解锁极狐GitLab 和 Jenkins 集成的 N 种方式
作者:小马哥,LFAPAC 开源布道师,极狐(GitLab) DevOps 布道师
极狐GitLab
前 言
极狐GitLab
关于 Jenkins
易于上手
插件众多
API 丰富
社区强大
所以 Jenkins 也被众多的企业或者组织用来构建自己的 CI/CD 系统。
然而,Jenkins 本身并不具备源代码管理的能力,而对于一个完整的 CI/CD 系统来讲,必须要从源代码管理系统开始。所以,本文将介绍如何利用极狐GitLab 和 Jenkins 来构建一个完整的 CI/CD 系统。
极狐GitLab 是一个一体化的 DevOps 平台,源代码管理只是其功能的一部分。更多关于极狐GitLab 的内容,可以登陆 https://about.gitlab.cn 进行查看。
极狐GitLab
极狐GitLab 与 Jenkins 的集成实践
本次集成实践主要包含以下内容
Jenkins 的安装(以Jenkins Operator 的方式进行)
极狐GitLab 插件的配置
极狐GitLab + Jenkins 的 CI/CD 构建
最后将演示三个不同的实践 demo,来展示极狐GitLab 和 Jenkins 的灵活配合
从 Jenkins 侧触发 Jenkins Job,来完成代码拉取(代码存储在极狐GitLab 侧)到部署的流程 利用极狐GitLab 的 webhook 功能,从极狐GitLab 侧自动触发 Jenkins Job 利用极狐GitLab CI 的功能,从极狐GitLab 侧自动触发 Jenkins Job
极狐GitLab
Jenkins 的安装
当然,Jenkins 的安装有多种方式,诸如
下载 jenkins.war 包,执行命令java -jar jenkins.war 来运行 Jenkins 实例 以容器的方式,用 docker 命令来运行 Jenkins 实例
$ docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts
使用 Jenkins Operator 来以云原生的方式运行 Jenkins 实例
当然,在如今的云原生时代,我们将选择第三种方式来运行 Jenkins 实例。
Jenkins Operator
但是,为了方便大家能够更便捷的安装 Jenkins,小马哥秉持着“一切皆代码”的宗旨,对所有安装流程进行了梳理,并用 kustomize 进行了编排,并将所有代码存放在了极狐GitLab 的仓库:https://gitlab.cn/xiaomage/jenkins-operator 中。
“一切皆代码”能够很好的实现 GitOps,关于GitOps 可以查看过往的公众号:GitOps 系列|云原生时代,还不懂 GitOps?而且可以借助 ArgoCD 来让 Jenkins 以 GitOps 的方式运行起来。关于极狐GitLab 和 ArgoCD 的集成,可以查看公众号文章极狐GitLab 和 ArgoCD 的集成实践。
Jenkins 安装步骤
clone 上述极狐GitLab 仓库的代码至本地
$ git clone git@gitlab.cn:xiaomage/jenkins-operator.git
在 jenkins/base/jenkins.yaml 中添加与极狐GitLab 相关的插件信息
- name: gitlab-plugin
version: "1.5.20"
- name: gitlab-api
version: 1.0.6
在 config.yaml 文件中添加关于极狐GitLab 的配置信息,如下
unclassified:
gitLabConnectionConfig:
connections:
- apiTokenId: "jihu-gitlab-token"
clientBuilderId: "autodetect"
connectionTimeout: 10
ignoreCertificateErrors: false
name: "极狐GitLab"
readTimeout: 10
url: "https://gitlab.cn"
useAuthenticatedEndpoint: false
gitLabServers:
servers:
- credentialsId: "Jihu-GitLab-Jenkins"
name: "极狐GitLab"
serverUrl: "https://gitlab.cn"
前面的 apiTokenId 和 credentialsId 都是与极狐GitLab Personal Access Token 相关的 token 信息,只不过每个 token 需要不同的权限。
在极狐GitLab 上创建 Personal Access Token
token 的创建过程可以参考下图展示的流程
将上述生成的 token 以 secret 的方式存放在jenkins/base/secret/credentials.secret.yaml 文件内
apiVersion: v1
kind: Secret
metadata:
name: jihu-gitlab-token
labels:
jenkins.io/credentials-type: secretText
annotations:
jenkins.io/credentials-description: jihu gitlab token
type: Opaque
stringData:
text: AdrW3dse23ewews
上述内容都是敏感信息,最终使用了 sops(gpg) 的方式来完成了加密,关于 sops(gpg) 的使用也可以参考公众号文章极狐GitLab 和 ArgoCD 的集成实践。
创建一个 jenkins 的 namespace
$ kubectl create ns jenkins
namespace/jenkins created
创建 Jenkins crd
$ kubectl -n jenkins apply -f jenkins/base/jenkins_crd.yaml
customresourcedefinition.apiextensions.k8s.io/jenkins.jenkins.io created
customresourcedefinition.apiextensions.k8s.io/jenkinsimages.jenkins.io created
创建 Jenkins 实例
进入 overlay 下面的某个目录,诸如 dev,然后执行一键式部署
$ cd jenkins/overlay/dev
$ kustomize build --enable-alpha-plugins . | kubectl -n jenkins apply -f -
serviceaccount/jenkins created
serviceaccount/jenkins-operator created
role.rbac.authorization.k8s.io/jenkins-operator created
rolebinding.rbac.authorization.k8s.io/jenkins-operator created
clusterrolebinding.rbac.authorization.k8s.io/jenkins-role-binding created
configmap/jenkins-config created
secret/github-token created
secret/jihu-gitlab-token created
deployment.apps/jenkins-operator created
jenkins.jenkins.io/jenkins created
overlay 下面的不同目录对应不同的环境,可以将下面的内容进行对应修改,以创建对应不同环境的 Jenkins 实例,本文作为示范,选择了 dev 目录,当然,这个目录是可以自定义的,这与 kustomize 的使用密切相关,感兴趣的小伙伴可以自行查阅。
查看 Jenkins 的运行情况
$ kubectl -n jenkins get pods
NAME READY STATUS RESTARTS AGE
jenkins-jenkins 1/1 Running 0 45h
jenkins-operator-5cd7d8887c-mm9zs 1/1 Running 0 2d
seed-job-agent-jenkins-64f8c989cd-8gwvg 1/1 Running 0 45h
接下来就可以通过服务暴露的手段来使用 Jenkins 了。本文使用 TKE,选择了配置应用服务均衡器来进行 Jenkins 服务暴漏。
$ kubectl -n jenkins get secret jenkins-operator-credentials-jenkins -o jsonpath="{.data.password}" | base64 -D
TxxxJYnVE0ddIVO2y
$ kubectl -n jenkins get secret jenkins-operator-credentials-jenkins -o jsonpath="{.data.user}" | base64 -D
jenkins-operator
至此,Jenkins 的安装与配置(极狐GitLab 的配置以 configmap 的形式挂载到了 Jenkins 实例的 config.yaml 文件中,Jenkins 实例起来以后,配置自从生效)已经完成,再次确认一下极狐GitLab 的配置是否生效:Manage Jenkins --> Configure --> GitLab 点击 Test Connection 测试连通性,返回 Success 则证明 Jenkins 和极狐GitLab 的连通性没有问题。
接下来,就可以解锁极狐GitLab 和 Jenkins 集成的 N 种方式了。
极狐GitLab
集成 Demo
解锁极狐GitLab 和 Jenkins 集成的第一种方式
这种场景中,极狐GitLab 作为源代码管理平台,而 Jenkins 作为 CI/CD 工具。Job 的构建从 Jenkins 侧发起。
此时只需要选择构建上图中所示的 Demo Job 即可,点击 Build with Parameters 后选择合适的参数
点击 Build 按钮即可。此时 Demo Job 会从极狐GitLab 的仓库中拉取源代码,随后执行镜像构建,最后做部署。所有的 Pipeline 代码均可在极狐GitLab 的仓库https://gitlab.cn/xiaomage/jenkins-operator/-/blob/main/cicd/pipelines/demo.groovy 中找到。其中拉取极狐GitLab 仓库的代码如下
checkout([$class: 'GitSCM',
branches: [[name: '*/main']],
extensions: [],
userRemoteConfigs: [
[
credentialsId: 'jihu-gitlab-sshkey',
url: 'git@gitlab.cn:majinghe/go-demo.git'
]
]
]
)
只需要指定相应的仓库及对应的 ssh private key 即可,ssh private key 也是以 secret 的方式存放在 secret/credentials.secret.yaml 中。
解锁极狐GitLab 和 Jenkins 集成的第二种方式
在这种场景下,Jenkins Job 的触发是在极狐GitLab 侧发起,也就是说当极狐GitLab 仓库中的代码发生变化时,能够自动触发 Jenkins Job。
有两种方式能够实现这种场景
在极狐GitLab 仓库上添加 webhook 的方式 直接利用极狐GitLab Integration 中的 Jenkins 集成功能
通过 webhook 的方式
在出现的界面中,输入 webhook 的地址,选择触发 hook 的事件(本文选自 push)
点击 Add webhook,同时可以使用 Test 按钮来做测试。
接着在极狐GitLab 的仓库中,修改一行代码,便可自动触发对应的 Jenkins Job,在 Jenkins 的控制台输出中会找到此次构建是由极狐GitLab 触发的
使用极狐GitLab Integration 中的 Jenkins 集成功能
在出现的界面中,填写要集成的 Jenkins 的信息,诸如 Jenkins URL,Jenkins username/password 等,在点击 Test settings 返回成功后,点击 Save changes。
解锁极狐GitLab 和 Jenkins 集成的第三种方式
在这种场景下,会完全使用极狐GitLab CI 来调用 Jenkins API 来触发 Jenkins Job。这种不需要维护和安装极狐GitLab 的一些 Jenkins 插件,而是充分使用了极狐GitLab CI 的功能。
创建一个用来远程触发 Jenkins Job 的 Token
在 Jenkins 右上角的用户选项中,选择 Configure,在 API Token 中生成 token 并保存。
在 Jenkins Job 中配置 Trigger builds remotely 输入上面步骤生成的 Token。
配置极狐GitLab CI
在极狐GitLab 的仓库中添加一个 .gitlab-ci.yaml 文件,并写入如下内容
image: curlimages/curl:latest
stage:
- deploy
deploy-job:
stage: deploy
script:
- curl -u ${USER}:${TOKEN} "http://JENKINS_HOST/job/JOB_NAME/buildWithParameters?token=${TOKEN}¶meters1=value1¶meters2=values2"
查看极狐GitLab CI 构建结果
极狐GitLab
结束语
极狐GitLab 作为一个一体化的 DevOps 平台,Jenkins 作为一款优秀的持续集成工具,两者在 DevOps 领域内的使用都非常广泛。都能帮助用户去构建自己的CI/CD 系统,两者的集成方式也是非常灵活的。
但是从上面的实践也可以看出,Jenkins 虽然功能强大,但是需要额外的配置工作量,而且从 DevOps 的发展趋势看,DevOps 平台时代已经到来,DevOps 平台能够整合不同工具链的能力,对使用人员隐去众多配置的额外工作,从而聚焦在提供整体的 DevOps 能力。
引用链接
https://about.gitlab.cn
https://www.jenkins.io/
https://jenkinsci.github.io/kubernetes-operator/
关于极狐(GitLab)
极狐(GitLab) 以“核心开放”为原则,面向中国市场,提供开箱即用的开放式一体化安全DevOps平台——极狐GitLab。通过业界领先的优先级管理、安全、风险和合规性功能,实现产品、开发、QA、安全和运维团队间的高效协同,加速和优化企业软件开发生命周期。极狐GitLab由极狐信息技术(湖北)有限公司在国内独立运营,提供中国本地化功能和支持服务。极狐(GitLab)公司以“中外合资3.0”模式创立,公司投资方包括GitLab Inc.、红杉宽带跨境数字产业基金,以及高成资本。
关注本公众号可以获取更多关于 DevOps 相关的技术实践分享。