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:
- app-repo — 应用代码 + Dockerfile + .gitlab-ci.yml(CI 在这里触发构建、推镜像并更新 GitOps repo)。
- 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 clone、git push) | 使用者拥有权限的所有项目 | 可设定 | 在本地端或自动化脚本中代表「我本人」操作 |
| Project Access Token | 项目 (Project) | 项目内自动化或 CI/CD 推送程序代码、呼叫 API | 单一项目 | 可设定 | CI Pipeline 自动推送变更到同项目或 GitOps 项目 |
| Group Access Token | 群组 (Group) | 跨项目或整个群组自动化操作、统一管理脚本 | 群组底下所有项目 | 可设定 | 多项目自动更新、集中管理 GitOps 任务 |
| CI_JOB_TOKEN | GitLab 自动生成 | 在 CI Job 之间传递凭证,或从私有 repo 拉取程序代码 / 呼叫 API | 仅该 Pipeline 范围 | Job 执行期间有效 | 在 pipeline 中让 A 项目拉取 B 项目资源 |
| Runner Token | GitLab 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)
- Home—>Project—>app-repo—>左侧点选Settings—>CI/CD

- 点选Variables
示例变量截图如下:
- 变量及变量值:
| Variable_Name | Value | Remark |
|---|---|---|
| CI_REGISTRY | registry.gitlab.com | 使用的image仓库URL |
| CI_REGISTRY_PASSWORD | glpat-1HARSp7T0xhb1noHQY5ZpG86MQp1Omk3cW4zCw.01.121x5jhjw | 访问仓库的token |
| CI_REGISTRY_USER | your_account@gmail.com | 用于连接image仓库,请换成自己的仓库账号 |
| GITOPS_REPO_TOKEN | glpat-1HARSp7T0xhb1noHQY5ZpG86MQp1Omk3cW4zCw.01.121x5jhjw | 仓库密码 |
| GITOPS_REPO_URL | https://gitlab.com/your-group/gitops-repo.git | 替换成自己的group |
| GITOPS_REPO_USER | lyour_account@gmail.com | 替换成自己的账号 |
GitOps 仓库 (最简单版本)
目录结构:
GitOps目录机构如下:
gitops-repo/
└─ myapp/
├─ deployment.yaml
└─ service.yaml
准备示例文件
- 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
- service.yaml内容:
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 8080
type: ClusterIP
推送gitops-repo示例
- 获取仓库url

- clone仓库
mkdir /root/demo-cicd-project
git clone https://gitlab.com/laker.whu-group/app-repo.git
- 将上面的示例文件放入仓库
- 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
准备示例文件
- 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)
- go.mod
module myapp
go 1.20
- go.sum
go mod tidy
go.sum 可以用 go mod tidy 自动生成,但是此范例go mod tidy将不会生成go.sum,原因如下:
- go.sum 文件的作用是记录 第三方模块依赖的版本和校验和。
- 如果项目中 没有第三方依赖,那么 go.sum 根本不需要,也就不会生成。
- 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"]
- .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
- clone仓库
mkdir /root/demo-cicd-project
git clone https://gitlab.com/laker.whu-group/app-repo.git
- 将上面的示例文件放入仓库
- 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 分享中,与大家一起进一步打通自动化开发的 “最后一公里”,让技术实践更高效、更贴合实际业务需求。
浙公网安备 33010602011771号