앞서 AWS EC2, S3, CodeAgent까지는 설정을 완료했고, 마지막으로 github workflow와 appspec.yml 그리고 실행한 script 파일을 완성하여 CICD 파이프라인 구축을 마쳐보겠습니다.
1. appspec.yml
version: 0.0
os: linux
files:
- source: / # Repository(S3)
destination: /home/ubuntu/app # EC2 instance
permission:
- object: /home/ubuntu/app/
owner: ubuntu
group: ubuntu
mode: 755
hooks:
ApplicationStart:
- location: deploy.sh
timeout: 60
runas: root
appspec.yml은 위와 같이 작성해줍니다.
(appspec.yml과 script 파일은 프로젝트 루트 경로에 작성해두면 됩니다.)
자세히 살펴보면,
version/os
0.0, linux로 고정해도 됩니다.
files
파일을 불러올 위치와 저장할 위치를 명시하면 됩니다.
source: Repository(S3)에 저장된 위치
destination: EC2 instance에서 저장할 위치
permission
권한 설정
hooks:
배포 프로세스의 각 단계에서 수행할 스크립트 파일을 명시해줍니다.
프로젝트를 빌드하고 실행하는 것을 목표로 하므로, ApplicationStart 시점에 deploy.sh를 수행하는 것만 명시해줍니다.
복잡한 프로세스에서는 단계별로 수행할 과정이 조금 더 세분화될 것입니다.
2. deploy.sh
실제 빌드 시 수행할 명령어를 작성한 스크립트입니다.
(스크립트는 github action과 aws code deploy를 이용하여 spring boot 배포하기(4) - 해보고나면 별거아니다 (isntyet.github.io를 참고했습니다!)
REPOSITORY=/home/ubuntu/app
cd $REPOSITORY
JAR_NAME=$(ls $REPOSITORY/build/libs/ | grep '.jar' | tail -n 1)
JAR_PATH=$REPOSITORY/build/libs/$JAR_NAME
CURRENT_PID=$(pgrep java)
if [ -z $CURRENT_PID ]
then
echo ">Nothing working."
else
sudo kill -9 $CURRENT_PID
fi
sudo nohup java -jar $JAR_PATH &
(1) .jar 파일 위치 확인
(2) 기존 프로세스가 있다면 종료
(3) .jar 파일 실행
크게 위와 같은 3부분으로 나눠져 있습니다.
쉘 스크립트 문법이 까다로우니 익숙하지 않다면 오류가 나지 않게 주의하셔야 합니다!
커맨드로 할때는 당연한데 파일로 작성하다보니 할당 시 띄어쓰기 하면 안되는걸 생각못해서 헤맸었네요😂 ( a = 100 (x) a=100 (o))
3. GitHub Actions(Workflow)
이제 마지막입니다!
name: deploy
on:
push:
branches: ["master"]
jobs:
deploy:
runs-on: ubuntu-20.04
environment: CICD
env:
APPLICATION: ${{secrets.APPLICATION}}
APPLICATION_TEST: ${{secrets.APPLICATION_TEST}}
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Create 'resoureces' dir for test
run : mkdir ./src/test/resources
- name: Create application.yml(test)
run : touch ./src/test/resources/application.yml
- name: Copy secretes to application.yml(test)
run : echo "$APPLICATION_TEST" > ./src/test/resources/application.yml
- name: Copy secrets to application.yml(build)
run: echo "$APPLICATION" > ./src/main/resources/application.yml
- name : Grand permission
run : chmod +x gradlew
- name : Build
run: ./gradlew clean build
- name : Make zip
run : zip -qq -r ./$GITHUB_SHA.zip .
- name: Configure AWS crendentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{secrets.AWS_ACCESS_KEY_ID}}
aws-secret-access-key: ${{secrets.AWS_SECRET_ACCESS_KEY}}
aws-region: ${{secrets.AWS_REGION}}
- name: Upload to S3
run : aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://${{secrets.S3_BUCKET_NAME}}/$GITHUB_SHA.zip
- name: Deploy with application
run : aws deploy create-deployment --application-name cicd-application --deployment-group cicd-group --s3-location bucket=${{secrets.S3_BUCKET_NAME}},key=$GITHUB_SHA.zip,bundleType=zip
조금 길어졌는데, CI 때 확인했던 내용은 제쳐두고 중요한 내용만 확인하겠습니다.
https://lback.tistory.com/19 -> GitHub Actions에 관한 내용은 이 글을 참고하시면 됩니다.
Make zip 부터가 CD를 위한 steps 입니다.
Make zip :
S3에 업로드 하기 위해 프로젝트를 압축합니다.
$GITHUB_SHA는 각각의 커밋마다 할당되는 값으로 생각하시면 됩니다.
Configure AWS credentials :
S3와 CodeDeploy에 접근하기 위한 IAM 사용자를 미리 만들어두었습니다.
그때 발급했던 액세스 키를 통해 접근 권한을 얻습니다.
노출되면 안되니, application.yml을 관리했던 것처럼 secrets로 접근하면 됩니다!
(※이 부분이 이해가 안가실때도 https://lback.tistory.com/19 참고하시면 됩니다)
Upload to S3
S3에 앞서 압축한 zip 파일을 업로드 해줍니다.
aws s3 cp --region [region] [이동할 파일] [s3://버킷 이름/저장할 이름]
Deploy with application
마지막으로, CodeDeploy Application 배포 커맨드를 호출해줍니다.
aws deploy create-deployment
--application-name [deploy application name]
--deployment-group [배포 그룹 명]
--s3-location bucket=[프로젝트가 업로드 된 s3 버킷 이름], key=[프로젝트 파일 이름], bundleType=[압축 형태]
더 자세한 옵션은
https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment.html 를 참고하시면 됩니다.
4. 결과확인
현재 서버에 접속하면 나오는 화면입니다. 여기서 인사문구를 바꾸도록 수정해보겠습니다.
nice to meet you를 hello로 바꾸니, master로 push 이벤트가 발생하면 수행되는 workflow가 실행됩니다.
직접 실행파일을 변경하지 않았는데, 잘 변경된 것을 확인할 수 있습니다!
이상으로 GitHub Actions와 AWS Code Deploy를 활용한 CI/CD 파이프라인 구축을 마치겠습니다.
'개발' 카테고리의 다른 글
[CI/CD] (4) CD 구축하기 - AWS (0) | 2023.05.04 |
---|---|
[CI/CD] (3) 설정 총정리 (0) | 2023.05.04 |
[CI/CD] (2) CD 흐름 파악하기(AWS Code Deploy) (0) | 2023.05.04 |
[CI/CD] (1) Github actions로 CI 구축하기 (1) | 2023.04.20 |
[Git] 하나의 저장소에 여러 프로젝트 추가하기(subtree) (0) | 2023.04.12 |