查看原文
其他

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

小马哥 极狐GitLab开发者 2022-05-14

小马哥

极狐GitLab DevOps 技术布道师,点击上方关注极狐GitLab 开发者订阅号,获取更多 DevOps 理念与实践。


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

极狐GitLab CI/CD


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


极狐GitLab

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


极狐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 相关的技术实践分享。



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存