返回文章列表
开发 | 运维 | 医疗 | 互联网 | 人工智能 2023-09-06

如何利用极狐GitLab CI/CD 完成 Jenkins 的迁移

小马哥
极狐GitLab 技术布道师

解锁极狐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 CI/CD 是极狐 GitLab DevOps 能力中非常重要的一部分,能够帮助用户快速构建 CI/CD 能力,整个过程无需安装和配置第三方工具(诸如 Jenkins)。而极狐 GitLab Runner 是能够助力极狐 GitLab CI/CD 实现的重要法宝。后续文章会陆续输出极狐 GitLab Runner 的灵活使用。敬请期待!

 

使用极狐 GitLab CI/CD 实现 Jenkins 的迁移

 

解锁极狐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 平台的好处之一,把繁杂、复杂的事情留给平台,开发人员可以直接使用平台的能力来完成业务的开发,这样能够极大的提升研发效能。

 

引用链接

  1. https://docs.gitlab.com/ee/ci/variables/
  2. https://docs.gitlab.com/runner/
  3. https://docs.gitlab.com/ee/ci/variables/index.html#deployment-variables
极狐GitLab 一体化DevOps平台 专为中国用户研发,免费试用60天专业版高级功能
售前咨询
联系电话
在线支持
预约演示