Jenkinsfile的编写

本文介绍了一个使用Jenkins进行微服务多环境多服务器构建和部署的自动化流程。该流程包括初始化准备、拉取代码、公共工程打包、删除旧容器和镜像、微服务打包、推送镜像、部署远程服务器等阶段,并通过示例展示了如何实现自动化脚本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 编写,微服务多环境多服务器同时构建。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值