二丫讲梵 二丫讲梵
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)

二丫讲梵

行者常至,为者常成
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)
  • Nexus系列文章

  • Jenkins系列文章

    • Jenkins入门系列笔记汇总整理
    • 前言与介绍
    • Jenkins初始部署与简单配置
    • Jenkins各配置选项介绍
    • Jenkins中一个项目的构建
    • Jenkins配置项目构建的钉钉通知
    • Jenkins忘记管理员密码怎么办
    • Jenkins与gitlab的交互探微
    • Jenkins根目录详解
    • Jenkins插件之显示构建时间
    • Jenkins插件之批量修改配置
    • Jenkins配置简单构建邮件推送
    • Jenkins复杂邮件推送配置详解
    • Jenkins配置复杂构建邮件推送
    • Jenkins构建安卓项目之前的一些唠叨
    • Jenkins构建安卓项目配置
    • Jenkins与Gitlab分支的交互
    • Jenkins构建nodejs项目
    • 使用docker部署Jenkins及初始配置
    • 配置gitlab提交代码Jenkins自动构建
    • Jenkins回滚方案探微
    • Jenkins角色控制(小黄锁)探微
    • Jenkins构建的应用配置问题解决探微
    • Jenkins构建中tag的应用
    • Jenkins插件之Ansicolor(神器)
    • 最基础核心的Jenkins功能部署一个java应用
    • Jenkins+sonar构建代码扫描
    • Jenkins+docker+gitlab将应用部署到docker
    • Jenkins参数化构建犀利插件Active-Choices-Plugin
    • 记一次将代码中参数外显到构建历史中的操作
    • Jenkins升级与迁移的经验分享
    • pipeline笔记之从一个简单的项目构建开始
    • Jenkinsfile声明式语法详解
    • 自动构建的原始配置以及pipeline中的用法
    • 多分支构建的实践与思考
    • 使用Jenkinsfile类前端项目的部署与回滚
    • 如何在Jenkinsfile中定义一个全局的时间戳变量
    • Jenkins中自由风格回滚方案的最佳实践
    • Jenkins中pipeline风格回滚方案的最佳实践
    • pipeline结合ansible剧本进行批量的部署与回滚配置
    • 最近配置安卓iOS打包本地化流程中一些值得记录的内容
    • pipeline中如何在environment环节声明一个含有通配符的变量
    • git-Parameter插件在pipeline共享库中的实践详解
    • jenkins作为ci检测代码是否合并的实践
    • 将Jenkins共享库的Jenkinsfile放到ci静态检测的实践
    • Jenkins的pipeline实践之GitSCM参数配置项详解
    • Jenkins中pipeline对接CMDB接口获取主机列表的发布实践
    • Jenkins有任务无法kill提示即将关闭
    • Jenkins基于Share Library共享库的最佳实践探索
    • Jenkins结合MySql Database插件的平台化实践思路
    • Jenkins-Groovy中三元表达式的用法
    • Jenkins-Groovy中Switch的高阶用法
    • Jenkins-pipeline之利用activity choice插件对接查询MySQL数据实现动态参数化的功能
    • CentOS通过yum快速安装Jenkins
    • Jenkins-pipeline语法之错误处理详解(文末有干货)
    • Jenkins常用插件汇总以及简单介绍
    • Jenkins所遇报错汇总及解决
    • Jenkins管理维护运维规范
  • ELK笔记

  • Kubernetes笔记

  • LLM专题

  • 系列专题
  • Jenkins系列文章
二丫讲梵
2020-07-06

pipeline中如何在environment环节声明一个含有通配符的变量

文章发布较早,内容可能过时,阅读注意甄别。

先来简述一下需求以及思路吧:

我这边拉代码编译以及准备工作都是基于Jenkinsfile完成,然后再基于ansible-playbook进行构建或者回滚,在调用playbook的时候会将提取出来的变量传进去,其中一个变量定义了项目打包之后的 jar 包的绝对路径。不同项目可能这个路径规范不一致,即便是同一项目,可能也会时常变更版本(比如admin-0.0.1.jar,下次可能会是admin-0.0.2.jar),从而无法写成固定的变量。

比较容易的一个办法是利用通配符来匹配这个包,那么可以定义成 project_file=$WORKSPACE/${project}/target/${project}-*.jar,以使得这个变量具有更强的兼容性。

但是当我兴致冲冲地将在全局environment区块中声明了如上变量后,便立刻点击了构建。然而却发现程序并没有解析通配符,传递下去的值变成了admin-*.jar,于是我开始寻觅能够解决这一尴尬的方案。

一开始打算直接在调用 ansible 之前声明这个变量,然而发现总是会失败,也许是我声明的方式不大对吧,后来还是在官网 (opens new window)看到了一个优雅的方案,官方示例如下:

pipeline {
    agent any
    environment {
        // 使用 returnStdout
        CC = """${sh(
                returnStdout: true,
                script: 'echo "clang"'
            )}"""
        // 使用 returnStatus
        EXIT_STATUS = """${sh(
                returnStatus: true,
                script: 'exit 1'
            )}"""
    }
    stages {
        stage('Example') {
            environment {
                DEBUG_FLAGS = '-g'
            }
            steps {
                sh 'printenv'
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

我赶忙创建一个项目运行一下看,果不其然,在环境变量中,CC=clang,EXIT_STATUS=1,一例惊醒梦中人,我于是定义了如下变量:

environment {
    // 定义项目编译完成之后的包文件
    project_file="""${sh(returnStdout: true, script: "echo $WORKSPACE/${project}/target/${project}-*.jar")}"""
}
1
2
3
4

其中 project 定义在全局的变量中。

最后果然输出了自己想要的内容。

img

经过几个项目的体验,简单总结有如下几个注意点:

  • 1,此声明不要放在开头的全局变量中,而应该在具体构建的 stage 中,不然变量的值将会是上次构建的包名,而非当次包名。示例如下:

    stage('部署<向左') {
      environment {
          // 定义项目编译完成之后的包文件
          project_file="""${sh(returnStdout: true, script: "echo $WORKSPACE/${project}/target/${project}-*.jar")}"""
      }
      when {
          environment name: 'mode',value: 'deploy'
      }
      steps {
          dir("$ansible_base"){
          script {
              try {
                  sh '''
                  ansible-playbook -i ./deploy_hosts/${JOB_NAME}_hosts --tags "deploy,${project}" site.yml -e "project"=$project -e "_version"=${_version} -e "JOB_NAME"=${JOB_NAME} -e "remote_host"=${remote_host} -e "server_port"=${server_port} -e project_env=${project_env} -e project_user=${project_user} -e start_Xms=${start_Xms} -e start_Xmx=${start_Xmx} -e "project_file"=${project_file}
                  '''
              }catch(exc) {
                  Reason = "项目部署步骤出错"
                  throw(exc)
              }
          }
          }
      }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
  • 2,有一个奇怪的坑是,当我将变量传给 playbook 时,如果 project_file 这个变量靠前,则后边的变量会被忽略(暂未经过更多验证),于是就把这个变量放在最后传了。

  • 3,后来又集成进来一项参数,就是 Java 应用的启动参数,这个特殊之处在于中间有空格,尝试了许多种方案,最终发现这个方案能够保证参数不是断开的。但是使用过程中始终发现会有问题,事实上那篇文章地下有说明,使用.trim()方法可以避开:

            environment {
                  // 定义项目编译完成之后的包文件
                  project_file="""${sh(returnStdout: true, script: "echo ${jar_file}").trim()}"""
                  // 指定服务启动参数, .trim() 去除末尾的空格
                  start_params="""${sh(returnStdout: true, script: "echo ${start_param}").trim()}"""
              }
    
    1
    2
    3
    4
    5
    6
微信 支付宝
#jenkins#tip
上次更新: 2024/07/04, 22:40:37
最近配置安卓iOS打包本地化流程中一些值得记录的内容
git-Parameter插件在pipeline共享库中的实践详解

← 最近配置安卓iOS打包本地化流程中一些值得记录的内容 git-Parameter插件在pipeline共享库中的实践详解→

最近更新
01
学习周刊-总第211期-2025年第20周
05-15
02
记录二五年五一之短暂回归家庭
05-09
03
学习周刊-总第210期-2025年第19周
05-09
更多文章>
Theme by Vdoing | Copyright © 2017-2025 | 点击查看十年之约 | 浙ICP备18057030号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式