如何在本地测试对Jenkinsfile所做的更改?

sor*_*rin 177 jenkins jenkins-workflow jenkins-pipeline

在编写jenkins管道时,为了查看它是否有效,提交每个新更改似乎非常不方便.

有没有办法在不提交代码的情况下在本地执行这些?

Jes*_*ick 119

您无法在本地执行Pipeline脚本,因为它的全部目的是编写Jenkins脚本.(这就是为什么最好保留Jenkinsfile简短且限于实际处理Jenkins功能的代码的原因之一;您的实际构建逻辑应该使用外部流程或构建工具来处理,您可以通过单行shbat步骤调用它们.)

如果要测试更改为Jenkinsfile直播但未提交,请使用1.14中添加重播功能

JENKINS-33925跟踪自动测试框架的需求.

  • @BoltzmannBrain,转到构建作业的Jenkins页面.在左侧,您应该看到以前的构建运行列表.当您将鼠标悬停在构建运行ID(例如"#123")或构建运行日期时,会出现一个小的向下箭头.单击它会显示一个上下文菜单,其中包含"重播"选项.该选项也可在构建运行的页面上使用. (5认同)
  • 博客文章说有一个“重播”按钮。知道在哪里吗?我似乎找不到它。 (2认同)
  • Concourse 允许您针对目标构建服务器执行本地脚本,因此您可以在提交更改之前验证它是否也可以在远程服务器上实际工作。https://concourse.ci/fly-cli.html。Jenkins 重放功能有点类似于此功能,但它有局限性,您必须先创建一个构建才能重放它。 (2认同)
  • 您可以看看[这个项目](https://github.com/jenkinsci/jenkinsfile-runner),目的是提供您想要的东西。 (2认同)

jav*_*der 61

我有一个适合我的解决方案.它由一个在docker中运行的本地jenkins和一个git web hook组成,用于在每次提交时触发本地jenkins中的管道.您不再需要推送到github或bitbucket存储库来测试管道.

这只是在linux环境中测试过的.

尽管这条指令有点长,但使这项工作变得相当简单.大多数步骤都在那里.

这就是你需要的

  • Docker安装并正常工作.这不是本指令的一部分.
  • 詹金斯本地运行在码头工人.下面解释如何.
    • 本地Jenkins docker用户从本地git仓库获取的适当权限(ssh访问密钥). 下面解释如何.
    • 从本地git存储库中提取的Jenkins管道项目.解释如下.
    • 您本地Jenkins中的git用户具有最小权限.解释如下.
  • 一个带有提交后Web钩子的git项目,用于触发管道项目.解释如下.

这就是你如何做到的

詹金斯码头

创建一个名为Dockerfile的文件来代替您的选择.我把它放在这里/opt/docker/jenkins/Dockerfile填充它:

FROM jenkins/jenkins:lts
USER root
RUN apt-get -y update && apt-get -y upgrade
# Your needed installations goes here
USER jenkins
Run Code Online (Sandbox Code Playgroud)

构建local_jenkins图像

这只需要执行一次或在向Dockerfile添加内容之后.

$ docker build -t local_jenkins /opt/docker/jenkins/
Run Code Online (Sandbox Code Playgroud)

启动并重新启动local_jenkins

有时您想轻松启动并重新启动jenkins.例如,重启机器后.为此,我制作了一个别名,我把它.bash_aliases放在我的主文件夹中.

$ echo "alias localjenkinsrestart='docker stop jenkins;docker rm jenkins;docker run --name jenkins -i -d -p 8787:8080 -p 50000:50000 -v /opt/docker/jenkins/jenkins_home:/var/jenkins_home:rw local_jenkins'" >> ~/.bash_aliases
$ source .bash_aliases  # To make it work
Run Code Online (Sandbox Code Playgroud)

确保该/opt/docker/jenkins/jenkins_home文件夹存在,并且您具有用户对其的读写权限.

要启动或重新启动jenkins,只需键入:

$ localjenkinsrestart
Run Code Online (Sandbox Code Playgroud)

您在本地jenkins中执行的所有操作都将存储在/ opt/docker/jenkins/jenkins_home文件夹中,并在重新启动之间保留.

在docker jenkins中创建一个ssh访问密钥

这是工作的一个非常重要的部分.首先,我们启动docker容器并为其创建一个bash shell:

$ localjenkinsrestart
$ docker exec -it jenkins /bin/bash
Run Code Online (Sandbox Code Playgroud)

您现在已进入docker容器,您可以通过jenkins@e7b23bad10aa:/$终端中的内容查看.@之后的哈希肯定会有所不同.

创建密钥

jenkins@e7b23bad10aa:/$ ssh-keygen
Run Code Online (Sandbox Code Playgroud)

在所有问题上按Enter键,直到收到提示

将密钥复制到您的计算机.如果你想知道,从docker容器内你的计算机是172.17.0.1.

jenkins@e7b23bad10aa:/$ ssh-copy-id user@172.17.0.1
Run Code Online (Sandbox Code Playgroud)

user =您的用户名和172.17.0.1是Docker容器中计算机的IP地址.

此时您必须输入密码.

现在让我们尝试通过从docker容器中ssh到您的计算机来完成循环.

jenkins@e7b23bad10aa:/$ ssh user@172.17.0.1
Run Code Online (Sandbox Code Playgroud)

这次你不需要输入密码.如果你这样做,出了点问题,你必须再试一次.

您现在将在您的计算机主文件夹中.试试吧ls.

不要停在这里,因为我们有一系列ssh shell需要摆脱.

$ exit
jenkins@e7b23bad10aa:/$ exit
Run Code Online (Sandbox Code Playgroud)

对!现在我们回来了,准备继续.

安装你的Jenkins

您可以在浏览器中找到您当地的Jenkins:http:// localhost:8787.

第一次将浏览器指向本地Jenkins时,您将使用安装向导进行操作.默认设置很好,但请确保在安装过程中安装管道插件.

设置你的jenkins

这是非常重要的,你在激活基于矩阵的安全//本地主机:8787/configureSecurity HTTP给自己的所有权利,加入自己的矩阵,勾选所有的箱子.(最右边有一个勾选方框图标)

  • 选择Jenkins’ own user database安全领域
  • Matrix-based security在"授权"部分中选择
  • 在字段中输入您的用户名,User/group to add:然后单击[ Add ]按钮
  • 在上面的表格中,您的用户名旁边会弹出一个人物图标.如果它被越过,则您输入的用户名不正确.
  • 转到表格的最右侧,单击全部勾选按钮或手动勾选行中的所有框.
  • 请确认Prevent Cross Site Request Forgery exploits未选中该复选框.(因为这个Jenkins只能通过你的电脑访问,所以这不是什么大问题)
  • 点击[ Save ]并注销Jenkins,然后再次确认它是否有效. 如果不是,则必须从头/opt/docker/jenkins/jenkins_home重新开始并在重新启动之前清空文件夹

添加git用户

我们需要允许我们的git hook以最小的权限登录我们的本地Jenkins.只是为了看到和建立工作就足够了.因此,我们创建一个名为gitpassword 的用户login.

将浏览器指向http:// localhost:8787/securityRealm/addUser并添加git为用户名和login密码.点击[ Create User ].

将权限添加到git用户

转到浏览器中的http:// localhost:8787/configureSecurity页面.将git用户添加到矩阵:

  • git在字段中写入User/group to add:并单击[ Add ]

现在是时候检查git用户的最小权限框了.只需要这些:

  • 整体:读
  • 工作:构建
  • 工作:发现
  • 工作:阅读

确保Prevent Cross Site Request Forgery exploits取消选中该复选框并单击[ Save ]

创建管道项目

我们假设我们user有用户名和我们的git启用项目,其中Jenkinsfile调用project并位于/home/user/projects/project

在您的http:// localhost:8787中, Jenkins添加了一个新的管道项目.我把它命名为hookpipeline以供参考.

  • 单击New ItemJenkins菜单中的
  • 为项目命名 hookpipeline
  • 单击管道
  • 点击 [ OK ]
  • 勾选Poll SCMBuild Triggers部分中的复选框.将计划留空.
  • 在管道部分:
    • 选择 Pipeline script from SCM
    • Repository URL现场进入user@172.17.0.1:projects/project/.git
    • Script Path现场进入Jenkinsfile
  • 保存hookpipeline项目
  • 手动构建hookpipeline一次,这是Poll SCM开始工作所必需的.

创建git钩子

转到该/home/user/projects/project/.git/hooks文件夹并创建一个名为post-commit包含此文件的文件:

#!/bin/sh
BRANCHNAME=$(git rev-parse --abbrev-ref HEAD)
MASTERBRANCH='master'

curl -XPOST -u git:login http://localhost:8787/job/hookpipeline/build
echo "Build triggered successfully on branch: $BRANCHNAME"
Run Code Online (Sandbox Code Playgroud)

使此文件可执行:

$ chmod +x /home/user/projects/project/.git/hooks/post-commit
Run Code Online (Sandbox Code Playgroud)

测试post-commit钩子:

$ /home/user/projects/project/.git/hooks/post-commit
Run Code Online (Sandbox Code Playgroud)

如果您的hookpipeline项目被触发,请检查Jenkins.

最后对项目进行一些任意更改,添加更改并执行提交.这将在您当地的Jenkins中触发管道.

快乐的时光!

  • 如果您的 docker 主机安装在 macOS 上,并且您希望从 docker 容器内通过 ssh 登录它,那么您应该使用“ssh user@docker.for.mac.localhost”,而不是使用 IP 地址。另请确保您从 macOS 系统偏好设置 -> 共享文件夹菜单启用了远程登录功能 (2认同)

Vad*_*imo 50

TL; DR
Jenkins管道单元测试框架

长版
Jenkins管道测试变得越来越痛苦.与传统的声明性作业配置方法不同,用户仅限于UI公开的内容,新的Jenkins管道是构建过程的完全成熟的编程语言,您可以将声明性部分与您自己的代码混合.作为优秀的开发人员,我们也希望对这种代码进行一些单元测试.

在开发Jenkins管道时,您应该遵循三个步骤.在步骤1中应涵盖的用途的情况下的80%.

  1. 在构建脚本中尽可能多地做(例如Maven,Gradle,Gulp等).然后在您的管道脚本中,只需按正确的顺序调用构建任务.构建管道只是编排和执行构建任务,但没有任何需要特殊测试的主要逻辑.
  2. 如果无法完全应用先前的规则,则转到管道共享库,您可以在其中自行开发和测试自定义逻辑并将它们集成到管道中.
  3. 如果以上所有方法都失败了,您可以尝试最近出现的其中一个库(2017年3月).Jenkins Pipeline Unit测试框架pipelineUnit(示例)

例子

pipelineUnit GitHub库包含有关如何使用一些斯波克例子詹金斯管道单元测试框架

  • 您还可以对这两个库进行简要比较吗? (2认同)

小智 18

Jenkins具有"重播"功能,使您无需更新源即可快速重播作业:

重播功能

  • 请注意,它显示在构建页面上,而不是项目或分支页面上。 (3认同)

fir*_*pol 16

在撰写的那一刻(2017年7月结束)蓝海插件,您可以直接在检查管道声明的语法可视化编辑器的管道.编辑从蓝海UI的工作,当你点击"配置"仅适用于GitHub的项目(这是一个已知的问题,他们正在努力使这也对工作的git等).

但是,正如本问题中所解释的,您可以打开编辑器浏览:

[Jenkins URL]/blue/organizations/jenkins/pipeline-editor/

然后单击页面中间,然后按Ctrl+S,这将打开一个textarea,您可以在其中粘贴管道声明性脚本.单击" 更新"时,如果存在语法错误,编辑器将通知您语法错误的位置.就像在这个截图中:

作为一个快速测试,我错误地输入

如果没有语法错误,textarea将关闭,页面将显示您的管道.不要担心它不会保存任何东西(如果它是一个github项目,它将提交Jenkinsfile更改).

我是Jenkins的新手,这非常有帮助,没有这个我不得不多次提交一个Jenkins文件,直到它工作(非常烦人!).希望这可以帮助.干杯.

  • 那是因为截至2017年,Jenkins仍然致力于解决点击式软件工程师的问题;)....至少Atom有一个像样的Groovy linter.只有Groovy但它有帮助. (2认同)

Dom*_*art 6

据我所知,这个流水线插件是新 Jenkinsfile 机制的“引擎”,所以我很肯定你可以用它来本地测试你的脚本。

我不确定将它复制到 Jenkinsfile 时是否需要任何其他步骤,但是语法等应该完全相同。

编辑:在“引擎”上找到参考,检查功能描述,最后一段,第一个条目。


Juu*_*nen 6

在我的开发设置中——缺少合适的 Groovy 编辑器——大量 Jenkinsfile 问题源于简单的语法错误。要解决此问题,您可以针对您的 Jenkins 实例(运行于$JENKINS_HTTP_URL)验证 Jenkinsfile :

curl -X POST -H $(curl '$JENKINS_HTTP_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)') -F "jenkinsfile=<Jenkinsfile" $JENKINS_HTTP_URL/pipeline-model-converter/validate

上面的命令是https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki/Validating-(or-linting)-a-Declarative-Jenkinsfile-from-the-command-line 的一个稍微修改过的版本

  • 这正是我一直在寻找的东西 - 不幸的是,它只适用于 * 声明性 * 管道,而不适用于脚本化管道 :( (4认同)

bog*_*ata 5

晚会晚了一点,但这就是为什么我写jenny了一些Jenkinsfile核心步骤的小重新实现。(https://github.com/bmustiata/jenny