Gitlab CI의 셸 조건
🇨🇿 V češtině si lze článek přečíst na kutac.cz
If you are using a different executor than Docker, this might not be relevant for you. However, Docker executor is the default one for shared runners in gitlab.com
gitlab-ci.yml
파일에서 Docker 이미지와 실행할 명령을 지정합니다. 해당 명령에 조건 또는 기타 구성을 포함할 수 있습니다. 그러나 사용된 Docker 이미지에는 여러 Shell 구현이 포함될 수 있으며 어떤 Shell이 선택되고 어떤 구문을 사용할지 알아야 합니다.*.sh 파일에서 수동으로 Shell 지정
스크립트가
.gitlab-ci.yml
파일에 직접 작성되지 않고 외부 파일에 작성되는 경우 Shell 경로와 파일 경로를 지정할 수 있습니다. 그런 다음 실행기에서 어떤 셸이 선택되었는지 크게 신경쓰지 않아도 됩니다. 파이프라인은 다음과 같습니다.deploy:
image: registry.gitlab.com/pavel.kutac/docker-ftp-deployer:php81
script:
- /bin/bash /usr/local/bin/execute-deployment.sh
.gitlab-ci.yml 파일 내 직접 조건
Literal block style 을 사용하여 YAML에 직접 조건을 작성할 수 있습니다. 그러면 파이프라인은 다음과 같을 수 있습니다. 사용된 스크립트와 Docker 이미지는 . 하지만 이제 어떤 구문을 사용해야 하는지 알아야 합니다.
deploy:
image: registry.gitlab.com/pavel.kutac/docker-ftp-deployer:php81
script: |
if [[ ${CI_COMMIT_MESSAGE,,} != "[skip-maintenance]"* ]]; then
wget --no-verbose -O - https://kutac.cz/some/path/to/turn/on/maintenance-mode
fi
./.ci/deploy/run-lftp-incremental-sync.sh
그러나 그 정보를 얻는 방법? 설명서에서 찾을 수 없었습니다. 그리고 언급된 Docker 이미지에는 Busybox
sh
및 bash
가 포함되어 있습니다. Gitlab 러너의 소스 코드를 파헤쳐야 했습니다.그리고 Gitlab Runner가 먼저
/bin/sh
로 짧은 스크립트를 실행한다는 것이 분명합니다. BashDetectShellScript
아래는 쉘 구현에 따라 다른 경로를 확인하고 그 중 하나를 선택합니다. 그런 다음 선택한 것을 사용하여 .gitlab-ci.yml
파일의 모든 스크립트를 실행합니다.const BashDetectShellScript = `if [ -x /usr/local/bin/bash ]; then
exec /usr/local/bin/bash $@
elif [ -x /usr/bin/bash ]; then
exec /usr/bin/bash $@
elif [ -x /bin/bash ]; then
exec /bin/bash $@
elif [ -x /usr/local/bin/sh ]; then
exec /usr/local/bin/sh $@
elif [ -x /usr/bin/sh ]; then
exec /usr/bin/sh $@
elif [ -x /bin/sh ]; then
exec /bin/sh $@
elif [ -x /busybox/sh ]; then
exec /busybox/sh $@
else
echo shell not found
exit 1
fi
`
// ...
func (b *BashShell) GetConfiguration(info common.ShellScriptInfo) (*common.ShellConfiguration, error) {
// ...
if info.Type == common.LoginShell {
script.CmdLine += " -l"
script.Arguments = []string{"-l"}
script.DockerCommand = []string{"sh", "-c", strings.ReplaceAll(BashDetectShellScript, "$@", "-l")}
} else {
script.DockerCommand = []string{"sh", "-c", strings.ReplaceAll(BashDetectShellScript, "$@", "")}
}
// ...
}
Reference
이 문제에 관하여(Gitlab CI의 셸 조건), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/arxeiss/shell-conditions-in-gitlab-ci-545텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)