当前位置: 首页 > 知识库问答 >
问题:

如何在本地测试对Jenkinsfile所做的更改?

赫连泰宁
2023-03-14

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

有没有办法在不提交代码的情况下在本地执行这些操作?

共有3个答案

姚雅珺
2023-03-14

TL;DR

  • Jenkins管道单元测试框架
  • Jenkinsfile Runner

Long Version
JenkinsPipeline测试变得越来越痛苦。与经典的声明性作业配置方法不同,用户仅限于UI公开的新JenkinsPipeline是一种成熟的编程语言,用于构建过程,您可以将声明性部分与自己的代码混合在一起。作为优秀的开发人员,我们也希望对这种代码进行一些单元测试。

在开发Jenkins管道时,您应该遵循三个步骤。步骤1.应涵盖80%的用例。

  1. 在构建脚本中尽可能多地做(例如。Maven, Gradle, Gulp 等)。然后在管道脚本中,只需按正确的顺序调用生成任务即可。生成管道仅协调和执行生成任务,但没有任何需要特殊测试的主要逻辑。
  2. 如果无法完全应用前面的规则,请转到管道共享库,您可以在其中自行开发和测试自定义逻辑,并将其集成到管道中。
  3. 如果上述所有方法都失败了,您可以尝试最近(2017年3月)出现的那些库之一。Jenkins Pipeline Unit testing framework 或 pipelineUnit(示例)。自2018年以来,还有Jenkinsfile Runner,这是一个从命令行工具执行Jenkins管道的包。

例子

pipelineUnit GitHub repo包含一些关于如何使用Jenkins管道单元测试框架的Spock示例

郎宏浚
2023-03-14

我有一个适合我的解决方案,它包括一个在docker中运行的本地jenkins和一个git web钩子,用于在每次提交时触发本地Jenkin中的管道。您不再需要推送到github或bitbucket存储库来测试管道。

这仅在Linux环境中进行了测试。

尽管这个指令有点长,但是完成这个工作还是相当简单的。大多数步骤都在那里。

  • Docker已安装并正常工作。这不是此指令的一部分。
  • 在docker本地运行的Jenkins。
    • 本地Jenkinsdocker用户从本地git存储库中提取的正确权限(ssh访问密钥)。下面解释了如何操作。
    • 从本地git存储库中提取的Jenkins管道项目。解释如下。
    • 本地Jenkins中具有最小权限的git用户。解释如下。

    创建一个名为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上激活基于矩阵的安全性,并通过将自己添加到矩阵并勾选所有框来赋予自己所有权限。(最右边有一个勾选所有框的图标)

      < li >选择< code>Jenkins自己的用户数据库作为安全领域 < li >在授权部分选择< code >基于矩阵的安全性 < li >在< code >要添加的用户/组:字段中输入您的用户名,然后单击< code>[添加]按钮 < li >在上面的表格中,您的用户名旁边应该会弹出一个人物图标。如果它是交叉的,你输入了错误的用户名。 < li >转到表格的最右侧并单击勾选所有按钮或手动勾选您所在行中的所有复选框。 < li >请确认< code >防止跨站点请求伪造漏洞复选框未被选中。(因为只有通过您的计算机才能联系到Jenkins,所以这没什么大不了的) < li >单击< code>[保存]并注销Jenkins,然后再次登录以确保其正常工作。如果没有,您必须从头开始,并在重新启动之前清空< code >/opt/docker/Jenkins/Jenkins _ home 文件夹

    添加 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作为参考。

    • 点击Jenkins菜单中的New Item
    • 将项目命名为钩子管道
    • 点击管道
    • 点击[OK]
    • 在构建触发器部分的复选框Poll SCM中打勾。将计划留空。
    • 在管道部分:
      • 从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中的管道。

      快乐的日子!

益兴生
2023-03-14

您不能在本地执行 Pipeline 脚本,因为它的整个目的是编写 Jenkins 的脚本。(这就是为什么最好保持 Jenkinsfile 简短并限制在实际处理 Jenkins 功能的代码中的原因之一;您的实际构建逻辑应使用外部进程或构建工具进行处理,这些工具通过单行 shbat 步骤调用。

如果您想测试对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?