Answers:
您不能在本地执行Pipeline脚本,因为它的全部目的是编写Jenkins脚本。(这就是为什么最好使您的文章Jenkinsfile
简短而仅限于实际处理Jenkins功能的代码的原因之一;您的实际构建逻辑应由外部过程或构建工具处理,您可以通过一行sh
或bat
一步来调用它。)
如果您想测试更改Jenkinsfile
但不提交,请使用1.14中添加的重播功能
JENKINS-33925跟踪自动化测试框架的需求。
我有一个对我来说很好的解决方案。它由在docker中运行的本地jenkins和一个git web钩子组成,以在每次提交时触发本地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/
启动并重新启动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。仅仅看到和建立工作就足够了。因此,我们创建了一个名为git
password 的用户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
转到/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/Dockerfile
,docker build -t local_jenkins /opt/docker/jenkins
因为Docker抱怨“无法准备上下文:上下文必须是目录”。
$ docker inspect jenkins | grep Gateway
ssh user@docker.for.mac.localhost
代替使用IP地址。还要确保从macOs系统偏好设置->共享文件夹菜单中启用了远程登录功能
TL; DR
长版
Jenkins管道测试变得越来越痛苦。不像经典声明式作业配置方法不同,用户只能将用户界面限制在UI所公开的范围内,而新的Jenkins Pipeline是一种完整的编程语言,用于将声明部分与自己的代码混合在一起的构建过程。作为优秀的开发人员,我们也希望对此类代码进行一些单元测试。
开发Jenkins Pipelines时应遵循三个步骤。在步骤1中应涵盖的用途的情况下的80%。
例子
该pipelineUnit GitHub库包含有关如何使用一些斯波克例子詹金斯管道单元测试框架
在编写Blue Ocean插件时(截至2017年7月),您可以直接在可视管道编辑器中检查声明性管道的语法。当您仅对github项目单击“配置”时,该编辑器将在Blue Ocean UI中工作(这是一个已知问题,他们正在努力使其也可以在git等上使用)。
但是,如该问题所述,您可以打开编辑器浏览至:
[Jenkins URL]/blue/organizations/jenkins/pipeline-editor/
然后单击页面中间的,然后按Ctrl+S
,这将打开一个文本区域,您可以在其中粘贴管道声明性脚本。当您单击Update时,如果存在语法错误,编辑器将让您知道语法错误在哪里。像此屏幕截图所示:
如果没有语法错误,则文本区域将关闭,并且页面将可视化您的管道。不用担心它不会保存任何内容(如果是github项目,它将提交Jenkinsfile更改)。
我是Jenkins的新手,这非常有帮助,没有这个,我不得不多次提交Jenkinsfile,直到它起作用(非常烦人!)。希望这可以帮助。干杯。
晚会晚了一点,但这就是为什么我写jenny
了一些Jenkinsfile核心步骤的小重新实现。(https://github.com/bmustiata/jenny)
在我的开发设置中-缺少合适的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进行的稍微修改的版本
除了其他人已经提到过的“重播”功能(同上它的用处!)之外,我发现以下内容也很有用:
将您的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}"
}
]
}
我正在使用replay future,进行一些更新并快速运行。