针对使用Jenkinsfile-Runner对流水线/共享库测试和jenkins流水线配置这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展1个Jenkins作业和2个Jenkinsfiles
针对使用 Jenkinsfile-Runner 对流水线 / 共享库测试和jenkins流水线配置这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展1 个 Jenkins 作业和 2 个 Jenkinsfiles(声明性管道)、Jenkins pipeline jenkinsfile的两种写作方式声明式和脚本式、Jenkins pipeline 之声明式的 jenkinsfile、jenkins Pipeline 脚本 jenkinsfile 实操指南等相关知识,希望可以帮助到你。
本文目录一览:- 使用 Jenkinsfile-Runner 对流水线 / 共享库测试(jenkins流水线配置)
- 1 个 Jenkins 作业和 2 个 Jenkinsfiles(声明性管道)
- Jenkins pipeline jenkinsfile的两种写作方式声明式和脚本式
- Jenkins pipeline 之声明式的 jenkinsfile
- jenkins Pipeline 脚本 jenkinsfile 实操指南
使用 Jenkinsfile-Runner 对流水线 / 共享库测试(jenkins流水线配置)
如果您确实想从 CLI 运行 Pipeline 而不启动完整的 Jenkins 实例,则可以查看 Jenkinsfile-runner 项目。在某些情况下可能出于开发 / 测试目的而适用。
Jenkinsfile Runner 是将 Jenkins Pipeline 执行打包为命令行工具的实验。预期的用例包括:在功能即服务的上下文中使用 Jenkins; 协助 Jenkinsfile 本地编辑;集成测试共享库。Jenkinsfile Runner 可以通过命令行运行也可以通过 Docker 方式运行。
在命令行中使用
准备工作:需要下载 Jenkins 的 war 包,并解压。
wget jenkins/war-stable/2.204.2/jenkins.war
unzip jenkins.war -d /test/jenkins
下载 Jenkinsfile-runner 项目,进行编译打包并生成可执行程序。
git clone https://github.com/jenkinsci/jenkinsfile-runner.git
cd jenkinsfile-runner/
mvn clean package -Dmaven.test.failure.ignore=true
Jenkinsfile-runner 的使用方法:
jenkinsfile-runner -w <path to war> \
-p <path to plugins> \
-f <path to Jenkinsfile> \
-a "param1=Hello¶m2=value2"
-w 指定我们刚才解压的 war 目录
-p 指定 Jenkins 的插件目录
-f 指定我们要运行的 Jenkinsfile
-a 指定对 Jenkinsfile 传递的参数
编写一个用于测试的 Jenkinsfile。
pipeline {
agent any
parameters {
string(name: ''param1'', defaultValue: '''', description: ''Greeting message'')
string(name: ''param2'', defaultValue: '''', description: ''2nd parameter'')
}
stages {
stage(''Build'') {
steps {
echo ''Hello world!''
echo "message: ${params.param1}"
echo "param2: ${params.param2}"
sh ''ls -la''
}
}
}
}
让我们使用 Jenkinsfile-runner 运行测试。
jenkinsfile-runner -w test/jenkins \
-p $JENKINS_HOME/plugins \
-f Jenkinsfile \
-a "param1=Hello¶m2=value2"
Started
Running in Durability level: PERFORMANCE_OPTIMIZED
Running on Jenkins in /tmp/jenkinsTests.tmp/jenkins8090792616816810094test/workspace/job
[Pipeline] node
[Pipeline] {
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Build)
[Pipeline] echo
Hello world!
[Pipeline] echo
message: Hello
[Pipeline] echo
param2: value2
[Pipeline] sh
[job] Running shell script
+ ls -la
total 12
drwxrwxr-x 2 kohsuke kohsuke 4096 Feb 24 15:36 .
drwxrwxr-x 4 kohsuke kohsuke 4096 Feb 24 15:36 ..
-rw-rw-r-- 1 kohsuke kohsuke 0 Feb 24 15:36 abc
-rw-rw-r-- 1 kohsuke kohsuke 179 Feb 24 15:36 Jenkinsfile
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
使用 Docker 方式
使用 docker 方式相对简单许多,我们只需要下载镜像,将要测试的 jenkinsfile
以 volume 的当时挂载到容器中即可。
docker run --rm \
-v $(pwd)/Jenkinsfile:/workspace/Jenkinsfile \
jenkins4eval/jenkinsfile-runner
-v 挂载本地的 Jenkinsfile
镜像名称
jenkins4eval/jenkinsfile-runner
总结:
在使用 jenkinsfile-runner 进行测试 Jenkinsfile 的过程中需要安装所需的插件,第一种方式是使用当前 JenkinsHome 目录中的插件,另一种方式是重新安装插件。 我觉得每次测试都安装插件会影响测试的效率,直接使用 JenkinsHome 中的插件也有可能在远端不便于使用。总之 Jenkinsfile 插件还是个问题!。
本文分享自微信公众号 - DevOps 云学堂(idevopsvip)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。
1 个 Jenkins 作业和 2 个 Jenkinsfiles(声明性管道)
如何解决1 个 Jenkins 作业和 2 个 Jenkinsfiles(声明性管道)?
我有 1 个工作,有 2 个声明性管道脚本,我从 1 个脚本调用另一个脚本
现在我收到此错误消息:
java.lang.IllegalStateException: 只有一个管道 { ... } 块可以 在一次运行中执行。
stage(''Loading app Deployment File'') {
steps {
script {
def util = load ''./abcd/Jenkinsfile.groovy''
}
}
}
解决方法
您不能在一个作业中使用两个管道脚本,我看到两个选项
- 创建另一个作业并将其称为下游作业
build job: "path/to/jenkins_job",parameters:([string(name:'''',value:'''')]),propagate: false,wait: true
-
将文件作为 jenkins 文件中的闭包调用
stage(''foo''){ options { timeout(time: 5,unit: "MINUTES") } steps{ script{ script1.call(arg1,arg2) } }
}
并配置script1.groovy如下
script1.groovy
#!groovy
def call(arg1,arg2){
try{
<do something>
return
} catch (Exception){
< something has failed >
}
// you can also add stages here
stage(''bar''){
try{
<do something>
return
} catch (Exception){
< something has failed >
}
}
}
需要注意的一点是,使用此方法也可以使用所有管道变量。
Jenkins pipeline jenkinsfile的两种写作方式声明式和脚本式
Jenkins pipeline jenkinsfile的两种写作方式,声明式和脚本式。
为什么需要pipeline?
在多年前Jenkins成为最流行的持续集成服务器的Jenkins 1.x时代,所有的新功能都是通过安装插件来增强,所有的配置都是通过网页界面来实现的。
在Jenkins迈入2.x的时代,为了跟随时代的步伐(everything is code),Jenkins引入了配置及代码的概念。用代码来表示流程是为了版本控制和自动化的方便,使得配置跟源代码一样可重现,更加容易地支持多分支开发部署。 具体地来说,就是Jenkins引入了pipeline的概念,可以使用groovy来编写Jenkinsfile。
为什么两种实现pipeline的方式呢?
真的是看戏的不嫌事大,同一功能两种实现,很多用户也会被搞迷吧。下面咱们就来捋一捋这个发展过程。
Jenkins是使用Java实现的,所以在很早的时候就引入了groovy作为DSL,管理员可以使用groovy来实现一些自动化和高级的管理功能。因为groovy引擎已经集成到Jenkins,所以在pipeline一开始很自然就使用groovy来编写Jenkinsfile。
但是groovy毕竟是一种语言,对于没有太多编程经验的小白这个学习曲线有点太陡峭。这个时候声明式的pipeline就出现了,主要是为了降低入门的难度。
作为Jenkins用户该如何选择呢?
- 声明式pipeline鼓励声明式编程模型,比较适合没有编程经验的初学者。
- 脚本式pipeline,是基于groovy的DSL语言实现的,为Jenkins用户提供了大量的灵活性性和可扩展性。
- 声明式pipeline会得到越来越多的官方支持,可以使用Visual Pipeline Editor来编辑和验证声明式pipeline。
- 如果实在是声明式语法还没有支持的功能,还可以在声明式里直接调用脚本。
所以推荐新手从声明式pipeline开始。
声明式pipeline:
https://jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline
脚本式pipeline:
https://jenkins.io/doc/book/pipeline/syntax/#scripted-pipeline
下面我们分别来个例子来初步感受下,看看你更喜欢哪种?
声明式pipeline
pipeline {
agent any
stages {
stage(''Example Build'') {
steps {
echo ''Hello World''
}
}
stage(''Example Deploy'') {
when {
branch ''production''
environment name: ''DEPLOY_TO'', value: ''production''
}
steps {
echo ''Deploying''
}
}
}
}
脚本式pipeline
node {
stage(''Example'') {
if (env.BRANCH_NAME == ''master'') {
echo ''I only execute on the master branch''
} else {
echo ''I execute elsewhere''
}
}
}
声明式pipeline里调用脚本式语法
pipeline {
agent any
stages {
stage(''Example'') {
steps {
echo ''Hello World''
script {
def browsers = [''chrome'', ''firefox'']
for (int i = 0; i < browsers.size(); ++i) {
echo "Testing the ${browsers[i]} browser"
}
}
}
}
}
}
参考:
https://stackoverflow.com/questions/43484979/jenkins-scripted-pipeline-or-declarative-pipeline
https://medium.com/@brianrthompson/scripted-vs-declarative-pipelines-which-to-choose-c6af403f1e97
Jenkins pipeline 之声明式的 jenkinsfile
Jenkins pipeline 之声明式的 jenkinsfile
内置的关键字
- pipeline : 是 pipeline 的跟节点
- agent: 定义 piple 使用哪个账号在哪个机器上执行
- post: 定义 pipeline 最后执行的一组任务,支持多种条件判断 always, changed, fixed, regression, aborted,failure, success, unstable, unsuccessful, and cleanup.
- stages: 是多个 stage 的父节点。
- stage: 代表整个 pipleline 里的一个阶段,stage 里面才是具体的 steps。
- steps: 定义在 stage 的内部,表示具体如何执行。
- environment: 定义公用的环境变量
- options: 定义 pipeline 或者 plugin 的参数设置。
- parameters: 定义了整个 pipeline 的外部参数,必须有默认值,用户也可以在启动时指定新的参数
- triggers: 定义如何触发 pipeline,例如 cron,pollSCM,或者 upstream。
- tools: 定义需要安装的工具,且会自动加入到 PATH
- input: 允许 pipeline 与用户交互,等待用户确认然后继续。
- when: 条件语句
pipeline 的实例代码
其实还是非常直观易懂的:
pipeline {
agent {
node {
label ''DEBIAN8''
}
}
triggers {
cron(''H */4 * * 1-5'')
}
environment {
ARTIFACTORY_URL = ''https://path.to.artifacts/some-registry''
}
options {
disableConcurrentBuilds()
retry(1)
skipStagesAfterUnstable()
timeout(time: 10, unit: ''MINUTES'')
skipDefaultCheckout()
buildDiscarder(logRotator(numToKeepStr: ''10'', artifactNumToKeepStr: ''1''))
}
tools {
/**
* Predefined environment variables MAVEN3 and JDK-1.8
*/
maven ''MAVEN3''
jdk ''JDK-1.8''
}
stages {
/**
* Initialization check for Java and Maven
*/
stage(''Initialization'') {
steps {
sh ''''''
java -version
mvn -version
''''''
}
}
/**
* Checkout source code from Github on any of the GIT nodes
*/
stage(''Checkout'') {
steps {
checkout scm
}
}
/**
* Compile the Maven project
*/
stage(''Build'') {
steps {
sh ''mvn clean install''
}
}
/**
* Trigger this in PRs, don''t run on master or release branches
*/
stage(''Package'') {
when {
changeRequest()
}
steps {
sh ''mvn clean package -DskipTests''
}
}
/**
* Only run this on master and release branches
*/
stage(''Deploy'') {
when {
branch ''master''
}
environment {
DEPLOYER = credentials(''deployer'')
}
steps {
sh ''mvn clean deploy''
}
}
/**
* Clean workspace
*/
stage(''Clean'') {
steps {
cleanWs()
}
}
}
post {
always {
echo ''I will always say Hello again!''
}
}
}
常见的 options
我们来解释一下上面常用的 option 的用途:
- disableConcurrentBuilds ():一时间最多只允许一个 pipeline 运行,如果前面的仍在运行, 后面的将会等待状态。
- retry (1): 失败了,重试一次。
- skipStagesAfterUnstable ():如果某个 stage 为 unstable 状态,则忽略后面的任务,直接退出。
- timeout (time: 10, unit: ''MINUTES''):10 分钟的超时设置。
- skipDefaultCheckout (): 忽略默认的 checkout。
- buildDiscarder (logRotator (numToKeepStr: ''10'', artifactNumToKeepStr: ''1'')): 保留最新的 10 个 build log 和 1 个 artifact。
参考:
https://medium.com/@brianrthompson/scripted-vs-declarative-pipelines-which-to-choose-c6af403f1e97
jenkins Pipeline 脚本 jenkinsfile 实操指南
前言碎语
jenkins 是一款流行的开源持续集成软件,插件丰富,扩展灵活。2.0 后推出 pipeline 流式构建,支持构建任务脚本化。本文主要旨在使用 jenkins 的 pipeline 功能完成 java maven 项目的打包,上传 jar 到目标服务器。pipeline 推出时间不长,实际使用的不是很多,网上基本没啥参考资料,官方的文档很详细,但不成本文所述体系。这篇博文是博主摸索半天后的成果,如有错落,欢迎指出。
说明:本文环境默认包含组件:jenkins,maven,jdk
一,安装 pipeline 支持插件
到配置中心插件管理搜索如下插件,安装
Pipeline Maven Integration Plugin :执行 withMaven 方法支持,用于构建 maven 项目工程,使用方式如下图,详细说明见:https://wiki.jenkins.io/display/JENKINS/Pipeline+Maven+Plugin
SSH Agent Plugin :sshagent 方法支持,用于上传构建产物到目标服务器,使用详情见:
https://wiki.jenkins.io/display/JENKINS/SSH+Agent+Plugin,这边博主实操时有个大坑,后面说详细说明
二,创建流式 Item,如图
三,编写 pipeline 脚本
脚本分三个步骤块,分别是 git clone(下载源码到本地),build(构建工程),deploy(上传构建产物到目标主机),脚本如下:
node {
stage(''git clone'') { // for display purposes
checkout([$class: ''GitSCM'', branches: [[name: ''*/${branch}'']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: ''xxxx-xxxx-xxxxx-xxxxxx'', url: ''http://git.xx.xxx/xxx/xform-boot.git'']]])
}
stage(''Build'') {
env.JAVA_HOME="${tool ''jdk1.8.0_92''}"
withMaven(
maven: ''M3'',
mavenLocalRepo: ''.repository'') {
sh "mvn clean install -U -P${profile} -Dmaven.test.skip=true"
}
}
stage(''deploy'') {
sshagent(credentials: [''deploy_ssh_key'']) {
sh ''ssh root@120.xx.95.105''
sh ''echo hello''
sh ''scp producer/target/salesApp-1.0-RELEASES.jar root@120.xx.95.105:/root/deploy/''
}
}
}
如上脚本需要配置两个认证凭证,分别是 git 的 credentialsId 和 sshagent 的 credentials
,到配置管理 credentials 处添加,如图
git 的认证比较简单,使用密码用户名验证,直接选 Username with password 就好了,这里还有个技巧,后面会讲到。
sshagen 测试下来只支持私钥,需要选择如下配置:
如图,使用了 From the Jenkins master ~./ssh, 需要你到 jenkins 所在主机的.ssh 目录,通过命令”ssh-keygen -t rsa“生成公私钥,生成时会询问你是否使用密码 加密,可以直接跳过,如果写了密码,那么上图中 Passphrase 需要写上加密密码,没写就留空。然后将 id_rsa.pub 中的内容拷贝到目标主机的 /root/.ssh/authorized_keys 文件中。上图中的 ID 可以指定,不指定会生成一个唯一字符串如:
这个 ID 对应了 pipeline 脚本中的验证 ID,到此,我们准备工作都已经做完了。
添加运行参数
细心的你可能发现了脚本中有类似占位符。这些的代码,如 ${branch},${profile}, 其实就是 pipeline 的占位符,这些参数控制了 git 从哪个分支拉代码,maven 构建的哪个环境的代码,这些参数需要在构建任务中明确指定,用以区分是生产环境还是测试环境等,如图
四,尝试构建任务
到这里我们的准备工作都已完成了,可以开启构建任务测试了,这时博主走了一个好大的坑,无论认证凭证模块怎么配置,总是抛如下的异常:Host key verification failed.
这个异常非常明显,pipeline 流式构建前两个步骤已经成功了,代码拉下来并已经构建成功了。但是通过 sshagent 上传到目标服务器时,认证失败了。这个问题占了我们摸索过程的一大半时间。最后还是感谢唐老大发现了问题。
异常原因:生产公私钥使用的 root 用户生产的,jenkins 是使用 jenkins 用户启动的,所有 jenkins 没有权限,
其实上面所有的步骤都没问题。最终在尝试了无数次的构建失败后构建图标终于绿了,构建产物成功上传到目标主机
一次次的失败:
成功的绿标
五,pipeline 的一点技巧
流式项目 Item 创建好后,在左边菜单最下面会有 pipeline 的语法菜单,点进去,会有如下页面:
1. 其中箭头一所指的,就是前文提到的 git 添加认证的一个小技巧,这个是一个 pipeline 脚本生成器,选中 git scm 后会出来 git 相关的配置,按照提示添加后,点击生成,就会生成以及配置组装好的脚本。特别适合新手
2. 箭头而是步骤指南,这个里面罗列了所有 pipeline 语法支持的一些 DSL 函数,如 git,checkout,wthMaven 等,并且详细的描述了方法的具体使用细节,详细 到每个参数的说明,如 withMavene:
文末结语
pipeline 的概念去年就听说了,现在实际操作了一把,还是非常的震撼,通过在项目中新增 jenkinsfile 就可以解决构建问题,而且非常灵活,支持写 if 等的逻辑判断脚本来决定构建行为。经历了无数次失败后成功的成就感不言而喻,有兴趣的都可以试试,彻底改变原先的构建模式。建议刚接触 pipeline 的新手,多看看 pipeline 语法页面的相关内容,对理解 pipeline 语法及书写脚本有很大的帮助。其次就是去相关的插件 wiki 页面多看看说明。国内的那些博客很多都是一笔带过,看不出在生产上面应用的痕迹,不建议去参考。最后,有任何问题欢迎在下面留言,一起讨论。
本文同步分享在 博客 “kailing”(other)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。
今天关于使用 Jenkinsfile-Runner 对流水线 / 共享库测试和jenkins流水线配置的介绍到此结束,谢谢您的阅读,有关1 个 Jenkins 作业和 2 个 Jenkinsfiles(声明性管道)、Jenkins pipeline jenkinsfile的两种写作方式声明式和脚本式、Jenkins pipeline 之声明式的 jenkinsfile、jenkins Pipeline 脚本 jenkinsfile 实操指南等更多相关知识的信息可以在本站进行查询。
本文标签: