跳转至

Jenkins

Jenkinsfile 通用语法可直接查官方文档,这里只保留会用的部分与内网实践。

🧭 三种构建方式

方式 触发方式 用途
触发式构建 开发 push / 合并后自动部署 开发环境
参数化构建 登录 Web 传参(tag、分支)后部署 测试 / 预上线环境
定时构建 参数化构建基础上加定时 App 自动打包

🐳 安装(Docker)

jenkins/jenkins:lts-jdk11 · jenkins_home · -p 8080:8080。容器化安装与目录说明。

docker run -d -v jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 \
  --restart=on-failure jenkins/jenkins:lts-jdk11
  • exec 映射 Jenkins war 所在目录,便于升级修复;jenkins_home 是系统配置(插件、流水线、workspace)。
  • 若用 -v $PWD/exec:/usr/share/jenkins/,须保证该目录下已有 jenkins.warref 目录。

⚠️ 使用注意

  1. Master 节点尽量不跑任务。
  2. JOB 设静默期;建议丢弃旧的构建。
  3. 轮询 / 定时构建注意设置 TZ=Asia/Chongqing
  4. 制品临时可放 Jenkins 自带库,长期保存用 Nexus 等。
  5. 中文乱码:确认 node 支持中文字符集后,在节点属性加环境变量 LANG = zh_CN.UTF-8
  6. 添加从节点时启动方式可选 Non verifying Verification Strategy
  7. SVN 轮询很占资源:Repository depth 选 empty

🧩 Jenkinsfile 要点

agent · stages · post · options · when · parallel。流水线元素与条件。

元素 作用域 必须 说明
stages / stage / steps stage、steps 必须 阶段与步骤
post Pipeline 结束后的后续 / 清理,条件有 always / changed / failure / success / unstable / aborted
options Pipeline timeoutretrybuildDiscarderdisableConcurrentBuildsskipDefaultCheckout
environment Pipeline 环境变量

agent {} 指定运行节点,支持 anynonenodelabeldockerdockerfile

pipeline {
    agent { label 'Bulid_21' }          // 指定节点 tag
    options { timeout(time: 1, unit: 'SECONDS') }
    environment { code = 'ccid' }
    stages {
        stage("CheckOut") {
            agent { label 'my-label1 || my-label2' }
            environment { ACCESS_KEY = credentials('my-ssh') }
            steps { script { println("获取代码") } }
        }
        stage("Build") {
            steps {
                echo 'Hello, mibo'
                sh('cd /home/mibo/' + env.fliepath + ';svn log -l 5;')
                sh 'make -j 40'
            }
        }
    }
    post {
        success { archiveArtifacts artifacts: 'all_result.txt', followSymlinks: false }
        failure { script { println("流水线失败后,要做的事情") } }
    }
}

条件判断(when):

when { branch 'master' }
when { environment name: 'DEPLOY_TO', value: 'production' }
when { expression { return params.DEBUG_BUILD } }
when { not { branch 'master' } }
when { allOf { branch 'master'; environment name: 'DEPLOY_TO', value: 'production' } }
when { anyOf { branch 'master'; branch 'staging' } }

并行执行(嵌套阶段内不能再 parallel):

stage('Parallel Stage') {
    when { branch 'master' }
    failFast true            // 一个失败则终止全部
    parallel {
        stage('Branch A') { agent { label "for-branch-a" } steps { echo "On Branch A" } }
        stage('Branch B') { agent { label "for-branch-b" } steps { echo "On Branch B" } }
    }
}

script 包裹即可用脚本语法:

steps {
    script {
        try { sh 'exit 1' } catch (exc) { echo 'Something failed' }
    }
}

🐍 通过 Python 管控 Job

from api4jenkins import Jenkins, Folder, job

for job in jenkins_obj.iter_jobs():
    job._class          # job 类型:Folder WorkflowJob FreeStyleProject 等
    job.configure()     # xml 格式的 job
    job.delete()        # 删除全部 job

jenkins_obj.create_job(job_name, job_config.encode('utf-8'))
jenkins_obj.get_job(job_name).disable()

清空某 Job 的 history(在 Jenkins 自带脚本管理器中执行):

item = Jenkins.instance.getItemByFullName("ABJ/CNEOS_4.4.15/SW64_CNEOS_4.4.15_server.v1.0")
item.builds.each() { build -> build.delete() }
item.updateNextBuildNumber(1)

Groovy 官方地址:https://groovy.apache.org/