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"