Jenkins可以与其他工具进行集成,并通过在Global Tool Configuration中进行配置,从而建立关联。比如集成Maven和SonarScanner,而在Jenkinsfile中也可以通过使用tools{}来对相关的工具进行调用,这篇文章将继续使用具体的示例来进行说明。
根据给定条件决定实际的分支处理逻辑,可以考虑在Jenkinsfile中使用when{}来达到这一目的。在本文中将仅仅介绍最为简单的逻辑分支处理方式,至于嵌套和多层逻辑处理将在后续的文章中进一步地展开。
本文示例:
将流水线分按照功能分为逻辑上的三段:构建(Build) 、测试(Test)、部署(Deploy),顺序如下所示。
在构建的时候使用集成的JDK和Maven,在测试阶段通过mvn sonar:sonar 集成单体测试的测试覆盖率到SonarQube,本文示例演示中只确认到通过tools{}方式确认到集成的JDK和Maven的版本信息。
本文使用Easypack的LTS Jenkins 2.176.1版,环境准备请参看
https://liumiaocn.blog.csdn.net/article/details/92764938
全集工具设定可以通过XML配置文件的方式,也可以直接在Jenkins的管理界面进行操作,详细可参照:
https://liumiaocn.blog.csdn.net/article/details/92924634
使用如下示例代码获取Jenkins-Crumb,为使用API方式生成三个Stage的Pipeline示例作准备。
liumiaocn:jenkins liumiao$ jenkins_host_url=http://localhost:32002
liumiaocn:jenkins liumiao$ user_passwd="root:liumiaocn"
liumiaocn:jenkins liumiao$ jenkins_crumb=`curl -u $user_passwd ${jenkins_host_url}'/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)' 2>/dev/null`
liumiaocn:jenkins liumiao$ echo $jenkins_crumb
Jenkins-Crumb:83d748ee92512c4dccd589aaa5c55a9a
liumiaocn:jenkins liumiao$
使用如下代码示例创建Job
liumiaocn:jenkins liumiao$ ls demo/pipeline/tools/config.xml
demo/pipeline/tools/config.xml
liumiaocn:jenkins liumiao$ cat demo/pipeline/tools/config.xml
<?xml?>
<flow-definition>
<actions>
<org.jenkinsci.plugins.pipeline.modeldefinition.actions.DeclarativeJobAction/>
</actions>
<description>Pipeline Job Sample</description>
<keepDependencies>false</keepDependencies>
<properties>
<hudson.plugins.jira.JiraProjectProperty/>
<com.dabsquared.gitlabjenkins.connection.GitLabConnectionProperty>
<gitLabConnection></gitLabConnection>
</com.dabsquared.gitlabjenkins.connection.GitLabConnectionProperty>
</properties>
<definition>
<script>pipeline {
agent any
tools {
maven 'bundled'
}
stages {
stage('Build') {
steps {
sh 'echo Build stage ...'
sh 'java -version'
}
}
stage('Test'){
steps {
sh 'echo Test stage ...'
sh 'mvn --version'
}
}
stage('Deploy') {
steps {
sh 'echo Deploy stage ...'
}
}
}
}</script>
<sandbox>false</sandbox>
</definition>
<triggers/>
<disabled>false</disabled>
</flow-definition>
liumiaocn:jenkins liumiao$ curl -X POST -u $user_passwd -H ${jenkins_crumb} -H "Content-Type:application/xml" --data-binary "@demo/pipeline/tools/config.xml" ${jenkins_host_url}/createItem?name=pipeline_job_tools
liumiaocn:jenkins liumiao$ echo $?
0
liumiaocn:jenkins liumiao$
本文示例所使用的Jenkinsfile信息如下所示,内容非常简单易读,简单说明如下:
pipeline {
agent any
tools {
maven 'bundled'
}
stages {
stage('Build') {
steps {
sh 'echo Build stage ...'
sh 'java -version'
}
}
stage('Test'){
steps {
sh 'echo Test stage ...'
sh 'mvn --version'
}
}
stage('Deploy') {
steps {
sh 'echo Deploy stage ...'
}
}
}
}
因为Easypack中的内置的JDK和Maven已经放到PATH中,这里将maven的链接删除,以确认mvn –version的正确执行是因为tools的作用。
liumiaocn:jenkins liumiao$ docker exec -it jenkins_jenkins_1 sh
/ # which mvn
/usr/local/bin/mvn
/ # which java
/usr/bin/java
/ #
/ # java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (IcedTea 3.12.0) (Alpine 8.212.04-r0)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)
/ #
/ # mvn --version
Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-24T18:41:47Z)
Maven home: /usr/local/share/maven
Java version: 1.8.0_212, vendor: IcedTea, runtime: /usr/lib/jvm/java-1.8-openjdk/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.9.87-linuxkit-aufs", arch: "amd64", family: "unix"
/ #
/ # rm /usr/local/bin/mvn
/ #
/ # mvn --version
sh: mvn: not found
/ #
使用如下命令或者直接在Jenkins上点击构建
liumiaocn:jenkins liumiao$ curl -X POST -u $user_passwd -H ${jenkins_crumb} ${jenkins_host_url}/job/pipeline_job_tools/build
liumiaocn:jenkins liumiao$ echo $?
0
liumiaocn:jenkins liumiao$
使用如下命令可以确认相关的执行日志信息
liumiaocn:jenkins liumiao$ curl -u $user_passwd ${jenkins_host_url}/job/pipeline_job_tools/1/consoleText
Started by user root
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /data/jenkins/workspace/pipeline_job_tools
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Declarative: Tool Install)
[Pipeline] tool
[Pipeline] envVarsForTool
[Pipeline] }
[Pipeline] // stage
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Build)
[Pipeline] tool
[Pipeline] envVarsForTool
[Pipeline] withEnv
[Pipeline] {
[Pipeline] sh
+ echo Build stage ...
Build stage ...
[Pipeline] sh
+ java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (IcedTea 3.12.0) (Alpine 8.212.04-r0)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] tool
[Pipeline] envVarsForTool
[Pipeline] withEnv
[Pipeline] {
[Pipeline] sh
+ echo Test stage ...
Test stage ...
[Pipeline] sh
+ mvn --version
Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-24T18:41:47Z)
Maven home: /usr/local/share/maven
Java version: 1.8.0_212, vendor: IcedTea, runtime: /usr/lib/jvm/java-1.8-openjdk/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.9.87-linuxkit-aufs", arch: "amd64", family: "unix"
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Deploy)
[Pipeline] tool
[Pipeline] envVarsForTool
[Pipeline] withEnv
[Pipeline] {
[Pipeline] sh
+ echo Deploy stage ...
Deploy stage ...
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
liumiaocn:jenkins liumiao$
可以看到事前mvn –version无法正常显示,而通过tools的关联,则可以正常动作了。
这篇文章使用了java和mvn两个工具进行版本确认,java是通过OS级别的PATH搜索路径的设定保证正常动作,而mvn则是通过tools块来实现。
https://jenkins.io/doc/book/pipeline/syntax/#tools