Gitlab CI의 셸 조건

6013 단어 gitdevopslinux
Gitlab CI/CD의 스크립트에는 조건이 포함될 수 있으며 이를 해결하는 방법에 대한 여러 옵션이 있습니다. 그렇다면 어떤 Shell이 ​​사용되고 어떤 구문을 사용해야 할까요? 이것은 문서화되지 않았습니다.


🇨🇿 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 이미지에는 Busyboxshbash가 포함되어 있습니다. 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, "$@", "")}
    }
    // ...
}

좋은 웹페이지 즐겨찾기