持续集成 Declarative Pipeline 语法的的使用中遇到一些问题,求助

咸吃萝卜淡操心 · 2017年12月13日 · 最后由 rocl 回复于 2017年12月18日 · 2603 次阅读

最近在学 Declarative Pipeline 语法遇到一些问题,查了很多资料也没能解决😂

#!/usr/bin/env groovy Jenkinsfile
pipeline {

    agent any
    parameters {
    choice(name:'choiceTest', choices:'1234\nABCD', description: '')
    string(name:'test', defaultValue: 'test1', description: '')
    }

    tools {
        maven 'maven3'
        jdk   'jdk8'
    }

}

对于以上内容,有如下问题想请教一下:
1.想请教一下 choice 怎样选择到 ABCD 这个值,我使用 ${params.choiceTest[1]}取到的值是 2
2.tools 的用法,如果我想使用 docker 该怎么写

tools{
    org.jenkinsci.plugins.docker.commons.tools.DockerTool 'docker'
    Docker 'docker'
    docker 'docker'
}

这样是都不行的,像这样的问题,比如安装的三方插件或者说只要不是一个单词像 jdk maven gradle 这样的都不知道该怎么写
错误日志

WorkflowScript: 17: Invalid tool type "docker". Valid tool types: [ant, hudson.tasks.Ant$AntInstallation, org.jenkinsci.plugins.docker.commons.tools.DockerTool, git, hudson.plugins.git.GitTool, gradle, hudson.plugins.gradle.GradleInstallation, jdk, hudson.model.JDK, jgit, org.jenkinsci.plugins.gitclient.JGitTool, jgitapache, org.jenkinsci.plugins.gitclient.JGitApacheTool, maven, hudson.tasks.Maven$MavenInstallation, hudson.plugins.mercurial.MercurialInstallation, hudson.plugins.sonar.SonarRunnerInstallation, hudson.plugins.sonar.MsBuildSQRunnerInstallation, com.hello2morrow.sonargraph.integration.jenkins.tool.SonargraphBuild] @ line 17, column 8.
          docker 'docker'

3.像 string 那个参数那样,既然是 defaultValue,我理解的是应该可以替换,那么需要怎样替换

共收到 4 条回复 时间 点赞
咸吃萝卜淡操心 Jenkins pipeline 踩坑集合 中提及了此贴 12月15日 00:19

第一个问题:这是一个单选,取值的时候需要选择,直接取 ${params. choiceTest} 的值就可以了,至于是什么,需要依赖用户的选择了。

我来回答下你的问题

(1).choice 怎么选择到 ABCD

(1.1).这是一个 choice,也就是执行这个 pileline 脚本前就要先选择一个 (不是选 1234,就是选 ABCD),所以不存在怎么选择到 ABCD
Pipeline 组件毕竟有一层封装,这个不可以像我们编写 vc/vb/html/c#/java......那样,界面可以默认初始化选定第二项 ABCD

(1.2).抛开 pipeline,jenkins 有一个插件可以做到默认值为非第一项 (Extensible Choice Parameter plugin)。但是很不幸,pipeline 插件目前不支持这个 Jenkins 插件 (Extensible Choice Parameter plugin)

(1.3) 至于 ${params.choiceTest[1]}取到的值是 2,你会发现
${params.choiceTest}----------------->1234
${params.choiceTest[0]}-------------->1
${params.choiceTest[1]}-------------->2
${params.choiceTest[2]}-------------->3
${params.choiceTest[3]}-------------->4
现在明白为什么 ${params.choiceTest[1]}取到值为 2 了???

(2). tools 用法,如果想使用 docker 该怎么写

tools 典型的用法
def mvnHome = tool 'M3'
sh "${mvnHome}/bin/mvn -B -Dmaven.test.failure.ignore verify"
也就是说 tools 实际上是读取 Jenkins-->Global Tool Configuration 里面的公共配置,更通常用于多 node 情况
至于你说的使用 docker,建议去查下"pipeline-syntax",里面有怎么使用 docker 的语法

(3). tools,比如安装的三方插件或者说只要不是一个单词像 jdk maven gradle 这样的都不知道该怎么写
实践证明不是一个单词,也是 OK 的, pipeline 关键代码如下:
node('master') {
def mvnHome = tool 'my jdk'
sh "${mvnHome}bin/java -version"
}
运行结果如下:
[test-long-toolsname] Running shell script
+ /opt/jdk1.8.0_151/bin/java -version
java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)

(4) .像 string 那个参数那样,既然是 defaultValue,我理解的是应该可以替换,那么需要怎样替换
这个是 pipeline 插件提供的,定义和读取类似如下
string(name:'test', defaultValue: 'test1', description: '')
${params.strPara}
你要非常清楚这个 string 是 pippeline 支持的,才可以这样使用,所以这个并不是通常意义上理解的 String 类型变量,让你想怎么办就怎么办

总体感觉你对 jenkins-pipeline 比较陌生,建议你先去读一遍 pipeline doc(我稍后在本版发一下 pipeline 官方文档的中文版),再看你想要实现的功能,或许会有不同的感触。

感谢回答, 对于 tools 的用法可能是我表述的不要明确

node('master') {
def mvnHome = tool 'my jdk'
sh "${mvnHome}bin/java -version"
}

 tools {
        maven 'maven3'
        jdk   'jdk8'
    }

我主要是看到这种用法,想知道其他插件类工具是不是也可以这样写,如果可以该怎么写,对于 docker 或者 sonnar 这样的 我做了很多尝试,也查了很多资料都没有找到答案,无论是看报错日志改成
tools{
org.jenkinsci.plugins.docker.commons.tools.DockerTool 'docker'
}
又或者是 pipeline-syntax 里建议的 tool name‘xxx’ type‘oooo’ 都一一尝试了一遍

(1.1).这是一个 choice,也就是执行这个 pileline 脚本前就要先选择一个 (不是选 1234,就是选 ABCD),所以不存在怎么选择到 ABCD

对于这个还是有点糊涂,你也说了 执行这个pileline脚本前就要先选择一个(不是选1234,就是选ABCD) 从我看的文档里 ${params.choiceTest}默认去第一个值,那么在脚本执行前就要选取到 ABCD 的话改怎么写

对于 jenkins 确实刚入手没多久,很多东西知其然不知其所以然,对于 choice 这个,去看了源码,也看了他的 UT 至今被绕的晕晕的😓

(1).docker 的用法,你还是找的不对,我等下后面是我这边实际的 docker 使用,不是在 tools 里面用 docker
(2).确切说,目前 pipeline 不支持 choice 中选择非默认 (第一个) 选项这样的用法,要看你的目的是什么,这样用的需求是什么。这就好比说你不能要求汽车飞起来一样,至少目前是这样的,无法这样用,如果抛开 pipeline,是可以支持的 (就是 Extensible Choice Parameter plugin 这个插件)

下面是一个使用 docker 的例子:

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册