// 打包镜像 -拼接字符串命令,不然 sh 命令不支持动态 $ 读取参数
|
def build_image(String module_dir,String image_name){
|
sh 'cd ' + module_dir +'/ && ls && docker build -f Dockerfile -t ' + image_name + ':latest .'
|
}
|
|
// 推送镜像 -拼接字符串命令,不然 sh 命令不支持动态 $ 读取参数
|
def push_image(String registry,String aliyunNamespace,String respName,String imageName) {
|
REGISTRY = registry
|
ALIYUN_NAMESPACE = aliyunNamespace
|
RESP_NAME = respName
|
IMAGE_NAME = imageName
|
script{
|
withCredentials([usernamePassword(credentialsId: 'aliyun', passwordVariable: 'password', usernameVariable: 'username')]) {
|
sh 'echo "$password" | docker login ' + REGISTRY + ' -u "$username" --password-stdin'
|
sh 'docker tag ' + IMAGE_NAME + ':latest ' + REGISTRY + '/' + ALIYUN_NAMESPACE + '/' + RESP_NAME + ':' + IMAGE_NAME + '-SNAPSHOT-$BUILD_NUMBER'
|
sh 'docker push ' + REGISTRY +'/' + ALIYUN_NAMESPACE + '/' + RESP_NAME + ':' + IMAGE_NAME + '-SNAPSHOT-$BUILD_NUMBER'
|
sh 'docker rmi ' + IMAGE_NAME + ':latest'
|
}
|
}
|
}
|
|
// 部署-拼接字符串命令,不然 sh 命令不支持动态 $ 读取参数
|
def deploy(String moduleDir) {
|
input '是否部署?'
|
sh 'cd ' + moduleDir + '/ && ls && docker-compose up -d'
|
}
|
|
pipeline {
|
agent any
|
//变量定义
|
environment {
|
REGISTRY = 'registry.cn-hangzhou.aliyuncs.com'
|
ALIYUN_NAMESPACE = 'arsn'
|
RESP_NAME='drone'
|
IMAGE_NAME=''
|
MODULE_DIR=''
|
SERVICE_NAMES = 'drone-gateway,drone-auth,drone-system,drone-resource,drone-log,drone-job,drone-swagger,drone-yw,drone-odm,drone-h5'
|
BUILD_MODULES = ''
|
}
|
|
stages {
|
//1.拉取源码
|
stage('Git Checkout'){
|
steps {
|
git branch: 'master', credentialsId: 'gitblit', url: 'http://127.0.0.1:10010/r/drone/drone_manage.git'
|
}
|
}
|
//2. 获取改变的模块(子服务)
|
stage('Detect Changes') {
|
steps {
|
script {
|
def changedFiles = "Changes:\n"
|
build = currentBuild
|
while(build != null && build.result != 'SUCCESS') {
|
changedFiles += "In ${build.id}:\n"
|
for (changeLog in build.changeSets) {
|
for(entry in changeLog.items) {
|
for(file in entry.affectedFiles) {
|
changedFiles += "* ${file.path}\n"
|
}
|
}
|
}
|
build = build.previousBuild
|
}
|
echo changedFiles
|
// 使用 split() 方法将字符串转换成数组
|
def serviceArray = SERVICE_NAMES.split(',')
|
def buildModules = []
|
// 遍历数组并打印每个元素
|
serviceArray.each { service ->
|
def name = service.trim()
|
echo "Service: ${name}"
|
if(changedFiles.contains(name)){
|
buildModules += name
|
}
|
}
|
BUILD_MODULES = buildModules.join(",")
|
echo "Modules to be built: $BUILD_MODULES"
|
}
|
}
|
}
|
//3.编译成jar包
|
stage('Maven Build') {
|
steps {
|
sh 'ls'
|
sh 'mvn clean package -Dmaven.test.skip=true'
|
sh 'ls target/'
|
}
|
}
|
//4.构建镜像,可能有多个
|
stage('Build Images'){
|
steps {
|
script {
|
if (BUILD_MODULES.contains("drone-gateway")) {
|
build_image('drone-gateway','drone-gateway')
|
}
|
if (BUILD_MODULES.contains("drone-auth")) {
|
build_image('drone-auth','drone-auth')
|
}
|
if (BUILD_MODULES.contains("drone-system")) {
|
build_image('drone-service/drone-system','drone-system')
|
}
|
if (BUILD_MODULES.contains("drone-resource")) {
|
build_image('drone-ops/drone-resource','drone-resource')
|
}
|
if (BUILD_MODULES.contains("drone-log")) {
|
build_image('drone-ops/drone-log','drone-log')
|
}
|
if (BUILD_MODULES.contains("drone-job")) {
|
build_image('drone-ops/drone-job','drone-job')
|
}
|
if (BUILD_MODULES.contains("drone-swagger")) {
|
build_image('drone-ops/drone-swagger','drone-swagger')
|
}
|
if (BUILD_MODULES.contains("drone-yw")) {
|
build_image('drone-service/drone-yw','drone-yw')
|
}
|
if (BUILD_MODULES.contains("drone-odm")) {
|
build_image('drone-service/drone-odm','drone-odm')
|
}
|
if (BUILD_MODULES.contains("drone-h5")) {
|
build_image('drone-service/drone-h5','drone-h5')
|
}
|
}
|
}
|
}
|
//5.拉取镜像并启动
|
stage("Push Image"){
|
steps {
|
script {
|
if (BUILD_MODULES.contains("drone-gateway")) {
|
push_image(REGISTRY,ALIYUN_NAMESPACE,RESP_NAME,'drone-gateway')
|
}
|
if (BUILD_MODULES.contains("drone-auth")) {
|
push_image(REGISTRY,ALIYUN_NAMESPACE,RESP_NAME,'drone-auth')
|
}
|
if (BUILD_MODULES.contains("drone-system")) {
|
push_image(REGISTRY,ALIYUN_NAMESPACE,RESP_NAME,'drone-system')
|
}
|
if (BUILD_MODULES.contains("drone-resource")) {
|
push_image(REGISTRY,ALIYUN_NAMESPACE,RESP_NAME,'drone-resource')
|
}
|
if (BUILD_MODULES.contains("drone-log")) {
|
push_image(REGISTRY,ALIYUN_NAMESPACE,RESP_NAME,'drone-log')
|
}
|
if (BUILD_MODULES.contains("drone-job")) {
|
push_image(REGISTRY,ALIYUN_NAMESPACE,RESP_NAME,'drone-job')
|
}
|
if (BUILD_MODULES.contains("drone-swagger")) {
|
push_image(REGISTRY,ALIYUN_NAMESPACE,RESP_NAME,'drone-swagger')
|
}
|
if (BUILD_MODULES.contains("drone-yw")) {
|
push_image(REGISTRY,ALIYUN_NAMESPACE,RESP_NAME,'drone-yw')
|
}
|
if (BUILD_MODULES.contains("drone-odm")) {
|
push_image(REGISTRY,ALIYUN_NAMESPACE,RESP_NAME,'drone-odm')
|
}
|
if (BUILD_MODULES.contains("drone-h5")) {
|
push_image(REGISTRY,ALIYUN_NAMESPACE,RESP_NAME,'drone-h5')
|
}
|
}
|
}
|
}
|
//6.部署
|
stage('deploy to') {
|
steps {
|
script {
|
if (BUILD_MODULES.contains("drone-gateway")) {
|
deploy('drone-gateway')
|
}
|
if (BUILD_MODULES.contains("drone-auth")) {
|
deploy('drone-auth')
|
}
|
if (BUILD_MODULES.contains("drone-system")) {
|
deploy('drone-service/drone-system')
|
}
|
if (BUILD_MODULES.contains("drone-resource")) {
|
deploy('drone-ops/drone-resource')
|
}
|
if (BUILD_MODULES.contains("drone-log")) {
|
deploy('drone-ops/drone-log')
|
}
|
if (BUILD_MODULES.contains("drone-job")) {
|
deploy('drone-ops/drone-job')
|
}
|
if (BUILD_MODULES.contains("drone-swagger")) {
|
deploy('drone-ops/drone-swagger')
|
}
|
if (BUILD_MODULES.contains("drone-yw")) {
|
deploy('drone-service/drone-yw')
|
}
|
if (BUILD_MODULES.contains("drone-odm")) {
|
deploy('drone-service/drone-odm')
|
}
|
if (BUILD_MODULES.contains("drone-h5")) {
|
deploy('drone-service/drone-h5')
|
}
|
}
|
}
|
}
|
}
|
}
|