StringTemplate模板引擎
持续集成流程,详情参见jenkins-持续集成
前言
jenkins通过Jenkinsfile
定义完整的流水线。
一个标准流水线内容如下
Jenkinsfile
pipeline {
agent any
stages {
stage('1.拉取代码') { }
stage('2.编译构建') { }
stage('3.代码静测') { }
stage("4.打包镜像") { }
stage("5.远程部署") { }
}
}
- 我们如何为不同的项目,选择不同的
stage
执行,该如何处理呢? - 对同一个项目,在不同的开发阶段,动态的选择
stage
执行。如:开发阶段,可以跳过
3.代码静测
可以考虑通过StringTemplate
动态的创建Jenkinsfile脚本来实现上述的问题。
1. 控制流水线执行
创建jenkinsfile-template-1.stg
jenkinsfile(stage1,stage2,stage3,stage4,stage5) ::= <<
pipeline {
agent any
stages {
<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); // 仍然执行 stage2
st.add("stage3", 1);
st.add("stage4", true);
st.add("stage5", false); // 不执行 stage5
String 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 any
stages {
<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 略!>
执行程序
@Test
public 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
- jgit 将
jenkinsfile
内容,动态推送到git仓库。 - jenkins-rest 执行流水线命令。
- 指定 jenkinsfile-
pipeline script from SCM
- 执行
Build with Parameters
- 指定 jenkinsfile-