리셋 되지 말자

[CSAPI] develop branch를 이용한 CI 파이프라인 구성 본문

프로젝트

[CSAPI] develop branch를 이용한 CI 파이프라인 구성

kyeongjun-dev 2021. 9. 20. 18:15

현재 상태

아래 그림과 같이 Nginx 컨테이너가 443 port를 통해 외부로 통신하고 있는 상태다. gitlab-runner는 컨테이너 형태가 아닌 local에 설치했기에 이처럼 그림으로 표시했다.

 

80포트를 443포트로 redirect

현재 http 즉 80 포트를 이용해 도메인으로 접속하면 아래 그림과 같이 접속할 수가 없다. (443 포트 접속은 가능)

보통 여러 웹사이트를 검색해서 들어가면, 분명 80포트로 접속했는데 https로 자동으로 접속되는걸 경험했었는데 이것을 해본다.
이 과정을 develop branch를 따로 두어, CI 파이프라인을 통해 업데이트 되도록 해본다.

 

develop branch 작업

develop branch를 만들고, develop branch에서 작업을 시작한다.

git branch
* develop
  main

 

1. Dockerfile, default.conf, certificate.crt, private.key 파일 추가

이전 게시글(링크)에서 https를 적용한 Nginx 실행을 위해 사용한 파일들을 추가한다.

ls
certificate.crt  default.conf  Dockerfile  private.key  README.md

 

2. default.conf 파일 수정

원래는 443 port만 listen 상태였는데, 80 port로 요청이 들어오면 443 port로 redirect하도록 수정한다.

- 수정 전

server {
    listen       443 ssl;

    ssl on;
    ssl_certificate /etc/ssl/certificate.crt;
    ssl_certificate_key /etc/ssl/private.key;
    server_name  test.csapi.kro.kr/;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

 

- 수정 후

server {
    listen      80;
    server_name test.csapi.kro.kr;
    return      301 https://$server_name$request_uri;
}

server {
    listen       443 ssl;

    ssl on;
    ssl_certificate /etc/ssl/certificate.crt;
    ssl_certificate_key /etc/ssl/private.key;
    server_name  test.csapi.kro.kr;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

 

 

3. nginx 디렉토리 생성

git의 루트디렉토리에 있으면, 정리가 어려우므로 nginx 전용 디렉토리를 생성하여, 현재까지 작업한 파일들을 이동

.
├── nginx
│   ├── certificate.crt
│   ├── default.conf
│   ├── Dockerfile
│   └── private.key
└── README.md

 

 

docker-compose.yml 파일 작성

여러 컨테이너 서비스가 추가될 것을 대비하여, 편리하게 여러 컨테이너를 연결시켜 주는 docker-compose를 사용하기 위해 .yml 파일 작성. build 할 때, docker image 의 이름이 csapi-nginx:test 가 되도록 설정

- docker-compose.yml

version: "3"
services:
  nginx:
    build: ./nginx
    image: csapi-nginx:test
    ports:
      - "80:80"
      - "443:443"

 

 

기존의 nginx 종료

port가 중복되는 컨테이너는 실행할 수 없으므로 443 포트로 실행 중이던 컨테이너는 종료한다.

 

CI 파이프라인 구성

.gitlab-ci.yml 파일을 수정하여 test 파이프라인을 구성한다.

1. yml 파일 작성 후 테스트

- .gitlab-ci.yml

stages:
  - build
  - test
  - deploy

image-build:
  stage: build
  services:
  before_script:
    - docker info
  script:
    - docker-compose build
  tags:
    - csapi-runner
  only:
    - develop

test:
  stage: test
  before_script:
  - echo 'Clear containers...'
  - docker-compose down -v
  script:
    - docker-compose up
    - echo 'testing....'
  after_script:
    - docker-compose down -v
  tags:
    - csapi-runner
  only:
    - develop

test-server-deploy:
  stage: deploy
  before_script:
    - docker info
  script:
    - echo 'Test Server Deploying...'
    - docker-compose up
  tags:
    - csapi-runner
  only:
    - develop

 

2. 테스트 결과

첫 CI 단게인 image-build 단계에서 에러 발생.

 

3. 에러 해결을 위한 gitlab runner executor 수정

gitlab-runner 의 executor 가 현재 docker 이므로, 이를 shell로 변경하여 다시 등록 후, 다시 devlop branch CI를 실행. 그리고 gitlab-runner user를 docker group에 추가하여 docker 명령어 사용이 가능하도록 함.

- test 단계 화면
docker-compose up 을 백그라운드로 실행시켰어야 했는데, 포그라운드로 실행시켜 pending 된 상태

 

4. .gitlab-ci.yml 파일 수정 후, CI 파이프라인 테스트

docker-compose up 을 -d 옵션을 추가하여 수정했다.

- .gitlab-ci.yml

stages:
  - build
  - test
  - deploy

image-build:
  stage: build
  services:
  before_script:
    - docker info
  script:
    - docker-compose build    
  tags:
    - csapi-runner
  only:
    - develop

test:
  stage: test
  before_script:
  - echo 'Clear containers...'
  - docker-compose down -v    
  script:
    - docker-compose up -d    
    - echo 'testing....'
  after_script:
    - docker-compose down -v
  tags:
    - csapi-runner
  only:
    - develop

test-server-deploy:
  stage: deploy
  before_script:
    - docker info
  script:
    - echo 'Test Server Deploying...'
    - docker-compose up -d
  tags:
    - csapi-runner
  only:
    - develop

 

5. 수정된 CI 파이프라인 수행 결과

build, test, deploy 단계를 모두 통과했다.

 

6. nginx redirect가 동작하는지 확인

http로 접속하면, https로 자동으로 redirect 하는걸 확인했다. nginx의 default.conf 파일을 수정하고, gitlab 프로젝트에 수정된 내용을 develop branch 에 push 했을 때 자동으로 수정 사항이 적용되어 test server에서 동작하는걸 확인할 수 있다.

 

 

후기

아직 django 컨테이너를 추가하지 않았기에 test 단계에서 수행하는 테스트 작업이 없다. 또한, 파이프라인을 구성하다 보니 고려해야할 게 몇 가지 있다.

1. docker-compose up -d 명령어 진행 후, 바로 다음 shell 명령어가 수행되는데 docker-compose 에 묶여있는 컨테이너들이 아직 실행이 안됐을 경우.

health check 방식과 같이 몇 초 간격으로 1분 동안 curl 같이 요청을 보내고 응답을 받을 수 있도록 하면 임시적으로 해결 가능할 것으로 생각됨.

2. docker image 의 버전별로 관리를 어떻게 할 것인가?

현재 nginx의 경우, 무조건 csapi-nginx:test 라는 이름으로 image가 build 되는 상태다. 이를 중간에 docker image registry에 업로드를 해야한다 (롤백 등의 이유로 인해). 이또한 추가할 예정. 물론 AWS의 ECR을 사용할 것 같다.

 

처음 구성은 어렵지만, 구성해 놓으면 편하다. 편하다는 얘기이지 수정할 필요가 없다는 건 아니다. 조금 더 세밀하게 살펴보자.

- 현재까지 구성

'프로젝트' 카테고리의 다른 글

[CSAPI] 구성 변경  (0) 2021.10.01
[CSAPI] nodejs, mongodb 컨테이너 추가  (0) 2021.09.22
[CSAPI] gitlab runner와 project 연동  (0) 2021.09.19
[CSAPI] GitLab Private 프로젝트 설정  (0) 2021.09.19
[CSAPI] Lightsail https 적용  (0) 2021.09.17
Comments