StringTemplate模板引擎
持续集成流程,详情参见jenkins-持续集成

前言

jenkins通过Jenkinsfile定义完整的流水线。
一个标准流水线内容如下
Jenkinsfile

pipeline {agent anystages {stage('1.拉取代码') { }stage('2.编译构建') { }stage('3.代码静测') { }stage("4.打包镜像") { }stage("5.远程部署") { }}
}
  1. 我们如何为不同的项目,选择不同的stage执行,该如何处理呢?
  2. 对同一个项目,在不同的开发阶段,动态的选择stage执行。

    如:开发阶段,可以跳过3.代码静测

可以考虑通过StringTemplate 动态的创建Jenkinsfile脚本来实现上述的问题。

1. 控制流水线执行

创建jenkinsfile-template-1.stg

jenkinsfile(stage1,stage2,stage3,stage4,stage5) ::= <<pipeline {agent anystages {<if(stage1)><stage1()> <endif><if(stage2)><stage2()> <endif><if(stage3)><stage3()> <endif><if(stage4)><stage4()> <endif><if(stage5)><stage5()> <endif>}}
>>stage1() ::= <<stage('1.拉取代码') {}
>>stage2() ::= <<stage('2.编译构建') {}
>>stage3() ::= <<stage('3.代码静测') {}
>>stage4() ::= <<stage('4.打包镜像') {}
>>stage5() ::= <<stage('5.远程部署') {}
>>

执行程序

 @Test
public void testGeneratorJenkinsFile1_1() {STGroup  group = new STGroupFile("tmp\\jenkinsfile-template-1.stg");ST st = group.getInstanceOf("jenkinsfile");st.add("stage1", 1);st.add("stage2", 0);  // 仍然执行 stage2st.add("stage3", 1);st.add("stage4", true);st.add("stage5", false); // 不执行 stage5String script = st.render();System.out.println(script);}

执行结果

2. 传递通用参数

通常,在执行jenkins流水线时,各个环节需要使用外部参数,如,拉取代码时,需要指定git分支等。

创建jenkinsfile-template-2.stg


jenkinsfile(stage1,stage2,stage3,stage4,stage5,params) ::= <<def git_token_id = <params.git_token_id>pipeline {agent anystages {<if(stage1)><stage1(params.git_url,params.selected_branch)> <endif><if(stage2)><stage2()> <endif><if(stage3)><stage3()> <endif><if(stage4)><stage4()> <endif><if(stage5)><stage5()> <endif>}}
>>stage1(git_url,selected_branch) ::= <<stage('1.拉取代码') {steps {<! 引用ST参数,直接替换 !>echo "git_url=<git_url> ,selected_branch=<selected_branch> "<! 引用全局变量,保留表达式 !>echo "git_token_id=${git_token_id}"}}
>>
<! 其他 stage 略!>

执行程序

   @Testpublic void testGeneratorJenkinsFile1_2() {STGroup  group = new STGroupFile("tmp\\jenkinsfile-template-2.stg");ST st = group.getInstanceOf("jenkinsfile");st.add("stage1", 1);st.add("stage3", 1);String gitTokenId = "6cac69be-bb16-49d4-a315-d71bc2883106";String gitUrl = "git@gitee.com:it_freshman/string-template-demo.git";String selectedBranch = "develop";st.addAggr("params.{git_token_id,git_url,selected_branch}", gitTokenId, gitUrl, selectedBranch);String script = st.render();System.out.println(script);}

执行结果

3.动态执行jenkinsfile — todo

  1. jgit 将jenkinsfile 内容,动态推送到git仓库。
  2. jenkins-rest 执行流水线命令。
    1. 指定 jenkinsfile-pipeline script from SCM
    2. 执行Build with Parameters

StringTemplate-动态创建jenkinsfile相关推荐

  1. python创建类的实例方法-Python中动态创建类实例的方法

    简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模 ...

  2. Javascript:DOM动态创建元素实例应用

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  3. 新建异常并处理java_java – 动态创建异常的工厂模式

    我创建了Exception xml并动态创建并抛出异常. com.package.CheckedException Checked Exception Message com.package.UnCh ...

  4. SpringBoot集成Quartz实现定时任务的动态创建、启动、暂停、恢复、删除。

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:毅大师 blog.csdn.net/qq_39648 ...

  5. Angular动态创建组件之Portals

    本文主要介绍使用Angular api 和 CDK Portals两种方式实现动态创建组件,另外还会讲一些跟它相关的内容.如:Angular多级依赖注入.ViewContainerRef,Portal ...

  6. asp.net 包含动态创建控件的容器如果要切换显示/隐藏不要用 Visible 属性

    asp.net 包含动态创建控件的容器如果要切换显示/隐藏不要用 Visible 属性 就是不用 XXX.Visible = false;  // true 因为这样该容器及其子控件会彻底的从页面上消 ...

  7. [原]动态创建Web控件制做计算器

    最近参加了Web基础开发的培训,收获不少,做了一个练习,在后台动态创建控件制作了一个简单功能的计算器.程序中控件创建好以后,往往不能放在想要的位置,前台的布局非常麻烦,我用Table.TableRow ...

  8. 《深入浅出MFC》系列之动态创建

    /*************************************************************************************************** ...

  9. 对xxl-job进行simpleTrigger并动态创建任务扩展

    2019独角兽企业重金招聘Python工程师标准>>> 博文原址:对xxl-job进行simpleTrigger并动态创建任务扩展 业务场景 需求上要求能实现quartz的simpl ...

最新文章

  1. 2020年人工智能汽车将出台多项标准
  2. vectorvectorint 二维容器编程
  3. 移动WEB前端开发资源整合
  4. Maven中scope依赖范围和依赖的传递性
  5. python爬虫之美女图片爬取
  6. C. Longest Simple Cycle
  7. query的list()和iterate()区别 面试题
  8. Yslow-23条规则
  9. 普通用户竟这样执行xp_cmdshell存储过程!
  10. Perl 字符串截取函数substr
  11. 采用docker部署3台Redis分布式红锁实例
  12. 【Window】英文系统显示中文乱码
  13. java 3的倍数_java,编写一个从1循环到150并在每行打印一个值,另外在每个3的倍数行上打印出foo,在每个5的倍数行上打印biz,在每个7的倍数上打印baz....
  14. python温度转换程序改写代码举一反三_006 实例1-温度转换
  15. quick框架之MyApp详解
  16. Floyd-Warshall算法总结
  17. 修改html会影响seo,网站修改css影响seo吗?
  18. 【原理】Basic Integer Overflows
  19. 微信尝试刷掌支付;苹果 WWDC 将于 6 月 6 日开幕;Qt Creator 10 发布|极客头条
  20. owin 怎么部署在云中_从几乎未能在云中部署简单的机器学习模型中学到的教训...

热门文章

  1. 华为的强大再次得到证明,高通为它定制功耗更低的芯片
  2. 使用Python做中文分词和绘制词云
  3. 机器学习算法的效果评估和优化方法
  4. 实在智能|电商RPA与电商人并肩作战
  5. Zemax学习笔记(16)- ZEMAX_分析>报告使用说明
  6. python图片镜像翻转_翻转图像/镜像图像
  7. IntelliJ IDEA 2018 注册码
  8. Anaconda创建环境及环境配置
  9. es文件浏览器有linux版么,【ES 文件浏览器】ES 文件浏览器TV版_ES 文件浏览器TV版官网_-沙发管家TV版应用市场...
  10. 15、条件概率、全概率公式、贝叶斯公式、马尔科夫链