在编写jenkins管道时,提交每个新更改以查看它是否有效似乎非常不方便。
是否有一种方法可以在本地执行这些而不提交代码?
在编写jenkins管道时,提交每个新更改以查看它是否有效似乎非常不方便。
是否有一种方法可以在本地执行这些而不提交代码?
据我所知,这个管道插件是新的Jenkinsfile机制的“引擎”,所以我非常肯定你可以用它来本地测试你的脚本。
我不确定是否有任何额外的步骤,当你复制到一个Jenkinsfile,但语法等应该完全相同。
编辑:在“引擎”上找到了参考,检查这个功能描述,最后一段,第一个条目。
您不能在本地执行Pipeline脚本,因为它的全部目的是编写Jenkins脚本。(这就是为什么Jenkins文件最好保持简短,并限制在实际处理Jenkins特性的代码中;你实际的构建逻辑应该通过外部进程或构建工具来处理,你可以通过一行sh或bat步骤调用它们。)
如果你想测试对Jenkinsfile的修改,但不提交,可以使用1.14中添加的Replay功能。
JENKINS-33925跟踪自动测试框架的特性请求。
博士TL;
Jenkins Pipeline单元测试框架 Jenkinsfile跑步
长版本 管道测试越来越让人头疼。不同于经典的声明式作业配置方法(其中用户仅限于UI所公开的内容),新的Jenkins Pipeline是一种用于构建过程的成熟编程语言,您可以将声明式部分与自己的代码混合在一起。作为优秀的开发人员,我们也希望对这类代码进行单元测试。
在开发Jenkins pipeline时,您应该遵循三个步骤。第一步。应该覆盖80%的用例。
Do as much as possible in build scripts (eg. Maven, Gradle, Gulp etc.). Then in your pipeline scripts just calls the build tasks in the right order. The build pipeline just orchestrates and executes the build tasks but does not have any major logic that needs a special testing. If the previous rule can't be fully applied then move over to Pipeline Shared libraries where you can develop and test custom logic on its own and integrate them into the pipeline. If all of the above fails you, you can try one of those libraries that came up recently (March-2017). Jenkins Pipeline Unit testing framework or pipelineUnit (examples). Since 2018 there is also Jenkinsfile Runner, a package to execution Jenkins pipelines from a command line tool.
例子
pipelineUnit GitHub回购包含了一些关于如何使用Jenkins Pipeline Unit测试框架的Spock示例
在我的开发设置中(缺少合适的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/管道模型转换器/验证
上面的命令是对 -a-Declarative-Jenkinsfile-from-the-command-line https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki/Validating- (or-linting)
除了其他人已经提到的重放功能(关于它的有用性也一样!),我发现以下功能也很有用:
创建一个测试管道作业,您可以在其中键入管道代码或指向Jenkinsfile的repo/分支来快速测试一些东西。为了更准确的测试,使用Multibranch Pipeline,它指向你自己的fork,在那里你可以快速做出改变并提交,而不影响proch。 由于Jenkinsfile是Groovy代码,只需使用“Groovy Jenkinsfile”调用它来验证基本语法。
在撰写本文时(2017年7月底),使用Blue Ocean插件,您可以直接在可视化管道编辑器中检查声明式管道的语法。当你点击“配置”时,编辑器从蓝海UI工作,仅用于github项目(这是一个已知的问题,他们正在努力使它也适用于git等)。
但是,正如在这个问题中解释的那样,你可以打开编辑器浏览到:
詹金斯[URL] /蓝色/组织/ Jenkins / pipeline-editor /
然后单击页面中间,并按Ctrl+S,这将打开一个文本区域,您可以在其中粘贴管道声明性脚本。当您单击Update时,如果有语法错误,编辑器将告诉您语法错误在哪里。就像这张截图:
如果没有语法错误,文本区域将关闭,页面将显示您的管道。别担心,它不会保存任何东西(如果它是一个github项目,它会提交Jenkinsfile更改)。
我是Jenkins的新手,这是非常有用的,没有这个,我不得不多次提交一个Jenkins文件,直到它工作(非常讨厌!)希望这能有所帮助。欢呼。
我有一个很适合我的解决办法。它由一个运行在docker中的本地jenkins和一个git web钩子组成,在每次提交时触发本地jenkins中的管道。你不再需要推送到你的github或bitbucket存储库来测试管道。
这只在linux环境中测试过。
这是相当简单的工作,虽然这个指令有点长。大多数步骤都在那里。
这就是你需要的
Docker installed and working. This is not part of this instruction. A Jenkins running in docker locally. Explained how below. The proper rights (ssh access key) for your local Jenkins docker user to pull from your local git repo. Explained how below. A Jenkins pipeline project that pulls from your local git repository. Explained below. A git user in your local Jenkins with minimal rights. Explained below. A git project with a post-commit web hook that triggers the pipeline project. Explained below.
这就是你要做的
詹金斯码头工人
创建一个名为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
这次您应该不需要输入密码了。如果你这样做了,说明出了问题,你必须再试一次。
您现在将在计算机的主文件夹中。试着看一看。
不要在这里停下来,因为我们需要退出一系列ssh shell。
$ exit
jenkins@e7b23bad10aa:/$ exit
没错!现在我们回来了,准备继续。
安装Jenkins
你可以在浏览器http://localhost:8787上找到当地的Jenkins。
当您第一次将浏览器指向本地Jenkins时,您将使用安装向导进行安装。 默认值是可以的,但是要确保在安装过程中安装了管道插件。
设置你的jenkins
非常重要的是,您要在http://localhost:8787/configureSecurity上激活基于安全性的矩阵,并通过将自己添加到矩阵并勾选所有方框来赋予自己所有权限。(在最右边有一个打勾图标)
Select Jenkins’ own user database as the Security Realm Select Matrix-based security in the Authorization section Write your username in the field User/group to add: and click on the [ Add ] button In the table above your username should pop up with a people icon next to it. If it is crossed over you typed your username incorrectly. Go to the far right of the table and click on the tick-all-button or manually tick all the boxes in your row. Please verify that the checkbox Prevent Cross Site Request Forgery exploits is unchecked. (Since this Jenkins is only reachable from your computer this isn't such a big deal) Click on [ Save ] and log out of Jenkins and in again just to make sure it works. If it doesn't you have to start over from the beginning and emptying the /opt/docker/jenkins/jenkins_home folder before restarting
添加git用户
我们需要允许我们的git钩子以最小的权限登录到我们的本地Jenkins。只要看到并创造就业机会就足够了。因此,我们创建了一个名为git的密码登录用户。
将浏览器指向http://localhost:8787/securityRealm/addUser,并添加git作为用户名,login作为密码。 单击[创建用户]。
增加git用户的权限
在浏览器中转到http://localhost:8787/configureSecurity页面。将git用户添加到矩阵中:
在User/group字段中写入git,然后点击[add]
现在是时候检查git用户的最小权限了。只需要这些:
总体:阅读 工作:构建 工作:发现 工作:阅读
确保“防止跨站点请求伪造攻击”复选框未选中,然后单击[保存]
创建管道项目
我们假设我们的用户名是user,我们启用git的项目名为project,位于/home/user/projects/project
在你的http://localhost:8787 Jenkins中添加一个新的管道项目。我将其命名为hookpipeline以供参考。
点击Jenkins菜单中的New Item 命名项目钩子管道 点击管道 点击[确定] 勾选“生成触发器”部分中的“Poll SCM”复选框。将时间表保留为空。 在管道部分: 从SCM中选择Pipeline脚本 在Repository URL字段中输入user@172.17.0.1:projects/project/.git 在脚本路径字段中输入Jenkinsfile 保存钩子管道项目 手动构建钩子管道一次,这是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配置文件,然后使用声明式linter,如下所示:
ssh jenkins.hostname.here declarative-linter < 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}"
}
]
}
有点晚了,但这就是为什么我写了jenny,一个小的重新实现一些核心的Jenkinsfile步骤。(https://github.com/bmustiata/jenny)
有一些限制,对于脚本管道,我使用这个解决方案:
使用内联groovy脚本的管道作业:
node('master') {
stage('Run!') {
def script = load('...you job file...')
}
}
用于测试的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作业。 从SCM和Git中选择SCM选项的Definition as Pipeline脚本。 将项目的git repo链接粘贴到Repository URL中,并将Jenkinsfile粘贴到脚本名称框中。 然后单击轻量级签出选项并保存项目。 因此,无论何时将commit推到git repo,您都可以在Jenkins中运行Build Now测试更改。
请按照以下视觉效果中的说明轻松设置Jenkins Pipeline的工作。
您可以验证您的管道以找出语法问题。Jenkins有很好的用于Jenkisfile验证的API - https://jenkins_url/pipeline-model-converter/validate
使用curl并传递.Jenkinsfile,您将立即得到语法检查
curl --user username:password -X POST -F "jenkinsfile=<jenkinsfile" https://jenkins_url/pipeline-model-converter/validate
您可以将此工作流添加到编辑器:
VS代码 崇高的文本
这是一个简短的解决方案,可以让我非常快速地测试管道代码:
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
skipDefaultCheckout为true,因为我们不需要这个工具git存储库中的文件。 defaultValue:参数。SCRIPT将默认值设置为最近一次执行。如果只有一个用户使用,它允许非常快速的短测试周期。 给定的脚本被写入一个文件,并加载和加载。
有了这个设置,我可以在其他jenkins文件中测试我能做的所有事情,包括使用共享库。
使用VS Code Jenkins Jack扩展,你可以在不使用git推送的情况下测试你的Jenkins文件,从你的本地文件到本地或远程运行的Jenkins。你将在VS Code中有作业的运行日志,能够在Jenkins中创建作业和更多的工作人员。我希望这有助于更多的人寻找一种方法来开发詹金斯档案。