2017-10-19 4 views
1

최근에 Gitlab으로 옮겨서 파이프 라인을 사용하기 시작했습니다. 빌드 서버 (Ubuntu 16.04 인스턴스)를 설치하고 쉘 실행 프로그램을 사용하는 러너를 설치했지만 실제로는 .gitlab-ci.yml 파일에 정의 된 스크립트를 실행하는 방법이 확실하지 않습니다. 다음 코드 조각을 고려하십시오쉘 실행 프로그램은 어떻게 스크립트를 실행합니까?

script: 
    - sh authenticate.sh $DEPLOY_KEY 
    - cd MAIN && sh deploy.sh && cd .. 
    - sh deploy_service.sh MATCHMAKING 
    - sh deauthenticate.sh 

내가 인상이었다 그것이 것입니다 단지 파이프를 강타 이러한 명령을, 따라서 나는 기본 배쉬 동작을 기다리고 있었다. 그러나 ssh 오류로 인해 deploy.sh이 실패합니다. Bash는 deploy_service.sh (예상되는 동작 임)을 계속 실행하지만 can't open deploy_service.sh 오류로 실패하고 Bash가 마지막 명령문을 실행하지 않고 작업이 종료됩니다.

처음부터 set -e을 수행하면 Bash는 오류가 발생하는 경우에만 중단되므로 모든 명령문이 실행될 것으로 예상됩니다. 나는 첫 번째 문으로 set -e을 추가하려고 시도했으나 아무런 차이가 없다. 첫 번째 ssh 오류에서 종료되지 않는다. 또한 (오류에 종료, set -e하지 않고, 그것을 왜 set -e

$ set -e 
$ cd MAIN && sh deploy.sh && cd .. 
deploy.sh: 72: deploy.sh: Bad substitution 
Building JS bundles locally... 

> better-npm-run build 

running better-npm-run in x 
Executing script: build 

to be executed: node ./bin/build 
-> building js bundle... 
-> minifying js bundle... 
Uploading JS bundles to server temp folder... 
COMMENCING RESTART. 5,4,3,2,1... 
ssh: Could not resolve hostname $: Name or service not known 
$ sh deploy_service.sh MATCHMAKING 
sh: 0: Can't open deploy_service.sh 
ERROR: Job failed: exit status 1 

으로 set -e

$ cd MAIN && sh deploy.sh && cd .. 
deploy.sh: 72: deploy.sh: Bad substitution 
Building JS bundles locally... 

> better-npm-run build 

running better-npm-run in x 
Executing script: build 

to be executed: node ./bin/build 
-> building js bundle... 
-> minifying js bundle... 
Uploading JS bundles to server temp folder... 
COMMENCING RESTART. 5,4,3,2,1... 
ssh: Could not resolve hostname $: Name or service not known 
$ sh deploy_service.sh MATCHMAKING 
sh: 0: Can't open deploy_service.sh 
ERROR: Job failed: exit status 1 

없이

:

나는 아래 Gitlab에서 정확한 출력을 추가했습니다 왜 두 번째 오류에서만 종료되고 ssh 오류가 아닌지)? 어떤 통찰력이라도 대단히 감사하겠습니다.

+2

"쉬 deploy.sh"당신은 호출하고'sh' 여기, bash가 아니라. 그들은 당신의 시스템에서 같은 것이 아닐 수도 있습니다. bash를 원하면 bash를 호출하십시오. – Kenster

+0

@Kenster'bash'는 그 스크립트에서'sh'를 호출하는데 사용되며, 에러는 적절한 종료 코드 (첫 번째 오류는 127, 두 번째 오류는 255)와 함께 'bash'로 반환됩니다. 문제는'bash'가 예상 한대로 오류를 감지하고 있지 않다는 것입니다. – Amposter

+0

docs : #이 명령은 다른 사용자 (쉘 실행 프로그램)의 컨텍스트에서 빌드가 실행되어야 할 때 사용됩니다 'cat generated-bash-script | su --shell/bin/bash --login user' – Amposter

답변

0

Gitlab 스크립트 블록은 실제 쉘 스크립트 배열입니다. https://docs.gitlab.com/ee/ci/yaml/#script 배열의 각 요소에서 오류가 발생하면 전체 배열이 실패합니다. 내가 sh deploy.sh 0이 아닌 종료 코드를 생성하여 생각하지 않는다

script: 
    - ./script.sh 
0

같은 일부 script.sh 파일

에 스크립트 블록을 넣어 해결하려면.

set -e을 사용하면 명령이 0이 아닌 리턴 코드와 함께 종료되었지만 쉘 스크립트를 실행하기위한 하위 프로세스를 작성중인 경우 현재 프로세스가 종료하도록 알리고 있습니다. 내가 스크립트를 실행하는 경우

#!/bin/bash 
echo "First." 
echox "Error" 
echo "Second" 

, 당신은 오류가 처리되지 않는 방법을 볼 수 있습니다 :

$ sh deploy.sh 
First. 
deploy.sh: line 5: echox: command not found 
Second 

내가 set -e을 실행하면 다음

내가 deploy.sh라고 한 간단한 예제 스크립트입니다 먼저 효과가 없다는 것을 알 수 있습니다.

$ set -e 
$ sh deploy.sh 
First. 
deploy.sh: line 5: echox: command not found 
Second 

지금, 나는 /bin/bash 오두막에 -e를 추가 : 나는 sh으로 스크립트를 실행하면

#!/bin/bash -e 
echo "First." 
echox "Error" 
echo "Second" 

-e여전히은 영향을지지 않습니다.

$ sh ./deploy.sh 
First. 
./deploy.sh: line 3: echox: command not found 
Second 

이 스크립트를 bash를 사용하여 직접 실행하면 -e이 적용됩니다.

  • ./deploy.sh를 사용하여 스크립트의 오두막 라인 (#!/bin/bash -e)
  • 전화 배쉬에서 직접 스크립트를 -e 추가를 통해 스크립트를 실행할 수 없습니다 :

    $ ./deploy.sh 
    First. 
    ./deploy.sh: line 3: echox: command not found 
    

    이 문제를 해결하려면 당신이해야 할 생각 sh. 당신이 실행하는 잘못된 디렉토리에 있던 의미하지 deploy.sh 경우cd ..하지 실행 (위의 하나가 성공했을 경우 && 수단이 다음 명령을 실행됩니다)는 실패 할 것을 염두에

곰, deploy_service.sh. 그 무엇을의 (

script: 
    - sh authenticate.sh $DEPLOY_KEY 
    - (cd MAIN && sh deploy.sh) 
    - sh deploy_service.sh MATCHMAKING 
    - sh deauthenticate.sh 

이 격렬하게 서로 다른 것이 아니라 하위 프로세스에서 실행되는 cd MAIN && sh deploy.sh가 발생합니다 : 당신은 cd MAIN; sh deploy.sh; cd .. 더 나은 것,하지만 난 간단한 대안으로 deploy.sh에 전화를 교체하는 것이 좋습니다 대괄호), 이는 전체 스크립트의 현재 디렉토리가 영향을받지 않음을 의미합니다. "하위 프로세스를 생성하고 하위 프로세스 변경 디렉토리에서 해당 스크립트를 실행"하는 것처럼 생각하면 하위 프로세스가 끝나면 시작한 곳에서 끝납니다.

다른 사용자가, 당신이 실제로 쉬에서 스크립트를 실행하는 댓글을 달았으로

하지 bash는, 그래서이 내내 더 좋을 수 있습니다

script: 
    - ./authenticate.sh $DEPLOY_KEY 
    - (cd MAIN && ./deploy.sh) 
    - ./deploy_service.sh MATCHMAKING 
    - ./deauthenticate.sh 
+0

'deploy.sh'는 0이 아닌 종료 코드를 반환합니다 (스크립트에서'set -e'를 사용하고'$?'변수를 여러 번 확인했습니다). 나는 '&&'경고와 왜 다음 문장이 실패하고 있는지 알고있다. 그러나 이것은 요점을 제외하고있다. 핵심은 두 줄 ('cd MAIN && sh deploy.sh && cd ..'와'sh deploy_service.sh MATCHMAKING')는 0이 아닌 종료 코드를 반환하지만 executor는 두 번째 명령문 오류시에만 오류가 발생합니다. – Amposter