JaeWon's Devlog
article thumbnail
반응형

해당 글은 전'우아한 형제들' 현'인프런'의 개발자이신 jojoldu님의 블로그 책(스프링 부트와 AWS로 혼자 구현하는 웹서비스)을 참고하여 작성하였습니다.


이전 글에서 AWS EC2에 개발한 프로젝트를 배포하였습니다.

이번 글에서는 해당 개발을 하고 Git에 Push를 하면 자동으로 EC2에 배포가 되도록 자동화를 구축해보도록 하겠습니다.

 

1. Travis CI 연동하기

- Travis CI는 Github에서 제공하는 무료 CI 서비스 입니다.

CI(지속적 통합)란???
코드 버전 관리를 하는 Git에 PUSH가 되면 자동으로 Test, Build가 수행되고 Build 결과를 운영 서버에 배포까지 자동으로 진행되는 과정
해당 글에서는 Travis CI를 사용하지만 추후에는, Github Action, Docker, Jenkins와 같은 툴을 사용해보도록 하겠습니다!!!
CI에 대해서도 따로 포스팅을 하도록 하겠습니다.
  • Travis CI 와 github 연결하기

- Travis CI 에 접속하여 Github와 연결합니다.

- Travis 와 Github 가 연결이 되었다면, CI 서비스를 이용할 Repository 를 선택합니다.

- 화면 좌측에 My Repositories 옆 + 버튼을 클릭합니다.

- Repository를 검색 후 선택하여, 활성화되도록 합니다.

- 이제, 다시 뒤로 돌아가면 Repository가 연결된 것을 확인하실 수 있습니다.

- Travis 웹페이지에서의 설정은 여기까지가 끝이고, 이후에는 코드로 진행하도록 하겠습니다.

  • 프로젝트 설정

- Travis CI는 프로젝트에 존재하는 .travis.yml 로 관리 합니다. (자세한 정보는 공식홈페이지 참고해주세요.)

- 프로젝트에 .travis.yml을 생성하여, 아래의 코드를 추가하겠습니다.

참고!!!
Github가 2020년 10월 경부터 새로 생성하는 Repository의 기본 branch가 main으로 되었습니다.
만약, 이전에 생성한 프로젝트는 기본 branch가 master 이므로 main 대신 master 또는 자신이 설정한 기본 branch로 작성하시면 됩니다.
language: java
jdk:
  - openjdk8

# Git Push할 Branch
branches:
  only:
    - main

# Travis CI 서버의 Home
cache:
  directories:
    - '$HOME/.m2/repository'
    - '$HOME/.gradle'

script: "./gradlew clean build"

# CI 실행 완료시 메일로 알람
notifications:
  email:
    recipients:
      - testXXX@gmail.com

- 위의 코드를 설명드리자면

  1. branches
    • 오직 main 브랜치에  PUSH 되는 경우에만 수행합니다.
  2. cache
    • Gradle을 통해 의존성을 받게 되면 이를 해당 디렉토리에 캐시하여, 같은 의존성은 다음 배포때부터 다시 받지 않도록 설정합니다.
  3. script
    • main 브랜치에 PUSH 되었을때 수행하는 명령어입니다.
    • 여기선 프로젝트 내부에 둔 gradlew을 통해 clean & build 를 수행합니다.
  4. notifications
    • Travis CI 실행 완료시 자동으로 알람이 가도록 설정합니다.

- 작성하셨다면, git으로 해당 파일을 포함해서 commit & push를 진행하시고, Travis 웹 페이지를 확인합니다.

 

- 위의 그림과 같이, 빌드가 진행되는 것을 확인 하실 수 있습니다.

- 빌드가 정상적으로 진행되었다면, 이메일에도 알림이 와있는지 .travis.yml에 등록한 email 에서 확인합니다.

  • README.md 에 라벨 추가하기

- 여러 오픈소스들을 찾아보다 보면 build passing 이란 라벨을 README.md 에 있는 것을 확인 하실수 있습니다.

- 해당 라벨을 travis ci 가 제공해주고 있으므로, 사용해보도록 하겠습니다.

- Travis 웹페이지에서 화면 상단 Repository 우측에 build 상태 를 클릭하시면, 위와 같이 Modal 창이 뜨게 됩니다.

- README.md 는 Markdown 형식이므로 FORMAT을 선택 후 아래 RESULT 값을 복사합니다.

- 프로젝트 README.md에 라벨이 노출되기 원하는 위치에 붙여 넣습니다.

- 이후 다시 git 에 commit & push를 하시면 git repository 에서도 라벨이 형성된 것을 확인하실 수 있습니다.

- 해당 라벨은 travis에서 빌드의 상태를 보여주기 때문에, passing, error 등으로 보일 수 있습니다.

- Travis 와 연결을 통해서 테스트(test)와 빌드(build) 는 자동화가 되었습니다.

 

2. AWS Code Deploy 연동하기

- Travis CI 는 Test & Build까지는 자동화 시켜주었지만, 빌드된 파일을 원하는 서버로 전달까지 해주진 못 합니다.

- AWS에서 제공하는 Code Deploy 를 사용하여 TravisCI로 Build된 파일을 EC2 인스턴스로 전달 하는 배포 자동화를 진행해보도록 하겠습니다.

  • 프로젝트 배포 전체적인 구조

https://jojoldu.tistory.com/265

- AWS Code Deploy까지 적용되어 자동화 빌드 & 배포가 된다면 전체 구조는 위의 그림과 같습니다.

  • AWS Code Deploy 계정 생성

- Travis CI에서 사용할 AWS Code Deploy 용 계정을 하나 생성합니다.

   (현재 로그인한 계정은 루트 사용자라 모든 권한을 갖고 있기 때문에 외부에 노출하면 안됩니다.)

- AWS의 서비스 검색에서 IAM을 선택 -> 사용자 탭 클릭-> 사용자 추가 버튼을 클릭 합니다.

- 원하시는 계정을 입력하시고, 프로그래밍 엑세스를 선택 후 다음:권한을 클릭합니다.

- 다음:권한 에서는 해당 계정이 사용할 정책을 선택합니다.

CodeDeploy와 S3(Build 파일 백업용) 권한만 할당 받겠습니다.

- 위 두개를 선택하셨다면 다음:태그를 클릭합니다.

- 다음:태그에서는 아무 입력없이 넘어갑니다.

- 설정한 AmazonS3FullAccessAWSCodeDeployFullAccess 정책이 포함되어 있는지 확인 후 계정을 생성합니다.

- 계정이 생성되었다면, 엑세스(Access)키와 비밀(Secret)키가 생성됩니다.

- csv 파일을 다운받아 저장합니다.(추후에 Travis 에서 사용)

3. AWS S3 버킷 생성

- Build 된 jar 파일을 보관해주는 S3 버킷을 생성하도록 하겠습니다.

- AWS의 서비스 검색에서 S3을 선택 -> 버킷만들기 버튼을 클릭 합니다.

- 버킷 이름을 입력하시고, 리전은 서울로 설정합니다.(만약, 리전이 다를 경우 이후 진행에 이슈가 발생할 수 있습니다.)

- 퍼블릭 엑세스 차단 설정에서는 새 ACL(액세스 제어 목록)을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단을 해제합니다.

- 설정이 다 되었으면, S3 생성을 합니다.

4. AWS IAM Role 추가

- 사용자를 대신에 access key & secret key를 사용해 원하는 기능을 진행하게할 AWS IAM Role(역할)을 생성하겠습니다.

- IAM Role에는 EC2와 CodeDeploy를 위한 역할을 생성하겠습니다.

- AWS의 서비스 검색에서 IAM을 선택 -> 역할 선택 -> 역할 만들기을 클릭 합니다.

- AWS 서비스EC2 를 선택 후 다음:권한을 클릭합니다.

- 권한 정책에서는 정책 필터 검색에 AmazonEC2RoleforAWSCodeDeploy를 검색 후 선택 후 다음:태그를 클릭합니다.

- 다음:태그에서는 아무 입력없이 다음:검토로 넘어갑니다.

- 역할 이름을 입력합니다.(보통은 서비스명-EC2CodeDeployRole 으로 입력합니다.)

- 정책 선택된 것을 확인 후 역할 만들기를 클릭하여 생성합니다.

- 한 가지 Roel 을 더 추가하도록 하겠습니다.

- CodeDeploy가 사용자를 대신해 배포를 진행하는 Role입니다.

-  IAM을 선택 -> 역할 선택 -> 역할 만들기을 클릭 합니다.

- AWS 서비스CodeDeploy 를 선택 후 다음:권한을 클릭합니다.

- CodeDeploy Role은 하나밖에 없으므로 바로 다음으로 넘어갑니다.

- 역할 이름을 입력합니다.(보통은 서비스명-CodeDeployRole 으로 입력합니다.)

- 정책 선택된 것을 확인 후 역할 만들기를 클릭하여 생성합니다.

- 생성한 이 역할(IAM Role)들을 AWS 서비스에 하나씩 할당하도록 하겠습니다.

 

5. EC2에 Code Deploy Role 추가 및 설치

  • EC2에 Code Deploy Role 추가

- AWS의 서비스 검색에서 EC2를 선택 -> EC2 인스턴스 우클릭 -> 보안 -> IAM 역할 수정 를 클릭합니다.

- 방금 생성한 서비스명-EC2CodeDeployRole 을 선택 후 저장합니다.

  • EC2에 CodeDeploy Agent 설치
필수!!!
EC2에서 IAM 역할을 수정하시면 꼭 EC2 인스턴스를 재부팅을 해주셔야 합니다.
그래야 IAM 역할을 수정한 것이 정상적으로 동작합니다.

- EC2에 CodeDeploy 에서 실행하는 이벤트를 받아서 처리할 수 있는 Agent를 설치하도록 하겠습니다.

- EC2에 접속하여, AWS CLI 를 설치합니다.

// yum 최신버전으로 업데이트
sudo yum -y update

// aws-cli yum으로 설치
sudo yum install -y aws-cli

- cli 설치가 되셨다면, /home/ec2-user/로 이동 후 , AWS CLI에 access key , secret key 를 입력하겠습니다.

- 이때, 위의 키들은 2.AWS Code Deploy 연동하기에서 저장한 csv 파일에서 가지고 오도록 하겠습니다.

cd /home/ec2-user
sudo aws configure

- 입력이 되셨다면, CLI 의 기본설정은 완료되었습니다.

- EC2에 AWS Code Deploy CLI 를 설치하도록 하겠습니다.

- /home/ec2-user/ 에서 아래 명령어를 통해 설치를 진행합니다.

aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-northeast-2

- 설치가 끝나면 install 파일이 생성된 것을 확인하실 수 있습니다.

- 해당 파일에 실행 권한을 부여하도록 하겠습니다.

chmod +x install

- 이 install 파일을 이용해 AWS CodeDeploy Agent를 설치 & 실행합니다.

sudo ./install auto
참고!!!
만약, ruby 가 설치되지 않았다는 에러 메시지가 나올 경우.(ruby : No such file or directory)
sudo yum install ruby
로 루비를 설치 후 진행하시면 됩니다.

- 설치가 끝나면, 아래 명령어로 Agent가 동작 중인지 확인합니다.

sudo service codedeploy-agent status

- EC2 가 부팅되면 자동으로 AWS CodeDeploy Agent 가 실행될 수 있도록 /etc/init.d/ 에 쉘 스크립트를 생성하여 실행되도록 하겠습니다.

- 아래 명령어를 통해 파일을 생성하고, 코드를 추가합니다.

참고!!!
리눅스에서 /etc/init.d/ 에 스크립트 파일이 있으면 부팅시 자동으로 실행됩니다.
sudo vim /etc/init.d/codedeploy-startup.sh
#!/bin/bash

echo 'Starting codedeploy-agent'
sudo service codedeploy-agent start

- 작성후 :wq! 를 통해 저장하면, EC2에서의 AWS 설정이 끝나게 됩니다.

 

6. .travis.yml & appspec.yml 설정하기

- Travis CI와 AWS CodeDeploy의 상세한 설정은 프로젝트 내에 존재하는 .yml로 관리하도록 하겠습니다.

  • Travis CI 와 S3 연동

- CodeDeploy 는 저장 기능이 없기 때문에, Trvais CI 가 Build 한 결과물(jar파일)을 받아서 CodeDeploy가 가져갈 수 있도록 보관할 수 있는 공간이 필요합니다.

- 이때의 공간은 AWS S3를 이용하도록 하겠습니다.

- 프로젝트에 .travis.yml 파일에 아래의 코드를 추가합니다.

	...
script: "./gradlew clean build"

deploy:
  - provider: s3
    access_key_id: $AWS_ACCESS_KEY # Travis repo settings에 설정된 값
    secret_access_key: $AWS_SECRET_KEY # Travis repo settings에 설정된 값
    bucket: jaewonstudy-webservice-deploy # 생성한 S3 버킷
    region: ap-northeast-2
    skip_cleanup: true
    acl: public_read
    wait-until-deployed: true
    on:
      repo: jaewon/jaewon-study #Github 주소
      branch: main
      
notifications:
	...

- 코드에서 $AWS_ACCESS_KEY, $AWS_SECRET_KEY 는 이전에 저장했던 csv 파일의 access key 와 secret key 입니다.

- 해당 파일에 직접 하드코딩으로 할당해도 되지만, Github에 올릴 경우 외부에 노출되기 때문에, 보안에 문제를 일으킬 수 있습니다.

- 그렇기 때문에, Travis CI를 사용하여 해당 키를 관리하도록 하고, Travis CI 가 실행시점에 해당 값들을 사용할 수 있도록 지정하도록 하겠습니다.

- Travis CI로 가셔서 우측 상단의 More Options -> Settings을 클릭합니다.

-  Environment Variables 항목에 AWS_ACCESS_KEY, AWS_SECRET_KEY를 변수로 해서 csv파일에서 받은 키 값들을 등록합니다.

- 이제는 .travis.yml 에서 $AWS_ACCESS_KEY, $AWS_SECRET_KEY란 이름으로 사용할 수 있습니다.

- 설정한 값들이 정상적으로 연동되는지 테스트를 진행합니다.

- 수정한 내용이 있으므로, git에 commit & push 를 진행합니다.

- Travis CI 에서 Build가 진행되고, 정상적으로 성공이 된다면 아래와 같이 확인하실 수 있습니다.

참고!!!
만약, Build Failed 란 메시지와 함께 Opps, It looks like you tried ~~~ Bucket ~~ 이란 메시지가 보인다면
S3 버킷 생성 시 퍼블릭 액세스 차단 설정을 다시 진행해주시면 됩니다.
새 ACL을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단 을 해제합니다.

- Travis CI 에서 성공이 되었다면, AWS S3에서 지정한 버킷(jaewonstudy-webservice-deploy)에 build 결과가 전송된 것을 확인하실 수 있습니다.

- 매번 Travis CI에서 파일을 하나하나 복사하는건 복사시간이 오래 걸리므로, 프로젝트 폴더 채로 압축해서 S3로 전달하도록 설정을 변경하도록 하겠습니다.(.travis.yml)

	...
before_deploy:
  - zip -r springboot-webservice *
  - mkdir -p deploy
  - mv jaewon-study.zip deploy/jaewon-study.zip

deploy:
  - provider: s3
    ...
    local_dir: deploy # before_deploy에서 생성한 디렉토리
	...

- 코드 내용은 다음과 같습니다.

  1. before_deploy
    • zip -r jaewon-study <- 현재 위치의 모든 파일을 jaewon-study.zip  이름으로 압축(zip)
    • mkdir -p deploy <- deploy라는 디렉토리를 Travis CI가 실행중인 위치에서 생성
    • mv jaewon-study.zip deploy/jaewon-study.zip <- jaewon-study.zip 파일을 deploy/jaewon-study.zip로 이동
  2. deploy
    • local_dir: deploy <- 앞에서 생성한 deploy 디렉토리, 해당 디렉토리(deploy) 내용들만 S3로 전송

- 프로젝트가 수정되었으니, 다시 git에 commit & push를 진행하여 확인하도록 하겠습니다.

- Travis 에서 정상적으로 성공 후, S3 를 확인하면 jaewon-study.zip 파일이 생성된 것을 확인하실 수 있습니다.

- zip파일 이외에는 필요없으므로, 삭제하도록 하겠습니다.

 

  • Travis CI & S3 & CodeDeploy 연동하기

- Travis CI와 S3, CodeDeploy를 연동하여 EC2에 배포되도록 하겠습니다.

- AWS의 서비스 검색에서 CodeDeploy 를 선택 -> 애플리케이션 -> 애플리케이션 생성 을 클릭합니다.

- 다음과 같이 원하시는 이름과 EC2/온프레미스를 선택 후 애플리케이션 생성을 합니다.

- 생성 후 해당 애플리케이션 클릭 -> 배포 그룹 -> 배포 그룹 생성 을 클릭합니다.

- 원하시는 배포 그룹 이름을 입력하시고, 서비스 역할에는 이전에 생성한 서비스명-CodeDeployRole를 선택합니다.

- 배포 유형은 현재 위치를 선택합니다.

- 배포할 EC2를 선택합니다.

- 배포 구성은 아래와 같이 설정 후, 로드밸런서 활성화는 체크해재 합니다.

- 위와 같이 설정이 완료되었으면, 배포 그룹 생성을 클릭하여 생성합니다.

- EC2로 접속하여 S3에서 zip을 받아 올 디렉토리를 생성하도록 하겠습니다.

mkdir /home/ec2-user/app/travis
mkdir /home/ec2-user/app/travis/build

 

- Travis CI 가 정상적으로 Build가 된다면, S3에 zip 파일을 전달하고, 이 zip 파일은 위의 경로로 복사되어 압축을 풀게 될 것 입니다.

- AWS CodeDeploy 설정을 위해 프로젝트 내에 appspec.yml 파일을 생성하도록 하겠습니다.

version: 0.0
os: linux
files:
  - source:  /
    destination: /home/ec2-user/app/travis/build/
  1. version: 0.0
    • CodeDeploy 버전
    • 프로젝트 버전이 아니기 때문에 0.0 외에 다른 버전을 사용하시면 오류가 발생
  2. source
    • S3 버킷에서 복사할 파일의 위치
  3. destination
    • 복사해온 zip 파일을 압축 풀 위치를 지정

- TravisCI가 CodeDeploy도 실행시키도록 아래와 같이 .travis.yml 를 수정합니다.

  deploy:
  - provider: s3
  
  	...
  
  - provider: codedeploy
    access_key_id: $AWS_ACCESS_KEY # Travis repo settings에 설정된 값
    secret_access_key: $AWS_SECRET_KEY # Travis repo settings에 설정된 값
    bucket: jaewonstudy-webservice-deploy # S3 버킷
    key: jaewon-study.zip # S3 버킷에 저장된 jaewon-study.zip 파일을 EC2로 배포
    bundle_type: zip
    application: jaewon-study-webservice # 웹 콘솔에서 등록한 CodeDeploy 어플리케이션
    deployment_group: jaewon-study-webservice-group # 웹 콘솔에서 등록한 CodeDeploy 배포 그룹
    region: ap-northeast-2
    wait-until-deployed: true
    on:
      repo: jaewon0913/jaewon-study
      branch: main
  
  notifications:
  	...

- 전체 .travis.yml 파일의 코드는 아래와 같습니다.

language: java
jdk:
  - openjdk8

branches:
  only:
    - main

# Travis CI 서버의 Home
cache:
  directories:
    - '$HOME/.m2/repository'
    - '$HOME/.gradle'

# Permission Denied Error 때문에 추가
before_install:
  - chmod +x ./gradlew

script: "./gradlew clean build"

before_deploy:
  - zip -r jaewon-study *
  - mkdir -p deploy
  - mv jaewon-study.zip deploy/jaewon-study.zip

deploy:
  - provider: s3
    access_key_id: $AWS_ACCESS_KEY # Travis repo settings에 설정된 값
    secret_access_key: $AWS_SECRET_KEY # Travis repo settings에 설정된 값
    bucket: jaewonstudy-webservice-deploy # 생성한 S3 버킷
    region: ap-northeast-2
    skip_cleanup: true
    acl: public_read
    local_dir: deploy # before_deploy에서 생성한 디렉토리
    wait-until-deployed: true
    on:
      repo: jaewon0913/jaewon-study #Github 주소
      branch: main

  - provider: codedeploy
    access_key_id: $AWS_ACCESS_KEY # Travis repo settings에 설정된 값
    secret_access_key: $AWS_SECRET_KEY # Travis repo settings에 설정된 값
    bucket: jaewonstudy-webservice-deploy # S3 버킷
    key: jaewon-study.zip # S3 버킷에 저장된 jaewon-study.zip 파일을 EC2로 배포
    bundle_type: zip
    application: jaewon-study-webservice # 웹 콘솔에서 등록한 CodeDeploy 어플리케이션
    deployment_group: jaewon-study-webservice-group # 웹 콘솔에서 등록한 CodeDeploy 배포 그룹
    region: ap-northeast-2
    wait-until-deployed: true
    on:
      repo: jaewon0913/jaewon-study
      branch: main

# CI 실행 완료시 메일로 알람
notifications:
  email:
    recipients:
      - test.jaewon0913@gmail.com

- AWS CodeDeploy 까지 설정이 되었으니, 확인을 하도록 하겠습니다.

- 파일들이 수정되었으므로, git commit & push 를 진행합니다.(CodeDeploy 웹 콘솔에서도 배포 진행과정을 확인할 수 있습니다.)

- 만약 배포가 정상적으로 성공되었다면, EC2 에서 생성한 경로에 정상적으로 파일이 위치해있는지 확인합니다.

cd /home/ec2-user/app/travis/build    <-- 디렉토리 이동
ll      <-- 파일 목록 조회

-  Git Push만으로 EC2에 파일 전달까지 자동으로 진행되는 것을 확인되었습니다.

 

7. CodeDeploy로 스크립트 실행

- 파일들은 EC2에 정상적으로 전달되었지만, jar 파일을 실행하지 않았기 때문에, 수정한 부분이 확인은 안됩니다.

- 그렇기 때문에, 이 전달받은 파일의 jar 파일을 실행시키는 스크립트를 생성하겠습니다.

- jar 파일들을 저장할 디렉토리를 생성합니다.

mkdir /home/ec2-user/app/travis/jar

- jar 디렉토리에 옮겨진 application.jar를 실행시킬 배포스크립트 deploy.sh 파일을 하나 생성합니다.

vi /home/ec2-user/app/travis/deploy.sh

- 코드는 아래와 같습니다.

#!/bin/bash
  
REPOSITORY=/home/ec2-user/app/travis
PROJECT_NAME=jaewon-study

echo "> Build 파일 복사"

cp $REPOSITORY/build/build/libs/*.jar $REPOSITORY/jar

echo "> 현재 구동중인 애플리케이션 pid 확인"

CURRENT_PID=$(pgrep -fl jaewon-study | awk '{print $1}')

echo "현재 구동중인 어플리케이션 pid: $CURRENT_PID"

if [ -z "$CURRENT_PID" ]; then
    echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
    echo "> kill -15 $CURRENT_PID"
    kill -15 $CURRENT_PID
    sleep 5
fi

echo "> 새 어플리케이션 배포"

JAR_NAME=$(ls -tr $REPOSITORY/jar/*.jar | tail -n 1)

echo "> JAR Name: $JAR_NAME"

echo "> $JAR_NAME 에 실행권한 추가"

chmod +x $JAR_NAME

echo "> $JAR_NAME 실행"

nohup java -jar \
    -Dspring.config.location=classpath:/application.yml \
    $JAR_NAME > $REPOSITORY/nohup.out 2>&1 &

- 이전에 작성했던, 배포스크립트와는 git pull해서 직접 build했던 부분을 제거하고, 이미 받아놓은 build 파일을 복사해 실행하는것이 수정되었습니다.

- 해당 스크립트 정상적으로 동작하는지 테스트를 합니다.(아래 명령어로 이미 받아놓은 build 파일들로 실행이 잘되는지 테스트합니다.)

chmod +x deploy.sh    <-- deploy.sh 실행 권한 부여
/home/ec2-user/app/travis/deploy.sh    <-- deploy.sh 실행 

- 프로젝트는 실행이 되었지만 중간에 Permission denied 가 되었습니다.

- 파일의 권한의 대한 문제이므로 appspec.yml에 파일 권한을 주는 코드와 배포가 끝나면 deploy.sh 를 실행하도록 수정하겠습니다.

files:
	...

# 파일 권한 추가
permission:
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user

hooks:
  AfterInstall: # 배포가 끝나면 아래 명령어를 실행
    - location: execute-deploy.sh
      timeout: 180

- CodeDeploy에서 바로 deploy.sh를 실행시킬수 없기 때문에, 우회하는 방법으로 deploy.sh를 실행하는 execute-deploy.sh 파일을 실행하도록 생성하겠습니다.

- 기타 yml들과 마찬가지로 execute-deploy.sh 역시 프로젝트 내부에 생성해서 CodeDeploy가 실행할수 있도록 합니다.

- 코드는 아래와 같습니다.

#!/bin/bash
/home/ec2-user/app/travis/deploy.sh > /dev/null 2> /dev/null < /dev/null &

- deploy.sh 를 백그라운드로 실행한뒤, 로그나 기타 내용을 남기지 않도록 처리하였습니다.

- 프로젝트 전체 구조는 아래 그림과 같습니다.

- 실제 배포 확인을 위해, 간단하게 Ver.2 를 추가하여 확인하겠습니다.

- 마지막으로, 수정된 파일들이 존재하므로 git commit & push 를 진행하여 최종 테스트를 진행합니다.

- 정상적으로 배포가 되었습니다.


출처

- https://jojoldu.tistory.com/265?category=635883 

반응형
profile

JaeWon's Devlog

@Wonol

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!