如何在本地测试对Jenkins文件所做的更改?

如何在本地测试对Jenkins文件所做的更改?,jenkins,jenkins-workflow,jenkins-pipeline,Jenkins,Jenkins Workflow,Jenkins Pipeline,在编写jenkins管道时,提交每个新更改以查看其是否有效似乎非常不方便 有没有一种方法可以在不提交代码的情况下在本地执行这些脚本?据我所知,这是新Jenkins文件机制的“引擎”,所以我很肯定您可以使用它在本地测试脚本 我不确定当你把它复制到一个Jenkins文件时是否需要任何额外的步骤,但是语法等应该完全相同 编辑:找到“引擎”上的引用,检查功能描述,最后一段,第一个条目。您不能在本地执行管道脚本,因为它的全部目的是为Jenkins编写脚本。(这就是为什么最好保持您的Jenkins文件简短且

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

有没有一种方法可以在不提交代码的情况下在本地执行这些脚本?

据我所知,这是新Jenkins文件机制的“引擎”,所以我很肯定您可以使用它在本地测试脚本

我不确定当你把它复制到一个Jenkins文件时是否需要任何额外的步骤,但是语法等应该完全相同


编辑:找到“引擎”上的引用,检查功能描述,最后一段,第一个条目。

您不能在本地执行管道脚本,因为它的全部目的是为Jenkins编写脚本。(这就是为什么最好保持您的
Jenkins文件
简短且仅限于实际处理Jenkins特性的代码的原因之一;您的实际构建逻辑应该通过外部流程或构建工具来处理,您可以通过一行
sh
bat
步骤来调用这些外部流程或构建工具。)

如果要测试对
Jenkinsfile
live的更改,但不提交,请使用1.14中添加的


跟踪自动化测试框架所需的数据。

TL;DR

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

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

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


    GitHub repo包含了一些Spock示例,介绍了如何在我的开发设置中使用

    ——缺少一个合适的Groovy编辑器——大量文件问题都源于简单的语法错误。要解决此问题,您可以针对Jenkins实例验证Jenkins文件(运行于
    $Jenkins\u HTTP\u URL
    ):


    curl-xpost-H$(curl'$JENKINS\uhttp\uurl/crumbisuer/api/xml?xpath=concat(//crumrequestfield,“:”,//crumb))-F“jenkinsfile=除了其他人已经提到的重播功能(关于它的有用性也是如此!),我发现以下内容也很有用:

  • 创建一个测试管道作业,您可以在其中键入管道代码或指向Jenkins文件的repo/分支以快速测试出某些内容。要进行更精确的测试,请使用指向您自己的分支的多分支管道,您可以在不影响产品的情况下快速进行更改和提交。分支名称env等内容仅在Mult中可用伊布兰奇
  • 由于Jenkinsfile是Groovy代码,只需使用“Groovy Jenkinsfile”调用它即可验证基本语法

  • 在编写(2017年7月底)时,使用该插件,您可以直接在可视化管道编辑器中检查声明性管道的语法。当您仅为github项目单击“配置”时,该编辑器将从蓝海UI工作(这是一个已知的问题,他们正在努力使它在git等上也能工作)

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

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

    然后点击页面中间,按<代码> CTRL+S ,这将打开一个文本框,在那里你可以粘贴一个管道声明脚本。当你点击更新时,如果有语法错误,编辑器会让你知道语法错误在哪里。

    如果没有语法错误,textarea将关闭,页面将可视化您的管道。不要担心它不会保存任何内容(如果是github项目,它将提交Jenkins文件更改)


    我是Jenkins的新手,这对我很有帮助,没有这一点,我不得不多次提交Jenkins文件,直到它能工作(非常讨厌!)。希望这有帮助。干杯。

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

    这只在linux环境中进行了测试

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

    这就是你需要的
    • 和工作。这不是本说明的一部分
    • 一个詹金斯在docker本地运行。解释如下。
      • 本地Jenkins docker用户从本地git repo中提取的适当权限(ssh访问密钥)。下面解释了如何操作
      • 一个Jenkins管道项目,从本地git存储库中提取。解释如下
      • 本地Jenkins中的git用户,具有最低权限。解释如下
    • 一个git项目,带有触发管道项目的提交后web钩子。解释如下
    你就是这样做的 詹金斯码头工人 创建一个名为Dockerfile的文件来代替您的选择
    FROM jenkins/jenkins:lts
    USER root
    RUN apt-get -y update && apt-get -y upgrade
    # Your needed installations goes here
    USER jenkins
    
    $ docker build -t local_jenkins /opt/docker/jenkins/
    
    $ 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
    
    $ localjenkinsrestart
    
    $ localjenkinsrestart
    $ docker exec -it jenkins /bin/bash
    
    jenkins@e7b23bad10aa:/$ ssh-keygen
    
    jenkins@e7b23bad10aa:/$ ssh-copy-id user@172.17.0.1
    
    jenkins@e7b23bad10aa:/$ ssh user@172.17.0.1
    
    $ exit
    jenkins@e7b23bad10aa:/$ exit
    
    #!/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
    
    ssh jenkins.hostname.here declarative-linter < Jenkinsfile
    
    {
      "version": "2.0.0",
      "tasks": [
        {
          "label": "Validate Jenkinsfile",
          "type": "shell",
          "command": "ssh jenkins.hostname declarative-linter < ${file}"
        }
      ]
    }
    
    node('master') {
        stage('Run!') {
                    def script = load('...you job file...')
        }
    }
    
    def execute() {
     ... main job code here ...
    }
    execute()
    
    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"
                }
            }
    }
    
    curl --user username:password -X POST -F "jenkinsfile=<jenkinsfile" https://jenkins_url/pipeline-model-converter/validate