Skip to content

jenkins流水线构建

以java项目为例子,主要进行的步骤如下:

  1. 设置项目构建参数

  2. 脚本内容编写

  3. 设置jenkins脚本路径(上传到git拉取构建)

一、构建流水线参数

依赖插件

1.1 Git Parameter

这个插件用来获取git代码分支的插件,使用这个插件获取参数的时候,第一次构建项目是报错的,这个不影响,选中默认的分支构建即可。

image-20230731101207189

image-20230731102844170

1.2 参数设置

这些参数是需要通过jenkins设置,然后在流水线中使用到的

image-20230731104439611

二、流水线脚本

2.1 初始化脚本

脚本初始化内容:

pipeline { //定义一个流水线脚本

}

2.2 设置工具

    //引用工具
    tools {
        //前面是工具,后面是名称(在系统上设置的--全局工具配置)
        maven 'maven'
    }

2.3 设置参数变量

    environment {
        HARBOR_USER = credentials('harbor')
    }

2.4 设置流水线步骤

    //多个流水线流程定义
    stages {
        //单个流水线定义
        stage('拉取git代码') {
            steps {
                script {
                     def branchName = gitBranch.replaceFirst('origin/', '')
                     // 拉取git代码
                    checkout([$class: 'GitSCM',
                       branches: [[name: "${branchName}"]],
                       userRemoteConfigs: [[
                           credentialsId: "${credentialsId}",
                           url: '${gitUrl}'
                       ]]
                    ])
                   echo '拉取完成'
                }

            }
        }

        stage('构建代码') {
            steps {
                script {
                    sh 'mvn clean package -DskipTests=true -e -U'
                    // 获取jar文件的路径
                    def jarPath = sh(returnStdout: true, script: "find . -name '${jarName.trim()}'").trim()
                    env.APP_JAR_PATH = jarPath // 设置全局变量
                    echo '构建完成'
                }
            }
        }
    }

2.5 在流水线当中拉取git文件

    //多个流水线流程定义
    stages {
        stage('构建镜像') {
            steps {
                 script {
                      // 拉取dockerfile文件
                    checkout([$class: 'GitSCM',
                        userRemoteConfigs: [[
                            credentialsId: "${credentialsId}",
                            url: 'http://192.168.1.200:8080/application/jenkins.git'
                        ]]
                    ])
                    def dockerfilePath = sh(returnStdout: true, script: "find . -name 'Dockerfile'").trim()
                    echo "dockerfile地址${dockerfilePath}"
                    // 替换 Dockerfile 中的参数
                    sh "sed -i 's|{{PORT}}|${port}|' ${dockerfilePath}"
                    sh "sed -i 's|{{APP_JAR_PATH}}|${APP_JAR_PATH}|' ${dockerfilePath}"
                    def dockerImage = "192.168.1.199/application/${env.JOB_NAME}"
                    docker.build(dockerImage, "-f ${dockerfilePath} .")
                    echo "镜像名称${dockerImage}"

                    // 登录到Harbor镜像仓库
                    sh "docker login --username=${HARBOR_USER_USR} --password=${HARBOR_USER_PSW} 192.168.1.199"
                    // 推送Docker镜像到Harbor镜像仓库
                    sh "docker push ${dockerImage}"
                    echo '推送镜像成功'
                 }
            }
        }
    }

2.6 推送rancher2.x

参考:

  1. https://blog.csdn.net/qq_45567067/article/details/129601539

  2. https://plugins.jenkins.io/redeploy-rancher2-workload/

  3. https://www.jenkins.io/doc/pipeline/steps/redeploy-rancher2-workload/#rancherredeploy-redeploy-rancher2-x-workload

2.7 前提条件

  1. rancher增加api秘钥,记录api秘钥的token值

  2. jenkins下载Redeploy Rancher2.x Workload Plugin插件,并且通过凭证配置rancher的token值和地址

  3. 获取程序对应的api接口地址。流程如下图:

rancher的地址为:https://192.168.1.30

  1. 先输入https://192.168.1.30/v3,然后通过projects搜索,点击如下图所示

image-20230804143414716

  1. 通过步骤1或者直接打开https://192.168.1.30/v3/projects,查找项目名称appication(jenkins构建的rancher项目),找到相关的服务,因为我们是deployment,所以选择如下

image-20230804143722747

  1. 搜索concurrency(实际的rancher应用名称),然后搜索相关的名称,找到对应的链接,则完整链接地址为:https://192.168.1.30/v3/project/c-x8d4c:p-vqcql/workloads/deployment:application:concurrency?action=redeploy

image-20230804143957427

2.8 通过插件更新rancher

通过插件更新rancher有个前提条件,ssl秘钥必须要可信任的,否则会报错。

注意链接的地址,只取/project开头,还有action是不需要的

        stage('更新rancher服务') {
            steps {
                rancherRedeploy alwaysPull: true, credential: 'rancher-token', images: '', workload: '/project/c-x8d4c:p-vqcql/workloads/deployment:application:concurrency'
            }
        }

2.9 通过shell脚本更新

这里将rancher的秘钥改为通过账号密码的方式引入

image-20230804144812709

    environment {
        //引入凭证
        RANCHER_USER = credentials('rancher')
    }
        stage('更新rancher服务') {
            steps {
                sh "curl -k -u '${RANCHER_USER_USR}:${RANCHER_USER_PSW}' -X POST -H 'Accept: application/json' -H 'Content-Type: application/json' 'https://192.168.1.30/v3/project/c-x8d4c:p-vqcql/workloads/deployment:application:concurrency?action=redeploy'"
            }
        }

三、问题注意

3.1 获取凭证

获取账号密码信息配置的凭证,在控制台打印的密码都是***,这是由于jenkins做了特殊的出来,所以通过打印控制台查看密码是不可行的。

参考文档:https://www.jenkins.io/zh/doc/book/pipeline/jenkinsfile/

1、通过环境变量获取(推荐)

设置环境变量参数--设置BITBUCKET_COMMON_CREDS变量,默认就能通过后缀_USR和_PSW获取账号和密码

environment {
    BITBUCKET_COMMON_CREDS = credentials('user')
}
  • BITBUCKET_COMMON_CREDS - 包含一个以冒号分隔的用户名和密码,格式为 username:password

  • BITBUCKET_COMMON_CREDS_USR - 附加的一个仅包含用户名部分的变量。

  • BITBUCKET_COMMON_CREDS_PSW - 附加的一个仅包含密码部分的变量。

2、通过流水线里的函数(这里仅供参考,因为获取密码的方式不对,可以配合bindings一起使用)

withCredentials([usernamePassword(credentialsId: 'harbor',usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]){ def password = URLEncoder.encode(PASSWORD, "UTF-8") //当密码用在URL中时,还需要进行编码。如git clone }

withCredentials(bindings: [certificate(aliasVariable: '', \
                                       credentialsId: 'jenkins-certificate-for-xyz', \
                                       keystoreVariable: 'CERTIFICATE_FOR_XYZ', \
                                       passwordVariable: 'XYZ-CERTIFICATE-PASSWORD')]) {
  // some block
}