避免在 gitlab-ci 中重复工作

问题描述 投票:0回答:1

我的 gitlab 管道由 4 个阶段和 5 个作业组成:

  1. 格式化
  2. 测试
  3. 构建
  • 构建前端
  • 构建后端
  1. 部署

前两个阶段在任何分支上运行,问题是当我创建 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
gitlab gitlab-ci cicd
1个回答
0
投票

您可以使用此规则作为第一步。

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
© www.soinside.com 2019 - 2024. All rights reserved.