当编写jenkins管道时,提交每个新的更改以查看其是否有效似乎非常不方便。
有没有办法在不提交代码的情况下在本地执行这些操作?
TL;DR
Long Version
JenkinsPipeline测试变得越来越痛苦。与经典的声明性作业配置方法不同,用户仅限于UI公开的新JenkinsPipeline是一种成熟的编程语言,用于构建过程,您可以将声明性部分与自己的代码混合在一起。作为优秀的开发人员,我们也希望对这种代码进行一些单元测试。
在开发Jenkins管道时,您应该遵循三个步骤。步骤1.应涵盖80%的用例。
例子
pipelineUnit GitHub repo包含一些关于如何使用Jenkins管道单元测试框架的Spock示例
我有一个适合我的解决方案,它包括一个在docker中运行的本地jenkins和一个git web钩子,用于在每次提交时触发本地Jenkin中的管道。您不再需要推送到github或bitbucket存储库来测试管道。
这仅在Linux环境中进行了测试。
尽管这个指令有点长,但是完成这个工作还是相当简单的。大多数步骤都在那里。
创建一个名为Dockerfile的文件来代替您的选择。我将它放在<code>/opt/docker/jenkins/Dockerfile</code>中,并用以下内容填充:
FROM jenkins/jenkins:lts
USER root
RUN apt-get -y update && apt-get -y upgrade
# Your needed installations goes here
USER jenkins
构建local_jenkins映像
您只需要执行一次操作,或者在向 Docker 文件添加内容后执行此操作。
$ docker build -t local_jenkins /opt/docker/jenkins/
启动并重新启动local_jenkins
时不时你想启动和重启詹金斯容易。例如,重新启动机器后。为此,我在< code >中创建了一个别名。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
请确保< code >/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
在所有问题上按回车键,直到得到提示
将密钥复制到您的计算机。从 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外壳需要摆脱。
$ exit
jenkins@e7b23bad10aa:/$ exit
没错。现在我们回来了,准备继续。
安装您的Jenkins
您将在浏览器中找到您的本地Jenkins,网址为http://localhost:8787。
第一次将浏览器指向本地 Jenkins 时,您将通过安装向导获得好评。默认值很好,但请确保在设置过程中安装管道插件。
设置您的jenkins
非常重要的是,您要在http://localhost:8787/configureSecurity上激活基于矩阵的安全性,并通过将自己添加到矩阵并勾选所有框来赋予自己所有权限。(最右边有一个勾选所有框的图标)
添加 git 用户
我们需要允许我们的git钩子以最少的权限登录到我们的本地Jenkins。仅仅查看和构建作业就足够了。因此,我们创建了一个名为git
的用户,密码为login
。
将浏览器定向到http://localhost:8787/security realm/addUser,添加< code>git作为用户名,添加< code>login作为密码。点击<代码>[创建用户] 。
向git用户添加权限
转到浏览器中的http://localhost:8787/configureSecurity页面。将git用户添加到矩阵中:
用户/组中编写git
以添加:
并单击[添加]
现在是时候检查git用户的最小权限了。只需要这些:
确保<code>防止跨站点请求伪造漏洞
我们假设我们有用户名用户
,并且我们的 git 启用的项目,其中包含 Jenkinsfile
,称为项目
,位于 /home/user/projects/project
在您的http://localhost:8787 Jenkins中添加一个新的管道项目。我把它命名为hookpipeline作为参考。
New Item
钩子管道
[OK]
Poll SCM
中打勾。将计划留空。管道脚本 - 在
Repository URL
字段中输入user@172.17.0.1:项目/项目/. git
- 在
Script Path
字段中输入Jenkinsfile
转到
/home/user/project/project/. git/hooks
文件夹并创建一个名为post-审视
的文件,其中包含以下内容:
#!/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中的管道。
快乐的日子!
您不能在本地执行 Pipeline 脚本,因为它的整个目的是编写 Jenkins 的脚本。(这就是为什么最好保持 Jenkinsfile
简短并限制在实际处理 Jenkins 功能的代码中的原因之一;您的实际构建逻辑应使用外部进程或构建工具进行处理,这些工具通过单行 sh
或 bat
步骤调用。
如果您想测试对Jenkinsfile
的更改,但不提交,请使用1.14中添加的重播功能
JENKINS-33925跟踪自动化测试框架的期望值。
问题内容: 在编写jenkins管道时,提交每个新更改以查看其是否有效似乎非常不便。 是否可以在不提交代码的情况下在本地执行这些操作? 问题答案: 您不能在本地执行Pipeline脚本,因为它的全部目的是编写Jenkins脚本。(这就是为什么最好使您的文章简短且仅限于实际处理Jenkins功能的代码的原因之一;您的实际构建逻辑应由您通过一行或一步调用的外部流程或构建工具来处理。) 如果您想测试更改
我正在使用DynamoDB local进行单元测试。这并不坏,但也有一些缺点。明确地: 在测试运行之前,您必须以某种方式启动服务器 服务器在每次测试之前不会启动和停止,因此测试会变得相互依赖,除非在每次测试之后添加代码删除所有表等 所有开发者都需要安装它 我想做的是把DynamoDB本地jar和它所依赖的其他jar放在我的目录中(我用Java写)。然后在每次测试之前,我会启动它,用运行,测试结束后
问题内容: 我有一个使用node.js express开发的移动应用程序后端。我尝试将其部署为lambda服务。为此,我创建了一个无服务器框架项目(https://github.com/serverless)。以前,我通过启动快速后端应用程序在本地测试了移动应用程序。现在,我找不到没有本地后端就可以在本地测试我的移动应用程序的方法。命令只在我调用一次后运行。 有什么方法可以将lambda函数作为W
如果我在a[n]中有一个数组
我有一张
我试图在app engine中使用google云endpoint编写一些代码,我也注册了受信任的测试程序,但我的请求仍然悬而未决,因此据我所知,只有当endpoint托管在appspot域中时,我才能访问这些endpoint,所以有没有办法在本地使用这些endpoint,以便我可以继续开发,直到我的请求被考虑作为受信任的测试程序使用云endpoint?