jenkins流水线构建
以java项目为例子,主要进行的步骤如下:
设置项目构建参数
脚本内容编写
设置jenkins脚本路径(上传到git拉取构建)
一、构建流水线参数
依赖插件
1.1 Git Parameter
这个插件用来获取git代码分支的插件,使用这个插件获取参数的时候,第一次构建项目是报错的,这个不影响,选中默认的分支构建即可。


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

二、流水线脚本
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
参考:
2.7 前提条件
rancher增加api秘钥,记录api秘钥的token值
jenkins下载Redeploy Rancher2.x Workload Plugin插件,并且通过凭证配置rancher的token值和地址
获取程序对应的api接口地址。流程如下图:
rancher的地址为:https://192.168.1.30


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

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的秘钥改为通过账号密码的方式引入

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
}