Jenkins基础:Jenkinsfile使用实例:7:使用集成的工具进行操作

Jenkins可以与其他工具进行集成,并通过在Global Tool Configuration中进行配置,从而建立关联。比如集成Maven和SonarScanner,而在Jenkinsfile中也可以通过使用tools{}来对相关的工具进行调用,这篇文章将继续使用具体的示例来进行说明。

tools{}

根据给定条件决定实际的分支处理逻辑,可以考虑在Jenkinsfile中使用when{}来达到这一目的。在本文中将仅仅介绍最为简单的逻辑分支处理方式,至于嵌套和多层逻辑处理将在后续的文章中进一步地展开。

  • 使用限制:需要写在pipeline或者stage块中
  • 可选vs必选:可选
  • 支持的工具与名称:
    • maven
    • org.jenkinsci.plugins.ansible.AnsibleInstallation
    • org.jenkinsci.plugins.docker.commons.tools.DockerTool
    • git
    • hudson.plugins.git.GitTool
    • jdk
    • hudson.model.JDK
    • jgit
    • org.jenkinsci.plugins.gitclient.JGitTool
    • jgitapache
    • org.jenkinsci.plugins.gitclient.JGitApacheTool
    • hudson.tasks.Maven$MavenInstallation
    • hudson.plugins.mercurial.MercurialInstallation
    • hudson.plugins.sonar.SonarRunnerInstallation
    • hudson.plugins.sonar.MsBuildSQRunnerInstallation
    • gradle

示例

本文示例:
将流水线分按照功能分为逻辑上的三段:构建(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

使用如下示例代码获取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

使用如下代码示例创建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说明

本文示例所使用的Jenkinsfile信息如下所示,内容非常简单易读,简单说明如下:

  • pipeline是结构,在其中可以指定agent和stages等相关信息
  • agent用于指定执行job的节点,any为不做限制
  • stages用与设定具体的stage
  • stage为具体的节点,比如本文示例中模拟实际的 Build(构建)、测试(Test)、部署(Deploy)的过程。
  • tools中可以使用集成的工具进行操作
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
/ #

执行Job

使用如下命令或者直接在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

标签:Jenkins 发布于:2019-10-16 10:26:59