在解锁极狐GitLab 和 Jenkins 集成的 N 种方式中,演示了如何使用极狐 GitLab 和 Jenkins 来搭建一个完整的 CI/CD Pipeline。其实从第三种方式:利用极狐 GitLab CI 来触发 Jenkins Job 就能够看出,其实极狐 GitLab CI/CD 是完全有能力完成 Jenkins CI/CD 功能的。
本文将阐述如何用极狐 GitLab CI/CD 来实现和 Jenkins 一样的功能。首先,先了解一下极狐 GitLab CI/CD。
极狐 GitLab CI/CD 是极狐 GitLab DevOps 能力中非常重要的一部分,能够帮助用户快速构建 CI/CD 能力,整个过程无需安装和配置第三方工具(诸如 Jenkins)。而极狐 GitLab Runner 是能够助力极狐 GitLab CI/CD 实现的重要法宝。后续文章会陆续输出极狐 GitLab Runner 的灵活使用。敬请期待!
在解锁极狐GitLab 和 Jenkins 集成的 N 种方式中的示例可以看出,极狐 GitLab 大部分时间仅仅被当作源代码托管服务,而代码构建、测试、部署等都在 Jenkins 上面完成,也就是说“Most In Jenkins”
Jenkins 的构建结果如下
整个构建的 Groovy Pipeline 代码大部分在这儿(不包含 Kubernetes pods template 的代码)。
node(label) {
container('golang'){
stage("Source Code Checkout"){
checkout([$class: 'GitSCM',
branches: [[name: '*/main']],
extensions: [],
userRemoteConfigs: [
[
credentialsId: 'jihu-gitlab-sshkey',
url: 'git@gitlab.cn:majinghe/go-demo.git'
]
]
]
)
}
}
container('docker'){
stage("Docker Image Build and Push"){
withCredentials([usernamePassword(credentialsId: 'jihu-gitlab-docker-registry', passwordVariable: 'password', usernameVariable: 'username')]) {
sh "docker login registry.gitlab.cn -u $username -p $password"
sh "docker build -t registry.gitlab.cn/majinghe/go-demo:$Release ."
sh "docker push registry.gitlab.cn/majinghe/go-demo:$Release"
}
}
}
container('kubectl'){
stage("Fetch Manifest File"){
println "Fetch Manifest file"
checkout([$class: 'GitSCM',
branches: [[name: '*/main']],
extensions: [],
userRemoteConfigs: [
[
credentialsId: 'jihu-gitlab-sshkey',
url: 'git@gitlab.cn:gitops/manifest.git'
]
]
]
)
}
stage("Deploy"){
sh "kubectl -n gitlab-demo apply -f deployment.yaml"
}
}
}
}
整体看,大体分为三部分:代码拉取、镜像构建、应用部署。下面就从这三方面入手来用极狐 GitLab CI/CD 逐一实现。
本例不没有包含代码编译、构建、测试等流程,是因为这是一个简单的 Demo 演示,而且一般情况下上述几个步骤的执行,就是一些 shell 命令,这个和后面的镜像构建的语法是类似的,参考即可。
对于 Jenkins 来讲,拉取变更代码的语法一般是
checkout([ $class: 'GitSCM',
branches: [[name: '*/main']],
extensions: [],
userRemoteConfigs: [
[
credentialsId: 'jihu-gitlab-sshkey',
url: 'git@gitlab.cn:majinghe/go-demo.git'
]
]
]
)
需要配置拉取代码的 ssh key 以及仓库地址。而这一点在极狐 GitLab 是极其简单的,不需要做任何改变,默认会把代码拉取存放到极狐 GitLab Runner 构建器内,默认路径是/builds/username/project-name。
对于 Jenkins 来讲,镜像构建的代码如下
withCredentials([usernamePassword(credentialsId: 'jihu-gitlab-docker-registry', passwordVariable: 'password', usernameVariable: 'username')]) {
sh "docker login registry.gitlab.cn -u $username -p $password"
sh "docker build -t registry.gitlab.cn/majinghe/go-demo:$Release ."
sh "docker push registry.gitlab.cn/majinghe/go-demo:$Release"
}
需要额外加一个 withCredentials 的语法,来把镜像仓库的用户名和密码传递过来。这需要借助 Jenkins 的 Credentials 插件,并且需要提前创建好对应的 credentials。
而对于极狐 GitLab 来讲,能更简单一点,直接用 login、build、push 三部曲就可以了。
build:
stage: build
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
CI_REGISTRY_PASSWORD、CI_REGISTRY_USER、CI_REGISTRY、CI_COMMIT_SHA,这些都是极狐 GitLab 预定义的 CI/CD 变量。更多的变量可以查看这儿[1]。
选择 Kubernetes 作为应用部署的基座。对于 Jenkins 而言,需要在 Jenkins 上安装一个 kubernetes 的插件,然后做一些配置。
部署的 Pipeline Groovy 语句如下
stage("Deploy"){
sh "kubectl -n gitlab-k8s-demo apply -f deployment.yaml"
}
极狐 GitLab 同样需要和 Kubernetes 做一些集成,这儿涉及到一些极狐 GitLab CI/CD 中与 Kubernetes 相关的预定义变量的使用,由于篇幅过大,不在这儿展开,后面还有文章专门讲述极狐 GitLab 与 Kubernetes 的集成。
将 Kubernetes 集群相关的 KUBE_URL、KUBE_CA_PEM 等信息写入极狐 GitLab CI/CD 变量中,使用下面几行代码,即可完成应用的部署。
deploy:
stage: deploy
image:
name: bitnami/kubectl:latest
entrypoint: [""]
script:
- kubectl config set-cluster jihu-tke --server="$KUBE_URL" --certificate-authority="$KUBE_CA_PEM"
- kubectl -n gitlab-k8s-demo apply -f deployment.yaml
所以对于极狐 GitLab 来讲,仅仅用下面二十几行代码就能够完成和上述 Jenkins Job 一样的功能。
image: docker:20.10.7
services:
- docker:20.10.7-dind
stages:
- build
- deploy
build:
stage: build
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
deploy:
stage: deploy
image:
name: bitnami/kubectl:latest
entrypoint: [""]
script:
- kubectl config set-cluster jihu-tke --server="$KUBE_URL" --certificate-authority="$KUBE_CA_PEM"
- kubectl -n gitlab-k8s-demo apply -f deployment.yaml
构建结果如下
最后可以在 Kubernetes 上面查看 pod 的状态
$ kubectl -n gitlab-k8s-demo get pods
NAME READY STATUS RESTARTS AGE
gitlab-k8s-demo-9794fd7bb-bfjwf 1/1 Running 0 61m
gitlab-k8s-demo-9794fd7bb-vb2b4 1/1 Running 0 61m
最终实现了“All In JiHu GitLab”
Jenkins 借助于丰富的插件来实现功能多样的 CI/CD,但是插件的安装、维护是一个不小的工作量,而且 Jenkins 本身也需要安装和维护。一般公司都是有专门的人员或者团队来进行整体的维护工作。
另外,现在流行的 Pipeline 的开发需要用到 Groovy 语法,在开发有新 Pipeline 上线的时候,一般是和 Jenkins 维护团队进行沟通协作,来完成新功能的 Pipeline 开发,无形之中增加了沟通成本,当团队增加的时候,还涉及到排期的问题。
而极狐 GitLab 借助极狐 GitLab Runner 来实现极狐 GitLab CI/CD,Runner 是一个用 go 语言开发且开源的组件[2]。其安装方式和使用方式都是非常灵活的,支持多操作系统(后续为大家陆续揭秘),再配合丰富的极狐 GitLab CI/CD 变量魔法[3],可以能很方便的构建起完整的 CI/CD 系统。开发人员可以通过查看相应的文档就能比较快的上手 Pipeline 的构建语法,从而可以自己来书写 Pipeline 进行新功能的调试、部署、测试等。当然,最重要的一点就是,没有额外的组件(除了 Runner,如果不打算自己 host Runner,那就连这点工作量也没了)需要安装,能够极大的减少工作量。
这也就是极狐 GitLab 开箱即用一体化 DevOps 平台的好处之一,把繁杂、复杂的事情留给平台,开发人员可以直接使用平台的能力来完成业务的开发,这样能够极大的提升研发效能。