返回文章列表
CTO | 开发 | 运维 | 医疗 | 互联网 2023-07-11

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

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

前言

 

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

 

关于 Jenkins

 

Jenkins 是一款开源的、非常优秀的持续集成工具,在国内外都有众多的拥趸者。Jenkins 具有以下优点:
 

  • 易于上手
  • 插件众多
  • API 丰富
  • 社区强大
     

所以 Jenkins 也被众多的企业或者组织用来构建自己的 CI/CD 系统。

 

然而,Jenkins 本身并不具备源代码管理的能力,而对于一个完整的 CI/CD 系统来讲,必须要从源代码管理系统开始。所以,本文将介绍如何利用极狐GitLab 和 Jenkins 来构建一个完整的 CI/CD 系统。

 

极狐GitLab 是一个一体化的 DevOps 平台,源代码管理只是其功能的一部分。更多关于极狐GitLab 的内容,可以登陆 https://about.gitlab.cn 进行查看。

 

极狐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
     

 

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 官网的介绍来安装 Jenkins。

 

但是,为了方便大家能够更便捷的安装 Jenkins,小马哥秉持着“一切皆代码”的宗旨,对所有安装流程进行了梳理,并用 kustomize 进行了编排,并将所有代码存放在了极狐GitLab 的仓库中。

 

“一切皆代码”能够很好的实现 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 以 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 的集成实践

 

  • 创建一个 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 服务暴漏。

 

接下来,获取 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 种方式了。
 

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

 

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


 

极狐GitLab 一体化DevOps平台 专为中国用户研发,免费试用60天专业版高级功能
售前咨询
联系电话
在线支持
预约演示