Bash: 如何执行路径

Bash: How to execute paths

我的 gitlab-cicd.yml 文件中有工作:

unit_test:
  stage: test
  image: $MAVEN_IMAGE
  script:
    - *tests_variables_export
    - mvn ${MAVEN_CLI_OPTS} clean test
    - cat ${CI_PROJECT_DIR}/rest-service/target/site/jacoco/index.html
    - cat ${CI_PROJECT_DIR}/soap-service/target/site/jacoco/index.html
  artifacts:
    expose_as: 'code coverage'
    paths:
      - ${CI_PROJECT_DIR}/soap-service/target/surefire-reports/
      - ${CI_PROJECT_DIR}/rest-service/target/surefire-reports/
      - ${CI_PROJECT_DIR}/soap-service/target/site/jacoco/index.html
      - ${CI_PROJECT_DIR}/rest-service/target/site/jacoco/index.html

我想改成这个:

unit_test:
  stage: test
  image: $MAVEN_IMAGE
  script:
    - *tests_variables_export
    - mvn ${MAVEN_CLI_OPTS} clean test
    - cat ${CI_PROJECT_DIR}/rest-service/target/site/jacoco/index.html
    - cat ${CI_PROJECT_DIR}/soap-service/target/site/jacoco/index.html
  artifacts:
    expose_as: 'code coverage'
    paths:
      - *resolve_paths

我尝试使用这个 bash 脚本:

.resolve_paths: &resolve_paths |-
  if [ "${MODULE_FIRST}" != "UNKNOWN" ]; then
    echo "- ${CI_PROJECT_DIR}/${MODULE_FIRST}/target/surefire-reports/"
    echo "- ${CI_PROJECT_DIR}/${MODULE_FIRST}/target/site/jacoco/index.html"
  fi
  if [ "${MODULE_SECOND}" != "UNKNOWN" ]; then
    echo "- ${CI_PROJECT_DIR}/${MODULE_SECOND}/target/surefire-reports/"
    echo "- ${CI_PROJECT_DIR}/${MODULE_SECOND}/target/site/jacoco/index.html"
  fi

现在我在管道中遇到这个错误:

WARNING: if [ "rest-service" != "UNKNOWN" ]; then\n echo "- /builds/minv/common/testcommons/taf-api-support/rest-service/target/surefire-reports/"\n echo "- /builds/minv/common/testcommons/taf-api-support/rest-service/target/site/jacoco/index.html"\nfi\nif [ "soap-service" != "UNKNOWN" ]; then\n echo "- /builds/minv/common/testcommons/taf-api-support/soap-service/target/surefire-reports/"\n echo "- /builds/minv/common/testcommons/taf-api-support/soap-service/target/site/jacoco/index.html"\nfi: no matching files ERROR: No files to upload

Can I execute [sic] paths using bash script like this?

不,脚本不能改变当前的 YAML,尤其是当您在将脚本解释为路径的地方指定脚本(只是一个字符串)时。

你可以trigger a dynamically generated YAML:

generate:
  stage: build
  script:
    - |
      exec > generated.yml
      echo ".resolve_paths: &resolve_paths"
      for module in "${MODULE_FIRST}" "${MODULE_SECOND}"; do
        [[ "$module" = UNKNOWN ]] && continue
          echo "- ${CI_PROJECT_DIR}/${module}/target/surefire-reports/"
          echo "- ${CI_PROJECT_DIR}/${module}/target/site/jacoco/index.html"
      done
      sed '1,/^\.\.\. *$/d' "${CI_CONFIG_PATH}"
  artifacts:
    paths:
      - generated.yml

run:
  stage: deploy
  trigger:
    include:
      - artifact: generated.yml
        job: generate

...

# Start of actual CI. When this runs, there will be an
# auto-generated job `.resolve_paths: &resolve_paths`.
# Put the rest of your CI (e.g. `unit_test:`) here.

但是 GitLab 的 YAML 中有很多扩展,您可能会找到一个非常好的解决方案,这取决于您打算用 .resolve_paths 做什么。也许看看