GitLab CI:让代码的变迁如行云流水,高效而优雅

一、GitLab CI/CD

  • • gitlab-CI gitlab8.0之后自带的一个持续集成系统,当每一次push到gitlab的时候,都会触发一次脚本执行。然后脚本内容包括测试、编译,部署等操作内容。

  • • gitlab-CI的脚本执行,需要自定义安装对应gitlab-runner来执行,代码push之后,webhook检测到代码变化,就会触发gitlab-CI,分配到各个runner来运行相应的脚本script。

GitLab CI:让代码的变迁如行云流水,高效而优雅
img

二、对比点

分支可配置性

  • • 使用Gitlab-CI,新创建的分支无需任何一步配置即可立即使用CI管道中定义的作业

  • • Jenkina 2基本gitlab的多分支流水线可以实现,相对配置来说gitlab更加方便

拉取请求支持

  • • GitLab与其CI平台紧密集成,可以方便查看每个打开和关闭的请求运行和完成管道。

  • • Jenkins没有与源代码管理系统进一步集成

权限管理

  • • 由于GitLab与CI深度整合,权限可以统一管理。

  • • Jenkins中需要单独管理权限控制,且权限复杂。

存储库交互

  • • GitLab CI是Git存储库的管理器固定组件

  • • Jenkins可以支持多种代码存储库的支持,同时多种插件可配置。

插件管理

  • • GitLab是开放式的,把多种功能集成到一起,不需要依赖插件。

  • • Jenkins的功能插件很多,更新维护成本高。插件更新及容易导致任务不可用。

总结:

  1. 1. 开发人员在使用gitbucket+jenkins,部署任务需要登录到jenkins上查看,目前jenkins没有做到按项目权限划分。使用jenkins查看任务构建状态不太方便找到。

  2. 2. gitlab-ci是把构建任务绑定在项目分支上,每一次提交都有新的构建任务触发,构建任务和代码目录相对应,更直观的能够看到构建状况。

  3. 3. 目前jenkins做了CI和CD两部分工作,假如开发人员只想做CI,那是不是GitLab-CI更方便开发人员测试,当需要发布时候在告知运维做CD同步。

测试研发生产Argo CDGitLab-CI

三、GitLab-CI的使用

  1. 1. GitLab-CI Runner介绍

  • • GitLab-CI Runner是一个开源项目,用于运行作业并将结果发送给GitLab。

  • • 与GitLab-CI结合使用,GitLab-CI是GitLab随附的用于协调作业的开源支持集成服务。

  • • GitLab-CI Runner是用go语言编写的,可以在linux,mac和window操作系统上运行。

  • • 容器部署需要使用最少Docker V1.13.0版本。

  • • GitLab-CI Runner 版本应与GitLab版本同步。

  • • 可以根据需要配置任意数量的Runner。

  1. 1. GitLab-CI Runner特点

作业运行控制:同时执行多个作业

作业运行环境:Linux、macOS、Windows、Docker、Kubernetes

  1. 1. GitLab-CI Runner类型与状态

类型:

    • • shared 共享类型,运行在整个平台项目的作业(gitlab)

    • • group 项目组类型,运行特定group下的所有项目作业(group)

    • • specific 项目类型,运行指定的项目作业(project)

状态:

    • • locked 锁定状态,无法运行项目作业

    • • paused 暂停状态,暂时不会接受新的作业

  1. 1. Runner的安装

image-20231225133145505

Linux

sudo curl ---output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
sudo chmod +/usr/local/bin/gitlab-runner
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start

Docker


sudo docker run ---name gitlab-runner --restart always -/srv/gitlab-runner/config:/etc/gitlab-runner -/var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:latest

k8s

runner-configmap.yaml

apiVersion: v1
data:
  REGISTER_NON_INTERACTIVE: "true"
  REGISTER_LOCKED: "false"
  METRICS_SERVER: "0.0.0.0:9100"
  CI_SERVER_URL: "http://172.16.1.233:50080/ci"
  RUNNER_REQUEST_CONCURRENCY: "4"
  RUNNER_EXECUTOR: "kubernetes"
  KUBERNETES_NAMESPACE: "kube-ops"
  KUBERNETES_PRIVILEGED: "true"
  KUBERNETES_CPU_LIMIT: "1"
  KUBERNETES_MEMORY_LIMIT: "1Gi"
  KUBERNETES_SERVICE_CPU_LIMIT: "1"
  KUBERNETES_SERVICE_MEMORY_LIMIT: "1Gi"
  KUBERNETES_HELPER_CPU_LIMIT: "500m"
  KUBERNETES_HELPER_MEMORY_LIMIT: "100Mi"
  KUBERNETES_PULL_POLICY: "if-not-present"
  KUBERNETES_TERMINATIONGRACEPERIODSECONDS: "10"
  KUBERNETES_POLL_INTERVAL: "5"
  KUBERNETES_POLL_TIMEOUT: "360"
kind: ConfigMap
metadata:
  labels:
    app: gitlab-ci-runner
  name: gitlab-ci-runner-cm
  namespace: kube-ops

runner-scripts-cm.yaml

apiVersion: v1
data:
  run.sh: |
    #!/bin/bash
    unregister() {
        kill %1
        echo "Unregistering runner ${RUNNER_NAME} ..."
        /usr/bin/gitlab-ci-multi-runner unregister -"$(/usr/bin/gitlab-ci-multi-runner list 2>&1 | tail -n1 | awk '{print $4}' | cut -d'=' -f2)" -n ${RUNNER_NAME}
        exit $?
    }
    trap 'unregister' EXIT HUP INT QUIT PIPE TERM
    echo "Registering runner ${RUNNER_NAME} ..."
    /usr/bin/gitlab-ci-multi-runner register -r ${GITLAB_CI_TOKEN}
    sed -'s/^concurrent.*/concurrent = '"${RUNNER_REQUEST_CONCURRENCY}"'/' /home/gitlab-runner/.gitlab-runner/config.toml
    echo "Starting runner ${RUNNER_NAME} ..."
    /usr/bin/gitlab-ci-multi-runner run -n ${RUNNER_NAME} &
    wait
kind: ConfigMap
metadata:
  labels:
    app: gitlab-ci-runner
  name: gitlab-ci-runner-scripts
  namespace: kube-ops

gitlab-ci-token-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: gitlab-ci-token
  namespace: kube-ops
  labels:
    app: gitlab-ci-runner
data:
  GITLAB_CI_TOKEN: R1IxMzQ4OTQxSGtIRlFSVFdzS3AxaG5IRmJKbnIK

runner-rbac.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: gitlab-ci
  namespace: kube-ops
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: gitlab-ci
  namespace: kube-ops
rules:
  - apiGroups: [""]
    resources: ["*"]
    verbs: ["*"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: gitlab-ci
  namespace: kube-ops
subjects:
  - kind: ServiceAccount
    name: gitlab-ci
    namespace: kube-ops
roleRef:
  kind: Role
  name: gitlab-ci
  apiGroup: rbac.authorization.k8s.io

runner-statefulset.yaml

apiVersion: v1
kind: Service
metadata:
  name: gitlab-ci-runner
  namespace: kube-ops
  labels:
    app: gitlab-ci-runner
spec:
  ports:
  - port: 9100
    targetPort: 9100
    name: http-metrics
  clusterIP: None
  selector:
    app: gitlab-ci-runner
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: gitlab-ci-runner
  namespace: kube-ops
  labels:
    app: gitlab-ci-runner
spec:
  updateStrategy:
    type: RollingUpdate
  replicas: 2
  serviceName: gitlab-ci-runner
  selector:
    matchLabels:
      app: gitlab-ci-runner
  template:
    metadata:
      labels:
        app: gitlab-ci-runner
    spec:
      volumes:
      - name: gitlab-ci-runner-scripts
        projected:
          sources:
          - configMap:
              name: gitlab-ci-runner-scripts
              items:
              - key: run.sh
                path: run.sh
                mode: 0755
      serviceAccountName: gitlab-ci
      securityContext:
        runAsNonRoot: true
        runAsUser: 999
        supplementalGroups: [999]
      containers:
      - image: gitlab/gitlab-runner:latest
        name: gitlab-ci-runner
        command:
        - /scripts/run.sh
        envFrom:
        - configMapRef:
            name: gitlab-ci-runner-cm
        - secretRef:
            name: gitlab-ci-token
        env:
        - name: RUNNER_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        ports:
        - containerPort: 9100
          name: http-metrics
          protocol: TCP
        volumeMounts:
        - name: gitlab-ci-runner-scripts
          mountPath: "/scripts"
          readOnly: true
      restartPolicy: Always
  1. 1. Runner注册

gitlab-runner register --url http://172.16.1.236:50080/ --registration-token $REGISTRATION_TOKEN    ##这里的tocker要写具体项目或者全局的
  1. 1. .gitlab-ci.yaml配置参数

关键字 描述
关键字 描述
except 限制作业在什么时候不创建
cache 指定需要在job之间缓存的文件或目录
parallel 指定并行运行的作业实例
script 必须参数,运行器需要执行的脚本
dependencies 当前作业依赖的其他作业,你可以使用依赖作业的归档文件
artifacts 归档文件列表,指定成功后应附加到job的文件和目录的列表
variables 定义环境变量
stages 定义流水线所有的阶段
only 定义哪些分支运行,限制作业在什么上创建
stage 定义作业所处流水线的阶段(默认test阶段)
trigger 定义下游流水线的触发器
allow_failure 允许作业失败,失败的作业不影响提交的状态
services 使用Docker services(服务)镜像
image 使用Docker image镜像
environment 作用部署的环境名称
coverage 作业的代码覆盖率
after_script 作业执行后需要执行的命令
before_script 作业执行前需要执行的命令
retry 作业失败时,可以自动执行多少次
include 作业加载其他YAML文件
tags 作业使用的Runner运行器的标签
when 什么时候运行作业
pages 上传GitLab Pages的结果

例子

stages:
  - build
  - push
  - sync
 
build:
  stage: build
  script:
    - sudo docker build -Dockerfile -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$CI_COMMIT_SHORT_SHA .
 
 
push:
  stage: push
  script:
    - echo "$DOCKER_PASS" | sudo  docker login $REGISTRY -"$DOCKER_USER" --password-stdin
    - sudo docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$CI_COMMIT_SHORT_SHA
     
 
 
 
sync:
  stage: sync
  before_script:
    - git remote set-url origin http://${CI_USERNAME}:${CI_PASSWORD}@172.16.1.236:50080/ops/mark-demo
    - git config --global user.email "gitlab@git.k8s.local"
    - git config --global user.name "GitLab CI/CD"
  script:
    - git checkout -B main
    - cd deployment/ && ls -lrt
    - sed -"s/$APP_NAME:.*/$APP_NAME:$CI_COMMIT_SHORT_SHA/g"  mark-web-dev.yaml
    - git commit -am '[skip ci] DEV image update'
    - git push origin main
 
variables:
  REGISTRY: "123.56.140.4:808"
  DOCKERHUB_NAMESPACE: "mark"
  APP_NAME: "mark-web"
image: docker:stable
stages:
  - build
  - push
  - sync
  - deploy
 
build:
  image: docker:stable
  stage: build
  tags:
    - k8s-runner
  script:
    - docker build -Dockerfile -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$CI_COMMIT_SHORT_SHA .
 
 
push:
  image: docker:stable
  stage: push
  tags:
    - k8s-runner
  script:
    - echo "$DOCKER_PASS" | docker login $REGISTRY -"$DOCKER_USER" --password-stdin
    - docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$CI_COMMIT_SHORT_SHA
     
 
 
 
sync:
  image: cnych/kubectl
  stage: sync
  tags:
    - k8s-runner
  before_script:
    - git remote set-url origin http://${CI_USERNAME}:${CI_PASSWORD}@172.16.1.233:50080/ops/mark-demo
    - git config --global user.email "gitlab@git.k8s.local"
    - git config --global user.name "GitLab CI/CD"
  script:
    - git checkout -B main
    - cd deployment/ && ls -lrt
    - sed -"s/$APP_NAME:.*/$APP_NAME:$CI_COMMIT_SHORT_SHA/g"  mark-web-dev.yaml
    - git commit -am '[skip ci] DEV image update'
    - git push origin main
 
deploy:
  image: cnych/kubectl
  stage: deploy
  tags:
    - node1
  script:
    - cd deployment
    - cat mark-web-dev.yaml
    - sudo kubectl apply -f   mark-web-dev.yaml
 
 
variables:
  REGISTRY: "123.56.140.4:808"
  DOCKERHUB_NAMESPACE: "mark"
  APP_NAME: "mark-web"


原文始发于微信公众号(背带裤的云原生):GitLab CI:让代码的变迁如行云流水,高效而优雅

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/219100.html

(0)
青莲明月的头像青莲明月

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!