Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

끄적끄적

[CI/CD] travis + aws codedeploy 사용하기 본문

개발

[CI/CD] travis + aws codedeploy 사용하기

으아아아앜 2020. 3. 9. 19:03

 

EC2 instance

  • 역할(AmazonEC2RoleforAWSCodeDeploy)을 만들고 인스턴스에 연결한다.

  • 인스턴스에 접속하여 CodeDeploy 에이전트 설치
aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install .--region ap-northeast-2

chmod +x ./install
sudo ./install auto

sudo service codedeploy-agent status #정상적으로 실행되고 있는지 확인

#만약 설치중 /usr/bin/env:ruby:No such file or directory 에러 발생
sudo yum install ruby

 

S3

  • bucket을 생성(안전한 사용을 위해 퍼블릭 엑세스를 차단)

 

CodeDeploy

  • 역할(AWSCodeDeployRole)을 생성
  • 어플리케이션 만든다. ( EC2/온프레미스 옵션)
  • 배포 그룹을 생성한다.
    - 앞에서 생성한 역할을 연결
    - 배포할 서비스가 2대 이상이라면 "블루/그린" 아니라면 현재 위치를 선택
    - 배포 설정 : CodeDeployDefault.AllAtOnce
                     //일정 비율(50%, 25% 등)로 나눠서 배포하는 것이 아닌 한번에 배포하는 것을 의미

 

Travis

  • IAM 사용자 생성 : codedeploy, s3에 대한 full권한을 갖고 있는 사용자를 생성한다.
  • 빌드할 레포지토리를 activity 설정을 하고, setting의 환경변수에 앞에서 생성한 사용자에 대한
    aws access key, aws secret key를 추가한다. //설정파일에서 사용할 예정

 

 

설정 파일 작성

  • GitHub Repository의 루트 경로에 아래 파일들을 작성한다.

 

.travis.yml 

  • travis가 어떤 동작을 해야할지 작성 되어있는 설정파일
  • 핵심은 script 를 통해 테스트 및 빌드를 하고 deploy를 통해 빌드 결과물을 전달하는 것
  • 레포지토리의 디렉토리 구조에따라 유연하게 작성하면된다.
language: java
jdk:
  - openjdk8


branches:
  only:
    - master


before_install:
  - chmod +x ./MyBoard_v1/mvnw

## master 브랜치에 푸시되었을때 수행하는 명령어
script:
  - echo "> start build"
  - cd ./MyBoard_v1
  - mvn package -Dmaven.test.skip=true
  - cd ..

before_deploy:
    - zip -r myboardv1-webservice *
    - mkdir -p deploy
    - mv myboardv1-webservice.zip deploy/myboardv1-webservice.zip

deploy:
    - provider: s3
      access_key_id: $AWS_ACCESS_KEY #travis에서 환경변수로 주입됨
      secret_access_key: $AWS_SECRET_KEY
      bucket: myboardv1-build
      region: ap-northeast-2
      skip_cleanup: true
      acl: private #zip파일 접근을 private으로
      local_dir: deploy #before_deploy에서 생성한 디렉토리
      wait-until-deployed: true

    - provider: codedeploy
      access_key_id: $AWS_ACCESS_KEY
      secret_access_key: $AWS_SECRET_KEY
      bucket: myboardv1-build
      key: myboardv1-webservice.zip
      bundle_type: zip
      application: myboardv1-webservice
      deployment_group: myboardv1-webservice-group
      region: ap-northeast-2
      wait-until-deployed: true

notifications:
  email:
    recipients:
      - xxxxx@gmail.com #배포결과를 알릴 이메일

 

 

appspec.yml

  • ec2의 aws codedeploy가 어떤 동작을 해야할지 작성 되어있는 설정파일
  • 핵심은 s3의 빌드 결과물을 어느 곳에 다운받아 압축해제 할것인지 설정
  • 빌드결과물을 어떻게 실행시킬것인지 hooks에서 관련 쉘스크립트를 명시
version: 0.0
os: linux
files:
  - source: /
    destination: /home/ec2-user/app/MyBoard_v1/zip/
    overwrite: yes

permissions:
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user

hooks:
  ApplicationStart:
    - location: auto-deploy.sh
      timeout: 60
      runas: ec2-user #ec2-user의 권한으로 deploy.sh를 실행하게됨

 

auto-deploy.sh

  • codedeploy가 배포를 위해 실행하는 쉘 스크립트
REPOSITORY=/home/ec2-user/app/MyBoard_v1
ZIP=zip
PROJECT_NAME=MyBoard_v1
WAR_NAME=portfolio-0.0.1-SNAPSHOT.war


echo "현재 구동중인 애플리케이션 pid 확인"
#CURRENT_PID=$(pgrep -f ${PROJECT_NAME}*.war)
CURRENT_PID=$(pgrep -f java)

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

echo "> application run"
cp -rf $REPOSITORY/$PROJECT_NAME/src/main/resources/properties/private $REPOSITORY/$ZIP/$PROJECT_NAME/src/main/properties
cd $REPOSITORY/$ZIP/$PROJECT_NAME
chmod +x ./mvnw
./mvnw clean package -Dmaven.test.skip=true
cd $REPOSITORY/$PROJECT_NAME
chmod +x ../$ZIP/$PROJECT_NAME/target/$WAR_NAME
nohup java -jar ../$ZIP/$PROJECT_NAME/target/$WAR_NAME > $REPOSITORY/nohup.out 2>&1 &
echo "> fin"

 

※ war 또는 jar 를 실행시킬때 2>&1 &를 하지 않으면 codedeploy가 timeout으로 배포 실패가 됨 

※ 만약 배포도중 오류가 발생했을때는 아래 명령어를 통해 로그확인가능

vim /var/log/aws/codedeploy-agent/codedeploy-agent.log
vim /opt/codedeploy-agent/deployment-root/{deployment-group-ID}/{deployment-ID}/logs/scripts.log
#deployment-group-ID,deployment-ID 는 codedeploy 콘솔 참고

 

참고: https://gamoo12.tistory.com/208

 

 

Comments