极狐GitLab 是一个一体化的 DevOps 平台,其本身具有很丰富的 DevOps 功能,诸如 CI/CD、DevSecOps、GitOps 等等。当然,极狐GitLab 也能够和一些现有的 CI/CD 工具进行集成。诸如今天要讲的极狐GitLab 和 Jenkins 的集成。
Jenkins 是一款开源的、非常优秀的持续集成工具,在国内外都有众多的拥趸者。Jenkins 具有以下优点:
所以 Jenkins 也被众多的企业或者组织用来构建自己的 CI/CD 系统。
然而,Jenkins 本身并不具备源代码管理的能力,而对于一个完整的 CI/CD 系统来讲,必须要从源代码管理系统开始。所以,本文将介绍如何利用极狐GitLab 和 Jenkins 来构建一个完整的 CI/CD 系统。
极狐GitLab 是一个一体化的 DevOps 平台,源代码管理只是其功能的一部分。更多关于极狐GitLab 的内容,可以登陆 https://about.gitlab.cn 进行查看。
本次集成实践主要包含以下内容
最后将演示三个不同的实践 demo,来展示极狐GitLab 和 Jenkins 的灵活配合
当然,Jenkins 的安装有多种方式,诸如
$ docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts
当然,在如今的云原生时代,我们将选择第三种方式来运行 Jenkins 实例。
今年 4 月,Jenkins Operator 正式成为 Jenkins 的子项目,这将在很大程度上弥合 Jenkins 和 Kubernetes 之间的鸿沟。可以根据Jenkins Operator 官网的介绍来安装 Jenkins。
但是,为了方便大家能够更便捷的安装 Jenkins,小马哥秉持着“一切皆代码”的宗旨,对所有安装流程进行了梳理,并用 kustomize 进行了编排,并将所有代码存放在了极狐GitLab 的仓库中。
“一切皆代码”能够很好的实现 GitOps,关于GitOps 可以查看过往的公众号:GitOps 系列|云原生时代,还不懂 GitOps?而且可以借助 ArgoCD 来让 Jenkins 以 GitOps 的方式运行起来。关于极狐GitLab 和 ArgoCD 的集成,可以查看公众号文章极狐GitLab 和 ArgoCD 的集成实践。
$ git clone git@gitlab.cn:xiaomage/jenkins-operator.git
- name: gitlab-plugin
version: "1.5.20"
- name: gitlab-api
version: 1.0.6
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 需要不同的权限。
将生成的 token 以 secret 的方式存放在jenkins/base/secret/credentials.secret.yaml 文件内
iVersion: 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 的集成实践。
$ kubectl create ns jenkins
namespace/jenkins created
$ 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
进入 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 服务暴漏。
接下来,获取 Jenkins 实例的用户名和密码来登陆使用 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 作为源代码管理平台,而 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 中。
构建流程和结果如下图
在这种场景下,Jenkins Job 的触发是在极狐GitLab 侧发起,也就是说当极狐GitLab 仓库中的代码发生变化时,能够自动触发 Jenkins Job。
有两种方式能够实现这种场景
这个需要在极狐GitLab 的仓库上添加一个 webhook,确定需要添加 webhook 的项目,点击左侧的 settings --> Webhooks
在出现的界面中,输入 webhook 的地址,选择触发 hook 的事件(本文选自 push)
点击 Add webhook,同时可以使用 Test 按钮来做测试。
接着在极狐GitLab 的仓库中,修改一行代码,便可自动触发对应的 Jenkins Job,在 Jenkins 的控制台输出中会找到此次构建是由极狐GitLab 触发的
在项目的 Settings --> Integrations 中选择 Jenkins 并添加
在出现的界面中,填写要集成的 Jenkins 的信息,诸如 Jenkins URL,Jenkins username/password 等,在点击 Test settings 返回成功后,点击 Save changes。
接着在极狐GitLab 的仓库中,修改一行代码,便可自动触发对应的 Jenkins Job,在 Jenkins 的控制台输出中会找到此次构建是由极狐GitLab 触发的
在这种场景下,会完全使用极狐GitLab CI 来调用 Jenkins API 来触发 Jenkins Job。这种不需要维护和安装极狐GitLab 的一些 Jenkins 插件,而是充分使用了极狐GitLab CI 的功能。
在 Jenkins 右上角的用户选项中,选择 Configure,在 API Token 中生成 token 并保存。
在 Jenkins Job 中配置 Trigger builds remotely 输入上面步骤生成的 Token。
在极狐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 构建结果
在 Jenkins 的控制台输出中会找到此次构建是由极狐GitLab 触发的
极狐GitLab 作为一个一体化的 DevOps 平台,Jenkins 作为一款优秀的持续集成工具,两者在 DevOps 领域内的使用都非常广泛。都能帮助用户去构建自己的CI/CD 系统,两者的集成方式也是非常灵活的。
但是从上面的实践也可以看出,Jenkins 虽然功能强大,但是需要额外的配置工作量,而且从 DevOps 的发展趋势看,DevOps 平台时代已经到来,DevOps 平台能够整合不同工具链的能力,对使用人员隐去众多配置的额外工作,从而聚焦在提供整体的 DevOps 能力。