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


210

在编写jenkins管道时,提交每个新更改以查看其是否有效似乎很不方便。

有没有一种方法可以在本地执行这些而不提交代码?

Answers:


139

您不能在本地执行Pipeline脚本,因为它的全部目的是编写Jenkins脚本。(这就是为什么最好使您的文章Jenkinsfile简短而仅限于实际处理Jenkins功能的代码的原因之一;您的实际构建逻辑应由外部过程或构建工具处理,您可以通过一行shbat一步来调用它。)

如果您想测试更改Jenkinsfile但不提交,请使用1.14中添加重播功能

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


博客文章说有一个“重播”按钮。任何想法在哪里?我似乎找不到它。
BoltzmannBrain

8
@BoltzmannBrain,转到构建作业的Jenkins页面。在左侧,您应该看到以前的构建运行的列表。当您将鼠标悬停在构建运行ID(例如“#123”)或构建运行日期上时,会出现一个向下的箭头。单击它会显示一个上下文菜单,该菜单具有“重播”选项。该选项在构建运行的页面上也可用。
晚安书呆子骄傲

2
Concourse允许您针对目标构建服务器执行本地脚本,因此您可以在提交更改之前验证它也可以在远程服务器上正常工作。concourse.ci/fly-cli.html。Jenkins重播功能与此类似,只是它有局限性,您必须先创建一个构建才能重播它。
mdo123 '17

2
您可以看看该项目该项目旨在提供您想要的东西。
罗曼(Romain),

1
看看JenkinsPipelineUnit(github.com/jenkinsci/JenkinsPipelineUnit
user864279

78

我有一个对我来说很好的解决方案。它由在docker中运行的本地jenkins和一个git web钩子组成,以在每次提交时触发本地jenkins中的管道。您不再需要推送到github或bitbucket存储库来测试管道。

这仅在Linux环境中进行了测试。

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

这就是你所需要的

  • Docker已安装并正常工作。这不是本指令的一部分。
  • 一个在docker本地运行的Jenkins。下面解释如何。
    • 您的本地Jenkins码头用户从您的本地git存储库中提取的正确权限(ssh访问密钥)。 下面解释如何。
    • 一个Jenkins管道项目,它从您本地的git存储库中提取。解释如下。
    • 本地Jenkins中的git用户,权限最少。解释如下。
  • 一个带有提交后Web挂钩的git项目,该挂钩会触发管道项目。解释如下。

这就是你的做法

詹金斯·泊克(Jenkins Docker)

创建一个名为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

建立local_jenkins图片

您只需要执行一次,或在向Dockerfile添加一些内容后执行此操作。

$ docker build -t local_jenkins /opt/docker/jenkins/

启动并重新启动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

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

要启动或重新启动您的詹金斯,只需键入:

$ localjenkinsrestart

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

在docker jenkins中创建ssh访问密钥

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

$ localjenkinsrestart
$ docker exec -it jenkins /bin/bash

现在,您已经进入了docker容器,您可以jenkins@e7b23bad10aa:/$在终端中看到类似的内容。@之后的哈希肯定会有所不同。

创建密钥

jenkins@e7b23bad10aa:/$ ssh-keygen

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

将密钥复制到您的计算机。您应该怀疑从Docker容器中的计算机为172.17.0.1。

jenkins@e7b23bad10aa:/$ ssh-copy-id user@172.17.0.1

用户=您的用户名,172.17.0.1是docker容器中计算机的IP地址。

此时,您将必须输入密码。

现在,让我们尝试通过从Docker容器中向计算机SSH来完成循环。

jenkins@e7b23bad10aa:/$ ssh user@172.17.0.1

这次您不需要输入密码。如果这样做,则出了点问题,您必须重试。

您现在将位于计算机的主文件夹中。尝试ls看看。

不要停在这里,因为我们有一连串的ssh shell,我们需要从中退出。

$ exit
jenkins@e7b23bad10aa:/$ exit

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

安装您的詹金斯

您将在浏览器中的http:// localhost:8787中找到本地的Jenkins 。

第一次将浏览器指向本地Jenkins时,您将获得安装向导的帮助。默认值很好,但是请确保在安装过程中安装管道插件。

设置您的詹金斯

http:// localhost:8787 / configureSecurity上激活基于矩阵的安全性并通过将自己添加到矩阵中并勾选所有框来赋予自己所有权利,这一点非常重要(在最右边有一个全选框图标)

  • 选择Jenkins’ own user database作为安全领域
  • Matrix-based security在授权部分中选择
  • 在字段中输入您的用户名,User/group to add:然后单击[ Add ]按钮
  • 在上方的表格中,您的用户名旁边应会弹出一个带有人形图标的用户名。如果交叉,则您输入的用户名错误。
  • 转到表格的最右边,然后单击全选按钮,或手动对行中的所有框进行勾选。
  • 请确认Prevent Cross Site Request Forgery exploits未选中该复选框。(由于只能从您的计算机访问此詹金斯,所以这没什么大不了的)
  • 单击[ 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 Item在Jenkins菜单中单击
  • 命名项目 hookpipeline
  • 点击管道
  • 请点击 [ OK ]
  • 选中“ Poll SCM构建触发器”部分中的复选框。将时间表保留为空。
  • 在管道部分中:
    • 选择 Pipeline script from SCM
    • Repository URL字段中输入user@172.17.0.1:projects/project/.git
    • Script Path字段中输入Jenkinsfile
  • 保存hookpipeline项目
  • 手动构建一次挂钩管道,这是轮询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"

使此文件可执行:

$ chmod +x /home/user/projects/project/.git/hooks/post-commit

测试提交后的钩子:

$ /home/user/projects/project/.git/hooks/post-commit

签入Jenkins,是否触发了hookpipeline项目。

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

快乐的时光!


我不得不替换为docker build -t local_jenkins /opt/docker/jenkins/Dockerfiledocker build -t local_jenkins /opt/docker/jenkins因为Docker抱怨“无法准备上下文:上下文必须是目录”。
Etienne Neveu

1
我在Mac中收到此错误。有人可以帮我吗?>>错误:ssh:连接到主机172.17.0.1端口22:连接被拒绝–
Manoj Shrestha

@ManojShrestha:IP 172.17.0.1是运行Docker容器的计算机的默认IP。您可以改用您的计算机(MAC:s)ip。
javabeangrinder

@ManojShrestha:您也可以尝试查找设置的网关IP,如下所示: $ docker inspect jenkins | grep Gateway
javabeangrinder

2
如果您的Docker主机安装在macOS上,并且您希望从Docker容器内通过ssh登录到该主机,则应 ssh user@docker.for.mac.localhost 代替使用IP地址。还要确保从macOs系统偏好设置->共享文件夹菜单中启用了远程登录功能
Paolo Angioletti,

60

TL; DR

长版
Jenkins管道测试变得越来越痛苦。不像经典声明式作业配置方法不同,用户只能将用户界面限制在UI所公开的范围内,而新的Jenkins Pipeline是一种完整的编程语言,用于将声明部分与自己的代码混合在一起的构建过程。作为优秀的开发人员,我们也希望对此类代码进行一些单元测试。

开发Jenkins Pipelines时应遵循三个步骤。在步骤1中应涵盖的用途的情况下的80%。

  1. 在构建脚本(例如Maven,Gradle,Gulp等)中进行尽可能多的操作。然后在管道脚本中以正确的顺序调用构建任务。构建管道仅编排并执行构建任务,但没有任何需要特殊测试的主要逻辑。
  2. 如果以前的规则无法完全应用,请移至“ 管道共享”库,您可以在其中自行开发和测试自定义逻辑,然后将其集成到管道中。
  3. 如果以上所有方法均使您失败,则可以尝试使用最近出现的那些库之一(2017年3月)。Jenkins管道单元测试框架pipelineUnit(示例)。自2018年以来,还有Jenkinsfile Runner,这是一个从命令行工具执行Jenkins管道的软件包。

例子

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


1
您还可以对这两个库进行简要比较吗?
索林

23

Jenkins具有“重播”功能,使您可以快速重播作业而无需更新源:

重播功能


1
请注意,它显示在构建页面上,而不是项目页面或分支页面上。
ArtOfWarfare

17

在编写Blue Ocean插件时(截至2017年7月),您可以直接在可视管道编辑器中检查声明性管道的语法。当您仅对github项目单击“配置”时,该编辑器将在Blue Ocean UI中工作(这是一个已知问题,他们正在努力使其也可以在git等上使用)。

但是,如该问题所述,您可以打开编辑器浏览至:

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

然后单击页面中间的,然后按Ctrl+S,这将打开一个文本区域,您可以在其中粘贴管道声明性脚本。当您单击Update时,如果存在语法错误,编辑器将让您知道语法错误在哪里。像此屏幕截图所示:

作为快速测试,我错误地键入了“ stepps”而不是“ steps”

如果没有语法错误,则文本区域将关闭,并且页面将可视化您的管道。不用担心它不会保存任何内容(如果是github项目,它将提交Jenkinsfile更改)。

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


2
这是因为截至2017年,Jenkins仍致力于解决点击软件工程师的问题;)....至少Atom拥有不错的Groovy linter。只是Groovy,但有帮助。
索林

具有语法高亮显示的编辑器也是经典jenkins UI的一部分。
Vadimo

6

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


没有冒犯,但是除非您不断更新自己的内容,否则它会变得毫无用处,因为管道语法目前处于不断变化的状态。
克拉德(Krad)

不采取。从到目前为止我所看到的,管道语法,它已经基本标准化了基本的管道步骤(jenkins.io/doc/pipeline/steps/workflow-basic-steps)。我现在已经使用了大约2年,没有遇到任何向后不兼容的更改。不应使用Jenkins插件恕我直言,可以使用共享库中的自定义命令来抽象化不断变化的API,在该库中您将获得API保证。如果您在谈论声​​明性语法,那可能是对的。我在管道中仅使用编程API,这就是Jenny支持的。坚如磐石:)
bogdan.mustiata

5

据我所知,此管道插件是新Jenkinsfile机制的“引擎”,因此非常肯定的是,您可以使用它来本地测试脚本。

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

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


5

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

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
这只是我一直在寻找的东西-不幸的是,它仅适用于声明性管道,而不适用于脚本管道:(
thom_nic

2

除了其他人已经提到过的“重播”功能(同上它的用处!)之外,我发现以下内容也很有用:

  1. 创建一个测试管道作业,您可以在其中输入管道代码或指向Jenkinsfile的存储库/分支以快速测试某些内容。为了进行更准确的测试,请使用指向您自己的fork的多分支管道,您可以在其中快速进行更改和提交而不影响产品。BRANCH_NAME env之类的内容仅在Multibranch中可用。
  2. 由于Jenkinsfile是Groovy代码,因此只需使用“ groovy Jenkinsfile”调用它即可验证基本语法。

使用可以隐藏而不会使用户感到困惑的单独作业是最重要的事情之一。我使用IntelliJ编辑Jenkins文件。它非常擅长显示语法错误。但是,回复按钮是关键。我创建一个带有基本更改运行的分支-通常会出错。然后,我编辑Jenkinsfile并将其复制并粘贴到“重播”窗口中,然后再次运行-重复此操作直到其正常运行,然后提交工作版本。
约翰·约翰逊

1

将您的SSH密钥放入您的Jenkins个人资料中,然后按如下所示使用声明式linter

ssh jenkins.hostname.here declarative-linter < Jenkinsfile

这将对您的Jenkinsfile进行静态分析。在您选择的编辑器中,定义自动运行该命令的键盘快捷键。在我使用的Visual Studio Code中,转到“任务”>“配置任务”,然后使用以下JSON创建Validate Jenkinsfile命令:

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Validate Jenkinsfile",
      "type": "shell",
      "command": "ssh jenkins.hostname declarative-linter < ${file}"
    }
  ]
}

0

我正在使用replay future,进行一些更新并快速运行。


1
您能否提供更多有关如何进行此工作的信息?
kosnik,

1
我使用Bit-bucket作为源代码管理器,然后我在Jenkins上创建了一个项目,希望自动发现我的存储库,我推荐这篇文章。每次按下我的仓库后,Jenkins都会自动播放我的Jenkins文件,如果失败,则在左侧菜单上有一个名为Replay的按钮,==>此按钮打开一个包含Jenkins文件的编辑器,您可以对其进行编辑并重播该作业,
AhmedDrira '18

0

有一些限制,对于脚本化管道,我使用以下解决方案:

  1. 具有嵌入式groovy脚本的管道作业:

node('master') {
    stage('Run!') {
                def script = load('...you job file...')
    }
}

  1. 用于测试的Jenkinsfile与lesfurets具有相同的结构:

def execute() {
 ... main job code here ...
}
execute()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.