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

时间:2016-03-30 12:35:59

标签: jenkins jenkins-workflow jenkins-pipeline

在编写jenkins管道时,为了查看它是否有效,提交每个新更改似乎非常不方便。

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

14 个答案:

答案 0 :(得分:91)

您无法在本地执行Pipeline脚本,因为它的全部目的是编写Jenkins脚本。 (这就是为什么最好保持Jenkinsfile简短且仅限于实际处理Jenkins功能的代码的原因之一;您的实际构建逻辑应该使用外部进程或构建工具来处理,您可以通过单行调用shbat步骤。)

如果您想测试更改为Jenkinsfile直播但没有提交,请使用1.14中添加的the Replay feature

JENKINS-33925跟踪自动化测试框架的需求。

答案 1 :(得分:43)

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

这只在linux环境中测试过。

虽然这条指令有点长,但这项工作相当简单。大多数步骤都在那里。

这就是你需要的

  • Docker installed并且正在努力。 这不是本教程的一部分。
  • Jenkins在本地的docker中运行。 解释如下。
    • 本地Jenkins docker用户从本地git仓库中提取的正确权限(ssh访问密钥)。 解释如下。
    • 从本地git存储库中提取的Jenkins管道项目。 在下面解释。
    • 您当地的Jenkins中的git用户拥有最少的权限。 在下面解释。
  • 一个带有提交后Web钩子的git项目,用于触发管道项目。 在下面解释。

你就是这样做的

Jenkins Docker

创建一个名为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

您现在已进入泊坞窗容器,您可以在终端中看到类似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

这次您不需要输入密码。如果你这样做了,那就出错了,你必须再试一次。

您现在将在您的计算机主文件夹中。试试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(因为这个詹金斯只能通过你的电脑访问,这不是什么大不了的事)
  • 点击[ 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,其中包含Jenkinsfile的git启用项目名为project,位于/home/user/projects/project

http://localhost:8787 Jenkins中添加一个新的管道项目。我把它命名为hookpipeline以供参考。

  • 点击Jenkins菜单中的New Item
  • 将项目命名为hookpipeline
  • 点击Pipeline
  • 点击[ OK ]
  • 勾选Build Triggers部分中的复选框Poll SCM。将计划保留为空。
  • 在管道部分:
    • 选择Pipeline script from SCM
    • Repository URL字段中输入user@172.17.0.1:projects/project/.git
    • Script Path字段中输入Jenkinsfile
  • 保存hookpipeline项目
  • 手动构建hookpipeline一次,这是Poll SCM开始工作所必需的。

创建git hook

转到/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的管道。

快乐的日子!

答案 2 :(得分:41)

TL; DR

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

开发Jenkins管道时应遵循三个步骤。 第1步。应涵盖80%的使用案例。

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

    pipelineUnit GitHub repo包含一些Spock示例,介绍如何使用Jenkins Pipeline Unit testing framework

答案 3 :(得分:12)

在使用Blue Ocean插件编写(2017年7月底)时,您可以直接在可视化管道编辑器中检查声明性管道的语法。当您单击&#34;配置&#34;时,编辑器将在Blue Ocean UI中运行。仅适用于 github项目(这是一个已知问题,他们正努力使其在git等上运行)。

但是,如this question中所述,您可以打开编辑器浏览:

[Jenkins URL]/blue/organizations/jenkins/pipeline-editor/

然后在页面中间单击,然后按Ctrl+S,这将打开一个textarea,您可以在其中粘贴管道声明脚本。当您单击更新时,如果存在语法错误,编辑器将通知您语法错误的位置。就像在这个截图中一样:

As a quick test I wrongly typed "stepps" instead of "steps"

如果没有语法错误,textarea将关闭,页面将显示您的管道。不要担心它不会保存任何东西(如果它是一个github项目它将提交Jenkinsfile更改)。

我是Jenkins的新手,这非常有帮助,没有这个我不得不多次提交一个Jenkins文件,直到它工作(非常讨厌!)。希望这可以帮助。欢呼声。

答案 4 :(得分:9)

Jenkins具有“重播”功能,可让您快速重播作业而无需更新源:

Replay feature

答案 5 :(得分:4)

据我所知,Pipeline Plugin是新Jenkinsfile机制的“引擎”,所以我非常肯定你可以用它来本地测试你的脚本。

我不确定将它复制到Jenkins文件时是否还需要任何其他步骤,但语法等应完全相同。

修改:在“引擎”上找到引用,查看this功能说明,最后一段,第一个条目。

答案 6 :(得分:4)

在我的开发设置中 - 缺少一个正确的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

以上命令是稍微修改过的版本 https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki/Validating-(or-linting)-a-Declarative-Jenkinsfile-from-the-command-line

答案 7 :(得分:4)

派对有点晚了,但这就是我编写jenny的原因,这是对Jenkinsfile核心步骤的一个小型重新实现。 (https://github.com/bmustiata/jenny

答案 8 :(得分:1)

除了其他人已经提到的重播功能(同样有用它!),我发现以下内容也很有用:

  1. 创建一个测试管道作业,您可以在其中键入管道代码或指向Jenkins文件的repo /分支以快速测试某些内容。要获得更准确的测试,请使用指向您自己的fork的Multibranch Pipeline,您可以在不影响prod的情况下快速进行更改和提交。像BRANCH_NAME env这样的东西只能在Multibranch中使用。
  2. 由于Jenkinsfile是Groovy代码,只需用&#34; groovy Jenkinsfile&#34;来调用它。验证基本语法。

答案 9 :(得分:0)

我正在使用replay future来进行一些更新并快速运行。

答案 10 :(得分:0)

在某些限制下,对于脚本化管道,我使用以下解决方案:

  1. 具有嵌入式groovy脚本的管道作业:

node('master') {
    stage('Run!') {
                def script = load('...you job file...')
    }
}

  1. 用于测试的Jenkinsfile与lesfurets具有相同的结构:

def execute() {
 ... main job code here ...
}
execute()

答案 11 :(得分:0)

为简单起见,您可以在git信息库的根目录下创建一个Jenkinsfile,类似于下面基于声明式管道的常规语法的示例“ 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中将新项目设置为管道作业。 选择Definition作为Pipeline script from SCM,选择Git作为SCM选项。 将项目的git repo链接粘贴到“存储库URL”中,并将Jenkinsfile粘贴到脚本名称框中。 然后单击lightweight checkout选项并保存项目。 因此,无论何时将提交推送到git repo,您​​都可以始终在Jenkins中每次运行Build Now时测试更改。

请按照以下视觉效果中的说明进行操作,以轻松设置Jenkins Pipeline的工作。

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

答案 12 :(得分:0)

您只需验证您的管道即可找出语法问题。 Jenkis 为 Jenkisfile validation 提供了很好的 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

您可以将此工作流程添加到编辑器:

答案 13 :(得分:-1)

将SSH密钥放入Jenkins配置文件,然后使用declarative linter,如下所示:

ssh jenkins.hostname.here declarative-linter < Jenkinsfile

这将对您的Jenkinsfile进行静态分析。在您选择的编辑器中,定义一个自动运行该命令的键盘快捷键。在我使用的Visual Studio代码中,转到任务&gt;配置任务,然后使用以下JSON创建验证Jenkinsfile 命令:

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Validate Jenkinsfile",
      "type": "shell",
      "command": "ssh jenkins.hostname declarative-linter < ${file}"
    }
  ]
}