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配置文件
搞了四天,一套流程全部打通,收获还是蛮多的,有很多细节,一不注意就掉坑里去了。多练多想,总有一天会变成高手。