跳过正文
  1. Posts/

Jenkinsfile Lint 1.5.0 发布:不需要 Jenkins 服务器的 Standalone 模式

沈显鹏
作者
沈显鹏
Engineer. Builder. Maintainer.
目录

大家好,我是沈工。

之前写过一篇 jenkinsfilelint 的文章——一个是它从我的个人项目进入 Jenkins 官方组织的过程。今天聊一聊刚刚发布的 v1.5.0 版本。

这个版本最大的变化,是加了一个 standalone(单机)模式

这个功能是社区用户提的需求。有人在 GitHub 上问:能不能不用 Jenkins 服务器也能跑语法校验?

我仔细想了一下,这个需求确实合理—— jenkinsfilelint 的目标是让 Jenkinsfile 的语法检查足够方便,如果还要依赖一个 Jenkins 服务器,那门槛还是有点高了。

简单说就是:你现在不需要有一个 Jenkins 服务器也能校验 Jenkinsfile 的语法了。

在这之前,jenkinsfilelint 的工作原理是调用 Jenkins 自带的 Pipeline Linter API:

$JENKINS_URL/pipeline-model-converter/validate

好处是校验结果准确,反馈更快,因为用的是你生产环境上 Jenkins 的真实逻辑。坏处也很明显——你得先有一个 Jenkins 服务器且要配置一下 credentials

如果你没有 Jenkins 服务器,或者你只是临时改一个 Jenkinsfile 还要配置 Jenkins 服务器,那就比较麻烦了。

于是就有了 v1.5.0 的这个方案:给用户准备了一个最小的 Jenkins 运行时环境,把依赖打包成一个镜像。用户只需要:

  • 有 Docker(或者 Podman 也行)
  • .pre-commit-config.yaml 加上 --local 参数

语法校验就自动在本地完成了。


Local 模式怎么用
#

如果你的 .pre-commit-config.yaml 之前是这样的:

repos:
  - repo: https://github.com/jenkinsci/jenkinsfilelint
    rev: v1.5.0
    hooks:
      - id: jenkinsfilelint

那么你需要配置环境变量 JENKINS_URLJENKINS_USERJENKINS_TOKEN,指向你的 Jenkins 服务器。

现在你只需要加一个 args: ["--local"]

repos:
  - repo: https://github.com/jenkinsci/jenkinsfilelint
    rev: v1.5.0
    hooks:
      - id: jenkinsfilelint
        args: ["--local"]

唯一依赖就是 Docker,不需要配置任何 Jenkins 地址和凭证。

安装和提交的流程一样丝滑:

pip install pre-commit
pre-commit install
git commit -m "Update Jenkinsfile"

第一次运行会有一个冷启动等待,因为要拉取和启动 Jenkins 容器,大概 20–40 秒。之后容器会保持运行,后续的校验都是秒级完成。

你可能会想:那容器的生命周期怎么管理?

我提供了两个方式:

  1. 自动复用:容器启动后会持续运行,下一次 commit 直接复用,没有额外等待时间
  2. 手动停止:跑完了想清理资源,执行 jenkinsfilelint server stop 就行

实现思路:最小 Jenkins 运行时
#

这个 standalone 模式的核心是一个自定义的 Docker 镜像。

打包成镜像后发布在 GitHub Container Registry 上:

ghcr.io/jenkinsci/jenkinsfilelint-server:latest

这个镜像的作用只有一个:接收 POST 请求,调用 Pipeline Model Converter 做语法校验,返回结果。,没有多余的插件。

如果你觉得自己维护这个镜像有特殊需求,也可以通过环境变量 JENKINSFILELINT_SERVER_IMAGE 指定自定义镜像。


Local 模式的局限性
#

这个模式虽然方便,但有一些限制,需要说清楚。

Jenkins Pipeline 的强大之处在于它的插件生态——不同的插件提供了不同类型的 agent、step、option。如果你的 Jenkinsfile 用到了自定义插件的功能(比如特定的 shared library、非标准的 agent label 等),local 模式的最小 Jenkins 环境无法覆盖这些插件,自然也就无法校验那些部分。

所以我的建议是:

场景推荐模式
快速语法检查、本地开发--local
需要权威校验(包含业务插件逻辑)远程模式(连接正式 Jenkins)
CI 流水线远程模式

--local 是快速语法门控,远程才是权威校验。 这俩不冲突,可以搭配使用。


小结
#

这次社区反馈驱动的开发体验还挺好的——有人提需求,我评估可行性,然后做出来。不是我自己觉得什么好就拍脑袋做什么。

如果你的团队在使用 Jenkins,不妨试试 Jenkinsfilelint,它可以帮助你在提交前发现 Jenkinsfile 的语法错误。如果有任何问题,欢迎在 GitHub 上提 issue。

项目地址:github.com/jenkinsci/jenkinsfilelint


转载本站文章请注明作者和出处,请勿用于任何商业用途。欢迎关注公众号「沈显鹏」

相关文章