我的 gitlab 管道由 4 个阶段和 5 个作业组成:
前两个阶段在任何分支上运行,问题是当我创建 MR 时,无论是否在源分支中传递,前两个阶段都会重新运行。
我想要的是通过前两个阶段,除非我直接推送到主分支。
第二件事是构建前端作业正在创建一个我用于构建后端的工件,我每年更改一次前端,所以这只是浪费时间。那么除非前端目录已更改,否则我如何使用以前创建的工件来创建新的工件。因为目前我的工作流程大约需要 1 小时,如果我可以跳过格式化、测试、构建前端这三个工作,时间将减少到一半
这是我的 yaml 文件的片段:
stages:
- formatting
- test
- build
- deploy
variables:
DOCKER_REGISTRY: **********
DOCKER_HOST: **********
DOCKER_TLS_CERTDIR: *********
POSTGRES_DB: ******************
formatting:
image: python:3.9
stage: formatting
before_script:
- cd backend/
- pip install black==22.3.0
- pip install bandit
script:
- black . --check --diff --color
- bandit -c pyproject.toml --recursive .
test-backend:
image: python:3.9
services:
- postgres:latest
stage: test
before_script:
- cd backend//
- pip install -r requirements/base.txt
script:
- pytest
variables:
DATABASE_URL: ********
POSTGRES_HOST_AUTH_METHOD: ******
coverage: '/TOTAL.*\s+(\d+%)$/'
build-frontend:
image: node:14.8.0
stage: build
before_script:
- cd web/
script:
- yarn install
- yarn build
artifacts:
paths:
- backend/build/
expire_in: 20 minutes
only:
- master
build-backend:
image:
name: amazon/aws-cli:2.15.1
entrypoint: [""]
stage: build
services:
- docker:dind
before_script:
- cd backend/
needs: [build-frontend]
script:
- docker build .
only:
- master
deploy-backend:
environment:
stage: deploy
image:
name: bitnami/kubectl:1.28
entrypoint: [ "" ]
needs: [build-backend]
before_script:
- cd backend/
script:
- kubectl apply .
only:
- master
目前前端工件在 20 分钟内结束,我希望它可以重复使用。
我在格式和测试阶段尝试了以下规则: 但他们要么完全取消工作,要么什么也不做。
rules:
- if: $CI_MERGE_REQUEST_APPROVED
when: never
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: never
- if: $CI_PIPELINE_SOURCE == "push"
when: always
尝试跳过使用批准,但没有改变任何东西。
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME && $CI_COMMIT_REF_NAME == "master"'
when: never
- when: always
- if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"
when: never
- if: $CI_PIPELINE_SOURCE == "push"
when: always
您可以使用此规则作为第一步。
rules:
- if: '$CI_MERGE_REQUEST && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main"'
when: always
- if: '$CI_MERGE_REQUEST == null'
when: always
对于仅前端更改,只需像这样过滤文件夹结构;
only:
- changes:
- web/**/*
- master