【 构建CICD流水线】

1、gitlab的用法

#创建项目
git add webapp
#初始化项目
git init 
#创建master分支
git checkout -b master
#分支重命名
git branch -m main master
#把指定项目的代码推送到指定的分支
git push origin master
#把某个目录推送到分支
git add tomcat
git commit -m "add dir tomcat"
git push origin master
#拉取分支代码
git pull origin master

2.构建CICD流水线

2.1 配置免密拉取gitlab仓库代码

在这里插入图片描述

2.2 配置CICD

2.2.1配置gitlab-Runner流水线作业运行的环境
root@docker-runner1:~/helm-runner# ll
total 46912
drwxr-xr-x  2 root root       74 Dec 27 10:28 ./
drwx------ 11 root root      294 Dec 27 10:24 ../
-rw-r--r--  1 root root     1378 Dec 26 15:36 Dockerfile
-rwxr-xr-x  1 root root      225 Dec 23 16:22 build.sh*
-r--------  1 root root     6200 Dec 23 15:56 config.yaml
-rw-r--r--  1 root root 48021504 Nov 18  2023 kubectl
root@docker-runner1:~/helm-runner# cat Dockerfile
FROM alpine:latest
# 复制 kube-config 文件
ADD config.yaml  /apps/config.yaml
# 设置 Helm 的 kubeconfig
ENV KUBECONFIG=/apps/config.yaml
# 替换 Alpine 软件源,并安装必要工具和插件
RUN { \
      echo 'http://mirrors.tuna.tsinghua.edu.cn/alpine/v3.12/main'; \
      echo 'http://mirrors.tuna.tsinghua.edu.cn/alpine/v3.12/community'; \
    } > /etc/apk/repositories && \
     apk add gettext                                      #这个是envsubst命令的安装包
ADD kubectl /usr/bin/kubectl
RUN chmod a+x /usr/bin/kubectl
# 定义 ENTRYPOINT 和 CMD
CMD ["kubectl", "version"]

root@docker-runner1:~/helm-runner# cat build.sh
#构建生产环境
#!/bin/bash
# docker build  --network host  --build-arg HELM_VERSION="3.15.2" --build-arg KUBE_CONFIG=./kubeconfig/config.yaml --build-arg CHART_REPO="http://172.17.1.112:80/prod"  -t prod-image:v1 .  #通过变量传参构建
docker build -t harbor.qiange.com/cicd/prod-image:v2 .

每个作业运行的镜像环境构建方法都一样,我就只复制发布到生产环境的运行环境镜像构造步骤

2.2.2 修改gitlab-runner的配置文件
root@docker-runner1:/opt/gitlab-runner/config# cat config.toml
concurrent = 1
check_interval = 0
connection_max_age = "15m0s"
shutdown_timeout = 0

[session_server]
  session_timeout = 1800
[[runners]]
  name = "172.17.1.22-docker-runner"
  url = "https://qiange.gitlab.com"
  id = 4
  token = "t1_B16JtPkxhgLbsHPv6Lpo"
  token_obtained_at = 2024-12-25T06:36:25Z
  token_expires_at = 0001-01-01T00:00:00Z
  tls-ca-file = "/root/qiange.gitlab.com.crt"
  executor = "docker"
  [runners.custom_build_dir]
  [runners.cache]
    MaxUploadedArchiveSize = 0
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "alpine:latest"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/var/run/docker.sock:/var/run/docker.sock","/cache","/root/qiange.gitlab.com.crt:/etc/gitlab-runner/certs/ca.crt:ro"]   #注意注意注意:在docker in docker环境中,这个地方要手动添加sock文件,否则运行CI流水线时会报无法连接到容器通信进程
    shm_size = 0
    network_mtu = 0
    
    
#修改完需要手动重启gitlab-runner容器
root@docker-runner1:~/helm-runner# docker ps
CONTAINER ID   IMAGE                         COMMAND                  CREATED        STATUS          PORTS     NAMES
76c1c3eb6cb1   gitlab/gitlab-runner:latest   "/usr/bin/dumb-init …"   44 hours ago   Up 19 minutes             gitlab-runner
root@docker-runner1:~/helm-runner# docker restart 76c1c3eb6cb1
2.2.3编写CICD流水线
variables:   #定义CI流水线全局变量,variables是静态变量,不支持在定义变量时执行shell命令
  REGISTRY: harbor.qiange.com
  IMAGE_NAME: cicd/app
  # TAG: `date '+%Y%m%d%H%M'`  此变量不生效,需要到Job中定义变量
  HARBOR_USER: admin
  HARBOR_PASSWD: 123456

stages:  #CI流水线的作业流程
  - make  #编译代码包
  - build  #构建镜像并将镜像推送到代码仓库
  - deploy-test  #发布到测试环境
  - deploy-prod  #发布到生产环境
 
#CI流水线的作业步骤
build-image:    #作业的名称
  image: harbor.qiange.com/docker/docker:v1    #作业运行的环境
  stage: build
  script:
    - echo $DOCKER_HOST
    - docker info
    - export TAG=$(date '+%Y%m%d')$CI_PIPELINE_ID
    - echo $TAG
    - docker build -t $REGISTRY/$IMAGE_NAME:$TAG .
    - docker login -u $HARBOR_USER -p $HARBOR_PASSWD $REGISTRY
    - docker push $REGISTRY/$IMAGE_NAME:$TAG
  only:
    - master
  tags:   #通过标签指定流水线运行在那个gitlab-runner上
     - ci-docker

deploy-test:    #发布到测试环境
  image: harbor.qiange.com/cicd/test-image:latest
  stage: deploy-test
  script:
    - REPLICAS=1
    - kubectl create ns webwork  || true            #如果命名空间已存在则忽略
    - sed -i "s|^\([[:space:]]*image:[[:space:]]*\).*|\1$REGISTRY/$IMAGE_NAME:$TAG|" tomcat-app/deployment.yaml
    - sed -i "s|^\([[:space:]]*replicas:[[:space:]]*\).*|\1$REPLICAS|" tomcat-app/deployment.yaml 
    - kubectl apply -f tomcat-app/deployment.yaml
    - kubectl apply -f tomcat-app/service.yaml
  only:
    - master
  tags:
    - ci-docker

deploy-prod:   #发布到生产环境
  image: harbor.qiange.com/cicd/prod-image:v2
  stage: deploy-prod
  script:
    - export TAG=$(date '+%Y%m%d')$CI_PIPELINE_ID
    - echo $TAG
    - REPLICAS=3
    - kubectl create ns webwork  || true
    - sed -i "s|^\([[:space:]]*image:[[:space:]]*\).*|\1$REGISTRY/$IMAGE_NAME:$TAG|" tomcat-app/deployment.yaml
    - sed -i "s|^\([[:space:]]*replicas:[[:space:]]*\).*|\1$REPLICAS|" tomcat-app/deployment.yaml 
    - cat tomcat-app/deployment.yaml
    - kubectl apply -f tomcat-app/deployment.yaml
    - kubectl apply -f tomcat-app/service.yaml
  only:
    - master
  tags:
    - ci-docker

在这里插入图片描述

2.2.4 使用envtrust语法写CICD流水线
  • 修改deployment.yaml文件
    在这里插入图片描述
#定义CI流水线全局变量
variables:   #variables是静态变量,不支持在定义变量时执行shell命令
  REGISTRY: harbor.qiange.com
  IMAGE_NAME: cicd/app
  # TAG: `date '+%Y%m%d%H%M'`  此变量不生效,需要到Job中定义变量
  HARBOR_USER: admin
  HARBOR_PASSWD: 123456

#CI流水线步骤流程
stages:
  - make  #编译代码包
  - build  #构建镜像并将镜像推送到代码仓库
  - deploy-test  #发布到测试环境
  - deploy-prod  #发布到生产环境
 
#CI流水线的工作步骤
build-image:
  image: harbor.qiange.com/docker/docker:v1
  stage: build
  script:
    - export TAG=$(date '+%Y%m%d')$CI_PIPELINE_ID
    - echo $TAG
    - docker build -t $REGISTRY/$IMAGE_NAME:$TAG .
    - docker login -u $HARBOR_USER -p $HARBOR_PASSWD $REGISTRY
    - docker push $REGISTRY/$IMAGE_NAME:$TAG
  only:
    - master
    - envsubst
  tags:
     - ci-docker

 deploy-test:    #发布到测试环境
   image: harbor.qiange.com/cicd/test-image:latest
   stage: deploy-test
   script:
    - export TAG=$(date '+%Y%m%d')$CI_PIPELINE_ID
    - echo $TAG                                       #生产中不加               
    - export REPLICAS=1
    - echo $REPLICAS                                  #生产中不加
    - kubectl create ns webwork  || true            #如果命名空间已存在则忽略
    -  envsubst < tomcat-app/deployment.yaml|cat -     #生产中可以不加,这个是把deployment打印出来
    -  envsubst < tomcat-app/deployment.yaml |kubectl apply -f -   #这个是部署生产环境
   only:
     - master
   tags:
     - ci-docker

deploy-prod:   #发布到生产环境
  image: harbor.qiange.com/cicd/prod-image:v2
  stage: deploy-prod
  script:
    - export TAG=$(date '+%Y%m%d')$CI_PIPELINE_ID
    - echo $TAG
    - export REPLICAS=3
    - echo $REPLICAS
    - kubectl create ns webwork  || true
    -  envsubst < tomcat-app/deployment.yaml|cat -
    -  envsubst < tomcat-app/deployment.yaml |kubectl apply -f -
  only:
    - master
    - envsubst
  tags:
    - ci-docker

在这里插入图片描述
envsubst这个语法及其好用,变用sed替换简单好用多了

3、报错

3.1 gitlab-runner提示无法解析代码仓库的域名

在这里插入图片描述

排错思路:

  • 在gitlab-runner服务器上ping qiange.gitlab.com域名,发现不通
  • 检查了gitlab-Runner服务器的DNS地址,没有把我自建的DNS服务器添加上,导致无法解析

解决方案:

  • 修改网卡的DNS地址

    root@docker-runner1:~# cat /etc/netplan/00-installer-config.yaml
    # This is the network config written by 'subiquity'
    network:
      version: 2
      ethernets:
        eth0:
          dhcp4: no
          dhcp6: no
          addresses: [172.17.1.22/24]
          gateway4: 172.17.1.2
          nameservers:
            addresses: [172.17.1.220,8.8.8.8]    #添加172.17.1.220DNS服务器的IP
    

3.2 提示无法和docker通信

在这里插入图片描述
排查思路:

在CI文件里面打印出DOCKER_HOST变量名
在这里插入图片描述

正确返回值应该是
在这里插入图片描述

解决方案:修改 config.toml配置文件
在这里插入图片描述

搞了四天,一套流程全部打通,收获还是蛮多的,有很多细节,一不注意就掉坑里去了。多练多想,总有一天会变成高手。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值