Kubernetes 上的 GitLab + ArgoCD 实践(一):达成基础 CI/CD 流程


CI/CD 是 Continuous Integration 和 Continuous Deployment(或 Continuous Delivery)的缩写,是一种软件开发流程,目标是提升软件交付的效率、可靠性和速度。

Continuous Integration (CI) 指的是开发人员会频繁地把代码提交并合并到主分支。每次有新的 commit,CI 系统都会自动执行构建、测试和验证。这样可以在早期就发现错误或冲突,避免因为长时间不合并代码而在发布前集中暴露问题。

Continuous Deployment(或 Continuous Delivery,CD) 则是 CI 之后的阶段。当代码通过构建和测试后,就能被自动部署(deploy)到生产环境或其他目标环境。通过 CD,团队可以更快、更频繁地把功能交付给用户。

ArgoCD 是一个开源工具,专门用于 Kubernetes 环境下的 Continuous Deployment 和应用配置管理。它在整个流程里承担着 CD 的角色。

简单来说,在 Kubernetes 集群中做 CI/CD,可以用 GitLab 来实现 CI,而 CD 部分则交给 ArgoCD 来完成。
在这里插入图片描述

Gitlab Repository/project 设置

GitLab 是一个基于 Web 的软件开发平台,提供各种功能和工具,用于端到端地管理软件开发生命周期。
GitLab 提供源码仓库管理、团队协作、问题追踪、CI/CD 自动化、自动化测试等多种解决方案。
要创建项目/仓库,可以在这里注册或登录。
接下来,我们将创建两个repo:

  1. app-repo — 应用代码 + Dockerfile + .gitlab-ci.yml(CI 在这里触发构建、推镜像并更新 GitOps repo)。
  2. gitops-repo — ArgoCD 指向这个仓库并自动 sync 到集群

创建Project

创建项目时,在右侧选择“New Project”来新建一个项目。
在这里插入图片描述
选择“Create blank project"创建一个空白的项目
在这里插入图片描述
然后按你们自己的喜好填写,为了简化演示,这里我选择了 Public 作为可见性级别在这里插入图片描述
接下来,如果项目已经创建完成,就是一个空白项目(blank)。
在这里插入图片描述
重复上面的步骤,再创建gitops-repo,最终我们将拥有两个repo:
在这里插入图片描述

Token

GitLab 中的 Token(令牌)是用于身份验证和授权的字符串,核心作用是:

  • 替代账号密码:在 API 调用、自动化脚本(如 CI/CD)、第三方工具集成等场景中,用 -Token 验证身份,避免明文密码泄露。
  • 精细化权限控制:不同类型的 Token(如 Personal Access Token、Project Access Token 等)可绑定特定权限(如仅读取代码、推送镜像等),确保安全边界。
  • 简化自动化流程:让 CI/CD 流水线、脚本等非人工交互场景能自动访问 GitLab 资源(如拉取代码、触发流水线、部署应用)。
    简单说,Token 是 “安全的钥匙”,既让程序能自动操作 GitLab,又能控制操作范围。

Gitlab中的Token种类

Gitlab中有很多种token,如下是他们的名称以及主要定义:

Token 名称发行对象主要用途权限范围有效期限常见使用场景
Personal Access Token (PAT)使用者 (User)代表使用者存取 GitLab API 或 Git 操作(如 git clonegit push使用者拥有权限的所有项目可设定在本地端或自动化脚本中代表「我本人」操作
Project Access Token项目 (Project)项目内自动化或 CI/CD 推送程序代码、呼叫 API单一项目可设定CI Pipeline 自动推送变更到同项目或 GitOps 项目
Group Access Token群组 (Group)跨项目或整个群组自动化操作、统一管理脚本群组底下所有项目可设定多项目自动更新、集中管理 GitOps 任务
CI_JOB_TOKENGitLab 自动生成在 CI Job 之间传递凭证,或从私有 repo 拉取程序代码 / 呼叫 API仅该 Pipeline 范围Job 执行期间有效在 pipeline 中让 A 项目拉取 B 项目资源
Runner TokenGitLab Runner注册 Runner 与 GitLab 通讯使用指定 Runner 层级(Instance / Group / Project)长期在安装 Runner 时注册联机用
Trigger Token用户 / 项目让外部系统(curl、Webhook 等)触发 GitLab Pipeline指定项目的 Pipeline可设定外部自动化流程触发 CI/CD pipeline
Deploy Token项目 (Project)给部署环境或服务器下载私有资源只读 (read_repository / read_registry)可设定Kubernetes / Docker 拉取私有 GitLab Registry 映像档
  • 建立 Token 時請設定合理的權限(Scope),不要給 api 權限除非必要。
  • 對於 CI/CD 建議使用 Project 或 Group Token,避免用個人 PAT(安全性更好)。
  • 所有 Token(除 CI_JOB_TOKEN)只會在建立時顯示一次,請妥善保存。

创建Token

为方便演示,避免权限问题,我选择使用Personal Access Token
要增加personnal access token, 依次点选下图红框中得选项
在这里插入图片描述
权限:
在实做过程种应该遵循 “最小权限原则”—— 尽量使用project access token 或group access token,并且仅授予完成 CI/CD 任务必需的权限,避免过度授权导致安全风险。具体需根据你的 CI/CD 流程(如代码拉取、推送镜像、部署等)选择权限
在这里插入图片描述
点击“create token"后,将会出现下面得页面展示token得新系统
token明文将只会在创建后展示一次,需要记录下来,已备后续使用,如果忘记token,只能透过”add new token"建立新的token
在这里插入图片描述

设定变量(Variables)

  1. Home—>Project—>app-repo—>左侧点选Settings—>CI/CD
    在这里插入图片描述
  2. 点选Variables
    示例变量截图如下:
    在这里插入图片描述
  3. 变量及变量值:
Variable_NameValueRemark
CI_REGISTRYregistry.gitlab.com使用的image仓库URL
CI_REGISTRY_PASSWORDglpat-1HARSp7T0xhb1noHQY5ZpG86MQp1Omk3cW4zCw.01.121x5jhjw访问仓库的token
CI_REGISTRY_USERyour_account@gmail.com用于连接image仓库,请换成自己的仓库账号
GITOPS_REPO_TOKENglpat-1HARSp7T0xhb1noHQY5ZpG86MQp1Omk3cW4zCw.01.121x5jhjw仓库密码
GITOPS_REPO_URLhttps://gitlab.com/your-group/gitops-repo.git替换成自己的group
GITOPS_REPO_USERlyour_account@gmail.com替换成自己的账号

GitOps 仓库 (最简单版本)

目录结构:

GitOps目录机构如下:

gitops-repo/
└─ myapp/
   ├─ deployment.yaml
   └─ service.yaml

准备示例文件

  1. deployment.yaml内容
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: registry.gitlab.com/laker.whu-group/app-repo:31096fec
ports:
- containerPort: 80
  1. service.yaml内容:
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 8080
type: ClusterIP

推送gitops-repo示例

  1. 获取仓库url
    在这里插入图片描述
  2. clone仓库
mkdir /root/demo-cicd-project
git clone https://gitlab.com/laker.whu-group/app-repo.git
  1. 将上面的示例文件放入仓库
  2. push仓库至gitlab仓库
git add .
git commit -m 'CI demo files for gitops-repo'
git push origin main

push完成后,gitops-repo project/repo应该是如下这样:
在这里插入图片描述

app-repo

目录结构:

app-repo目录机构如下:

app-repo/
├─ cmd/myapp/main.go
├─ go.mod
├─ go.sum
├─ Dockerfile
├─ .gitlab-ci.yml

准备示例文件

  1. myapp/main.go:
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello CI/CD world!\n")
}
func main() {
http.HandleFunc("/", handler)
fmt.Println("Starting server on :8080")
http.ListenAndServe(":8080", nil)
  1. go.mod
module myapp
go 1.20
  1. go.sum
go mod tidy

go.sum 可以用 go mod tidy 自动生成,但是此范例go mod tidy将不会生成go.sum,原因如下:

  • go.sum 文件的作用是记录 第三方模块依赖的版本和校验和。
  • 如果项目中 没有第三方依赖,那么 go.sum 根本不需要,也就不会生成。
  1. Dockerfile(多阶段构建)
# Builder stage
FROM golang:1.20-alpine AS builder
WORKDIR /src
COPY go.mod ./
#COPY  go.sum ./
RUN go mod tidy
RUN go mod download
COPY . .
RUN mkdir -p /out \
&& CGO_ENABLED=0 GOOS=linux go build -o /out/myapp ./myapp
# Final stage
FROM alpine:3.19
COPY --from=builder /out/myapp /myapp
USER 1000
EXPOSE 8080
ENTRYPOINT ["/myapp"]
  1. .gitlab-ci.yml
    .gitlab-ci.yml 是 GitLab 持续集成 / 持续部署(CI/CD)的核心配置文件,用于定义项目在 GitLab 平台上的自动化构建、测试、部署等流程。通过这个文件,开发者可以将代码提交、合并等操作与自动化流程关联,实现从代码提交到最终发布的全流程自动化。
stages:
- build
- update-gitops
variables:
IMAGE: "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA"
build-image:
stage: build
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [""]
variables:
DOCKER_AUTH_CONFIG: "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}"
script:
- |
/kaniko/executor \
--dockerfile=Dockerfile  \
--context=$CI_PROJECT_DIR \
--destination=${IMAGE}
#  because gcr.io/kaniko-project/executor is a light image  without sh shell, so it is changed to "command mode" instead of "script mode"
#command:
#  - /kaniko/executor
#  - --dockerfile=Dockerfile
#  - --context=$CI_PROJECT_DIR
#  - --destination=${IMAGE}
update-gitops:
stage: update-gitops
image: alpine:3.18
before_script:
- apk add --no-cache git yq
- git config --global user.email "ci@mydomain.com"
- git config --global user.name "gitlab-ci"
script:
- git clone https://oauth2:${GITOPS_REPO_TOKEN}@${GITOPS_REPO_URL#https://} gitops
#- git clone https://$GITOPS_REPO_USER:$GITOPS_REPO_TOKEN@${GITOPS_REPO_URL#https://} gitops
- cd gitops
- yq e '.spec.template.spec.containers[0].image = strenv(IMAGE)' -i ./myapp/deployment.yaml
- git add .
- git commit -m "Update image to $IMAGE"
- git push origin HEAD:main
only:
- main

推送app-repo

  1. clone仓库
mkdir /root/demo-cicd-project
git clone https://gitlab.com/laker.whu-group/app-repo.git
  1. 将上面的示例文件放入仓库
  2. push仓库至gitlab仓库
git add .
git commit -m 'CI demo files'
git push origin main

push完成后,app-repo project/repo应该是如下这样:
在这里插入图片描述

触发CI

一般来说,当应用代码仓库(app-repo)中包含 .gitlab-ci.yml 文件时,该文件会定义项目的 CI 流程。当开发者执行 git push 将代码提交到远程仓库后,GitLab 会自动检测到变更并触发相应的 CI 作业。
也可以使用–allow-empty选项再次手动触发

git commit -m "empty commit" --allow-empty
git push origin main

验证

进入Home—>Poject—>Group—>Project Name(这里是app-repo)—左侧Build—>Pipeline
将会看到Status是Passed,如下图:
在这里插入图片描述
进一步点击Passed后,将显示两个job执行成功:
在这里插入图片描述
进入project对应的repo将会看到已经构建好的image
在这里插入图片描述

结论

至此,我们通过简单直观的示例,完整演示了基于 GitLab 的持续集成(CI)核心流程 —— 从 .gitlab-ci.yml 配置文件的关键节点定义,到代码提交后自动触发的构建、测试环节,再到任务执行结果的反馈,每一步都力求用易懂的方式拆解 CI 的运作逻辑。​
这样的基础演示,旨在帮助刚接触 CI 技术的朋友快速建立认知:持续集成并非复杂的 “黑箱”,而是通过代码化配置,将 “提交代码→验证质量” 的手动步骤转化为自动化流程的实用工具。它的核心价值,就在于让团队在开发早期及时发现代码问题,减少后续联调阶段的返工成本。​
当然,文中的示例仅覆盖了 CI 的基础场景。在实际项目中,CI 流程会根据技术栈(如前端、后端、移动端)、业务需求(如多环境测试、代码合规检查)灵活调整 —— 比如增加代码覆盖率统计、多语言依赖安装、测试报告生成等环节,甚至结合 GitLab Runner 的不同执行器(如 Docker、虚拟机)优化任务效率。这些复杂应用,都需要我们结合具体项目场景逐步探索与迭代。​
不过,持续交付(CD)才是让自动化流程真正落地到 “价值交付” 的关键一步。前文的 CI 为代码质量筑牢了防线,而接下来,我们将继续聚焦 GitLab 生态,演示如何基于 CI 构建的产物,实现从 “代码验证” 到 “自动部署” 的 CD 流程 —— 包括环境配置、部署脚本编写、多环境(测试 / 预生产 / 生产)发布策略等核心内容,让自动化链路真正贯穿 “开发→验证→交付” 的全流程。​
期待在后续的 CD 分享中,与大家一起进一步打通自动化开发的 “最后一公里”,让技术实践更高效、更贴合实际业务需求。

---

相关课程


️ 实践工具

posted @ 2025-11-18 19:18  clnchanpin  阅读(187)  评论(0)    收藏  举报