1,拉取代码

任何拉取代码的动作,都可以使用如下方式进行,已将参数做成最优解。

  1. stage('拉取代码') {
  2. steps {
  3. checkout(
  4. [$class: 'GitSCM', doGenerateSubmoduleConfigurations: false, submoduleCfg: [],changelog: true,
  5. extensions: [[$class: 'CloneOption', depth: 1, noTags: false, reference: '', shallow: true]],
  6. branches: [[name: "$BRANCH"]],userRemoteConfigs: [[url: "${env.GIT_URL}", credentialsId: "cicd-ssh"]]]
  7. )
  8. }
  9. }

2,分支的过滤规则

  • branchFilterType:只有符合条件的分支才会触发构建,必选,否则无法实现触发。可选参数有:
    • NameBasedFilter:基于分支名进行过滤,多个分支名使用逗号分隔。
    • RegexBasedFilter:基于正则表达式对分支名进行过滤。
    • All:所有分支。
  • 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,设置构建名称

buildNamebuildDescription

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)
            }
        }
    }
}