CI/CD 集成
在 GitHub Actions、GitLab CI、BuildKit 和 Kubernetes Runner 中使用 SparkCR。
CI/CD 集成
在 CI/CD 中使用 SparkCR 的目标是减少公共镜像仓库拉取失败和限流,同时避免把个人密码写入流水线。
推荐做法
- 为每个项目或 runner 单独创建 Access Token。
- 公共镜像拉取只授予
pull:public。 - 需要私有上游镜像时再授予
pull:private。 - 需要推送到私有上游时再授予
push。 - 把账号邮箱、令牌和镜像仓库入口放入 CI Secret。
- 令牌泄漏或人员变更后,撤销旧令牌并创建新令牌。
通用登录步骤
在流水线开始阶段登录:
echo "$SPARKCR_TOKEN" | docker login "$SPARKCR_REGISTRY" \
--username "$SPARKCR_USERNAME" \
--password-stdin建议使用这些 Secret:
SPARKCR_REGISTRYSPARKCR_USERNAMESPARKCR_TOKEN
GitHub Actions
name: build
on:
push:
branches: [main]
pull_request:
jobs:
image:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Login to SparkCR
run: |
echo "${{ secrets.SPARKCR_TOKEN }}" | docker login "${{ secrets.SPARKCR_REGISTRY }}" \
--username "${{ secrets.SPARKCR_USERNAME }}" \
--password-stdin
- name: Pull base image through SparkCR
run: docker pull "${{ secrets.SPARKCR_REGISTRY }}/docker.io/library/node:22-alpine"
- name: Build image
run: docker build --pull -t app:${{ github.sha }} .GitLab CI
stages:
- build
build-image:
stage: build
image: docker:27
services:
- docker:27-dind
before_script:
- echo "$SPARKCR_TOKEN" | docker login "$SPARKCR_REGISTRY" --username "$SPARKCR_USERNAME" --password-stdin
script:
- docker pull "$SPARKCR_REGISTRY/docker.io/library/node:22-alpine"
- docker build --pull -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA" .BuildKit 与 buildx
BuildKit 会复用 Docker credential store。只要同一个 job 内先执行 docker login,后续 docker buildx build 就能通过 SparkCR 拉取基础镜像。
echo "$SPARKCR_TOKEN" | docker login "$SPARKCR_REGISTRY" \
--username "$SPARKCR_USERNAME" \
--password-stdin
docker buildx create --use
docker buildx build --pull --tag app:ci .私有镜像仓库拉取和推送
私有上游需要先在控制台的 Private Registries 页面创建。CI Token 至少需要:
- 拉取私有镜像:
pull:private - 推送私有镜像:
push
示例:
echo "$SPARKCR_TOKEN" | docker login "$SPARKCR_REGISTRY" \
--username "$SPARKCR_USERNAME" \
--password-stdin
docker pull "$SPARKCR_REGISTRY/acme-harbor/myapp:base"
docker build -t "$SPARKCR_REGISTRY/acme-harbor/myapp:$CI_COMMIT_SHA" .
docker push "$SPARKCR_REGISTRY/acme-harbor/myapp:$CI_COMMIT_SHA"其中 acme-harbor 使用私有镜像仓库页面生成的 endpoint 为准。
Kubernetes Runner
Kubernetes runner 建议同时配置:
- 节点 runtime mirror,让集群内镜像拉取走 SparkCR。
imagePullSecret,让 runner Pod 能认证到 SparkCR。
创建 Secret:
kubectl create secret docker-registry sparkcr-registry \
--docker-server="$SPARKCR_REGISTRY" \
--docker-username="$SPARKCR_USERNAME" \
--docker-password="$SPARKCR_TOKEN"在 runner 或 job Pod 模板中引用:
imagePullSecrets:
- name: sparkcr-registry