[yaml] GitLab CI (.gitlab-ci.yml)에 대한 여러 줄 YAML 문자열

gitlab-ci.yml명령에 여러 줄 문자열을 사용 하는 파일 을 작성하려고합니다 . 그러나 파싱되지 않는 것 같습니다. 나는 둘 다 해봤 - |- >동일한 결과.

stages:
  - mystage

Build:
  stage: mystage
  script:
    - |
        echo -e "
            echo 'hi';
            echo 'bye';
        "

실행하려고 할 때 echo -e '전체 여러 줄 문자열이 아닌 실행할 스크립트 로만 표시 됩니다. 이로 인해 문제가 발생합니다.

이와 같은 것을 작성하는 올바른 구문은 무엇입니까?



답변

TL; DR; Gitlab-CI에서 명령으로 실행할 수있는 단일 행 문자열로로드되는 다중 행 YAML 스칼라 (가독성을 위해)를 사용하려고합니다. 이렇게하려면 여러 줄에 걸쳐있는 YAML에서 일반 (따옴표없이) 스칼라를 사용합니다.

script:
- echo -e
   "echo 'hi';
    echo 'bye';"

이러한 스칼라에 대해 YAML이 부과하는 몇 가지 제한 사항이 있음을 유의하십시오. 확실히 알아야 할 것은 각 다음 줄이 적어도 하나 이상의 위치 echo -e(컬렉션 노드를 기준으로 들여 쓰기되지 않은 두 위치 들여 쓰기 됨)가 들여 쓰기되고 모든 줄 바꿈이 공백으로 대체된다는 것입니다. 로드 될 때 (그러므로 줄 바꿈을 넣을 위치를 약간 관리해야합니다).


귀하의 게시물에는 여러 가지 오해가있어 잘못된 질문을하게됩니다.

여러 줄 YAML 문자열 같은 것은 없습니다 . YAML에는 스칼라가 있으며 이러한 스칼라 중 일부는 프로그램에 의해 문자열로로드 될 수 있고 다른 일부는 정수, 부동 소수점 등으로로드 될 수 있습니다.

문자열이 명령 줄로 해석 될 수 있기 때문에 문자열로로드되는 스칼라 노드에 분명히 관심이 있습니다. 그러나 여러 줄 명령 줄 (예 : 삽입 된 줄 바꿈 포함) 을 원하지 않습니다. 여러 줄 스크립트 가 Gitlab CI에서 지원되지 않기 때문입니다 (@Jordan이 표시 한대로).

가독성을 위해 YAML의 표준 기능을 사용하여 다중 라인 스칼라를 단일 라인 문자열로로드하려고합니다.

가독성에 신경 쓰지 않는다면 다음을 사용할 수 있습니다.

- echo -e "\n    echo 'hi';\n    echo 'bye';\n"

스칼라가 echo따옴표로 묶여 있지 않기 때문에 (즉,로 시작 ) 백 슬래시 나 따옴표에 대해 YAML에서 특별한 작업을 수행 할 필요가 없습니다.

스크립트의 결과는 동일합니다 (빈 줄 인쇄 echo 'hi';, 네 공백 들여 쓰기 된 행에 인쇄, 네 공백 들여 쓰기 된 행에 인쇄 echo 'bye';).

가독성을 위해 다중 라인 입력을 사용하려는 경우 (단일 라인으로로드 됨) 기본적으로 두 가지 옵션이 있습니다. 다중 라인 평면 스칼라를 사용하거나 YAML에서 접힌 스칼라를 사용합니다.

다중 선 일반 스칼라

Plain은 스칼라가 인용되지 않음을 의미하며, YAML의 모든 다중 행과 마찬가지로 다음 행이 적절하게 들여 쓰기되어야 함을 의미합니다.이 경우에는 초기 행보다 더 많이 들여 쓰기해야합니다.

script:
- echo -e
   "echo 'hi';
    echo 'bye';"

개행은 공백으로 대체되므로하지 마십시오.

script:
- echo -e
   "echo 'hi';
    echo '
   bye';"

전에 눈에 보이는 공간을 얻을 수 있습니다 bye.

이러한 스칼라 내에서 콜론 뒤에 공백이 올 수 없다는 것과 같은 몇 가지 제한 사항이 있습니다 (키-값 쌍처럼 보이게 함).

일반 스칼라에서는 문자를 이스케이프 할 수 없으므로 일반 스칼라에서 백 슬래시를 이스케이프 할 필요가 없습니다. 물론 백 슬래시를 포함 할 있습니다. 이는 YAML에서로드 된 문자열로 끝나고 실행 된 명령에 대한 의미를 가질 있습니다. 그 문자열에서.

접힌 스칼라

접힌 스칼라는 모든 (단일) 줄 바꿈이로드 중에 공백으로 대체된다는 점에서 일반 스칼라와 유사합니다.

script:
- >
  echo -e
  "echo 'hi';
  echo 'bye';"

최소한 접힌 스칼라 표시기 ( >) 만큼 실제 명령 정보를 들여 쓰기해야합니다 .

평범한 스칼라와는 달리 :특별한 의미가 없습니다. 따라서 YAML 오류를 발생시켜 일반 스칼라가 실패하면 유사한 접힌 스칼라는 실패 할 가능성이 높습니다.


답변

나는 이것이 문제가 될 것이라고 미리 여기에 왔지만 가독성을 위해 다음과 같은 “다중 행”명령이 작동합니다.

Gitlab 러너 : 쉘 러너 버전 1.11.0 / Gitlab 버전 : 8.17.2

myjob:
stage: deploy
script:
  # Single line command
  - az component update --add sql

  # Multi-line command
  - az sql server create -n ${variable} -g ${variable} -l ${variable}
    --administrator-login ${variable} --administrator-login-password ${variable}


답변

yaml literal_block 및 anchors 기능을 통해 여러 줄 스크립트 / 명령을 사용할 수 있습니다. 예:

.build: &build |
    echo -e "\n$hl? Building $green$build_path/$build_assets_dir/*.js $nl\n"
    echo -e "javascript-obfuscator $build_path/$build_assets_dir/*.js"
[...]

build:master:
  stage: build
  script:
    - *rsync
    - *build
[...]


답변

wp config create 명령은 .gitlab-ci에서 꽤 까다 롭습니다 …

build:
  stage: build
  script:
    - echo "Building the app"
    - |
        wp config create --dbname=$vardb --dbhost=$varhost --dbuser=$varusr --dbpass=$varpas --extra-php <<PHP
            define( 'WP_DEBUG', false );
            define( 'FS_METHOD', 'direct' );
            define( 'WP_POST_REVISIONS', 5 );
            define( 'AUTOSAVE_INTERVAL', 600 );
        PHP
    - scp ./wp-config.php continued...
  allow_failure: true


답변

이것은 Travis CI에서 나를 위해 일하고 있습니다.

before_install:
  - set -e
  - |
    echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
    <settings xmlns=\"http://maven.apache.org/SETTINGS/1.0.0\"
              xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
              xsi:schemaLocation=\"http://maven.apache.org/SETTINGS/1.0.0
                                   http://maven.apache.org/xsd/settings-1.0.0.xsd\">
      <servers>
        <server>
          <id>github</id>
          <username>${GITHUB_USERNAME}</username>
          <password>${GITHUB_PASSWORD}</password>
        </server>
      </servers>
    </settings>
    " >  ${HOME}/.m2/settings.xml

여기서 두 개의 환경 변수 ( ${GITHUB_USERNAME}${GITHUB_PASSWORD})도 보간됩니다.


답변

이 형식이 작동합니다. YAML에서 일반 (따옴표없이) 스칼라를 사용하십시오. 예 : 테라 폼 백엔드 초기화에 사용되는 스크립트

  before_script:
    - cd ${TF_ROOT}
    - terraform init -backend-config="address=${GITLAB_TF_ADDRESS}"
      -backend-config="lock_address=${GITLAB_TF_ADDRESS}/lock"
      -backend-config="unlock_address=${GITLAB_TF_ADDRESS}/lock"
      -backend-config="username=${GITLAB_USER_LOGIN}" -backend-config="password=${GITLAB_ACCESS_TOKEN}"
      -backend-config="lock_method=POST" -backend-config="unlock_method=DELETE"
      -backend-config="retry_wait_min=5"


답변