从上面的流程图,结合官方文档和源码,大致我可以猜到它的工作流和原理:
- DevStream 首先将 GitLab、Jenkins、Harbor 等工具的部署流程代码化,通过插件的形式支持这些工具的安装部署;
- 工具部署完成后,DevStream 会从 SCM(GitHub 或者 GitLab 都可以)下载一个项目脚手架模板,模板源码在这里;这个模板支持高度自定义,本质就是将一些需要自定义的内容抽离成变量,供用户自由渲染,然后批量生产项目脚手架;
- 接着 DevStream 根据用户给定的配置文件渲染模板库,然后将其上传到 SCM(GitHub 或者 GitLab 都可以);
- 然后 DevStream 会配置 Jenkins,安装一些必要的插件等,用户支持最终的 Pipeline 顺利执行;
- DevStream 期望 Pipeline 配置通过 Jenkinsfile 来定义,这个 Jenkinsfile 也是通过模板的方式保存,可以灵活渲染 。比如官网示例中 Jenkinsfile 模板保存在这里;DevStream 执行的时候会下载这个 Jenkinsfile 模板(当然,这个模板也支持自定义,支持放到 GitLab 或者其他任何 web 服务器上),下载后渲染用户自定义变量,然后将其写入刚才创建的项目脚手架对应的代码库里;
- 接着 DevStream 就可以调用 Jenkins api,完成 Pipeline 创建了 。没错,创建 Pipeline 的时候,需要的 Jenkinsfile、项目地址等信息都有了,所以这里的 Pipeline 配置很轻量;
- 最后 DevStream 还需要调用 GitLab api 完成 webhook 的创建,这样 SCM(GitHub 或者 GitLab)上的事件(push、merge 等)才能顺利通知到 Jenkins,从而触发 Pipeline 执行 。
四、开干吧!考虑到插件的依赖顺序,外加 Jenkins、GitLab、Harbor 等工具的部署属于"基础设施",几乎只需要执行一次,而 Repo Scaffolding 和 Jenkins Pipeline 的创建属于"配置"过程,可能要执行多次(比如不断新增 Repo 和 Pipeline 等),所以我们分2步来完成这条工具链的搭建过程 。
4.1、工具链部署先下载一个 DevStream 的 CLI,参考这个文档 。有了 dtm 之后,我们就该着手准备配置文件了(下面配置保存到 config.yaml 里):
---varFile: "" # If not empty, use the specified external variables config filetoolFile: "" # If not empty, use the specified external tools config filepluginDir: "" # If empty, use the default value: ~/.devstream/plugins, or use -d flag to specify a directorystate: # state config, backend can be local, s3 or k8s backend: local options: stateFile: devstream-1.state---tools:- name: gitlab-ce-docker instanceID: default dependsOn: [ ] options: hostname: gitlab.example.com gitlabHome: /srv/gitlab sshPort: 30022 httpPort: 30080 httpsPort: 30443 rmDataAfterDelete: false imageTag: "rc"- name: jenkins instanceID: default dependsOn: [ ] options: repo: name: jenkins url: https://charts.jenkins.io chart: chartPath: "" chartName: jenkins/jenkins namespace: jenkins wait: true timeout: 5m upgradeCRDs: true valuesYaml: | serviceAccount: create: true name: jenkins controller: adminUser: "admin" adminPassword: "changeme" ingress: enabled: true hostName: jenkins.example.com installPlugins: - kubernetes:3600.v144b_cd192ca_a_ - workflow-aggregator:581.v0c46fa_697ffd - git:4.11.3 - configuration-as-code:1512.vb_79d418d5fc8 additionalPlugins: # install "GitHub Pull Request Builder" plugin, see https://plugins.jenkins.io/ghprb/ for more details - ghprb # install "OWASP Markup Formatter" plugin, see https://plugins.jenkins.io/antisamy-markup-formatter/ for more details - antisamy-markup-formatter # Enable HTML parsing using OWASP Markup Formatter Plugin (antisamy-markup-formatter), useful with ghprb plugin. enableRawHtmlMarkupFormatter: true # Jenkins Configuraction as Code, refer to https://plugins.jenkins.io/configuration-as-code/ for more details # notice: All configuration files that are discovered MUST be supplementary. They cannot overwrite each other's configuration values. This creates a conflict and raises a ConfiguratorException. JCasC: defaultConfig: true- name: harbor instanceID: default dependsOn: [ ] options: chart: valuesYaml: | externalURL: http://harbor.example.com expose: type: ingress tls: enabled: false ingress: hosts: core: harbor.example.com chartmuseum: enabled: false notary: enabled: false trivy: enabled: false persistence: persistentVolumeClaim: registry: storageClass: "" accessMode: ReadWriteOnce size: 5Gi jobservice: storageClass: "" accessMode: ReadWriteOnce size: 1Gi database: storageClass: "" accessMode: ReadWriteOnce size: 1Gi redis: storageClass: "" accessMode: ReadWriteOnce size: 1Gi