[ErrorCatcher 8] GitLab CI/CD

LILO Ghim·2022년 5월 22일
0
post-thumbnail

야믈을 지어다가 며칠을 먹었다

그리고 먹다가 뱉을 뻔 한 이야기


야심차게 작성했던 .gitlab-ci.yml
뭐 당연히 기대도 하지 않았지만,
다양한 에러를 내뱉었고,
그것을 고쳐 나가는 이야기
(응 너 말고 또 니 사수 ^^ 흫)


1

놀랍게도 shell script에서
[ "대괄호안에다가모라고쓰고싶을때" ]
요롷게 대괄호 시작과 끝에 공백을 주어야 함
이거 때문에 shell에서 피 흘리는 거 보고싶지 않으면,
오.타.조.심.

(막 이런거 / \ 흫)

before_script:
  - if [ $CI_COMMIT_REF_NAME != "dev" ] && [ $CI_COMMIT_REF_NAME != "master" ]; then echo "Pipeline stopped!"; exit 1; fi

2

rules ifonly except

최초의 야믈에서는,
(오해의 여지가 있을 것 같군, 최초의 (내가 작성한) 야믈에서는)
JOB을 수행 할 조건을 선언해주기 위한 것으로
only를 사용했다


only:
	- dev
    - push

뭐 이런 식으로다가


그런데,
생각도 못했지, 아니 생각은 했지
.env
너라는 간극


배포할 환경에 따라서
다른 ENV들을 불러다가
npm start를 할진대

손으로 한땀한땀
로컬에서 도커 이미지 빌드 한 다음에,
EC2로 넘어가서
vienv파일 만들어 넣어주고,
docker run --env-file .env로...
이 말 밖엔...


배포할 환경이 1개 이상이라면,
그에 따라서 줄줄이 소세지도 아니고
JOB을 적을 일도 아니고...
(실제로 그런 예시를 보고 말았...
모니터 한 화면에 들어오지도 않아 ^^)


그래서

  1. only이든 rules이든 when이든 if이든
    내가 커밋하는 브랜치의 이름을 가져와 분기를 태우고,

  JOB:  
    variables:
    	BUILD_VARIABLE: "development"
  	rules:
    	- if: $CI_COMMIT_REF_NAME == "master"
      	  variables:
        	BUILD_VARIABLE: "production"
    	- if: $CI_COMMIT_REF_NAME == "dev"
  1. 도커 이미지 빌드 할 때, 분기에 따라 변수 하나를 같이 docker file로 던져주고,
 	docker build -t (생략) --build-arg BUILD_VARIABLE=$BUILD_VARIABLE .
  1. docker file에서 그 변수를 넘겨 받아,
	ARG BUILD_VARIABLE
  1. package.jsonscripts에서 2의 변수에 맞는 환경변수를 내보내어 index에서 읽도록 docker file에서 2의 변수를 다시 꺼내는(?) 설정이 필요한 것
	ENV NODE_ENV=${BUILD_VARIABLE}

2-1

rules/if를 쓰게 되면, true일 때, script를 실행하는데

only를 지워버리면서 rules if로 작성했던 내용이

(초기)변수이름은 2이고,
if 커밋한 브랜치 이름이 a이면 변수이름은 1이다 
-> a가 아닌 브랜치로 커밋해서 변수이름이 2라면,

if 뒤 조건이 false라서 script 실행이 안됨

그래서,

(초기)변수이름은 2인데,
if 커밋한 브랜치 이름이 a이면 환경변수는 1,
if 커밋한 브랜치 이름이 b이면 2로 실행해라

라고 수정

runner에게 JOB을 언제 실행 할지,
정확하게 명시해줘야 할 것


3

shared runner를 unable하면서,
activated specific runner is not working이 되는 상황이 초래


TLS enabled

Docker-in-Docker with TLS enabled in the Docker executor
The Docker daemon supports connections over TLS. In Docker 19.03.12 and later, TLS is the default.


#register 할 때
--docker-privileged \
--docker-volumes "/certs/client"

#config.toml
[runners.docker]
	volumes = [ "/certs/client", "/cache" ]

#.gitlab-ci.yml
DOCKER_TLS_CERTDIR: "/certs"

TLS disabled

Docker-in-Docker with TLS disabled in the Docker executor
Sometimes you might have legitimate reasons to disable TLS. For example, you have no control over the GitLab Runner configuration that you are using.

...네?...


#register 할 때
--docker-volumes "/certs/client" #하지 않았다면!

#config.toml
[runners.docker]
	volumes = [ "/cache" ] #default

#.gitlab-ci.yml
DOCKER_TLS_CERTDIR: ""

기억난다 기억나
2주 전쯤runnerregister할 때,
이유는 모르겠으나 요노마들이 3종 세트였는데,
이유를 모르니 묵살 당했지,
그럴듯 하지만 맘에 들지 않는다라고...

그래서 config.tomlrunners.docker.volume에는
defaul로 등록이 되어있었을 것이고,
야믈은, 러너는, 컨테이너들은??? CERTDIR을 찾았을 것...

깃랩출처


+)
요있~네


그래... 이런 것을 봤었더랬지...
https://nearhome.tistory.com/141


4

$CI_COMMIT_SHORT_SHA

git commit SHA를 꺼내어 docker IMAGE_TAG로 쓰기 위해
SHA를 꺼내는 방법1)과,
shell에서 변수로 저장하는 방법2)을 찾아


1) git show HEAD --pretty==format:"%H" --no-patch` 
2) SHA = $(git show HEAD --pretty==format:"%H" --no-patch)

야믈에서,


#.gitlab-ci.yml
IMAGE_TAG = $(git show HEAD --pretty==format:"%H" --no-patch)
----- $DOCKER_USER/$IMAGE_NAME:$IMAGE_TAG -----

이렇게 썼다가
한 줄로 끝내는 방법이 있었다

$CI_COMMIT_SHORT_SHA


5

아주 편안한 녹색과 푸른 색으로 찬란 할 때쯤,
메모리가 터지고야 말았는데,
이건 EC2 instance를
컴퓨터 사양 업그레이드 하듯 올려줌


6


- ssh ec2-user@$TARGET_IP docker container ls -a
- ssh ec2-user@$TARGET_IP docker container rm -f nodejs-server

docker run하기 전에, 이 두 줄의 script가 있어야 했던 이유는,
port 때문이었다 ^^


결론

가져오라는 브랜치 이름을 안 가져오고
갑자기 나는 다른 곳으로 갔다


생각을 하다가 하다가 또 하다가
다른 곳으로 가지 말고,
멈추지도 말고,
다른 곳으로 갔다가 다시 돌아오고,
멈췄다가 다시 가야겠지...? 그렇지???


@출처 from 개먼사님

profile
킴릴로

0개의 댓글