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


86

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

stages:
  - mystage

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

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

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


이것에 대한 문제가 있습니다 : gitlab.com/gitlab-org/gitlab-ci-multi-runner/issues/166 귀하의 코드 거기에서 제안 된 솔루션과 동등한 (충분한) YAML 이어야 하므로 문제가 무엇인지 명확하지 않습니다. . 당신은 \당신의 줄에 추가 를 시도 할 수 있지만 그것이 작동하는지 여부는 말할 수 없습니다.
Jordan Running

답변:


37

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 오류를 발생시켜 일반 스칼라가 실패하면 유사한 접힌 스칼라는 실패 할 가능성이 높습니다.


명확성과 유지 관리를 위해 여러 줄로 작성하고 싶습니다. 내 예는 사소하지만 실제 스크립트는 확실히 아닙니다.
samanime

이해할 수 있습니다. GitLab CI에서 처리하기 전에 읽을 수있는 YAML 파일을 사전 처리하는 것이 허용됩니까?
Anthon 2017 년

나는 그것을 고려했다. 추가 단계이며 약간의 복잡성이 추가되었지만 그만한 가치가 있습니다.
samanime

가능한 해결책을 추가했습니다.
Anthon

3
오 소년. 기술적으로는 정확하지만이 답변은 가독성이 떨어질 정도로 우스꽝스럽게 장황합니다. YAML 파서를 작성하지 않는 모든 사람은 아마도 PotatoFarmer매우 찬성 되고 훨씬 간결한 답변을 원할 것입니다. 것입니다.
Cecil Curry

115

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

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}

2
여기서 트릭은 무엇입니까? 두 번째 줄을 첫 번째 줄과 같은 수준으로 들여 쓰셨습니까?
Victor Grazi 2019

6
@ victor-grazi 내가 이해하는대로 : 일반 YAML (일반 흐름 스칼라)에서 이스케이프 (예 : newline \n)는 아무 작업도 수행하지 않으며 선행 공백은 무시됩니다. Gitlab YAML이 이러한 방식으로 스크립트 블록을 구문 분석하는 것처럼 보입니다. 들여 쓰기시 : YAML 사양에 따르면 In YAML block styles, structure is determined by indentation두 번째 줄은 YAML 사양에 필요한만큼 들여 쓰기되고 (부모 들여 쓰기에 상대적인 하나의 공백) 가독성을 위해 하나 더 있습니다 (기술적으로 불필요하지만 더 예쁘다).
PotatoFarmer

매력처럼 작동합니다. 새 줄의 모든 매개 변수와도 작동합니다
bodolsog

26

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
[...]

공유 해주셔서 감사합니다.이 고급 기능은 작업의 가독성을 높이고 레시피 전체에서 코드 청크를 재사용 할 수있는 데 특히 유용합니다.
PotatoFarmer

5
이것은 좋은 예이지만 .rsync를 정의하면 더 명확해질 것입니다.
Victor Grazi

13

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

4

이것은 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})도 보간됩니다.


0

이 형식이 작동합니다. 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"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.