문제가 Gitlab CI (@Jordan가 표시)하고 "스크립트"에서 지원되지 않는 multi-line scripts 관련이있을 것으로 보인다 때문에
실제로 하나의 명령이다, 당신은 단지 한 줄에 그것을 다시한다
- echo -e "\n echo 'hi';\n echo 'bye';\n"
스칼라가 인용되어 있지 않으므로 (예 : echo
으로 시작) 백 슬래시 또는 따옴표에 대해 YAML에서 특별한 작업을 수행 할 필요가 없습니다.
스크립트의 결과는 (사 개 공간을 들여 줄에 네 개의 공간을 들여 줄에 인쇄 echo 'bye';
을 인쇄 echo 'hi';
을 빈 줄을 인쇄 할 수 있습니다.)
를 사용하면 멀티 라인을 사용하려는 경우 동일 입력이 가독성을 위해 가장 좋은 옵션은 입력을 사전 처리하는 것입니다. 파이썬과 ruamel.yaml (면책 조항 : 나는 저자)을 사용하는 것이 좋습니다. 이렇게하면 인용 부호 나 주석과 같은 기능을 그대로 유지할 수 있습니다.
이 gitlab-ci.in.yml
감안할 때 :
stages:
- 'mystage'
Build:
stage: mystage
# the following is rewritten
script:
- |
echo -e "
echo 'hi';
echo 'bye';
"
다음과 같은 파이썬 (버전 3) 프로그램 :
stages:
- 'mystage'
Build:
stage: mystage
# the following is rewritten
script:
- "echo -e \"\n echo 'hi';\n echo 'bye';\n\"\n"
합니다 (flatten_multi_line()
멀티를하지 않고 :
from pathlib import Path
import ruamel.yaml
def flatten_multi_line(d):
if isinstance(d, list):
for idx, elem in enumerate(d):
if isinstance(elem, (list, dict)):
flatten_multi_line(elem)
elif isinstance(elem, ruamel.yaml.scalarstring.PreservedScalarString):
d[idx] = ruamel.yaml.scalarstring.DoubleQuotedScalarString(elem)
elif isinstance(d, dict):
for key in d:
if isinstance(d[key], (list, dict)):
flatten_multi_line(d[key])
elif isinstance(d[key], ruamel.yaml.scalarstring.PreservedScalarString):
d[key] = ruamel.yaml.scalarstring.DoubleQuotedScalarString(elem)
in_file = Path('gitlab-ci.in.yml')
out_file = Path('gitlab-ci.yml')
with in_file.open() as fp:
data = ruamel.yaml.round_trip_load(fp, preserve_quotes=True)
flatten_multi_line(data)
with out_file.open('w') as fp:
ruamel.yaml.round_trip_dump(data, fp)
gitlab-ci.yml
다음 제공 줄 문자열은 w로 보존됩니다. 엘). 당신은 또한 새로 생성 된 YAML 파일의 처리를 실행할 수있는 프로그램에서
잘못된 YAML입니다. '빌드'이후에 콜론이 누락 된 것 같습니다. 'echo -e'와'echo 'hi''에 동일한 작은 따옴표를 사용하고 이중 따옴표를 사용하지 않으시겠습니까? – Anthon
죄송합니다. 그 둘은 저의 모범입니다. 나는 그들을 바로 잡았다. 내가 사용중인 실제 버전은 온라인 YAML-JSON 파서에서 작동하지만 GitLab CI에서는 실패합니다. – samanime
다음과 같은 문제가 있습니다. https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/issues/166 코드가 * 동등해야하므로 문제가 무엇인지 분명하지 않습니다.) YAML은 거기에서 제안 된 해결책을 제시했습니다. 줄에''\''을 추가해 볼 수도 있지만 작동 여부는 말할 수 없습니다. –