Java Spring Boot 项目脚手架的快速创建与 Jenkins CI 流水线的自动化配置

快速部署 GitLab + Jenkins + Harbor 工具链中你已经学会了如何使用 DevStream 快速部署 GitLab + Jenkins + Harbor 工具链。

本文将基于部署好 GitLab + Jenkins + Harbor 工具链,继续以 Java Spring Boot 项目为例,演示如何通过 DevStream 快速创建 Java Spring Boot 项目脚手架,同时在 Jenkins 上自动创建对应的 Pipeline 实现 Java Spring Boot 项目的 CI 流程。

1、工作流介绍

本文最终将实现的工具链相关工作流如下图所示:

Workflow

GitLab + Jenkins + Harbor Toolchain Workflow

这里的工作流主要是:

  1. DevStream 根据你给定配置,选择默认项目模板或者用户自定义模板创建项目脚手架;
  2. DevStream 根据你给定配置,使用 CI 模板创建 CI 流程,过程中会涉及到 CI 工具的配置(比如调用 Jenkins API 完成一些 Jenkins 插件的安装等);
  3. 最终 DevStream 完成全部配置后,如果你提交代码到 DevStream 为你创建的代码库中,GitLab 便会出发 Jenkins 执行相应的 CI 流程,Jenkins 上的流水线运行结果也会实时回显到 GitLab 上,并且这个过程中构建出来的容器镜像会被自动推送到 Harbor 上。

2、安装 dtm

你可以参考这个文档完成 dtm 的下载与安装。

3、准备配置文件

DevStream 可以简单地以 local 作为状态 Backend,也就是将状态保存到本地文件。如果你在本地测试,可以选择使用这种方式; 而企业 On premise 环境部署可能需要使用 k8s Backend 将状态通过 kube-apiserver 存入 etcd,两种方式配置分别如下:

DevStream with ‘local’ BackendDevStream with ‘k8s’ Backend

local Backend

  1. config:
  2. state:
  3. backend: local
  4. options:
  5. stateFile: devstream.state

k8s Backend

  1. config:
  2. state:
  3. backend: k8s
  4. options:
  5. namespace: devstream
  6. configmap: state

下文将以 local Backend 为例演示。

在编写应用相关配置项之前,你需要先定义一些变量,这会让后续的配置和维护工作变得更加简单:

config-apps.yaml

  1. config:
  2. state:
  3. backend: local
  4. options:
  5. stateFile: devstream.state
  6. vars:
  7. appName: myapp
  8. gitlabURL: http://gitlab.example.com:30080
  9. jenkinsURL: http://jenkins.example.com
  10. harborURL: http://harbor.example.com

你可以根据自己的需要,选择性自定义上述 vars 配置的值,这些变量内容主要是域名等可修改配置项。

继续往里面追加应用相关配置,你的配置文件会扩充成这样:

config-apps.yaml

  1. config:
  2. state:
  3. backend: local
  4. options:
  5. stateFile: devstream-app.state
  6. vars:
  7. appName: myapp
  8. gitlabURL: http://gitlab.example.com:30080
  9. jenkinsURL: http://jenkins.example.com
  10. harborURL: http://harbor.example.com
  11. apps:
  12. - name: [[ appName ]]
  13. spec:
  14. language: java
  15. framework: springboot
  16. repo:
  17. url: [[ gitlabURL ]]/root/[[ appName ]].git
  18. branch: main
  19. token: [[ env GITLAB_TOKEN ]]
  20. repoTemplate:
  21. url: https://github.com/devstream-io/dtm-repo-scaffolding-java-springboot.git
  22. ci:
  23. - type: template
  24. templateName: ci-pipeline
  25. pipelineTemplates:
  26. - name: ci-pipeline
  27. type: jenkins-pipeline
  28. options:
  29. branch: main
  30. jenkins:
  31. url: [[ jenkinsURL ]]
  32. user: admin
  33. enableRestart: true
  34. password: [[ env JENKINS_PASSWORD ]]
  35. imageRepo:
  36. user: admin
  37. url: [[ harborURL ]]/library
  38. password: [[ env IMAGE_REPO_PASSWORD ]]

你可以将这个配置文件放到服务器上的某一个路径内,比如 ~/devstream-test/config-apps.yaml

4、让配置生效

你还需要几个简单的步骤来让上述配置生效。

4.1、准备 GitLab Token

你可以参考下图方式在 GitLab 上创建一个 token,这个 token 将给 DevStream 必要的权限用来在 GitLab 上创建项目脚手架等:

GitLab token

Generate GitLab token

然后这个 token 需要被设置到环境变量里:

环境变量配置

  1. export GITLAB_TOKEN=YOUR_GITLAB_TOKEN

同时需要将 Harbor 密码配置到环境变量里:

环境变量配置

  1. export IMAGE_REPO_PASSWORD=Harbor12345

此外由于 DevStream 需要调用 Jenkins 的 API 来帮你创建流水线,所以你还需要告诉 DevStream Jenkins 的密码:

环境变量配置

  1. export JENKINS_PASSWORD=changeme

你可以将这个配置文件放到服务器上同一个目录,比如 ~/devstream-test/,然后在该目录下执行:

4.2、开始执行

首先你需要执行初始化命令:

初始化

  1. dtm init -f config-apps.yaml

这时候 DevStream 会帮你下载 jenkins-pipelinerepo-scaffolding 两个插件,最终将有这两个插件来帮你完成代码库脚手架的创建和 Jenkins 流水线的配置。

接着你可以继续执行如下命令

Bash

  1. dtm apply -f config-apps.yaml -y

如果 apply 命令执行成功的话,你可以看到大致如下日志:

执行日志

  1. 2022-12-02 01:04:44 [INFO] Delete started.
  2. 2022-12-02 01:04:44 [INFO] Using local backend. State file: devstream-app.state.
  3. 2022-12-02 01:04:44 [INFO] Tool (jenkins-pipeline/myapp) will be deleted.
  4. 2022-12-02 01:04:44 [INFO] Tool (repo-scaffolding/myapp) will be deleted.
  5. 2022-12-02 01:04:44 [INFO] Start executing the plan.
  6. 2022-12-02 01:04:44 [INFO] Changes count: 2.
  7. 2022-12-02 01:04:44 [INFO] -------------------- [ Processing progress: 1/2. ] ----------
  8. ----------
  9. 2022-12-02 01:04:44 [INFO] Processing: (jenkins-pipeline/myapp) -> Delete ...
  10. 2022-12-02 01:04:46 [INFO] Prepare to delete 'jenkins-pipeline_myapp' from States.
  11. 2022-12-02 01:04:46 [SUCCESS] Tool (jenkins-pipeline/myapp) delete done.
  12. 2022-12-02 01:04:46 [INFO] -------------------- [ Processing progress: 2/2. ] --------------------
  13. 2022-12-02 01:04:46 [INFO] Processing: (repo-scaffolding/myapp) -> Delete ...
  14. 2022-12-02 01:04:46 [INFO] Prepare to delete 'repo-scaffolding_myapp' from States.
  15. 2022-12-02 01:04:46 [SUCCESS] Tool (repo-scaffolding/myapp) delete done.
  16. 2022-12-02 01:04:46 [INFO] -------------------- [ Processing done. ] --------------------
  17. 2022-12-02 01:04:46 [SUCCESS] All plugins deleted successfully.
  18. 2022-12-02 01:04:46 [SUCCESS] Delete finished.
  19. root@dtm-realk8sdev:~# ./dtm apply -y -f config-apps.yaml
  20. 2022-12-02 01:04:55 [INFO] Apply started.
  21. 2022-12-02 01:04:55 [INFO] Using local backend. State file: devstream-app.state.
  22. 2022-12-02 01:04:55 [INFO] Tool (repo-scaffolding/myapp) found in config but doesn't exist in the state, will be created.
  23. 2022-12-02 01:04:55 ℹ [INFO] Tool (jenkins-pipeline/myapp) found in config but doesn't exist in the state, will be created.
  24. 2022-12-02 01:04:55 [INFO] Start executing the plan.
  25. 2022-12-02 01:04:55 [INFO] Changes count: 2.
  26. 2022-12-02 01:04:55 [INFO] -------------------- [ Processing progress: 1/2. ] --------------------
  27. 2022-12-02 01:04:55 [INFO] Processing: (repo-scaffolding/myapp) -> Create ...
  28. 2022-12-02 01:04:55 [INFO] github start to download repoTemplate...
  29. 2022-12-02 01:04:56 [SUCCESS] Tool (repo-scaffolding/myapp) Create done.
  30. 2022-12-02 01:04:56 [INFO] -------------------- [ Processing progress: 2/2. ] --------------------
  31. 2022-12-02 01:04:56 [INFO] Processing: (jenkins-pipeline/myapp) -> Create ...
  32. 2022-12-02 01:04:57 [INFO] jenkins plugin imageRepo start config...
  33. 2022-12-02 01:04:57 [WARN] jenkins gitlab ssh key not config, private repo can't be clone
  34. 2022-12-02 01:04:57 ℹ [INFO] jenkins start config casc...
  35. 2022-12-02 01:04:59 ✔ [SUCCESS] Tool (jenkins-pipeline/myapp) Create done.
  36. 2022-12-02 01:04:59 ℹ [INFO] -------------------- [ Processing done. ] --------------------
  37. 2022-12-02 01:04:59 ✔ [SUCCESS] All plugins applied successfully.
  38. 2022-12-02 01:04:59 ✔ [SUCCESS] Apply finished.

5、查看执行结果

这时候你可以在 GitLab 上看到 dtm 为你准备的 Java Spring Boot 项目脚手架:

Repo Scaffolding

Repo scaffolding

接着你可以登录 Jenkins,查看 dtm 为你创建的 Pipeline:

Jenkins Pipeline

Jenkins pipeline

这个 Pipeline 会自动执行一次,执行完成后回到 GitLab,你可以看到 Jenkins 回写的 Pipeline 状态:

GitLab Status

GitLab Status

后面每当 GitLab 上这个 repo 发生 Push 或者 Merge 事件的时候,就会触发 Jenkins 上的 Pipeline 运行。

当然,在 Harbor 上你可以找到 CI 流程构建出来的容器镜像:

GitLab Status

Image in Harbor

6、环境清理

你可以通过如下命令清理环境:

环境清理命令

  1. dtm delete -f config-apps.yaml -y