def docker_registry_url = "registry.cn-hangzhou.aliyuncs.com"
def docker_registry_namepase = "xxx"
def docker_registry_auth = "839ff854-529c-4fe8-ba98-476004665f4c"
def git_auth = "76b820ad-b6b7-4b36-8f82-f5a1fe4b475a"
def git_url = "http://172.16.126.6/eleven/jenkins-demo.git"
def project_service_name_select = "${project_service_name}".split(",")
def publish_server_select = "${publish_server}".split(",")
def env_select = "${environment}".split(",")
node {
stage('初始化准备') {
echo "做一些初始化工作,待填充"
}
stage('拉取代码') {
echo "****************************** 开始拉取 ${branch} 分支代码 ******************************"
checkout([$class: 'GitSCM', branches: [[name: "${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
echo "****************************** 拉取代码成功。。。 ******************************"
}
stage('公共工程打包') {
echo '****************************** 公共工程打包 ******************************'
}
stage('删除旧容器和镜像 & 微服务打包 & 推送镜像 & 部署远程服务器') {
echo '****************************** 删除旧容器和镜像 & 微服务打包 & 推送镜像 & 部署远程服务器 Start ******************************'
for (int i = 0; i < project_service_name_select.length; i++) {
for (int j = 0; j < env_select.length; j++) {
for (int h = 0; h < publish_server_select.length; h++) {
def app_name_select = project_service_name_select[i].split("/")
def current_app_name = app_name_select[app_name_select.length - 1]
def branch_select = "${branch}".split("/")
def current_branch_name = branch_select[branch_select.length - 1]
def current_app_port = ""
echo "**************** 根据项目名称获取端口号 ****************"
script {
switch (current_app_name) {
case "demo":
current_app_port = "20040"
break
case "system":
current_app_port = "20010"
break
case "tool":
current_app_port = "20030"
break
case "gateway":
current_app_port = "1218"
default -> error('根据项目名称未正确匹配到端口号')
}
}
echo "**************** 正确匹配到 ${current_app_name} 的端口号为 ${current_app_port} ****************"
def image_name = "${docker_registry_url}/${docker_registry_namepase}/${current_app_name}-${current_branch_name}-${env_select[j]}:${image_tag}" as Object
echo "**************** 镜像名称为 ${image_name} ****************"
echo "**************** 删除旧镜像 ${image_name} ****************"
sh "docker images | grep -E ${current_app_name}-${current_branch_name}-${env_select[j]} | grep ${image_tag}| awk '{print \$3}' | uniq | xargs -I {} docker rmi --force {}"
if ("${}") {
echo "**************** 开始进行打包 ****************"
sh "mvn -f ${project_service_name_select[i]} clean package -Dmaven.test.skip=true -P ${env_select[j]}"
echo "**************** 开始构建镜像 ****************"
sh "cd ${project_service_name_select[i]} && docker build -f Dockerfile -t ${image_name} . --no-cache"
echo "**************** 推送镜像到远程服务器 ****************"
withCredentials([usernamePassword(credentialsId: "${docker_registry_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
sh "docker login -u ${username} -p ${password} ${docker_registry_url}"
sh "docker push ${image_name}"
sh "echo **************** 镜像推送成功:${image_name} ****************"
}
}
echo "****************************** 开始部署 ${project_service_name_select[i]} 服务的 ${env_select[j]} 环境到 ${publish_server_select[h]} 服务器 ******************************"
sshPublisher(publishers: [sshPublisherDesc(configName: "${publish_server_select[h]}",
transfers: [sshTransfer(cleanRemote: false, excludes: '',
execCommand: """
sh "docker ps -a | grep ${current_app_name}-${current_branch_name}-${env_select[j]} | grep ${image_tag} | awk '{print \$1}' | xargs -I docker stop {} | xargs -I docker rm {}"
sh "docker images | grep -E ${current_app_name}-${current_branch_name}-${env_select[j]} | grep ${image_tag}| awk '{print \$3}' | uniq | xargs -I {} docker rmi --force {}"
docker pull ${image_name}
docker run -d -p ${current_app_port}:8080 -v /var/logs/${current_app_name}/${current_branch_name}/${env_select[j]}:/var/logs ${image_name}
""",
execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false,
patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '',
sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
echo "****************************** 部署 ${project_service_name_select[i]} 服务的 ${env_select[j]} 环境到 ${publish_server_select[h]} 服务器完成 ******************************"
}
}
}
echo '****************************** 删除旧容器和镜像 & 微服务打包 & 推送镜像 & 部署远程服务器 End ******************************'
}
stage('发送邮件') {
echo '****************************** 发送邮件 ******************************'
}
}
Jenkinsfile 编写,微服务多环境多服务器同时构建。