# CI/CD 的阶段定义,按顺序执行各阶段;默认包含`.pre`(最先执行)/`.post`(最后执行)两个阶段,不用显示定义 stages: - build - test - deploy # 全局变量定义 variables: IMG_URL: "$HARBOR_HOST/$HARBOR_PROJECT/$CI_PROJECT_NAME" IMG_TAG: ":latest" # 默认值信息配置 default: # 各 stage 使用的默认镜像,如果不定义,则为 gitlab-runner 创建时指定的镜像;各 stage 可以覆盖该值以使用不同的镜像 image: docker.colovu.com/library/docker:20.10.16 # Gitlab-runner 配置的执行器为 Docker 时,需要 配置对应的 dind 服务(这里使用Runner中配置的Dind服务) #services: # - name: docker.colovu.com/library/docker:20.10.16-dind # alias: docker # 流水线中,各阶段都会执行的脚本命令,包括`before_script`(在各阶段 script 前执行)/`after_script`(在各阶段 script 后执行) before_script: - | if [[ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]]; then IMG_TAG=":latest" else IMG_TAG=":$CI_COMMIT_REF_NAME" fi - docker login -u "$HARBOR_USERNAME" -p "$HARBOR_PASSWORD" $HARBOR_URL # 环境变量信息 env-variables: stage: .pre script: - export # 编译阶段任务 build-arm64: stage: build tags: - arm64 script: - docker buildx build --platform=linux/arm64 --pull -t "$IMG_URL$IMG_TAG-linux-arm64" . --push - docker rmi "$IMG_URL$IMG_TAG-linux-arm64" build-amd64: stage: build tags: - amd64 script: - docker buildx build --platform=linux/amd64 --pull -t "$IMG_URL$IMG_TAG-linux-amd64" . --push - docker rmi "$IMG_URL$IMG_TAG-linux-amd64" # 生成多架构制品,并在上传后删除本地文件 build-artifact: stage: build needs: [build-amd64, build-arm64] script: - docker manifest create "$IMG_URL$IMG_TAG" "$IMG_URL$IMG_TAG-linux-arm64" "$IMG_URL$IMG_TAG-linux-amd64" - docker manifest push -p "$IMG_URL$IMG_TAG" # 测试阶段任务 test: stage: test script: - docker run --pull always --rm --platform=linux/arm64 "$IMG_URL$IMG_TAG" --version - docker run --pull always --rm --platform=linux/amd64 "$IMG_URL$IMG_TAG" --version - docker images -q "$IMG_URL" | sort -u | xargs docker rmi -f # 部署阶段任务 deploy: stage: deploy script: - echo "deploy stage"