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

是否有一种方法可以在本地执行这些而不提交代码?


当前回答

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

ssh jenkins.hostname.here declarative-linter < Jenkinsfile

这将对你的詹金斯档案进行静态分析。在您选择的编辑器中,定义一个自动运行该命令的键盘快捷方式。在Visual Studio Code中,这是我使用的,转到Tasks > Configure Tasks,然后使用以下JSON创建一个Validate Jenkinsfile命令:

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

其他回答

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

ssh jenkins.hostname.here declarative-linter < Jenkinsfile

这将对你的詹金斯档案进行静态分析。在您选择的编辑器中,定义一个自动运行该命令的键盘快捷方式。在Visual Studio Code中,这是我使用的,转到Tasks > Configure Tasks,然后使用以下JSON创建一个Validate Jenkinsfile命令:

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

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

这只在linux环境中测试过。

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

这就是你需要的

Docker installed and working. This is not part of this instruction. A Jenkins running in docker locally. Explained how below. The proper rights (ssh access key) for your local Jenkins docker user to pull from your local git repo. Explained how below. A Jenkins pipeline project that pulls from your local git repository. Explained below. A git user in your local Jenkins with minimal rights. Explained below. A git project with a post-commit web hook that triggers the pipeline project. Explained below.

这就是你要做的

詹金斯码头工人

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

不时地你想启动和重启詹金斯容易。例如,在重新启动机器后。为此,我创建了一个别名,并将其放在主文件夹中的.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

现在您已经进入了docker容器,您可以在终端中通过类似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

这次您应该不需要输入密码了。如果你这样做了,说明出了问题,你必须再试一次。

您现在将在计算机的主文件夹中。试着看一看。

不要在这里停下来,因为我们需要退出一系列ssh shell。

$ exit
jenkins@e7b23bad10aa:/$ exit

没错!现在我们回来了,准备继续。

安装Jenkins

你可以在浏览器http://localhost:8787上找到当地的Jenkins。

当您第一次将浏览器指向本地Jenkins时,您将使用安装向导进行安装。 默认值是可以的,但是要确保在安装过程中安装了管道插件。

设置你的jenkins

非常重要的是,您要在http://localhost:8787/configureSecurity上激活基于安全性的矩阵,并通过将自己添加到矩阵并勾选所有方框来赋予自己所有权限。(在最右边有一个打勾图标)

Select Jenkins’ own user database as the Security Realm Select Matrix-based security in the Authorization section Write your username in the field User/group to add: and click on the [ Add ] button In the table above your username should pop up with a people icon next to it. If it is crossed over you typed your username incorrectly. Go to the far right of the table and click on the tick-all-button or manually tick all the boxes in your row. Please verify that the checkbox Prevent Cross Site Request Forgery exploits is unchecked. (Since this Jenkins is only reachable from your computer this isn't such a big deal) Click on [ Save ] and log out of Jenkins and in again just to make sure it works. If it doesn't you have to start over from the beginning and emptying the /opt/docker/jenkins/jenkins_home folder before restarting

添加git用户

我们需要允许我们的git钩子以最小的权限登录到我们的本地Jenkins。只要看到并创造就业机会就足够了。因此,我们创建了一个名为git的密码登录用户。

将浏览器指向http://localhost:8787/securityRealm/addUser,并添加git作为用户名,login作为密码。 单击[创建用户]。

增加git用户的权限

在浏览器中转到http://localhost:8787/configureSecurity页面。将git用户添加到矩阵中:

在User/group字段中写入git,然后点击[add]

现在是时候检查git用户的最小权限了。只需要这些:

总体:阅读 工作:构建 工作:发现 工作:阅读

确保“防止跨站点请求伪造攻击”复选框未选中,然后单击[保存]

创建管道项目

我们假设我们的用户名是user,我们启用git的项目名为project,位于/home/user/projects/project

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

点击Jenkins菜单中的New Item 命名项目钩子管道 点击管道 点击[确定] 勾选“生成触发器”部分中的“Poll SCM”复选框。将时间表保留为空。 在管道部分: 从SCM中选择Pipeline脚本 在Repository URL字段中输入user@172.17.0.1:projects/project/.git 在脚本路径字段中输入Jenkinsfile 保存钩子管道项目 手动构建钩子管道一次,这是Poll SCM开始工作所必需的。

创建git钩子

进入/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的管道。

快乐的日子!

有一些限制,对于脚本管道,我使用这个解决方案:

使用内联groovy脚本的管道作业:


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

用于测试的Jenkinsfile具有与lesfuret相同的结构:


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

使用VS Code Jenkins Jack扩展,你可以在不使用git推送的情况下测试你的Jenkins文件,从你的本地文件到本地或远程运行的Jenkins。你将在VS Code中有作业的运行日志,能够在Jenkins中创建作业和更多的工作人员。我希望这有助于更多的人寻找一种方法来开发詹金斯档案。

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

如果你想测试对Jenkinsfile的修改,但不提交,可以使用1.14中添加的Replay功能。

JENKINS-33925跟踪自动测试框架的特性请求。