linux “before_script”中的GitLab CI条件源命令

xwbd5t1u  于 2023-04-11  发布在  Linux
关注(0)|答案(2)|浏览(96)

我有一个项目,我有几个分支,主分支,开发分支,然后n动态功能分支。
例如,我的GitLab CI Pipeline中的docker-build作业使用source命令从名为.main.env或.develop.env(取决于分支名称)的文件中获取before_script部分中的一些环境变量。

docker-build:
  image: docker:latest
  stage: package
  tags:
    - deployment
  before_script:
    - source .${CI_COMMIT_REF_NAME}.env # || source .develop.env
  services:
    - docker:dind
  script:
    - docker build --build-arg SPRING_ACTIVE_PROFILE=$SPRING_ACTIVE_PROFILE -t $TAG_COMMIT -t $TAG_LATEST . -f Dockerfile
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker push $TAG_COMMIT
    - docker push $TAG_LATEST

正如你所看到的,我尝试添加条件命令source .develop.env,以防第一个命令中的文件找不到,但这不起作用。它仍然抛出一个错误,说文件.SOME_FEATURE_分支.env无法找到。
现在我想知道是否有更好的方法来解决这个问题,而不是仅仅为特性分支做另一个工作,只是获取.develop.env文件的源代码?

pxyaymoc

pxyaymoc1#

也许更好的方法是显式地检查文件是否存在。

before_script:
  - |
    if [[ -f ".${CI_COMMIT_REF_NAME}.env" ]]; then
        source ".${CI_COMMIT_REF_NAME}.env"
    else
        source .develop.env
    fi

您还可以使用rules:variables:完成类似的操作,如果您希望将shell脚本从CI环境的细节中分离出来,这将非常方便。

job:
  variables:  # default env file
    ENV_FILE: ".develop.env" 
  rules:
  - exists: ".${CI_COMMIT_REF_NAME}.env"
    variables: # override when this file exists
      ENV_FILE: ".${CI_COMMIT_REF_NAME}.env"
  - when: on_success
  before_script:
    - source $ENV_FILE
rseugnpd

rseugnpd2#

当第一个源运行失败时,错误将被写入STDERR。然后它将继续执行第二个源。如果你想取消第一个源命令中的错误消息,你可以将STDOUT重定向到/dev/null。

docker-build:
  image: docker:latest
  stage: package
  tags:
    - deployment
  before_script:
    - source .${CI_COMMIT_REF_NAME}.env 2>/dev/null || source .develop.env
  services:
    - docker:dind
  script:
    - docker build --build-arg SPRING_ACTIVE_PROFILE=$SPRING_ACTIVE_PROFILE -t $TAG_COMMIT -t $TAG_LATEST . -f Dockerfile
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker push $TAG_COMMIT
    - docker push $TAG_LATEST

相关问题