前言

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

关于 Jenkins

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

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

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

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

集成实践

本次集成实践主要包含以下内容

最后将演示三个不同的实践 demo,来展示极狐GitLab 和 Jenkins 的灵活配合

gitlab-jenkins

Jenkins 的安装

当然,Jenkins 的安装有多种方式,诸如

当然,在如今的云原生时代,我们将选择第三种方式来运行 Jenkins 实例。

Jenkins-Operator

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

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

一切皆代码能够很好的实现 GitOps,关于GitOps 可以查看过往的公众号:GitOps 系列|云原生时代,还不懂 GitOps?而且可以借助 ArgoCD 来让 Jenkins 以 GitOps 的方式运行起来。关于极狐GitLab 和 ArgoCD 的集成,可以查看公众号文章极狐GitLab 和 ArgoCD 的集成实践

Jenkins 安装步骤

$ 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"

前面的 apiTokenIdcredentialsId 都是与极狐GitLab Personal Access Token 相关的 token 信息,只不过每个 token 需要不同的权限。

Token 的创建过程可以参考下图展示的流程

personal-token

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 的集成实践

$ 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 的使用密切相关,感兴趣的小伙伴可以自行查阅。

$ 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
TxxxJYnVE09WddddddIVO2y
$ kubectl -n jenkins get secret jenkins-operator-credentials-jenkins -o jsonpath="{.data.user}" | base64 -D
jenkins-operator

jenkins-login

至此,Jenkins 的安装与配置(极狐GitLab 的配置以 configmap 的形式挂载到了 Jenkins 实例的 config.yaml 文件中,Jenkins 实例起来以后,配置自从生效)已经完成,再次确认一下极狐GitLab 的配置是否生效

Manage Jenkins --> Configurae --> GitLab 点击 Test Connection 测试连通性,返回 Success 则证明 Jenkins 和极狐GitLab 的连通性没有问题。

gitlab-plugin

接下来,就可以解锁极狐GitLab 和 Jenkins 集成的 N 种方式了。

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

这种场景中,极狐GitLab 作为源代码管理平台,而 Jenkins 作为 CI/CD 工具。Job 的构建从 Jenkins 侧发起。

此时只需要选择构建上图中所示的 Demo Job 即可,点击 Build with Parameters 后选择合适的参数

job-build

点击 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 中。

构建流程和结果如下图

console-result

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

在这种场景下,Jenkins Job 的触发是在极狐GitLab 侧发起,也就是说当极狐GitLab 仓库中的代码发生变化时,能够自动触发 Jenkins Job

有两种方式能够实现这种场景

通过 webhook 的方式

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

webhook

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

webhook-1

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

webhook-2

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

result

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

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

integration-jenkins

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

integration-jenkins-1

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

result

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

在这种场景下,会完全使用极狐GitLab CI 来调用 Jenkins API 来触发 Jenkins Job。这种不需要维护和安装极狐GitLab 的一些 Jenkins 插件,而是充分使用了极狐GitLab CI 的功能。

在 Jenkins 右上角的用户选项中,选择 Configure,在 API Token 中生成 token 并保存。

token-creation

在 Jenkins Job 中配置 Trigger builds remotely 输入上面步骤生成的 Token

remote-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}&parameters1=value1&parameters2=values2"

gitlab-ci

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

result

上述的演示解锁了极狐GitLab 和 Jenkins 灵活集成的多种方式,仅仅作为演示用,具体使用中需要充分考虑项目的复杂度、安全性。

结束语

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

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

60天免费试用极狐GitLab专业版

极狐GitLab不仅是源代码管理或CI/CD工具,它是一个覆盖完整软件开发生命周期和DevOps的开放式一体化平台。

企业版试用
售前咨询
联系电话
在线支持
预约演示