사실 NGINX 무중단 배포 전에 이 글을 작성해야했는데 어쩌다보니 이걸 더 늦게 작성하게 된다.
NGINX 무중단 배포
https://velog.io/@dirn0568/NGINX-%EB%AC%B4%EC%A4%91%EB%8B%A8-%EB%B0%B0%ED%8F%AC
우선 나의 프로젝트에 .github/workflows/파일명.yml을 만들어주고 깃에 푸쉬해준다
이렇게 하면 깃에서 알아서 파일명.yml을 찾아서 Actions에서 만들어준다.
그 다음은 IAM 에서 사용자를 등록해준다.
권한정책은 저렇게 4개만 추가해줘도 된다.
그리고 IAM을 통해 생긴 ACCESS_KEY와 SECRET_ACCESS_KEY를 Github Settings에 등록해 준다.(나는 CLI 방식으로 만들었다)
S3를 생성해준다.
CI 과정이 끝났다.
이제 CD과정을 해보자
새로운 역할을 하나 만들어 준다
정책과 신뢰관계까지 만들어주고
방금 생성한 역할을 ec2의 IAM 역할 수정에 넣어준다
CodeDeploy에 필요한 파일을 설치하자
ubuntu 22.04 루비 버전이 안맞아서 오류가 날 수 있었던 것으로 기억함 ruby를 2.x대로 바꿔줘야함
$cd /tmp
$wget https://aws-codedeploy-us-east-1.s3.us-east-1.amazonaws.com/releases/codedeploy-agent_1.3.2-1902_all.deb
$mkdir codedeploy-agent_1.3.2-1902_ubuntu22
$dpkg-deb -R codedeploy-agent_1.3.2-1902_all.deb codedeploy-agent_1.3.2-1902_ubuntu22
$sed 's/Depends:.*/Depends:ruby3.0/' -i ./codedeploy-agent_1.3.2-1902_ubuntu22/DEBIAN/control
$dpkg-deb -b codedeploy-agent_1.3.2-1902_ubuntu22/
$sudo dpkg -i codedeploy-agent_1.3.2-1902_ubuntu22.deb
$systemctl list-units --type=service | grep codedeploy
$sudo service codedeploy-agent status (잘작동하는지 확인)
그리고 CodeDeploy의 설정을 끝마춰준다. Name-EC2(이름)을 설정해주고 중요한 것은 로드밸런싱을 해제해야 한다는 것이다.
그리고 3개의 파일들을 작성해서 프로젝트에 올려준다.
# learn-github.action.yml
name: server CI/CD
#
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
env:
S3_BUCKET_NAME: 버켓 이름
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
distribution: 'temurin'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
shell: bash
- name: Build with Gradle
run: ./gradlew build
shell: bash
- name: Make zip file
run: zip -r ./파일명.zip .
shell: bash
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./파일명.zip s3://$S3_BUCKET_NAME/
- name: Code Deploy
run: aws deploy create-deployment --application-name 애플리케이션 이름 --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name 애플리케이션 배포 그룹 이름 --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=파일 이름.zip
# appspec.yml
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/app
permissions:
- object: /
pattern: "**"
owner: ubuntu
group: ubuntu
mode: 755
hooks:
ApplicationStart:
- location: deploy.sh
timeout: 60
runas: root
# deploy.sh
#!/usr/bin/env bash
JAR_REPOSITORY=/home/ubuntu/app/build/libs
REPOSITORY=/home/ubuntu/app/
JAR_NAME=$(ls -tr $JAR_REPOSITORY/빌드.gradle jar파일명(-0.0.1-SNAPSHOT.jar) | tail -n 1)
echo "> 현재 구동 중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f $JAR_NAME)
echo "현재 구동 중인 애플리케이션 pid: $CURRENT_PID"
if [ -z "$CURRENT_PID" ]; then
echo "현재 구동 중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -15 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
fi
echo "> 새 애플리케이션 배포"
echo "> JAR NAME: $JAR_NAME"
echo "> $JAR_NAME 에 실행권한 추가"
chmod +x $JAR_NAME
echo "> $JAR_NAME 실행"
nohup java -jar $JAR_NAME >> $REPOSITORY/nohup.out 2>&1 &
appspec.yml과 deploy.sh는 프로젝트 제일 상단(src 패키지와 같은 위치)에 위치시켜준다.