0

我开始使用 gitlab CI/CD 管道,但是如果我有一个项目(Repo)并且在这个项目中我的前端和后端被项目结构分开,那么我对构建过程的输出有一些疑问,例如:

汽车计划

.gitlab-ci.yml

|__前端汽车项目

|__后端汽车项目

假设每次我在前端更改某些内容时,我都需要构建它并将其部署到 S3,但无需构建后端(java 应用程序)并将其部署到弹性 beanstalk(反之亦然,当我更改时)后端)..有没有办法使用 GitLab 检查更改的位置(FrontEndCarProject/BackendCarProject),并根据是否必须部署到 S3 或弹性 beanstalk 将 .gitlab-ci.yml 重定向到脚本文件?

试试看

注意:另一种方法是根据我要部署的位置手动更改 yml 文件。但是有没有办法自动检测并自动化?

.gitlab-ci.yml

只是为了得到这个想法,这是一个将以线性方式运行的示例,但是我如何有条件地构建/部署(取决于我的前端或后端)?为了简单起见,我应该将它们保存在不同的存储库中吗?这是一个好习惯吗?


variables:
  ARTIFACT_NAME: cars-api-v$CI_PIPELINE_IID.jar
  APP_NAME: cars-api

stages:
  - build
  - deploy

# ONLY Build when front(FrontendCarProject) in changed
build_front:
  stage: build
  image: Node:latest
  script:
    - npm install
  artifacts:
    paths:
      - ./dist

# ONLY build when backend(BackendCarProject) is changed
build_back:
  stage: build
  image: openjdk:12-alpine
  script:
    - ./gradlew build
  artifacts:
    paths:
      - ./build/libs/

# ONLY deploy when front(FrontendCarProject) in changed
deploy_s3:
  stage: deploy
  image:
    name: python:latest
  script:
    - aws configure set region us-east-1
    - aws s3 cp ./build/libs/cars-api.jar s3://$S3_BUCKET/cars-api.jar

# ONLY deploy when backend(BackendCarProject) is changed
deploy_back_end:
  stage: deploy
  image:
    name: banst/awscli
  script:
    - aws configure set region us-east-1
    - aws s3 cp ./build/libs/$ARTIFACT_NAME s3://$S3_BUCKET/$ARTIFACT_NAME
    - aws elasticbeanstalk create-application-version --application-name $APP_NAME --version-label $CI_PIPELINE_IID --source-bundle S3Bucket=$S3_BUCKET,S3Key=$ARTIFACT_NAME
    - aws elasticbeanstalk update-environment --application-name $APP_NAME --environment-name "production" --version-label=$CI_PIPELINE_IID
4

1 回答 1

2

如果您的前端和后端可以单独构建和部署,那么您可以使用rules:changes来检查是否发生了更改,并且需要:可选仅部署各自构建的库。

variables:
  ARTIFACT_NAME: cars-api-v$CI_PIPELINE_IID.jar
  APP_NAME: cars-api

stages:
  - build
  - deploy

# ONLY Build when front(FrontendCarProject) in changed
build_front:
  stage: build
  image: Node:latest
  script:
    - npm install
  rules:
    - changes:
        - FrontEndCarProject/*
  artifacts:
    paths:
      - ./dist

# ONLY build when backend(BackendCarProject) is changed
build_back:
  stage: build
  image: openjdk:12-alpine
  script:
    - ./gradlew build
  rules:
    - changes:
        - BackendEndCarProject/*
  artifacts:
    paths:
      - ./build/libs/

# ONLY deploy when front(FrontendCarProject) in changed
deploy_s3:
  stage: deploy
  image:
    name: python:latest
  script:
    - aws configure set region us-east-1
    - aws s3 cp ./build/libs/cars-api.jar s3://$S3_BUCKET/cars-api.jar
  needs:
    - job: build_front
      artifacts: true
      optional: true

# ONLY deploy when backend(BackendCarProject) is changed
deploy_back_end:
  stage: deploy
  image:
    name: banst/awscli
  script:
    - aws configure set region us-east-1
    - aws s3 cp ./build/libs/$ARTIFACT_NAME s3://$S3_BUCKET/$ARTIFACT_NAME
    - aws elasticbeanstalk create-application-version --application-name $APP_NAME --version-label $CI_PIPELINE_IID --source-bundle S3Bucket=$S3_BUCKET,S3Key=$ARTIFACT_NAME
    - aws elasticbeanstalk update-environment --application-name $APP_NAME --environment-name "production" --version-label=$CI_PIPELINE_IID
  needs:
    - job: build_back
      artifacts: true
      optional: true
于 2021-06-15T05:30:37.520 回答