1,拉取代码
任何拉取代码的动作,都可以使用如下方式进行,已将参数做成最优解。
stage('拉取代码') {
steps {
checkout(
[$class: 'GitSCM', doGenerateSubmoduleConfigurations: false, submoduleCfg: [],changelog: true,
extensions: [[$class: 'CloneOption', depth: 1, noTags: false, reference: '', shallow: true]],
branches: [[name: "$BRANCH"]],userRemoteConfigs: [[url: "${env.GIT_URL}", credentialsId: "cicd-ssh"]]]
)
}
}
2,分支的过滤规则
- branchFilterType:只有符合条件的分支才会触发构建,必选,否则无法实现触发。可选参数有:
- NameBasedFilter:基于分支名进行过滤,多个分支名使用逗号分隔。
- RegexBasedFilter:基于正则表达式对分支名进行过滤。
- All:所有分支。
- NameBasedFilter:基于分支名进行过滤,多个分支名使用逗号分隔。
- includeBranchesSpec:基于branchFilterType值,输入期望包括的分支的规则。
- excludeBranchesSpec:基于branchFilterType值,输入期望排除的分支的规则。
如果只接受固定分支的触发请求,语法如下:
triggers{
gitlab( triggerOnPush: true,
triggerOnMergeRequest: true,
branchFilterType: "NameBasedFilter",
includeBranchesSpec: "release/qat",
secretToken: "${env.git_token}")
}
如果想通过正则匹配到某些分支进行触发,语法如下:
triggers{
gitlab( triggerOnPush: true,
triggerOnMergeRequest: true,
branchFilterType: "RegexBasedFilter",
sourceBranchRegex: "test.*",
secretToken: "${env.git_token}")
}
3,定义一个时间戳变量
这个地方的时间戳,不能直接使用Linux系统级别的,而需要引用groovy语法的格式,有两种便是方法,如下:方法一:
def createVersion() {
// 定义一个版本号作为当次构建的版本,输出结果 20191210175842_69
return new Date().format('yyyyMMddHHmmss') + "_${env.BUILD_ID}"
}
pipeline {
agent any
environment {
_version = createVersion()
}
stages {
stage ("test") {
steps {
echo ${_version}
}
}
}
}
方法二:
pipeline {
agent any
environment {
// 输出结果为 20200330142150_4
_version = sh(script: "echo `date '+%Y%m%d%H%M%S'`" + "_${env.BUILD_ID}", returnStdout: true).trim()
}
stages {
stage ("test") {
steps {
echo "${_version}"
}
}
}
}
4,docker构建镜像
stage('构建镜像推到远程') {
environment {
// 定义本次commit id, .trim() 去除末尾的空格
COMMIT_ID=sh(script: "git log -1 --pretty=format:'%h'", returnStdout: true).trim()
// 定义镜像全拼, .trim() 去除末尾的空格 reg.weipaitang.com/multienv/wpt-api:t1_5e0e8e2_20200929204420
IMAGE_NAME=sh(script: "echo ${BASE_IMAGE_NAME}" + ":" + "${BRANCH}" + "_" + "${COMMIT_ID}" + "_" + "`date '+%Y%m%d%H%M%S'`", returnStdout: true).trim() //构建版本号
}
steps {
script {
sh """cat dockerfile-api > Dockerfile"""
def BUILD_RESULT = docker.build("${IMAGE_NAME}")
BUILD_RESULT.push()
}
}
}
而后改进版如下:
stage('构建镜像推远程') {
steps {
script {
try {
docker.withRegistry("https://reg.weipaitang.com", "3ab670b9-6e5c-4eae-9006-d2294cfc5154") {
docker.build("${IMAGE_NAME}", "-f ${DOCKERFILE_NAME} ./").push()
}
}catch(exc) {
env.REASON = "构建镜像推到远程出错"
throw(exc)
}
}
}
}
5,设置构建名称
buildName
和 buildDescription
post {
always {
script{
wrap([$class: 'BuildUser']){
buildName "#${BUILD_ID}-${BRANCH}" // 更改构建名称
currentBuild.description = "提交者: ${COMMIT_USER}" // 添加说明信息
currentBuild.description += "\n提交ID: ${COMMIT_ID}" // 添加说明信息
currentBuild.description += "\n提交时间: ${COMMIT_TIME}" // 添加说明信息
currentBuild.description += "\n提交内容: ${COMMIT_INFO}" // 添加说明信息
}
}
}
success {
wrap([$class: 'BuildUser']){
script{
sh """
/bin/bash /data/.jenkins/scripts/post_weixin_test.sh "构建项目:${JOB_NAME}" "构建之人:${BUILD_USER}" "构建分支:${BRANCH}" "构建信息:${COMMIT_INFO}" "构建结果:[啤酒]构建成功[啤酒]" "构建版本:${IMAGE_NAME}" "构建日志:${RUN_DISPLAY_URL}"
"""
}
}
}
failure {
wrap([$class: 'BuildUser']){
script{
sh """
/bin/bash /data/.jenkins/scripts/post_weixin_test.sh "构建项目:${JOB_NAME}" "构建之人:${BUILD_USER}" "构建分支:${BRANCH}" "构建信息:${COMMIT_INFO}" "构建结果:[心碎]构建失败[心碎]" "失败原因:${REASON}" "构建日志:${RUN_DISPLAY_URL}"
"""
}
}
}
}
6,active choice参数
properties([
parameters([
[$class: 'ChoiceParameter', filterLength: 1, filterable: false, randomName: 'choice-parameter-5631314439613978',
name: 'BRANCH', choiceType: 'PT_SINGLE_SELECT', description: '选择将要部署的分支,将会自动指定环境',
script: [
$class: 'GroovyScript',
fallbackScript: [ classpath: [], sandbox: false, script: 'return[\'error\']'],
script: [ classpath: [], sandbox: false, script:'return["t1","t2","t3"]']
]
],
[$class: 'CascadeChoiceParameter', filterLength: 1, filterable: false, randomName: 'choice-parameter-5631314456178619',
name: 'DEPLOY_ENV', referencedParameters: 'BRANCH', choiceType: 'PT_SINGLE_SELECT', description: '环境取自选择的分支,不能自定义',
script: [
$class: 'GroovyScript',
fallbackScript: [classpath: [], sandbox: false, script: 'return[\'Could not get Environment from Env Param\']'],
script: [ classpath: [],sandbox: false,
script:
'''if (BRANCH.equals("t1")){
return["env-01"]
} else if(BRANCH.equals("t2")){
return["env-02"]
} else if(BRANCH.equals("t3")){
return["env-03"]
}
'''
]
]
]
])
])
pipeline {
agent any
stages {
stage ("测试") {
steps {
script{
sh """
echo "选择的分支为:$BRANCH"
echo "对应的环境为:$DEPLOY_ENV"
"""
}
}
}
}
}
7,kubectl文件
stage("部署至对应环境") {
steps {
script {
try {
configFileProvider([configFile(fileId: "${k8_auth}", targetLocation: "admin.kubeconfig")]){
sh '''
kubectl get pod -n env-03 --kubeconfig admin.kubeconfig
'''
}
}catch(exc) {
env.REASON = "部署至对应环境出错"
throw(exc)
}
}
}
}