Archives
12-03 00:17
Today
0
Total
287,804
관리 메뉴

FILife

Gitlab-ci 를 통한 자동배포 구축하기 본문

내가 자꾸 까먹어서 쓰는 개발 이야기/Linux Server

Gitlab-ci 를 통한 자동배포 구축하기

FIL 2019. 8. 14. 18:38
728x90

이번엔 꽤 복잡했다.

 

1. phpunit, gitlab-runner 설치

 

먼저 Laravel의 테스트 자동화를 도와줄 phpunit을 composer.json에 추가해준다.

 

unit test 자동화를 위해 https://github.com/vigneshc91/laravel-test-generator 패키지를 documentation에 따라

 

설치하고, 불필요하거나 시스템에 영향을 미칠 수 있는 테스트 항목을 정리하여 셋팅 해 두었다.

 

추후 gitlab-runner 가 phpunit으로 테스트를 수행하려면 composer.json의 require-dev 항목에 들어있어야 한다.

$ composer require --dev phpunit/phpunit ^8.3

해당 내용을 포함하여 저장소에 push 해 준다.

 

composer.json에 해당 내용이 없으면 heroku가 에러를 뿜어내게 된다.

 

다음으로, 어디서도 실행할 수 있도록 apt-get으로도 phpunit을 설치 해 준다.

 

하는김에 gitlab-runner도 설치 해 준다.

 

다만 최신버전을 받으려면 https://docs.gitlab.com/runner/install/linux-manually.html 의 내용에 따라,

 

install 또는 update 를 수행한다.

$ sudo apt-get install phpunit gitlab-runner

이것으로 밑작업 완료.

 

 

2. gitlab-runner 설정

 

gitlab-runner는 gitlab에서 push 이벤트가 발생했을 때, 필요한 환경이나 명령어를 gitlab으로 전달해주는 감시자이다.

 

프로젝트 루트로 이동하여 gitlab-runner를 등록한다.

$ sudo gitlab-runner register

https://gitlab.com > 프로젝트 페이지 > 설정 > CI/CD > Runners 로 들어간다.

 

Set up a specific Runner manually 항목을 보면, url과 토큰을 확인할 수 있다. 차례대로 입력 해 준다.

 

description 입력을 요구하면 프로젝트를 식별할 수 있는 문자열을 적당히 입력 해 주고,

 

tag 입력을 요구하면 축약된 문자열로 잘 입력한다.

 

tag는 gitlab-runner와 프로젝트를 매칭시켜주는 중요 요소로 작용하게 된다.

 

여기서는 my-tag 라고 설정한 것으로 가정한다.

 

이후는 안내 문구에 따라 필요한 설정을 넣어주면 된다.

 

 

3. .gitlab-ci.yml 작성

 

가장 애먹었던 부분이다.

 

일단 예제를 보자면 이렇다.

 

before_script:
  - cd /home/fil/workspace/my-project

stages:
  - test
  - qa
  - production

testing:
  stage: test
  script:
    - echo "Unit test started."
    - composer install
    - phpunit
  tags:
    - my-tag
  only:
    - tags

qa:
  stage: qa
  script:
    - echo "Deploy to qa"
    - dep deploy qa
  tags:
    - my-tag
  only:
    - tags
    - qa

deploying:
  only:
    - master
    - tags
  stage: production
  script:
    - echo "Deploy to production"
    - cd public
    - cd ..
    - dep deploy ec2
  tags:
    - my-tag

before-script 부분은 필요한지 잘 모르겠다. 검색하다보니 저렇게 쓴 사람이 있기에 혹시나 해서 넣어봤다.

 

stages는 gitlab-ci가 작업을 수행할 공간을 의미하는듯 한데,

 

stage가 서로 다른 작업은 병렬로 실행된다. 일종의 멀티태스킹으로 생각하면 될것같다.

 

gitlab의 CI/CD 메뉴를 통해 작업이 실행되는 모습을 콘솔로 지켜볼 수 있는데,

 

보아하니 docker로 컨테이너를 만들고, 해당 컨테이너에서 지정된 명령들을 수행하는 것 같다.

 

즉, stage가 다른 작업이 두개 있다면 두 작업을 각각의 컨테이너에서 동시에 실행하는것으로 보면 될듯 하다.

 

only 부분에는 branch 이름과 태그를 적어 주었다.

 

deploying 스크립트는 프로덕션 서버에 배포할때 사용할 예정인데,

 

master 브랜치에 코드가 push 되었을때 & runner가 my-tag에 해당할때만 수행하도록 설정했다.

 

이후 .gitlab-ci.yml 파일을 origin/master에 push했을때

 

자동으로 deployer 배포가 실행되어 slack으로 메시지를 받을 수 있었다.

 

 

워낙 복잡해서 최대한 간단하게 적었는데, 수정&테스트를 병행하면 잘 될것이라 본다.

 

1만큼 고생하면 5만큼 할일이 줄어드는 꿀작업이다.

 

--------------------------------------------- 내용 추가 19.08.20 -----------------------------------------------

 

gitlab-runner 10 이상 버전에서 "Problem with the SSL CA cert" 오류를 지속적으로 만나야 했다.

 

검색을 반복한 끝에 아래 해결방법을 찾을 수 있었다.

tls_verify = false 
environment = ['GIT_SSL_NO_VERIFY=true']

위 두줄을 /etc/gitlab-runner/config.toml 파일의 [[runners]] 각각에 추가 해 준다.

 

출처: https://gitlab.com/gitlab-org/gitlab-runner/issues/2859#note_54723535

 

또는 아래 내용을 .gitlab-ci.yml 파일에 추가해도 된다고 한다.

 

variables:
  GIT_SSL_NO_VERIFY: "true"

 

gitlab과 gitlab-runner간의 ssl 통신 문제라고 추정하는 듯 하다.

 

출처: https://gitlab.com/gitlab-org/gitlab-runner/issues/986#note_3262945

0 Comments
댓글쓰기 폼