查看原文
其他

解锁极狐GitLab 和 Jenkins 集成的 N 种方式

极狐(GitLab) 极狐GitLab开发者 2022-05-14

作者:小马哥,LFAPAC 开源布道师,极狐(GitLab) DevOps 布道师

极狐GitLab

前 言


极狐GitLab[1] 是一个一体化的 DevOps 平台,其本身具有很丰富的 DevOps 功能,诸如 CI/CD、DevSecOps、GitOps 等等。当然,极狐GitLab 也能够和一些现有的 CI/CD 工具进行集成。诸如今天要讲的极狐GitLab 和 Jenkins 的集成。


极狐GitLab

关于 Jenkins


Jenkins[2] 是一款开源的、非常优秀的持续集成工具,在国内外都有众多的拥趸者。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

今年 4 月,Jenkins Operator 正式成为 Jenkins 的子项目,这将在很大程度上弥合 Jenkins 和 Kubernetes 之间的鸿沟。可以根据Jenkins Operator 官网[3]的介绍来安装 Jenkins。

但是,为了方便大家能够更便捷的安装 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: v1kind: Secretmetadata:    name: jihu-gitlab-token    labels:        jenkins.io/credentials-type: secretText    annotations:        jenkins.io/credentials-description: jihu gitlab tokentype: OpaquestringData:    text: AdrW3dse23ewews


上述内容都是敏感信息,最终使用了 sops(gpg) 的方式来完成了加密,关于 sops(gpg) 的使用也可以参考公众号文章极狐GitLab 和 ArgoCD 的集成实践

  • 创建一个 jenkins 的 namespace

$ kubectl create ns jenkinsnamespace/jenkins created
  • 创建 Jenkins crd

$ kubectl -n jenkins apply -f jenkins/base/jenkins_crd.yamlcustomresourcedefinition.apiextensions.k8s.io/jenkins.jenkins.io createdcustomresourcedefinition.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 createdserviceaccount/jenkins-operator createdrole.rbac.authorization.k8s.io/jenkins-operator createdrolebinding.rbac.authorization.k8s.io/jenkins-operator createdclusterrolebinding.rbac.authorization.k8s.io/jenkins-role-binding createdconfigmap/jenkins-config createdsecret/github-token createdsecret/jihu-gitlab-token createddeployment.apps/jenkins-operator createdjenkins.jenkins.io/jenkins created


overlay 下面的不同目录对应不同的环境,可以将下面的内容进行对应修改,以创建对应不同环境的 Jenkins 实例,本文作为示范,选择了 dev 目录,当然,这个目录是可以自定义的,这与 kustomize 的使用密切相关,感兴趣的小伙伴可以自行查阅。

查看 Jenkins 的运行情况

$ kubectl -n jenkins get podsNAME                                      READY   STATUS    RESTARTS   AGEjenkins-jenkins                           1/1     Running   0          45hjenkins-operator-5cd7d8887c-mm9zs         1/1     Running   0          2dseed-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 -DTxxxJYnVE0ddIVO2y$ kubectl -n jenkins get secret jenkins-operator-credentials-jenkins -o jsonpath="{.data.user}" | base64 -Djenkins-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 的方式

这个需要在极狐GitLab 的仓库上添加一个 webhook,确定需要添加 webhook 的项目,点击左侧的 settings --> Webhooks


在出现的界面中,输入 webhook 的地址,选择触发 hook 的事件(本文选自 push)


点击 Add webhook,同时可以使用 Test 按钮来做测试。


接着在极狐GitLab 的仓库中,修改一行代码,便可自动触发对应的 Jenkins Job,在 Jenkins 的控制台输出中会找到此次构建是由极狐GitLab 触发的


使用极狐GitLab Integration 中的 Jenkins 集成功能

在项目的 Settings --> Integrations 中选择 Jenkins 并添加


在出现的界面中,填写要集成的 Jenkins 的信息,诸如 Jenkins URL,Jenkins username/password 等,在点击 Test settings 返回成功后,点击 Save changes。


接着在极狐GitLab 的仓库中,修改一行代码,便可自动触发对应的 Jenkins Job,在 Jenkins 的控制台输出中会找到此次构建是由极狐GitLab 触发的


解锁极狐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}&parameters1=value1&parameters2=values2"
  • 查看极狐GitLab CI 构建结果


在 Jenkins 的控制台输出中会找到此次构建是由极狐GitLab 触发的


极狐GitLab

结束语


极狐GitLab 作为一个一体化的 DevOps 平台,Jenkins 作为一款优秀的持续集成工具,两者在 DevOps 领域内的使用都非常广泛。都能帮助用户去构建自己的CI/CD 系统,两者的集成方式也是非常灵活的。


但是从上面的实践也可以看出,Jenkins 虽然功能强大,但是需要额外的配置工作量,而且从 DevOps 的发展趋势看,DevOps 平台时代已经到来,DevOps 平台能够整合不同工具链的能力,对使用人员隐去众多配置的额外工作,从而聚焦在提供整体的 DevOps 能力。


引用链接

  1. https://about.gitlab.cn

  2. https://www.jenkins.io/

  3. https://jenkinsci.github.io/kubernetes-operator/


关于极狐(GitLab)

极狐(GitLab) 以“核心开放”为原则,面向中国市场,提供开箱即用的开放式一体化安全DevOps平台——极狐GitLab。通过业界领先的优先级管理、安全、风险和合规性功能,实现产品、开发、QA、安全和运维团队间的高效协同,加速和优化企业软件开发生命周期。极狐GitLab由极狐信息技术(湖北)有限公司在国内独立运营,提供中国本地化功能和支持服务。极狐(GitLab)公司以“中外合资3.0”模式创立,公司投资方包括GitLab Inc.、红杉宽带跨境数字产业基金,以及高成资本。


关注本公众号可以获取更多关于 DevOps 相关的技术实践分享。




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存