基于gitlab 构建CICD发布到K8S 平台

基于GitLab 构建CICD 发布到k8s 平台

1.前置准备

2. 安装GitLab

sh 复制代码
# 创建所需的文件夹
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

sh 复制代码
# 再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 当然高版本应该也可以 但是我没测试过

sh 复制代码
# 添加软件包仓库
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/

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. 项目组变量

变量的作用访问是在当前项目组以及子组中可以访问

点击项目组里面的设置> CICD

相关推荐
十年磨一剑~10 小时前
docker 为何每次 docker tag才能 docker push
docker·容器·eureka
gs8014012 小时前
记一次多 Agent 架构在单节点 K8s 触发的 PID 耗尽与 Pod 驱逐(Evicted)大摸排
容器·架构·kubernetes
bukeyiwanshui12 小时前
20260701 k8s Metric Server
容器·贪心算法·kubernetes
江湖有缘13 小时前
基于Docker环境部署tillywork开源工作管理工具
docker·容器·开源
鸿儒51715 小时前
MR-50国产化GPU docker配置方法
docker·容器·mr
Zhu75816 小时前
在k8s集群部署ApacheHadoop单节点单数据副本
云原生·容器·kubernetes
摇滚侠16 小时前
云原生 Java 架构师的第一课 K8s+Docker+KubeSphere+DevOps 51-60
java·云原生·kubernetes
bukeyiwanshui17 小时前
20260703 K8s ECShop商城项目
云原生·容器·kubernetes
糖果店的幽灵17 小时前
混沌测试从入门到精通(容器与K8s)
云原生·容器·kubernetes