build : deploy 수정 #107
Workflow file for this run
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: 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 | |