基于GitLab 构建CICD 发布到k8s 平台
1.前置准备
必须安装Docker环境
必须有一套k8s环境 安装地址 https://blog.csdn.net/qq_36838700/article/details/141165373?spm=1011.2415.3001.5331
安装Helm
2. 安装GitLab
# 创建所需的文件夹
mkdir -p /data/gitlab/{config,logs,data}
# docker 启动 方便
docker run --detach \
--hostname 192.168.31.85 \
--env GITLAB_OMNIBUS_CONFIG="external_url 'http://192.168.31.85'" \
--publish 443:443 --publish 80:80 --publish 10022:22 \
--name gitlab \
--restart always \
--volume /data/gitlab/config:/etc/gitlab \
--volume /data/gitlab/logs:/var/log/gitlab \
--volume /data/gitlab/data:/var/opt/gitlab \
--shm-size 256m \
192.168.31.85/amd64/gitlab:17.1.4-ce.0
# 获取密码 用户名 root
docker exec -it 容器名字或容器ID grep 'Password:' /etc/gitlab/initial_root_password
3. 安装Helm
# 再k8s 集群安装
# 下载helm 二进制包
wget https://get.helm.sh/helm-v3.18.4-linux-amd64.tar.gz
# 解压
tar xf helm-v3.18.4-linux-amd64.tar.gz
# 移动二进制文件到你的path环境变量中
mv linux-amd64/helm /usr/local/bin
# 验证helm 安装
helm version
# 输出结果
version.BuildInfo{Version:"v3.18.4", GitCommit:"980d8ac1939e39138101364400756af2bdee1da5", GitTreeState:"clean", GoVersion:"go1.23.6"
4. 拉取gitlab-runner 包
gitlab runner是用于执行 gitlab cicd任务的工具
我的gitlab 版本是 17.1.4 对应的 gitlab-runner 0.66.1 当然高版本应该也可以 但是我没测试过
# 添加软件包仓库
helm repo add gitlab https://charts.gitlab.io
# 更新包
helm repo update
# 拉取并解压
helm pull gitlab/gitlab-runner --untar --version 0.66.1
# 新建一个 values-gitlab-runner.yaml
gitlabUrl: "http://192.168.31.18" # 你的gitlab地址
rbac:
create: true
replicas: 1
##
serviceAccount:
create: true
name: gitlab-runner-sa
runnerToken: "glrt-XoKhHCypx1BPLVxUQx7z" # 这个token怎么获得 下图有解释
runners:
config: |
[[runners]]
[runners.kubernetes]
namespace = "{{.Release.Namespace}}"
image = "alpine"
# 可能没gitlab-runner 这个名称空间 需要手动创建下
kubectl create ns gitlab-runner
# 注册gitlab-runner 到k8s中
helm upgrade --install gitlab-runner -f values-gitlab-runner.yaml . --namespace gitlab-runner
4.1.1 Token 如何获得
登陆你的帐号 用管理员帐号登陆 点击管理中心
点击 CICD > Runner
点击新建实例
标签名称可以自定义
复制token 到上处的配置文件中即可
运行安装gitlab-runner 命令后
如果出现 You 什么的表示你runner 已经成功运行在k8s中了 点击View Runners
5 新建项目
如果要想使用流水线 就必须要在项目中声明流水线的配置文件 文件名称 为.gitlab-ci.yml
我这里就不演示创建项目了
6 最后附上流水线配置文件 构建项目 + 打包镜像
具体流水线语法 请看官网 https://archives.docs.gitlab.com/17.11/ci/yaml/
stages:
- compile
- build
variables:
IMG_SVC_NAME: electron-signature
AMD64: amd64
ARM64: arm64
CI_REGISTRY_AMD64_IMAGE: $CI_REGISTRY/$AMD64-yf/$IMG_SVC_NAME
CI_REGISTRY_ARM64_IMAGE: $CI_REGISTRY/$ARM64-yf/$IMG_SVC_NAME
AMD64_BASE_IMAGE: $CI_REGISTRY/$AMD64/openjdk:8-jre
ARM64_BASE_IMAGE: $CI_REGISTRY/$ARM64/openjdk:8-jre-arm64
LOCAL_KUBE_CONFIG: /tmp/config
PACK_ENVIRONMENT: deliver
MIRROR_IMAGE_VERSION: 1.0.0
cache:
paths:
- cache
compile-package: # This job runs in the build stage, which runs first.
stage: compile
image: $CI_REGISTRY/$AMD64/openjdk-17-maven:3.8.8
only:
- /^feat/
- /^hotfix/
- /^release/
- tag
- push
- dev
script:
- echo "Fetch current version of package"
- PROJECT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
- echo "Gotcha version:$PROJECT_VERSION"
- echo "CUR_BUILD_VERSION=$PROJECT_VERSION" >> build.env
- echo "Compiling the code..."
- mvn clean package -P$PACK_ENVIRONMENT -Dmaven.test.skip=true -Dmaven.repo.local=cache
- echo "Compile complete."
artifacts:
untracked: false
when: on_success
access: all
expire_in: 1 week
paths:
- electron-signature-web/target/*.jar
reports:
dotenv: build.env
build:
stage: build
image: $CI_REGISTRY/$AMD64/kaniko-project/executor:debug
# run on branch develop, and merged
rules:
- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "dev"'
before_script:
- echo "Build multi-architecture images (amd64 & arm64)"
- cp $CI_PROJECT_DIR/Dockerfile $CI_PROJECT_DIR/Dockerfile.bak
- mkdir -pv /kaniko/.docker
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$REGISTRY_USER\",\"password\":\"$REGISTRY_PASS\"}}}" > /kaniko/.docker/config.json
- cat /kaniko/.docker/config.json
script:
- sed "s|^FROM.*|FROM $AMD64_BASE_IMAGE|g" $CI_PROJECT_DIR/Dockerfile.bak > $CI_PROJECT_DIR/Dockerfile
- PROJECT_VERSION=$CI_REGISTRY_AMD64_IMAGE:$MIRROR_IMAGE_VERSION
- /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $PROJECT_VERSION --custom-platform "linux/amd64"
- sed "s|^FROM.*|FROM $ARM64_BASE_IMAGE|g" $CI_PROJECT_DIR/Dockerfile.bak > $CI_PROJECT_DIR/Dockerfile
- PROJECT_VERSION=$CI_REGISTRY_ARM64_IMAGE:$MIRROR_IMAGE_VERSION
- /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $PROJECT_VERSION --custom-platform "linux/arm64"
- echo "build complete"
artifacts:
reports:
dotenv: build.env
7. 全局变量定义
可能有小伙伴到看 .gitlab-ci.yml 文件中 存在 $CI_REGISTRY $CI_PROJECT_DIR 等这些为在文件中定义的变量 那是在哪里定义的呢
点击设置> CICD
可以选择添加变量
8. 项目组变量
变量的作用访问是在当前项目组以及子组中可以访问