如何在本地测试对詹金斯文件所做的更改?

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

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

187365 次浏览

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

我不确定是否有任何额外的步骤,当你复制到一个Jenkinsfile,但语法等应该完全相同。

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

您不能在本地执行Pipeline脚本,因为它的全部目的是编写Jenkins脚本。(这就是为什么最好让你的Jenkinsfile保持简短,并限制在实际处理Jenkins特性的代码中;你实际的构建逻辑应该由外部进程或构建工具来处理,你可以通过一行shbat步骤调用它们。)

如果你想测试对Jenkinsfile的更改,但没有提交,请使用1.14中添加的Replay特性

詹金斯- 33925跟踪自动测试框架的特性请求。

博士TL;

< p > 长版本 < br > 管道测试越来越让人头疼。与经典声明式作业配置方法不同,在这种方法中,用户仅限于UI所暴露的内容,新的Jenkins Pipeline是一种用于构建过程的成熟编程语言,您可以将声明式部分与自己的代码混合在一起。作为优秀的开发人员,我们也希望对这类代码进行单元测试。< / p >

在开发Jenkins pipeline时,您应该遵循三个步骤。步骤1。应该覆盖80%的用例。

  1. 在构建脚本中做尽可能多的工作(例如;Maven, Gradle, Gulp等)。然后在管道脚本中按正确的顺序调用构建任务。构建管道只是编排和执行构建任务,但没有任何需要特殊测试的主要逻辑。
  2. 如果前面的规则不能完全应用,那么转移到共享库,在那里你可以自己开发和测试自定义逻辑,并将它们集成到管道中。
  3. 如果以上所有方法都不适合你,你可以尝试最近(2017年3月)出现的这些库之一。Jenkins Pipeline单元测试框架pipelineUnit(示例)。自2018年起,还有Jenkinsfile跑步,一个从命令行工具执行Jenkins管道的包。

例子

pipelineUnit GitHub回购包含一些关于如何使用Jenkins Pipeline单元测试框架的Spock示例

在我的开发设置中——缺少一个合适的Groovy编辑器——大量的詹金斯文件问题源于简单的语法错误。为了解决这个问题,你可以对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

以上命令是对 -a-Declarative-Jenkinsfile-from-the-command-line https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki/Validating- (or-linting) < / p >

除了其他人已经提到的重放功能(关于它的有用性也一样!),我发现以下功能也很有用:

  1. 创建一个测试管道作业,您可以在其中键入管道代码或指向Jenkinsfile的repo/分支来快速测试一些东西。为了更准确的测试,使用Multibranch Pipeline,它指向你自己的fork,在那里你可以快速做出改变并提交,而不影响proch。
  2. 由于Jenkinsfile是Groovy代码,只需使用“Groovy Jenkinsfile”调用它来验证基本语法。

在使用蓝色的海洋插件编写(2017年7月底)时,您可以直接在可视化管道编辑器中检查声明性管道的语法。编辑器,从蓝海UI工作时,你点击“配置”仅为github项目(这是一个已知的问题,他们正在努力使它也工作在git等)。

但是,正如这个问题中解释的那样,你可以打开编辑器浏览到:

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

然后单击页面中间,并按Ctrl+S,这将打开一个文本区域,您可以在其中粘贴管道声明性脚本。当你点击更新时,如果有语法错误,编辑器会让你知道语法错误在哪里。就像这张截图:

作为一个快速测试,我错误地键入 < / >

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

我是Jenkins的新手,这是非常有用的,没有这个,我不得不多次提交一个Jenkins文件,直到它工作(非常讨厌!)希望这能有所帮助。欢呼。

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

这只在linux环境中测试过。

这是相当简单的工作,虽然这个指令有点长。大多数步骤都在那里。

这就是你需要的

  • 码头工人安装和工作。这不是指令的一部分。
  • 一个詹金斯在码头附近跑。解释如下。
    • 本地Jenkins docker用户从本地git回购中提取的适当权限(ssh访问密钥)。解释如下。
    • 从本地git存储库中提取的Jenkins管道项目。下面的解释。
    • 在本地Jenkins中拥有最小权限的git用户。下面的解释。
    • 李< / ul > < / >
    • 一个git项目,带有一个触发管道项目的提交后web钩子。下面的解释。

    这就是你要做的

    詹金斯码头工人

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

    不时地你想启动和重启詹金斯容易。例如,在重新启动机器后。为此,我创建了一个别名,并将其放在我的主文件夹中的.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文件夹存在,并且你对它有用户读写权限。

    要启动或重启jenkins,只需输入:

    $ 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
    

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

    这时您必须输入密码。

    现在,让我们尝试从docker容器内通过ssh连接到您的计算机来完成循环。

    jenkins@e7b23bad10aa:/$ ssh user@172.17.0.1
    

    这次您应该不需要输入密码了。如果你这样做了,说明出了问题,你必须再试一次。

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

    不要在这里停下来,因为我们需要退出一系列ssh shell。

    $ exit
    jenkins@e7b23bad10aa:/$ exit
    

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

    安装Jenkins

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

    当你第一次将浏览器指向本地Jenkins时,你将会使用安装向导。 默认值是可以的,但是要确保在安装过程中安装了管道插件。< / p >

    设置你的jenkins

    它是非常重要的,您通过将自己添加到矩阵并勾选所有方框来激活基于http://localhost:8787/configureSecurity给自己所有的权利的安全性矩阵。(在最右边有一个打勾图标)

    • 选择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钩子以最小的权限登录到我们的本地Jenkins。只要看到并创造就业机会就足够了。因此,我们创建了一个名为git的用户,密码为login

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

    增加git用户的权限

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

    • User/group to add:字段中写入git,然后单击[ Add ]

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

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

    确保未选中Prevent Cross Site Request Forgery exploits复选框,然后单击[ Save ]

    创建管道项目

    我们假设我们的用户名是user,我们启用git的项目中有Jenkinsfile,叫做project,位于/home/user/projects/project

    在你的http://localhost:8787 Jenkins中添加一个新的管道项目。我将其命名为hookpipeline以供参考。

    • 在Jenkins菜单中单击New Item
    • 将项目命名为hookpipeline
    • 点击管道
    • 单击[ OK ]
    • 在Build Triggers部分中勾选复选框Poll SCM。将时间表保留为空。
    • 在Pipeline部分:
      • 选择Pipeline script from SCM
      • Repository URL字段输入user@172.17.0.1:projects/project/.git
      • Script Path字段输入Jenkinsfile
      • 李< / ul > < / >
      • 保存钩子管道项目
      • 手动构建钩子管道一次,这是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"
      

      使这个文件可执行:

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

      测试后提交钩子:

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

      通知詹金斯你的钩子管道项目是否被触发。

      最后对你的项目做一些随意的改变,添加这些改变并提交。这将触发本地Jenkins的管道。

      快乐的日子!

将SSH密钥放入Jenkins配置文件中,然后使用声明式短绒,如下所示:

ssh jenkins.hostname.here declarative-linter < Jenkinsfile

这将对你的詹金斯档案进行静态分析。在您选择的编辑器中,定义一个自动运行该命令的键盘快捷方式。在Visual Studio Code中,这是我使用的,转到任务>配置任务,然后使用以下JSON创建验证Jenkinsfile命令:

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

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

我使用重放未来,做一些更新和运行迅速。

Jenkins有一个“重放”功能,它可以让你快速重放作业而不更新源:

Replay feature

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

  1. 使用内联groovy脚本的管道作业:

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

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

def execute() {
... main job code here ...
}
execute()

为了简单起见,您可以在git存储库的根目录下创建一个Jenkinsfile,类似于下面基于声明性管道的groovy语法的示例'Jenkinsfile'。

pipeline {


agent any


stages {
stage('Build the Project') {
steps {
git 'https://github.com/jaikrgupta/CarthageAPI-1.0.git'
echo pwd()
sh 'ls -alrt'
sh 'pip install -r requirements.txt'
sh 'python app.py &'
echo "Build stage gets finished here"
}
}
stage('Test') {
steps {
sh 'chmod 777 ./scripts/test-script.sh'
sh './scripts/test-script.sh'
sh 'cat ./test-reports/test_script.log'
echo "Test stage gets finished here"
}
}
}

https://github.com/jaikrgupta/CarthageAPI-1.0.git

您现在可以在Jenkins中将一个新项目设置为Pipeline作业。 选择Definition作为Pipeline script from SCMGit作为SCM选项。 将项目的git repo链接粘贴到Repository URL中,并将Jenkinsfile粘贴到脚本名称框中。 然后单击lightweight checkout选项并保存项目。 因此,无论何时你将一个提交推到git回购,你总是可以在Jenkins中每次运行Build Now测试更改

请按照以下视觉效果中的说明轻松设置Jenkins Pipeline的工作。

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

您可以验证您的管道以找出语法问题。Jenkins为Jenkisfile验证 - https://jenkins_url/pipeline-model-converter/validate提供了很好的API

使用curl并传递.Jenkinsfile,您将立即得到语法检查

curl --user username:password -X POST -F "jenkinsfile=<jenkinsfile" https://jenkins_url/pipeline-model-converter/validate

您可以将此工作流添加到编辑器:

这是一个简短的解决方案,可以让我非常快速地测试管道代码:

pipeline {
agent any
options {
skipDefaultCheckout true
timestamps()
}
parameters {
text(name: 'SCRIPT', defaultValue: params.SCRIPT,
description: 'Groovy script')
}
stages {
stage("main") {
steps {
script {
writeFile file: 'script.groovy',
text: params.SCRIPT
def groovyScript = load 'script.groovy'
echo "Return value: " + groovyScript
}
} // steps
} // stage
} // stages
} // pipeline
  1. skipDefaultCheckout true,因为我们不需要这个工具git存储库中的文件。
  2. defaultValue: params.SCRIPT将默认值设置为最近一次执行。如果只有一个用户使用,它允许非常快速的短测试周期。
  3. 给定的脚本被写入一个文件,并用load加载。

有了这个设置,我可以在其他jenkins文件中测试一切,包括使用共享库。

使用VS Code 詹金斯杰克扩展,你可以在不使用git推送的情况下测试你的Jenkins文件,从你的本地文件到本地或远程运行的Jenkins。你将在VS Code中有作业的运行日志,能够在Jenkins中创建作业和更多的工作人员。我希望这有助于更多的人寻找一种方法来开发詹金斯档案。