📝 前言
在现代软件交付体系中,CI/CD(持续集成与持续部署)已成为研发效率的关键组成部分。
虽然 GitHub Actions 功能强大,但对于自建代码仓库或私有化部署需求的团队而言,Gitea Actions 提供了一个轻量、安全且兼容性极高的替代方案。
本文将介绍如何通过 Kubernetes 中运行 Gitea Runner,实现一套完整的自动化构建与部署流水线。
📌 Runner 运行在 K8S 上的优势
相较于直接在主机或虚拟机运行,将 Gitea Runner 部署到 Kubernetes 带来以下显著优势:
Runner 可根据任务负载自动扩缩容,确保在高并发构建场景下保持稳定性能,同时在空闲时释放资源,降低成本。
每个构建任务都在独立 Pod 中执行,不同项目间互不干扰,最大限度降低安全风险与环境污染问题。
借助容器化环境,Runner 的执行环境可通过镜像精确控制,避免“在我电脑上没问题”的情况,实现可预测的构建。
所有 Runner 作为 K8S 工作负载运行,日志、监控、网络策略均可通过现有集群工具(如 Prometheus、Grafana)统一管理。
PS:我们之前也有介绍过通过二进制的方式部署 Runner:《使用二进制部署 Gitea Runner 指南(实战二)》
📋 前提条件
可参看之前的文章:《使用 Docker 快速部署 Gitea 指南(实战一)》
PS:当然也可以将 Gitea 服务端也一并部署到 K8S 集群上。
可参看之前的文章一键部署:《第四部分:使用 sealos 部署集群》
🚀 详细步骤
1️⃣ 创建 Runner Token
进入 Gitea 服务管理页面 → 设置 → Actions → 创建 Runner Token,复制Token。
后续注册 Runner 时使用。

2️⃣ 在 Kubernetes 中部署 Gitea Runner
gitea-runner.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| apiVersion: apps/v1 kind: Deployment metadata: name: gitea-runner spec: replicas: 1 selector: matchLabels: app: gitea-runner template: metadata: labels: app: gitea-runner spec: containers: - name: runner image: gitea/act_runner:latest args: ["daemon"] env: - name: GITEA_INSTANCE_URL value: "http://git.luhome.com" - name: GITEA_RUNNER_REGISTRATION_TOKEN value: xLm8BDFRf...... - name: GITEA_RUNNER_NAME value: "k8s-runner" - name: GITEA_RUNNER_LABELS value: "k8s:docker://docker.gitea.com/runner-images:ubuntu-latest" - name: DOCKER_HOST value: "unix:///var/run/docker.sock" volumeMounts: - name: docker-sock mountPath: /var/run/docker.sock - name: workdir mountPath: /data volumes: - name: docker-sock hostPath: path: /var/run/docker.sock - name: workdir emptyDir: {}
|
执行部署命令:
1 2 3 4
| kubectl apply -f gitea-runner.yaml
kubectl get pods
|
若显示为 Running,并且在 Gitea → Actions → Runner 页面中状态为 **空闲**,表示成功注册。
3️⃣ 实战示例:构建并部署镜像
.gitea/workflows/build.yaml 示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| name: Build and Deploy
on: push: branches: - main
env: KUBECONFIG: ${{ secrets.KUBECONFIG }}
jobs: build: runs-on: k8s steps: - name: Checkout code uses: actions/checkout@v4
- name: Build Docker image run: | docker build -t myapp:latest .
- name: Push image to registry run: | docker tag myapp:latest registry.example.com/myapp:latest docker push registry.example.com/myapp:latest
- uses: azure/setup-kubectl@v4 with: version: 'v1.30.0' - name: Write kubeconfig run: | echo "${{ secrets.KUBECONFIG }}" > ~/.kube/config
- name: Deploy to K8S run: | kubectl set image deployment/myapp myapp=registry.example.com/myapp:latest
|
注意首次启动比较慢,因为要拉取标签对应的构建镜像:docker.gitea.com/runner-images:ubuntu-latest 可将该镜像传到私有镜像仓库会极大提高构建效率。