【Jenkins】个人向-Jenkinsfile怎样写 [复制链接]
发表于 2025-10-22 13:09:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
官方参考:https://www.jenkins.io/doc/book/pipeline/syntax/
Pipeline Utility Steps 插件:https://birdbook.com.cn/ops/ci/jenkins/plugins/pipeline%20utility%20steps.html
常用环境变量

寄义表达式备注params,传入参数传入参数params.都可以用env.来访问实验Jenkins用户名env.BUILD_USER_ID依赖用户名插件:
wrap([$class: ‘BuildUser’]) {
        env.BUILD_USER_ID
    }
构建序号env.BUILD_NUMBER构建节点env.NODE_NAMEwindows默认cpu逻辑核数env.NUMBER_OF_PROCESSORSlinux获取下令 nprocSTAGE名字env.STAGE_NAME常用语法

等候
  1. sleep 300
复制代码
条件
  1. _force_cores = '16'
  2. if (_force_cores.toInteger() < 64 && _force_cores.toInteger() > 0) {
  3.     matlab_cores = _force_cores.toInteger()
  4. } else {
  5.     error "Faulty data in FORCE_MATLAB_CORES: ${_force_cores}"
  6. }
复制代码
循环
  1. for(i in list_matcher_in.toSet()){
  2.     command = command.replaceAll("@S_IN_VAR@${i}@E_IN_VAR@", global_vars.get(i))
  3. }
  4. def continue_update = true
  5. while (continue_update){
  6.     continue_update=false
  7. }
  8. batch.each { elem ->
  9.     println elem
  10. }
  11. // 带序号的遍历
  12. batches.eachWithIndex{ elem , index ->
  13. }
复制代码
暂时切换工作目次
  1. dir("xxxx") {
  2.         xxxx
  3. }
复制代码
常用option
  1. options {
  2.         /* 配置构建超时时间 */
  3.         timeout(time: 600, unit: "MINUTES")
  4.         /* 设置不允许并发构建 */
  5.         disableConcurrentBuilds()
  6.         /* 保留记录 */
  7.         buildDiscarder logRotator(artifactDaysToKeepStr: '30', artifactNumToKeepStr: '30', daysToKeepStr: '30', numToKeepStr: '30')
  8.     }
复制代码
界说初始参数(可选,可以直接再视图界说,不在jenkinsfile里)
  1. parameters {
  2.     string(defaultValue: "/app/jenkins/xxxx.zip", description: '文件路径', name: 'filePath')
  3.     string(defaultValue: "", description: '部署日期', name: 'date')
  4.     booleanParam defaultValue: true, description: '是否需要验证', name: 'needVerify'
  5. }
复制代码
任务输入弹窗
  1. // 仅做确认
  2. input ”请确认“
  3. // 输入一个参数
  4. env.URL_REPO_BUILD = input message: '请输入仓库地址', ok: 'Yes', parameters: [string(description: 'ssh://git@10.1.1.111/XX_Build' , name: 'URL_REPO_BUILD', trim: true)]
  5. // 输入多个参数
  6. def inputResp = input message: '请输入子仓库信息', ok: '更新', parameters: [string(defaultValue: 'Application_Code_Files/SWU_XXXX', description: '子仓库相对路径', name: 'SWU_REPO_NAME', trim: false), string(defaultValue: '', description: '子仓库版本号', name: 'SUB_REVISION_ID', trim: false), booleanParam(defaultValue: false, description: '是否继续更新子仓库', name: 'CONTINUE_UPDATE')]
  7. continue_update = inputResp['CONTINUE_UPDATE']
  8. env.SUB_REVISION_ID = inputResp['SUB_REVISION_ID']
  9. env.SWU_REPO_NAME = inputResp['SWU_REPO_NAME']
复制代码
界说全局可访问的量
  1. /////////////////////// 全局定义变量
  2. def project_prefix = 'WORK'
  3. def JOB = [
  4.     xxx: "${project_prefix}_Build",
  5.     log_archive: 'log_files.7z',
  6.     repo: [
  7.         base_repo: "${project_prefix}_Build",
  8.         bsw_repo: 'core',
  9.     ],
  10.     path: [
  11.         _7z: 'C:/Program Files/7-Zip/7z.exe'
  12.         var_path: ""
  13.     ],
  14.     lic: [
  15.         XXXX: 'XXXXX',
  16.     ]
  17. ]
  18. // 访问方式
  19. JOB.path._7z
  20. // 赋值方式
  21. JOB.path.var_path = 'nihao'
  22. //////////////////////全局配置文件
  23. /*
  24. driverClassName=com.mysql.jdbc.Driver
  25. url=jdbc:mysql://localhost:3306/day11
  26. password=root
  27. username=root
  28. maxActive=20
  29. minIdle=3
  30. initialSize=20
  31. */
  32. // 读取配置文件,原生调用方法
  33. import hudson.FilePath
  34. import hudson.model.ParametersAction
  35. import hudson.model.FileParameterValue
  36. import hudson.model.Executor
  37. def getConfig(){
  38.     File file = new File("static-server.properties")
  39.     def props = new Properties();
  40.     props.load(new BufferedReader(new InputStreamReader(new FileInputStream(file))));
  41.     return props;
  42. }
  43. def config = getConfig();
  44. env.baseDeployDir=config["baseDeployDir"]  //全局可访问
  45. env.deployDir="${baseDeployDir}/${system}"
  46. // Pipeline Utility Steps
  47. pipeline {
  48.     agent any
  49.     stages {
  50.         stage('Read Properties') {
  51.             steps {
  52.                 script {
  53.                     // 读取 properties 文件
  54.                     def props = readProperties file: 'config.properties'
  55.                     // 输出 properties 文件中的值
  56.                     echo "DB_URL: ${props['db.url']}"
  57.                     echo "DB_USER: ${props['db.user']}"
  58.                     echo "DB_PASSWORD: ${props['db.password']}"
  59.                     // 或者遍历所有的属性
  60.                     props.each { key, value ->
  61.                         echo "${key}: ${value}"
  62.                     }
  63.                 }
  64.             }
  65.         }
  66.     }
  67. }
  68. // 不推荐(中途定义全局变量)
  69. 定义变量的时候不加def,默认定义全局变量
  70. // 用environment初始定义环境变量
  71. pipeline {
  72.     agent any
  73.     environment {
  74.         A = '100' // 环境变量,在所有 stage 中有效
  75.     }
  76.     stages {
  77.         stage('Stage 1') {
  78.             steps {
  79.                 echo "A in Stage 1: ${env.A}"
  80.             }
  81.         }
  82.         stage('Stage 2') {
  83.             steps {
  84.                 echo "A in Stage 2: ${env.A}"
  85.             }
  86.         }
  87.     }
  88. }
  89. // 用env定义环境变量
  90. env.system_type="linux"
  91. pipeline {
  92.     agent any
  93.     stages {
  94.         stage('Stage 1') {
  95.             steps {
  96.                 script{
  97.                     env.system="system"
  98.                 }
  99.             }
  100.         }
  101.         stage('Stage 2') {
  102.             steps {
  103.                 echo env.system
  104.                 println env.system_type
  105.             }
  106.         }
  107.     }
  108. }
复制代码
实验条件
  1. // 环境变量当条件
  2. when{
  3.         environment name: 'deployMgmt', value: 'true'
  4. }
  5. // 多个条件
  6. when{
  7.     allOf{
  8.       environment name: 'deploy1', value: 'true'
  9.       anyOf{
  10.         environment name: 'deploy2', value: 'true'
  11.         environment name: 'deploy3', value: 'true'
  12.       }
  13.     }
  14. }
复制代码
字符串利用
  1. // 拼接
  2. "${aa}${bb}"
  3. aa+bb
  4. //替换
  5. command = command.replaceAll('aa', 'bb')
  6. command = command..replaceAll(/\.(abc|dfg)$/, "")  // 正则表达式
  7. // 切分
  8. text.split(/[ ,!]+/)  // 正则表达式
  9. text.split('split')   // 按单词切分 如果分割单词出现2次,返回的字符串数组中会有一个null
  10. text.tokenize('ab')  // 按字符a和b去切分,连续出现分割字符,自动合并连续的分隔符,保证没有null
  11. // 判断包含
  12. filepath.contains('xxx.pdf')
复制代码
有效的内置函数
  1. fileExists('/app/a.txt') //判断是否有文件
  2. fileExists('/app/dir/'') //判断是否有目录,多个/
  3. isUnix() //判断系统类型,依赖插件Pipeline Utility Steps
  4. // 正则表达式 /[0-9a-f]{12}/
  5. def matcher = (inPath =~ /\/([^_]+)_Autosar\.mdl/)
  6. if (matcher) {
  7.     match = matcher[0][1]
  8. }
  9. // 列表拼接
  10. def swuList = []
  11. swuList.add(name)
  12. swus = '\n'.join(swuList)
复制代码
调用其他作业
  1. jobB =build job: "xxxx-deploy", propagate: false, wait: true, parameters: [
  2.   string(name: 'dir', value: "${env.dir}")
  3. ]
  4. String result = jobB.getResult();
  5. Name = jobB.getProjectName()
  6. println result;
复制代码
函数功能抽象,以微信关照为例
  1. def notice(result){
  2.   return script {
  3.         String author=config["receiver"]
  4.         String msg = "${envDesc}发布${result}"
  5.         jobB = build job: "notice", propagate: false, wait: false, parameters: [
  6.                 string(name: 'msg', value: "${msg}"),
  7.                 string(name: 'authors', value: "${author}"),
  8.                 string(name: "msgType", value: "wechat")
  9.         ]
  10.     }
  11. }
复制代码
post处理惩罚
  1. post {
  2.     /* post节点定义在阶段运行结束的操作,支持一些后置条件
  3.     * always 总是运行
  4.     * changed 当前状态与上一次构建状态不同时运行
  5.     * failure 当前失败时运行
  6.     * success 当前成功时运行
  7.     * unstable 不稳定状态时运行
  8.     * aborted 被终止时运行
  9.     * */
  10.   failure {
  11.     script{
  12.     }
  13. }
复制代码
多台呆板实验的时间,共享文件
  1. // 保留文件或者文件夹
  2. stash includes: "${JOB.output_folder_name}/**", allowEmpty: true, name: 'output_folder_stash'
  3. // 切换节点后,释放
  4. unstash 'output_folder_stash'
复制代码
归档文件
  1. // 可多次执行
  2. archiveArtifacts artifacts: "${JOB.log_archive}"
复制代码
自动报错
  1. error 'Invalid format'
复制代码
环境变量局部收效
  1. //代码块生效
  2. withEnv (['TMP=E:\\TMP']) {
  3. }
  4. //stage级别生效
  5. stage('STAGE') {
  6.     agent {label "MATLAB"}
  7.     environment {
  8.         TOOLS_PATH = "${JOB.path.build_tools_common}"
  9.     }
  10.     stages {
复制代码
动态stage,可以动态天生stage
  1. batches.eachWithIndex { batch, index ->
  2.         stage("Batch ${index+1}/${batches.size()}") {
  3.                 echo running
  4.         }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表