Jenkins 编写 pipeline 的几点备忘

Published: 2023-09-01

Tags: Jenkins CI/CD

本文总阅读量

Pipeline 参数化构建认证问题

在 Pipeline 中,仅用于获取 Tag 的参数化仓库未被 Pipeline 使用,将导致拉取 Tag 时权限校验失败。

例如,Pipeline 基于配置仓库生成数据,已经拉取了配置仓库代码。但某参数需要在构建时通过 Git Parameter 选择代码仓库的 Tag传入,此时由于代码仓库未在 Pipeline 中实际使用,将提示无权限访问其 Tag。

解决方法是在 Pipeline 中显式拉取代码仓库并指定其凭据,后续即可正常获取对应的 Tag 参数。

 // 获取程序代码
 dir(code_repo_directory) {
     checkout([$class: 'GitSCM',
         branches: [[name: "refs/tags/${code_version}"]],
         userRemoteConfigs: [[credentialsId: scm_credentials_id, url: scm_url]]
     ])
 }

另外有一点需要注意,修改 Pipeline 后需要先运行一次才能列出 Tag(因为需要加载新的 Pipeline 及绑定凭据)。

获取 Shell 命令的执行结果

将 sh 命令的输出到文件,而后在 script 区块使用 Groovy 语法,将状态或内容赋值到变量。

steps {
   script {
       sh """
       if [ ! -d "${destDir}" ] 
       then
           echo "not exist" > 'dest_dir_status.txt'
       else
           echo "exist" > 'dest_dir_status.txt'
       fi
       """

       def output = readFile 'dest_dir_status.txt'

       if (output.contains('not exist')) {
           target_exists = 'not_exist'
       } else {
           target_exists = 'exist'  
       }

       echo "Dir Test Result: ${target_exists}"
   }
}

在之后的步骤中就可以使用 when 语法选择跳过部分 stage

when {
    equals(actual: target_exists, expected: 'not_exist')
}

使用 Pipeline 提交代码

以下是一段代码提交示例,首先切换到仓库的路径,通过 withCredentials 和 gitUsernamePassword 对仓库进行 HTTP 认证。

steps {
    dir(stage_repo_directory) {
        withCredentials([gitUsernamePassword(credentialsId: scm_credentials_id)]){
            sh """
            git add projects/config.yaml
            git status
            git diff --stat
            git config --local user.name "${BUILD_USER_ID}"
            git commit -m "ops: ci automated commit, by ${BUILD_USER_ID}" || true
            git push origin HEAD:refs/heads/master
            """
        }
    }
}

提交代码时需要注意使用正确的分支。