탕구리's 블로그

Travis CI / AWS codedeploy - with willson 본문

Server

Travis CI / AWS codedeploy - with willson

탕구리당 2019. 7. 15. 22:41
반응형

 

WillSon 서버에는 무엇을 했나요?

 

회고록에서 적었던 것처럼 우선 해보고 싶었던 CI/CD (Continuous Integration / Continuous Delivery)를 한번 구축해보고 싶었기 때문에 간단하고 쉽게 구축할 수 있는 서비스를 수소문하여 Travis CI와  AWS code deploy 서비스를 연동하여 사용하기로 하였습니다.

 

 

전체적인 흐름은 어떻게 될까?

순서대로 차근차근 알아보면 다음과 같아요.

 

1. 깃헙에 코드를 업로드합니다

2. 코드가 업로드되면 Trigger가 발생하고.

3. Travis CI의 가상 머신을 통해 CI 작업을 진행

4. CI 작업이 완료되면 코드를 압축하여  S3 버킷에 저장

5. deploy agent가 설치된 ec2 서버에서 이를 확인

6. S3를 통해 다운로드된 코드는 미리 작성된 shell script의 내용을 수행하며 배포

 

의 과정을 통해서 이루어지게 됩니다.

 

 

 

과정은 알겠으니 어떻게 설정해야 할까요?

 

위에서 일어나는 과정을 설정 및 제어하기 위해서는 몇 가지 파일을 작성해야 합니다.

 

1. travis ci를 위한 .travis.yml

2. codedeploy를 위한 appspec.yml

3. 배포 마무리시 작동할 shell script

 

 

우선. travis.yml의 역할은 코드 업로드로 인한 trigger 발생 시 travis 가상 머신에서 작동될 내용에 대한 명세입니다. 제가 작성한 .travis.yml의 내용은 다음과 같습니다. 

 

// .travis.yml

language: node_js  // 사용하려는 언어

node_js: // 버전 정보

  - "9.11" 

 

cache :

  yarn: true

 

// 가상 머신에서 인스톨하기 전에 실행할 명령어

before_install: 

  - npm install -g yarn

 

// trigger를 발생시킬 branch를 선택합니다.

branches: 

  only:

    - develop

 

// CI를 실행할 명령어를 입력해줍니다. 저는 CI를 진행하지 않고 바로 배포하기 위해 아래와 같이 작성했습니다.

script: 

  - echo "skipping tests"

 

// CI 종료 후  deploy 하기 전  필요한 코드를 압축

before_deploy: 

  - rm -rf node_modules

  - zip -r willson-deploy ./*

  - mkdir -p deploy

  - mv willson-deploy.zip deploy/willson-deploy.zip

 

// 배포 파일을 올릴 대상을 선정해줍니다.

// s3에 접근을 위한 두 개의 키는 travis 사이트의 setting에서 설정 가능합니다.

// 해당 key의 유저는 s3와 codedeploy에 대한 policy를 가지고 있어야 합니다.

deploy: 

  - provider: s3

    access_key_id: $AWS_ACCESS_KEY

    secret_access_key: $AWS_SECRET_KEY

    bucket: willson-deploy  // 압축파일을 저장할 버킷 이름

    region: ap-northeast-2 // s3의 regison은 나누어져 있지 않지만.. 빼도 상관없을 거 같아요.

    skip_cleanup: true

    local_dir: deploy // deploy 디렉터리 안에 있는 내용을 s3로 업로드합니다.

    wait-until-deployed: true

    on:

      repo: willson-appjam/willson-server

      branch: develop

 

    - provider: codedeploy

    access_key_id: $AWS_ACCESS_KEY

    secret_access_key: $AWS_SECRET_KEY

    bucket: willson-deploy

    key: willson-deploy.zip # 해당 버킷에 저장되어 있는 파일 이름

    bundle_type: zip

    deployment_group: willson-group

    application: willson

    region: ap-northeast-2

    wait-until-deployed: true

    on:

    repo: willson-appjam/willson-server

    branch: develop

 

// 배포 실행 시 알림 메일 받을 주소

notifications:

email:

recipients:

- 30032dongsu@gmail.com

제가 파일에 사용한 옵션 외에도 많은 옵션이 존재하니 궁금하신 사항은 여기를 참고해 주세요!

 

 

다음으로 appspec.yml에 대한 내용입니다. appspec.yml은 서버에 옮겨지고 난 후, 어떤 행동을 할 지에 대한 내용을 담고 있습니다.

version0.0

os: linux

 

files:

- source: /

   destination: /home/ec2-user/deploy/willson  // S3에서 가지고 온 파일을 저장할 디렉터리 위치를 지정

 

# 생성되는 파일에 대한 permission을 설정

permissions:

    - object: /home/ec2-user

       owner: ec2-user

       group: ec2-user

       mode: 755

       type:

         - directory

         - file

 

# 훅에서 잡히는 location은 $HOME에 위치합니다.

# runas는 명령어를 실행할 사용자를 선택 (현재는 ec2-user) 

# timeout은 오류로 판단하는 대기 시간

hooks:

  AfterInstall:

    - location: deploy.sh

       timeout: 1000

       runas: ec2-user

자세한 내용은 여기 확인해주세요!

 

이제 마지막으로 실제 deploy를 위한 shell script를 확인해 봅시다.

#!/bin/bash

// .bash_profile을 source 하지 않았더니 계속 디렉터리에 대한 권한 문제가 생기더라고요

// ec2-user의 권한으로 명령어를 수행하도록 설정하였는데 문제가 생겨서 임시방편으로 해놓았는데 

// 정확히 어떤 원리로 작동하는지는 시간이 급해서 그냥 넘어갔습니다.

// 혹시 저처럼 문제가 생기는 분은 profile을 source 해주시면 될 거 같아요.

 

source $HOME/.bash_profile

export WILLSON=$HOME/deploy/willson

 

echo "delete willson project"

pm2 delete willson

 

echo "make bundle file"

cd $HOME/deploy/willson

npm run build:dev

 

echo "start willson project"

pm2 start --name willson $WILLSON/config/dist/bundle.js

 

이렇게 가장 해보고 싶었던 배포 자동화를 위와 같은 과정을 통해 해결하였습니다. 물론 중간에 다 건너뛰고... 그랬지만 말이죠. 테스트 과정도 같이 진행하고 싶었는데, gitignore 파일들이 있다 보니까 build 과정에서 지속적인 오류가 발생하여 건너뛰고 배포에 집중했습니다.

 

너무 간략하게 정리해서 크게 도움은 안될꺼 같지만, 저와 비슷한 오류를 가지거나 간단한 배포가 필요하신 분들에게 도움이 됐으면 합니다.

반응형

'Server' 카테고리의 다른 글

Apache와 Tomcat 연동(feat. mod_jk)  (0) 2020.03.05
Nginx는 무슨 역할을 할까? - with willson  (0) 2019.07.18
Swagger를 이용해보자! 2편  (3) 2018.05.27
Swagger를 이용해보자! 1편  (1) 2018.05.27
REST API에 대해 알아보자  (0) 2017.12.31
Comments