끄적끄적
[CI/CD] travis + aws codedeploy 사용하기 본문
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
'개발' 카테고리의 다른 글
[jpa] 2차 캐시 사용하기(ehcache) (0) | 2020.04.03 |
---|---|
[java] 람다 Functional Interface (0) | 2020.03.12 |
[jpa] querydsl BooleanBuilder 사용하기 (0) | 2020.03.09 |
[spring] filter에서 예외응답하기 (0) | 2020.03.09 |
[jpa] @Entity에 default 값을 설정하기 (0) | 2020.03.09 |
Comments