no space left error 자동 fix #81
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: CI/CD Pipeline | |
on: | |
push: | |
branches: | |
- main # main 브랜치에 푸시될 때 실행 | |
jobs: | |
build-and-deploy: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout Code | |
uses: actions/checkout@v3 | |
- name: Set Docker Permissions | |
run: | | |
sudo chmod 666 /var/run/docker.sock | |
- name: Generate .env.prod | |
run: | | |
echo "DB_HOST=${{ secrets.DB_HOST }}" >> .env.prod | |
echo "DB_PASSWORD=${{ secrets.DB_PASSWORD }}" >> .env.prod | |
echo "DB_PORT=${{ secrets.DB_PORT }}" >> .env.prod | |
echo "DB_DATABASE=${{ secrets.DB_DATABASE }}" >> .env.prod | |
echo "SECRET_FOR_JWT=${{ secrets.SECRET_FOR_JWT }}" >> .env.prod | |
echo "SERVER_IP=${{ secrets.SERVER_IP }}" >> .env.prod | |
echo "AWS_S3_ACCESS_KEY_ID=${{ secrets.AWS_S3_ACCESS_KEY_ID }}" >> .env.prod | |
echo "AWS_S3_SECRET_ACCESS_KEY=${{ secrets.AWS_S3_SECRET_ACCESS_KEY }}" >> .env.prod | |
echo "AWS_S3_BUCKET_NAME=${{ secrets.AWS_S3_BUCKET_NAME }}" >> .env.prod | |
echo "AWS_DEFAULT_REGION=${{ secrets.AWS_DEFAULT_REGION }}" >> .env.prod | |
- name: Get Public IP | |
id: ip | |
uses: haythem/[email protected] | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v2 | |
- name: Log in to Docker Hub | |
uses: docker/login-action@v2 | |
with: | |
username: ${{ secrets.DOCKER_USERNAME }} | |
password: ${{ secrets.DOCKER_PASSWORD }} | |
- name: Get Version | |
id: version | |
run: echo "VERSION=1.0.$(date +%s)" >> $GITHUB_ENV | |
- name: Build and Push Docker Image | |
run: | | |
docker build -t odumag99/snuvote:${{ env.VERSION }} . | |
docker tag odumag99/snuvote:${{ env.VERSION }} odumag99/snuvote:latest | |
docker push odumag99/snuvote:${{ env.VERSION }} | |
docker push odumag99/snuvote:latest | |
- name: Configure AWS credentials | |
uses: aws-actions/configure-aws-credentials@v4 | |
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: Add GitHub Actions IP | |
run: | | |
aws ec2 authorize-security-group-ingress \ | |
--group-id ${{ secrets.SECURITY_GROUP_ID }} \ | |
--protocol tcp \ | |
--port 22 \ | |
--cidr ${{ steps.ip.outputs.ipv4 }}/32 || true | |
- name: Copy .env.prod to EC2 | |
run: | | |
echo "${{ secrets.SERVER_SSH_KEY }}" > ssh_key | |
chmod 600 ssh_key | |
scp -i ssh_key -o StrictHostKeyChecking=no .env.prod ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_IP }}:/home/${{ secrets.SERVER_USER }}/.env.prod | |
- name: Deploy to EC2 | |
run: | | |
ssh -i ssh_key -o StrictHostKeyChecking=no ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_IP }} " | |
# 첫 번째 docker pull 시도 | |
echo 'Pulling Docker image...' | |
sudo docker pull odumag99/snuvote:${{ env.VERSION }} 2>&1 | tee pull.log | |
# docker pull의 exit code 확인 | |
if [ \"\${PIPESTATUS[0]}\" -ne 0 ]; then | |
echo 'Docker pull failed! Checking the error...' | |
# no space left on device 오류인 경우 | |
if grep -q 'no space left on device' pull.log; then | |
echo 'Disk full detected! Removing old images and retrying...' | |
# 기존 Docker 이미지 삭제 후 다시 pull 시도 | |
sudo docker rmi \$(sudo docker images -q) | |
sudo docker pull odumag99/snuvote:${{ env.VERSION }} | |
# 두 번째 pull도 실패하면 배포 중단 | |
if [ \"\${PIPESTATUS[0]}\" -ne 0 ]; then | |
echo 'Second Docker pull failed! Stopping deployment.' | |
exit 1 | |
fi | |
# 그 외 오류인 경우 배포 중단 | |
else | |
echo 'Unexpected Docker pull error detected! Stopping deployment.' | |
exit 1 | |
fi | |
fi | |
if [ \"\$(sudo docker ps -aq -f name=snuvote)\" ]; then | |
sudo docker stop snuvote | |
sudo docker rm snuvote | |
fi && | |
sudo docker run -d --name snuvote -p 8000:8000 \ | |
--env-file /home/${{ secrets.SERVER_USER }}/.env.prod \ | |
--mount type=bind,source=/home/ubuntu/snuvote_images,target=/src/images \ | |
odumag99/snuvote:${{ env.VERSION }}" | |
- name: Remove GitHub Actions IP | |
run: | | |
aws ec2 revoke-security-group-ingress \ | |
--group-id ${{ secrets.SECURITY_GROUP_ID }} \ | |
--protocol tcp \ | |
--port 22 \ | |
--cidr ${{ steps.ip.outputs.ipv4 }}/32 || true |