在编写jenkins管道时,为了查看它是否有效,提交每个新更改似乎非常不方便。
有没有办法在不提交代码的情况下在本地执行这些?
您无法在本地执行Pipeline脚本,因为它的全部目的是编写Jenkins脚本。 (这就是为什么最好保持你的Jenkinsfile
简短且限于实际处理Jenkins功能的代码的一个原因;你的实际构建逻辑应该用外部进程处理或构建工具,你通过单行sh
或bat
步骤调用。)
如果您想测试对Jenkinsfile
的更改但没有提交,请使用在1.14中添加的the Replay feature
JENKINS-33925跟踪自动化测试框架的需求。
将SSH密钥放入Jenkins配置文件,然后使用declarative linter,如下所示:
ssh jenkins.hostname.here declarative-linter < Jenkinsfile
这将对您的Jenkinsfile进行静态分析。在您选择的编辑器中,定义一个自动运行该命令的键盘快捷键。在我使用的Visual Studio Code中,转到Tasks> Configure Tasks,然后使用以下JSON创建Validate Jenkinsfile命令:
{
"version": "2.0.0",
"tasks": [
{
"label": "Validate Jenkinsfile",
"type": "shell",
"command": "ssh jenkins.hostname declarative-linter < ${file}"
}
]
}
我正在使用重播的未来,做一些更新并快速运行。
由于一些限制和脚本管道,我使用此解决方案:
node('master') {
stage('Run!') {
def script = load('...you job file...')
}
}
def execute() {
... main job code here ...
}
execute()
我有一个适合我的解决方案。它由一个在docker中运行的本地jenkins和一个git web hook组成,用于在每次提交时触发本地jenkins中的管道。您不再需要推送到github或bitbucket存储库来测试管道。
这只是在linux环境中测试过的。
尽管这条指令有点长,但使这项工作变得相当简单。大多数步骤都在那里。
创建一个名为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/Dockerfile
启动并重新启动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
文件夹存在,并且您具有用户对它的读写权限。
要启动或重新启动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 [email protected]
user =您的用户名和172.17.0.1是Docker容器中计算机的IP地址。
此时您必须输入密码。
现在让我们尝试通过从docker容器中ssh到您的计算机来完成循环。
jenkins@e7b23bad10aa:/$ ssh [email protected]
这次您不需要输入密码。如果你这样做,出了点问题,你必须再试一次。
您现在将在您的计算机主文件夹中。试试ls
,看看吧。
不要停在这里,因为我们有一系列ssh shell,我们需要摆脱它们。
$ exit
jenkins@e7b23bad10aa:/$ exit
对!现在我们回来了,准备继续。
安装你的Jenkins
您可以在http://localhost:8787的浏览器中找到您当地的Jenkins。
第一次将浏览器指向当地的Jenkins时,您将看到安装向导。默认设置很好,但请确保在安装过程中安装管道插件。
设置你的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 hook以最小的权限登录我们的本地Jenkins。只是为了看到和建立工作就足够了。因此,我们创建了一个名为git
的用户,密码为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
hookpipeline
[ OK ]
Poll SCM
。将计划留空。Pipeline script from SCM
在Repository URL
领域进入[email protected]:projects/project/.git
在Script Path
领域进入Jenkinsfile
转到/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
测试post-commit钩子:
$ /home/user/projects/project/.git/hooks/post-commit
如果您的hookpipeline项目被触发,请检查Jenkins。
最后对项目进行一些任意更改,添加更改并执行提交。这将在您当地的Jenkins中触发管道。
快乐的时光!
TL; DR
长版 詹金斯管道测试变得越来越痛苦。与传统的声明性作业配置方法不同,用户仅限于UI公开的内容,新的Jenkins管道是构建过程的完全成熟的编程语言,您可以将声明性部分与您自己的代码混合。作为优秀的开发人员,我们也希望对这种代码进行一些单元测试。
在开发Jenkins管道时,您应该遵循三个步骤。步骤1.应涵盖80%的用例。
例子
pipelineUnit GitHub repo包含一些关于如何使用Jenkins Pipeline Unit testing framework的Spock示例
在撰写(2017年7月底)Blue Ocean插件的那一刻,您可以直接在可视化管道编辑器中检查声明性管道的语法。当您单击“配置”仅用于github项目时,编辑器可以使用Blue Ocean UI(这是一个已知问题,他们正在努力使其在git等上运行)。
但是,正如this question中所解释的,您可以打开编辑器浏览:
[Jenkins URL]/blue/organizations/jenkins/pipeline-editor/
然后单击页面中间,然后按Ctrl+S
,这将打开一个textarea,您可以在其中粘贴管道声明脚本。单击“更新”时,如果存在语法错误,编辑器将通知您语法错误的位置。就像在这个截图中:
如果没有语法错误,textarea将关闭,页面将显示您的管道。不要担心它不会保存任何东西(如果它是一个github项目,它将提交Jenkinsfile更改)。
我是Jenkins的新手,这非常有帮助,没有这个我不得不多次提交一个Jenkins文件,直到它工作(非常烦人!)。希望这可以帮助。干杯。
派对有点晚了,但这就是为什么我写了jenny
,一些核心Jenkinsfile步骤的重新实现。 (https://github.com/bmustiata/jenny)
据我所知,这个Pipeline Plugin是新Jenkinsfile机制的“引擎”,所以我非常肯定你可以使用它来本地测试你的脚本。
我不确定当你将它复制到Jenkins文件时是否需要任何额外的步骤,但是语法等应该完全相同。
编辑:找到关于“引擎”的参考,检查this功能描述,最后一段,第一个条目。
在我的开发设置中 - 缺少一个正确的Groovy编辑器 - 大量的Jenkinsfile问题源于简单的语法错误。要解决此问题,您可以针对Jenkins实例验证Jenkins文件(在$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
除了其他人已经提到的重播功能(同样有用它!),我发现以下内容也很有用: