基于gitlab+k8s实现CI/CD

项目简介

利用Container、Gitlab、Gitlab Runner(k8s)、SonarQube、Harbor、Jmeter、Maven、Java技术,搭建一个完整的 CI/CD 管道,实现当开发人员完成代码提交后,开始流水线工作,完成编译打包、单元测试、源码扫描、上传制品、部署服务到Docker容器、自动化测试工作。通过自动化构建、测试、代码质量检查和容器化部署,将开发人员从繁琐的手动操作中解放出来,提高团队的开发效率、软件质量和安全性,实现持续更新迭代和持续部署交付。

CI/CD流程图

gitops-gitlab+k8s.drawio.png

流程说明

  1. 开发人员将代码提交到Gitlab代码仓库时,触发持续构建和持续部署流程。
  2. k8s Runner通过maven镜像实现编译打包、单元测试操作。
  3. k8s Runner通过sonar-scanner镜像请求sonarqube服务,实现源码扫描操作。
  4. k8s Runner通过docker-dind镜像实现项目镜像构建并推送至Harbor镜像仓库。
  5. k8s Runner通过执行shell脚本完成镜像拉取以及启动容器服务操作。
  6. k8s Runner通过jmeter镜像实现自动化测试操作。
  7. 流水线执行完成后,将结果邮件通知给开发和运维人员。
  8. 用户访问项目服务器。

k8s资源列表

服务名称Service/ingress地址端口
镜像构建服务buildkitd.cicd.svc1234
代码托管服务gitlab.cicd.svc80
代码扫描服务sonarqube-sonarqube.cicd.svc9000
镜像仓库服务harbor.local.com443

准备工作

服务部署

镜像构建服务部署

关于镜像构建问题,如果k8s容器运行时为docker,可以直接使用docker in docker方案,启动一个docker:dind容器,通过绑定宿主机/var/run/docker.sock即可调用。
如果k8s容器运行时为container,则推荐使用nerdctl+buildkitd方案,启动一个buildkitd服务并暴露1234端口提供构建镜像服务,通过nerdctl命令请求buildkitd服务,执行镜像构建与推送操作,具体内容可参考
https://www.cuiliangblog.cn/detail/section/167380911
本次实验以container环境为例,通过nerdctl+buildkitd方案,实现构建并推送镜像。

  • buildkitd-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: buildkitd-config
  namespace: cicd
data:
  buildkitd.toml: |-
    debug = true
    [registry."docker.io"]
      mirrors = ["934du3yi.mirror.aliyuncs.com"]
    [registry."harbor.local.com"]
      http = false
  • buildkitd-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: buildkitd
  name: buildkitd
  namespace: cicd
spec:
  replicas: 1
  selector:
    matchLabels:
      app: buildkitd
  template:
    metadata:
      labels:
        app: buildkitd
    spec:
      containers:
        - name: buildkitd
          # image: moby/buildkit:master-rootless
          image: harbor.local.com/cicd/buildkit:master-rootless
          args:
            - --addr
            - tcp://0.0.0.0:1234
            - --addr
            - unix:///run/user/1000/buildkit/buildkitd.sock
            - --config
            - /etc/buildkitd/buildkitd.toml
          resources:
            requests:
              memory: "1Gi"
              cpu: "1"
            limits:
              memory: "4Gi"
              cpu: "4"
          readinessProbe:
            exec:
              command:
                - buildctl
                - debug
                - workers
          livenessProbe:
            exec:
              command:
                - buildctl
                - debug
                - workers
          securityContext:
            privileged: true
          ports:
            - containerPort: 1234
          volumeMounts:
            - mountPath: /etc/buildkitd
              name: config
      volumes:
        - name: config
          configMap:
            name: buildkitd-config

  • buildkitd-svc.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: buildkitd
  name: buildkitd
  namespace: cicd
spec:
  ports:
    - port: 1234
      protocol: TCP
  selector:
    app: buildkitd

Runner镜像构建

Runner不仅要构建镜像,还需要操作k8s资源,因此需要构建一个名为gitlab-runner-agent的镜像,dockerfile内容如下:

FROM alpine:latest
USER root
COPY kubectl /usr/bin/kubectl
COPY nerdctl /usr/bin/nerdctl
COPY buildctl /usr/bin/buildctl

部署gitlab-runner与优化

部署gitlab-runner具体内容可参考https://www.cuiliangblog.cn/detail/section/172302364,此处不再赘述,注册后的runner效果如下:
image.png
部署完gitlab-runner后可根据实际情况进行runner优化,具体可参考文档:https://www.cuiliangblog.cn/detail/section/174152592

流水线镜像构建

需要构建maven、sonar-scanner、jmeter镜像,具体可参考文档:https://www.cuiliangblog.cn/detail/section/172326640

模板库资源更新

模板库具体介绍可参考文档:https://www.cuiliangblog.cn/detail/section/173479217,本文是在gitlab+Linux项目基础上补充模板库内容。

deploy.yml

# 服务部署
.deploy-linux: # 部署到linux系统
  stage: deploy
  tags:
    - deploy
  script:
    - sh -x $DEPLOY_PATH $ARTIFACT_USER $ARTIFACTORY_KEY /opt/$ARTIFACT_URL_PATH $ARTIFACTORY_PUBLIC_URL/$ARTIFACT_REPO/$ARTIFACT_URL_PATH

.deploy-docker: # 部署到docker环境
  stage: deploy
  image: harbor.local.com/cicd/docker:dind # 在部署阶段使用docker:dind镜像操作
  tags:
    - docker
  script:
    - sh -x $DEPLOY_PATH $HARBOR_USER $HARBOR_PASSWORD $IMAGE_FULL_NAME $CI_PROJECT_NAME

.deploy-k8s: # 部署到k8s环境
  stage: deploy
  image: harbor.local.com/cicd/gitlab-runner-agent:v1.0 # 在部署阶段使用自定义镜像操作
  tags:
    - k8s
  script:
    - echo $NAME_SPACE
    - echo $DOMAIN_NAME
    - echo $IMAGE_FULL_NAME
    - sed -i "s|NAME_SPACE|${NAME_SPACE}|g" cicd/k8s.yaml
    - sed -i "s|DOMAIN_NAME|${DOMAIN_NAME}|g" cicd/k8s.yaml
    - sed -i "s|IMAGE_NAME|${IMAGE_FULL_NAME}|g" cicd/k8s.yaml
    - cat cicd/k8s.yaml
    - kubectl apply -f cicd/k8s.yaml

harbor.yml

# 镜像上传与下载
variables: # 全局变量
  HARBOR_URL: harbor.local.com # harbor仓库地址
  IMAGE_FULL_NAME: "$HARBOR_URL/$HARBOR_REPO/$IMAGE_NAME"

.docker-upload-harbor:
  stage: upload-harbor
  image: harbor.local.com/cicd/docker:dind # 在构建镜像阶段使用docker:dind镜像操作
  tags: # 在docker机器构建镜像
    - docker
  before_script:
    - cat $DOCKERFILE_PATH 
  script:
    - docker build -f $DOCKERFILE_PATH -t $IMAGE_FULL_NAME .
    - docker login $HARBOR_URL -u $HARBOR_USER -p $HARBOR_PASSWORD # 登录harbor
    - docker push $IMAGE_FULL_NAME # 上传镜像
    - docker rmi -f $IMAGE_FULL_NAME # 删除镜像

.docker-download-harbor:
  stage: download-harbor
  image: harbor.local.com/cicd/docker:dind # 在构建镜像阶段使用docker:dind镜像操作
  tags:
    - docker
  script:
    - docker login $HARBOR_URL -u $HARBOR_USER -p $HARBOR_PASSWORD # 登录harbor
    - docker pull $IMAGE_FULL_NAME # 下载镜像
  after_script:
    - docker images

.container-upload-harbor:
  stage: upload-harbor
  image: harbor.local.com/cicd/gitlab-runner-agent:v1.0 # 在构建镜像阶段使用自定义镜像操作
  tags: # 在k8s机器构建镜像
    - k8s
  before_script:
    - cat $DOCKERFILE_PATH 
  script:
    - nerdctl build --buildkit-host tcp://buildkitd.cicd.svc:1234 -f $DOCKERFILE_PATH -t $IMAGE_FULL_NAME .
    - nerdctl login $HARBOR_URL --insecure-registry -u $HARBOR_USER -p $HARBOR_PASSWORD # 登录harbor
    - nerdctl push $IMAGE_FULL_NAME --insecure-registry # 上传镜像
    - nerdctl rmi -f $IMAGE_FULL_NAME # 删除镜像

.container-download-harbor:
  stage: download-harbor
  image: harbor.local.com/cicd/gitlab-runner-agent:v1.0 # 在构建镜像阶段使用自定义镜像操作
  tags:
    - k8s
  script:
    - nerdctl login --insecure-registry $HARBOR_URL -u $HARBOR_USER -p $HARBOR_PASSWORD # 登录harbor
    - nerdctl pull $IMAGE_FULL_NAME --insecure-registry # 下载镜像
  after_script:
    - nerdctl images

流水线项目创建

项目代码仓库地址

gitee:https://gitee.com/cuiliang0302/spring_boot_demo
github:https://github.com/cuiliang0302/spring-boot-demo

gitlab项目权限配置

具体参考文档:https://www.cuiliangblog.cn/detail/section/169621642

配置密钥变量

进入项目——>设置——>CI/CD——>变量
新建SONAR_QUBE_TOEKN、HARBOR_PASSWORD两个变量,取消保护变量,并勾选隐藏变量。
变量配置信息内容如下:
下载.png
ARTIFACTORY_KEY cmVmdGtuOjAxOjE3NDk5OTgyMzk6SVA4bjlCRm9URWNlSUhUVDg3QW9yTm9HWllQ
SONAR_QUBE_TOEKN squ_5583fe4ce47851eb16a1ce638b4681d931505ccc
squ_16cc9225bf7fe70ce4f55a851efb41fede1fb80a

配置邮件发送

具体可参考文档:https://www.cuiliangblog.cn/detail/section/173068275

流水线配置

在项目根目录下创建.gitlab-ci.yml文件,流水线内容如下

include: # 引入模板库公共文件
  - project: 'devops/gitlabci-template'
    ref: master
    file: 'jobs/build.yml'
  - project: 'devops/gitlabci-template'
    ref: master
    file: 'jobs/test.yml'
  - project: 'devops/gitlabci-template'
    ref: master
    file: 'jobs/sonarqube.yml'
  - project: 'devops/gitlabci-template'
    ref: master
    file: 'jobs/harbor.yml'
  - project: 'devops/gitlabci-template'
    ref: master
    file: 'jobs/deploy.yml'
  - project: 'devops/gitlabci-template'
    ref: master
    file: 'jobs/jmeter.yml'

variables: # 全局变量
  SONAR_QUBE_PATH: "$CI_PROJECT_DIR/cicd/sonar-project.properties" # sonarqube配置文件地址
  # 镜像上传
  HARBOR_REPO: devops # harbor仓库名
  HARBOR_USER: admin # harbor用户名
  DOCKERFILE_PATH: cicd/Dockerfile # Dockerfile文件路径
  IMAGE_NAME: "$CI_PROJECT_NAME:$CI_COMMIT_BRANCH-$CI_COMMIT_SHORT_SHA" # 镜像名称
  # 服务部署
  DEPLOY_PATH: "$CI_PROJECT_DIR/cicd/deployment-docker.sh" # 服务部署脚本路径
  # 自动化测试
  JMETER_PATH: "$CI_PROJECT_DIR/cicd/jmeter/demo.jmx" # 自动化测试脚本路径

default:
  cache: # 全局缓存配置
    paths:
      - target/

stages:
  - build
  - code_scan
  - product
  - deploy
  - test

mvn: # 编译打包
  stage: build
  extends: .mvn-build
  image: harbor.local.com/cicd/maven:v3.9.3 # 构建阶段使用指定的maven镜像
  tags:
    - k8s
  
unit_test: # 单元测试
  stage: build
  extends: .mvn_unit_test
  image: harbor.local.com/cicd/maven:v3.9.3 # 构建阶段使用指定的maven镜像
  tags:
    - k8s

code_scan: # SonarQube代码扫描
  stage: code_scan
  extends: .sonarqube
  image: harbor.local.com/cicd/sonar-scanner-cli:10 # 代码扫描阶段使用sonar-scanner-cli镜像
  before_script:
    - ls target/
  tags:
    - k8s
  
product: # 上传到harbor仓库
  stage: product
  extends: .container-upload-harbor
  tags:
    - k8s

deploy_to_prod: # 部署到生产环境
  stage: deploy
  extends: .deploy-k8s
  rules:
    - if: '$CI_COMMIT_BRANCH == "master"'
  tags: 
    - k8s
  variables:
    NAME_SPACE: prod
    DOMAIN_NAME: prod.local.com
  after_script:
    - sleep 10
    - kubectl get pod -n $NAME_SPACE -o wide
  environment: # 生产环境
    name: production
    url: http://$DOMAIN_NAME

deploy_to_test: # 部署到测试环境
  stage: deploy
  extends: .deploy-k8s
  rules:
    - if: '$CI_COMMIT_BRANCH == "test"'
  tags: 
    - k8s
  variables:
    NAME_SPACE: prod
    DOMAIN_NAME: prod.local.com
  after_script:
    - sleep 10
    - kubectl get pod -n $NAME_SPACE -o wide
  environment: # 测试环境
    name: test
    url: http://$DOMAIN_NAME

pages: # 自动化测试并收集测试报告
  stage: test
  extends: .jmeter
  image: harbor.local.com/cicd/jmeter:5.6.3 # 自动化阶段使用jmeter镜像
  tags: 
    - k8s

结果验证

pod信息查看

[root@tiaoban ~]# kubectl get pod -n prod
NAME                    READY   STATUS    RESTARTS   AGE
demo-655457bb99-9s8hr   1/1     Running   0          51s

其他效果与之前gitlab+linux效果类似,区别在于本次全程使用k8s类型runner运行job任务。

查看更多

微信公众号

微信公众号同步更新,欢迎关注微信公众号《崔亮的博客》第一时间获取最近文章。

博客网站

崔亮的博客-专注devops自动化运维,传播优秀it运维技术文章。更多原创运维开发相关文章,欢迎访问https://www.cuiliangblog.cn

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Jenkins、GitLabKubernetes是三个常用的开源工具。它们能够相互协作形成一个完整的构建自动化CI/CD发布流水线。 首先,开发者在GitLab的代码仓库中提交代码,触发GitLab的Webhook,告知Jenkins需要进行构建。 接下来,Jenkins开始执行构建任务,它会拉取GitLab中的代码仓库,并在Kubernetes集群中创建一个构建环境。在构建环境中,Jenkins会进行一些构建工作,如编译代码、运行测试、打包程序等。 当Jenkins构建成功后,它会将构建好的程序镜像推送到Kubernetes上,Kubernetes将在自己的集群中创建一个新的Pod,并将新的程序部署到这个Pod中。当程序运行成功后,Kubernetes自动更新负载均衡器路由。 这样,整个构建自动化CI/CD发布流水线就完成了,从代码仓库提交到程序部署,全部都是自动完成的,可以大大提高开发效率,减少出错的可能性。同时,由于使用了Kubernetes,可以实现水平扩展和高可用性,保证了程序稳定运行。 ### 回答2: Jenkins、GitLabKubernetesk8s)是如今广泛应用于软件开发和部署的热门工具。这三个工具的结合,为软件开发的自动化构建、持续集成和持续交付(CI/CD)提供了更加高效、可靠的方法。 当我们考虑如何将这三个工具集成到一起时,以下是一种建议的CI/CD发布流水线: 1. GitLab仓库维护代码版本控制 GitLab是一个代码托管平台,它提供了完整的Git存储库管理工具,包括代码审查、问题跟踪和持续集成。我们可以在GitLab中设置一个仓库,用于维护我们的应用程序代码。我们的代码将被存储在该仓库中,可以利用GitLab提供的版本控制和分支管理功能方便地进行协作和开发。 2. Jenkins构建应用程序 Jenkins是一个流行的自动化构建工具,它可以与GitLab集成,以便在GitLab存储库的变更上触发自动化构建。Jenkins从GitLab仓库中获取代码并自动构建我们的应用程序。如果构建成功,则可以将构建后的应用程序存储在构建存储库或者将其部署到Kubernetes集群中,否则通知开发者维护代码。 3. 部署到Kubernetes集群 Kubernetes (k8s)是一个开源容器编排管理器,它可以帮助我们管理和部署容器化的应用程序。我们可以将我们的应用程序容器化,并将其部署到Kubernetes集群上,这将为我们提供高可用性、可伸缩性和自动化容器调度等好处。 我们可以使用KubernetesK8s自动化部署工具,以通过各种环境阶段(测试、预生产和生产)自动部署容器化应用程序的不同副本,从而完成全面部署。 4. 自动化测试应用程序 在部署应用程序部署之前,应使用不同的测试阶段对其进行测试,包括单元测试、集成测试和端到端测试。在一个CI/CD管道中,我们可以添加多个虚拟机代表不同的测试阶段,来自动化测试应用程序。如果某种类型的测试失败,则将在构建次数的下面进行记录和报警,以便修复应用程序中的问题。 通过使用上述流程,我们可以实现一个自动化构建和部署的CI/CD流水线,从而形成一个协调的工具链集成,使软件开发活动化和规范化。这将为我们提供更高效、可靠的开发和部署环境,从而缩短开发周期、减少对人力的依赖,以及提高应用程序质量和交付速度。同时,我们的代码将始终被版本控制,让我们随时翻查历史,充分发掘之前的知识和经验。 ### 回答3: 现代软件开发过程中,持续集成、持续交付和持续部署成为了不可或缺的重要环节,对于构建自动化 CI/CD 发布流水线,使用 Jenkins、GitLabKubernetes 是目前主流的选择。 Jenkins 是最经典的自动化构建工具之一,它可以无缝集成 GitLab实现代码检出、运行测试、打包构建、发布部署等操作。此外,Jenkins 也支持插件化的扩展,可以方便的与第三方工具进行集成并自动化构建。对于 Jenkins,我们需要建立一个 Jenkins 服务器,配置好 GitLab 仓库的访问权限,并在 Jenkins 中配置 WebHook,使其能够接收 GitLab 代码提交的通知触发自动化构建。 GitLab 是一款完整的 CI/CD 工具链,除了支持源码管理、合并请求和协作功能外,还内置了 CI/CD 功能,可以集成测试、构建、发布等自动化流程。与 Jenkins 集成,可以实现更强大的自动化构建和交付流程。我们需要在 GitLab 项目中配置自动化构建流水线,并在相对应的流程中配置 Jenkins 以触发相关的构建、测试和发布操作。 Kubernetes 是一款流行的容器编排及部署工具,可以极大地简化应用程序的部署和扩展。对于自动化构建和交付,Kubernetes 的作用在于将应用程序打包为 Docker 镜像,然后自动部署到云端集群环境中,完成持续部署的流程。我们需要在 Kubernetes 中配置相应的应用程序部署文件,并将其注册到 Kubernetes 集群中,以便实现自动化部署和发布。通常我们需要部署 Kubernetes 应用程序的一个运行环境,如 Harbor 仓库,容器运行时等。 在应用程序的构建和交付过程中,最重要的是持续监测和优化,我们需要使用可视化和统一的工具来监测应用程序的性能和健康状况。对于这个目的,我们可以选择一些可视化的 APM 工具,如 New Relic,将其集成到我们的 CI/CD 流程中,以监测和优化应用程序的性能。此外,我们也可以使用一些 CI/CD 管理平台,例如 Jenkins X,来简化整个流程,并提供一个更全面的工具来监测和管理应用程序的构建和交付流程。 总之,构建自动化 CI/CD 发布流水线是现代软件开发的必要环节,使用 Jenkins、GitLabKubernetes 可以大大简化这个过程,提高开发流程的自动化和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值