Skip to content

build : deploy 수정 #107

build : deploy 수정

build : deploy 수정 #107

Workflow file for this run

name: Docker Build and Push
on:
push:
branches:
- main
- GUTTOK-92
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up JDK 21
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '21'
- name: Grant execute permission for Gradle
run: chmod +x gradlew
- name: Generate .env file
run: |
cat <<EOF > .env
MYSQL_URL=jdbc:mysql://mysql:3306/${{ secrets.DOCKER_MYSQL_DATABASE }}
MYSQL_USERNAME=${{ secrets.DOCKER_MYSQL_USERNAME }}
MYSQL_PASSWORD=${{ secrets.DOCKER_MYSQL_PASSWORD }}
REDIS_HOST=${{ secrets.REDIS_HOST }}
REDIS_PORT=${{ secrets.REDIS_PORT }}
REDIS_PASSWORD=${{ secrets.REDIS_PASSWORD }}
AWS_REGION=${{ secrets.AWS_REGION }}
AWS_ACCESS_KEY=${{ secrets.AWS_ACCESS_KEY }}
AWS_SECRET_KEY=${{ secrets.AWS_SECRET_KEY }}
DOCKER_MYSQL_PASSWORD=${{ secrets.DOCKER_MYSQL_PASSWORD }}
DOCKER_MYSQL_DATABASE=${{ secrets.DOCKER_MYSQL_DATABASE }}
DOCKER_MYSQL_CHARSET=${{ secrets.DOCKER_MYSQL_CHARSET }}
DOCKER_MYSQL_COLLATION=${{ secrets.DOCKER_MYSQL_COLLATION }}
DOCKER_REDIS_PASSWORD=${{ secrets.DOCKER_REDIS_PASSWORD }}
DOCKER_TZ=${{ secrets.DOCKER_TZ }}
EOF
shell: bash
- name: Run tests with Gradle
run: ./gradlew clean bootjar -Duser.language=ko -Duser.country=KR
Docker-build-and-push:
runs-on: ubuntu-latest
needs: test
#if: github.ref == 'refs/heads/main'
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up JDK 21
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '21'
- name: Grant execute permission for Gradle
run: chmod +x gradlew
- name: Generate .env file
run: |
cat <<EOF > .env
MYSQL_URL=jdbc:mysql://mysql:3306/${{ secrets.DOCKER_MYSQL_DATABASE }}
MYSQL_USERNAME=${{ secrets.DOCKER_MYSQL_USERNAME }}
MYSQL_PASSWORD=${{ secrets.DOCKER_MYSQL_PASSWORD }}
REDIS_HOST=${{ secrets.REDIS_HOST }}
REDIS_PORT=${{ secrets.REDIS_PORT }}
REDIS_PASSWORD=${{ secrets.REDIS_PASSWORD }}
AWS_REGION=${{ secrets.AWS_REGION }}
AWS_ACCESS_KEY=${{ secrets.AWS_ACCESS_KEY }}
AWS_SECRET_KEY=${{ secrets.AWS_SECRET_KEY }}
DOCKER_MYSQL_PASSWORD=${{ secrets.DOCKER_MYSQL_PASSWORD }}
DOCKER_MYSQL_DATABASE=${{ secrets.DOCKER_MYSQL_DATABASE }}
DOCKER_MYSQL_CHARSET=${{ secrets.DOCKER_MYSQL_CHARSET }}
DOCKER_MYSQL_COLLATION=${{ secrets.DOCKER_MYSQL_COLLATION }}
DOCKER_REDIS_PASSWORD=${{ secrets.DOCKER_REDIS_PASSWORD }}
DOCKER_TZ=${{ secrets.DOCKER_TZ }}
EOF
- name: Build Local Docker Image
run: docker build -f Dockerfile.local -t guttok_app:local .
- name: Build AWS Docker Image
run: docker build -f Dockerfile.aws -t guttok_app:aws .
- name: Tag and Push Local Image to Docker Hub
run: |
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKERHUB_USERNAME }}" --password-stdin
export IMAGE_NAME="${{ secrets.DOCKERHUB_USERNAME }}/guttok_app:latest-local"
docker tag guttok_app:local $IMAGE_NAME
docker push $IMAGE_NAME
- name: Tag and Push AWS Image to Docker Hub
run: |
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKERHUB_USERNAME }}" --password-stdin
export IMAGE_NAME="${{ secrets.DOCKERHUB_USERNAME }}/guttok_app:latest-aws"
docker tag guttok_app:aws $IMAGE_NAME
docker push $IMAGE_NAME
aws-pull:
runs-on: ubuntu-latest
needs: Docker-build-and-push
# if: github.ref == 'refs/heads/main'
steps:
- name: Deploy to AWS EC2
uses: appleboy/[email protected]
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_SSH_KEY }}
port: ${{ secrets.EC2_SSH_PORT }}
script: |
# 1. 앱 디렉터리 생성
echo "Creating app directory..."
mkdir -p /home/${{ secrets.EC2_USER }}/guttok_app/
# 2. EC2에 .env 파일 생성
echo "Generating .env file on EC2..."
cat <<EOF > /home/${{ secrets.EC2_USER }}/guttok_app/.env
AWS_MYSQL_URL=${{ secrets.AWS_MYSQL_URL }}
MYSQL_USERNAME=${{ secrets.AWS_MYSQL_USERNAME }}
MYSQL_PASSWORD=${{ secrets.AWS_MYSQL_PASSWORD }}
REDIS_HOST=${{ secrets.AWS_REDIS_HOST }}
REDIS_PORT=${{ secrets.AWS_REDIS_PORT }}
AWS_REGION=${{ secrets.AWS_REGION }}
AWS_ACCESS_KEY=${{ secrets.AWS_ACCESS_KEY }}
AWS_SECRET_KEY=${{ secrets.AWS_SECRET_KEY }}
DOCKER_MYSQL_PASSWORD=${{ secrets.DOCKER_MYSQL_PASSWORD }}
DOCKER_MYSQL_DATABASE=${{ secrets.DOCKER_MYSQL_DATABASE }}
DOCKER_MYSQL_CHARSET=${{ secrets.DOCKER_MYSQL_CHARSET }}
DOCKER_MYSQL_COLLATION=${{ secrets.DOCKER_MYSQL_COLLATION }}
DOCKER_REDIS_PASSWORD=${{ secrets.DOCKER_REDIS_PASSWORD }}
DOCKER_TZ=${{ secrets.DOCKER_TZ }}
EOF
# 3. .env 파일에 대한 권한 설정
echo "Setting permissions for .env file..."
chmod 600 /home/${{ secrets.EC2_USER }}/guttok_app/.env
# 4. Docker Hub 로그인 및 최신 이미지 Pull
echo "Pulling latest Docker image from DockerHub..."
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKERHUB_USERNAME }}" --password-stdin
docker pull ${{ secrets.DOCKERHUB_USERNAME }}/guttok_app:latest-aws
# 5. 기존 컨테이너 중지 및 삭제
echo "Stopping and removing old container..."
docker stop guttok_app || true
docker rm guttok_app || true
# 6. 새 컨테이너 실행
echo "Running new container..."
docker run -d --name guttok_app \
--env-file /home/${{ secrets.EC2_USER }}/guttok_app/.env \
-p 8080:8080 \
${{ secrets.DOCKERHUB_USERNAME }}/guttok_app:latest-aws