写点什么

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

用户头像
极狐GitLab
关注
发布于: 4 小时前

解锁极狐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.7services:  - docker:20.10.7-dindstages:            - build  - deploybuild:  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_SHAdeploy:  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 podsNAME                              READY   STATUS    RESTARTS   AGEgitlab-k8s-demo-9794fd7bb-bfjwf   1/1     Running   0          61mgitlab-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)

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


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


关于作者:小马哥,极狐 GitLab DevOps 技术布道师



发布于: 4 小时前阅读数: 4
用户头像

极狐GitLab

关注

开源开放,人人贡献 2021.05.19 加入

开放式一体化DevOps平台,助力行业高速协同增长!

评论

发布
暂无评论
如何利用极狐GitLab CI/CD 完成 Jenkins 的迁移