基于gitlab 构建CICD发布到K8S 平台
基于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: truename: 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- buildvariables:IMG_SVC_NAME: electron-signatureAMD64: amd64ARM64: arm64CI_REGISTRY_AMD64_IMAGE: $CI_REGISTRY/$AMD64-yf/$IMG_SVC_NAMECI_REGISTRY_ARM64_IMAGE: $CI_REGISTRY/$ARM64-yf/$IMG_SVC_NAMEAMD64_BASE_IMAGE: $CI_REGISTRY/$AMD64/openjdk:8-jreARM64_BASE_IMAGE: $CI_REGISTRY/$ARM64/openjdk:8-jre-arm64LOCAL_KUBE_CONFIG: /tmp/configPACK_ENVIRONMENT: deliverMIRROR_IMAGE_VERSION: 1.0.0cache:paths:- cachecompile-package: # This job runs in the build stage, which runs first.stage: compileimage: $CI_REGISTRY/$AMD64/openjdk-17-maven:3.8.8only:- /^feat/- /^hotfix/- /^release/- tag- push- devscript:- 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: falsewhen: on_successaccess: allexpire_in: 1 weekpaths:- electron-signature-web/target/*.jarreports:dotenv: build.envbuild:stage: buildimage: $CI_REGISTRY/$AMD64/kaniko-project/executor:debug# run on branch develop, and mergedrules:- 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.jsonscript:- 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. 项目组变量
变量的作用访问是在当前项目组以及子组中可以访问