jenkins-pipeline 插件

    本文将演示:

    1. 通过 插件在 GitLab 上创建一个 Java Spring Boot 项目脚手架;
    2. 通过 jenkins-pipeline 插件在 Jenkins 上创建一条 Java Spring Boot 的 CI 流水线;
    3. 通过 jenkins-pipeline 插件实现在 GitLab 和 Jenkins 上分别配置相应参数,实现当 GitLab 上的代码库有 push 或者 merge 事件时,自动触发 Jenkins 上的流水线运行,同时流水线的执行结果自动回写到 GitLab 上。

    提示

    GitHub 与 GitLab 的主要区别在于 DevStream tool config 的 options.scm.url 以及所需要的 token 等不同。

    必须满足

    • 一套可用的 Jenkins 环境
    • 一套可用的 GitLab 环境
    • 一套可用的 Harbor 环境
    • Jenkins 与 GitLab、Harbor 网络互通
    • 执行 dtm 的主机与 Jenkins、GitLab 网络互通

    注意

    当前插件暂时只支持对接使用 dtm 部署的 Jenkins。

    本文基于如下环境编写:

    • 系统:一台装有 CentOS 7 的云主机;
    • k8s:minikube 方式部署的单节点集群;
    • Jenkins、Harbor 和 GitLab:使用 dtm 方式部署。

    2、配置

    你需要预先准备好 GitLab 的 token 和镜像仓库(Harbor 等)的密码,然后配置到环境变量里,例如(记得替换占位字符):

    Bash

    提示

    如果是 GitHub,则这里的环境变量改成:

    Bash

    1. export IMAGE_REPO_PASSWORD=YOUR_IMAGE_REPO_PASSWORD
    2. export GITHUB_TOKEN=YOUR_GITHUB_TOKEN

    然后准备 DevStream 插件配置:

    下面的配置文件展示的是”tool file”的内容。

    关于更多关于DevStream的主配置、tool file、var file的信息,请阅读核心概念概览和.

    YAML

    除了这几个必须修改的配置项外,其他配置项你可以在确保理解含义的前提下灵活决定是否调整。

    注意:这个配置示例仅是 tool config,完整的 DevStream 配置文件还需要补充 core config 等内容,具体参考。

    你可以使用 dtm apply 命令开始应用当前配置:

    • dtm apply -f config-jenkins-pipeline.yaml -y

    这个过程的日志大致如下:

    Bash

    1. 2022-09-05 09:01:08 [INFO] Apply started.
    2. 2022-09-05 09:01:08 [INFO] Using dir </root/.devstream/plugins> to store plugins.
    3. 2022-09-05 09:01:09 [INFO] Using local backend. State file: devstream.state.
    4. 2022-09-05 09:01:09 [INFO] Tool (repo-scaffolding/springboot) found in config but doesn't exist in the state, will be created.
    5. 2022-09-05 09:01:09 ℹ [INFO] Tool (jenkins-pipeline/default) found in config but doesn't exist in the state, will be created.
    6. 2022-09-05 09:01:09 [INFO] Start executing the plan.
    7. 2022-09-05 09:01:09 [INFO] Changes count: 2.
    8. 2022-09-05 09:01:09 [INFO] -------------------- [ Processing progress: 1/2. ] --------------------
    9. 2022-09-05 09:01:09 [INFO] Processing: (repo-scaffolding/springboot) -> Create ...
    10. 2022-09-05 09:01:10 [SUCCESS] Tool (repo-scaffolding/springboot) Create done.
    11. 2022-09-05 09:01:10 [INFO] -------------------- [ Processing progress: 2/2. ] --------------------
    12. 2022-09-05 09:01:10 [INFO] Processing: (jenkins-pipeline/default) -> Create ...
    13. 2022-09-05 09:01:10 [INFO] Secret jenkins/docker-config has been created.
    14. 2022-09-05 09:01:14 [SUCCESS] Tool (jenkins-pipeline/default) Create done.
    15. 2022-09-05 09:01:14 [INFO] -------------------- [ Processing done. ] --------------------
    16. 2022-09-05 09:01:14 [SUCCESS] Apply finished.

    4、执行结果

    你可以在 GitLab、Jenkins 上查看本次执行结果:

    • Repo Scaffolding

    首先你可以在 GitLab 上可以看 repo scaffolding 的效果,dtm 为你创建了一个 Java Spring Boot 项目脚手架:

    Repo scaffolding

    • Pipeline

    接着你可以在 Jenkins 上看到刚才 dtm 为你创建的 Pipeline:

    Pipeline

    Pipeline

    如果你点开这个 test-job,就能看到它已经被触发了一次,执行结果如下:

    Pipeline console

    • 状态回写

    然后你可以回到 GitLab,看一下 Jenkins Pipeline 的执行结果有没有被成功回写:

    GitLab status

    • 检查镜像

    通过 Jenkins 的日志你可以找到刚才 push 的镜像地址为 harbor.example.com:80/library/spring-demo:latest

    Jenkins' logs

    Jenkins’ logs

    // TODO(daniel-hutao): 补充 Harbor 截图

    最后你可以通过 docker pull 下载该镜像:

    Docker pulling

    当前插件完整配置如下:

    YAML

    离线配置 (下文待进一步整理)

    目前的 jenkins-pipeline 插件配置过程中会连接外部网络来安装插件和配置 pipeline 的共享库,为了支持在离线环境中使用 jenkins-pipeline 来创建和管理 jenkins 流水线,我们在 jenkins-pipeline 插件中提供了一个选项 offline 用于表示需要在离线环境下配置 jenkins-pipeline

    流水线正常运行需要依赖 jenkins 的几个插件。在离线环境中因为无法下载外部环境的插件,需要在 jenkins 预先安装好插件或者使用已经有插件的 jenkins 镜像,devstream 官方也提供了已预先安装好所有依赖的镜像 devstreamdev/jenkins:2.361.1-jdk11-dtm-0.2

    依赖的插件如下: | 插件名 | 作用 | 备注 | |———————|————————|——————————————| | dingding-notifications | 用于发送钉钉通知 | 如果需要使用钉钉通知,则需要安装此插件 | | github-branch-source | jenkins github 插件 | 如果代码仓库使用的是 github,则必须安装此插件 | | gitlab-plugin | jenkins gitlab 插件 | 如果代码仓库使用的是 gitlab,则必须安装此插件 | | sonar | sonar sanner 代码扫描插件 | 如果需要使用 sonarqube,则需要安装此插件 | | kubernetes | jenkins kubernetes 插件 | 用于 jenkins runner, 必须安装此插件 | | git | jenkins git 插件 | 用于代码的克隆和权限认证, 必须安装此插件 | | configuration-as-code | jenkins 配置即代码插件 | 用于 devstream 配置 jenkins 的全局配置, 必须安装此插件|

    jenkins 中 devstream 默认使用共享库来管理 jenkins 流水线的共用代码,在离线环境中因为无法连接共享库,所以 devstream 提供了单独的 Jenkinfile 配置。

    YAML

    1. - name: test
    2. spec:
    3. language: java
    4. framework: springboot
    5. url: gitlab.com/root/test.git
    6. branch: main
    7. token: [[ env GITLAB_TOKEN ]]
    8. repoTemplate:
    9. url: https://github.com/devstream-io/dtm-repo-scaffolding-java-springboot.git
    10. ci:
    11. - type: template
    12. templateName: ci-pipeline
    13. pipelineTemplates:
    14. - name: ci-pipeline
    15. type: jenkins-pipeline
    16. options:
    17. branch: main
    18. jenkins:
    19. url: jenkins.com
    20. user: admin
    21. offline: true # 在此处设置 offline 为 true, 即开启该 jenkins-pipeline 的离线模式
    22. imageRepo:
    23. password: [[ env IMAGE_REPO_PASSWORD ]]

    使用该配置可得到以下输出: