Skip to content

Merge pull request #149 from Money-Touch/chore/#148 #76

Merge pull request #149 from Money-Touch/chore/#148

Merge pull request #149 from Money-Touch/chore/#148 #76

Workflow file for this run

name: Java CI/CD with Gradle and Docker
# event trigger
on:
push:
branches:
- ci/cd
- develop
- main
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
## jdk setting
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
# 환경별 yml 파일 생성 - dev
- name: Make application-dev.yml
run: |
if [ ! -d "src/main/resources" ]; then
mkdir -p src/main/resources
fi
echo "${{ secrets.APPLICATION_DEV_YML }}" > src/main/resources/application-dev.yml
shell: bash
# gradle caching - 빌드 시간 향상
- name: Gradle Caching
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
# gradlew 실행 권한 부여
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# Gradle 빌드
- name: Build Gradle (without test)
run: ./gradlew bootJar -x test
# Dockerfile을 통해 이미지를 빌드하고, 이를 docker repo로 push
- name: Docker build & push to docker repo
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker build -f Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }} .
docker push ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest
# # docker-compose 파일과 nginx.conf 파일을 EC2 인스턴스에 복사
# - name: Copy docker-compose.yml & nginx.conf to EC2 server
# uses: appleboy/[email protected]
# with:
# host: ${{ secrets.HOST }}
# username: ubuntu
# key: ${{ secrets.KEY }}
# source: "docker-compose.yml,nginx.conf"
# target: /home/ubuntu/
deploy:
needs: build # build 작업이 완료된 후 실행
runs-on: ubuntu-latest
steps:
# appleboy/ssh-action@master 액션을 사용하여 지정한 서버에 ssh로 접속하고, script를 실행
# script의 내용은 도커의 기존 프로세스들을 제거하고, docker repo로부터 방금 위에서 push한 내용을 pull 받아 실행
- name: Deploy to server
uses: appleboy/ssh-action@master
id: deploy
with:
host: ${{ secrets.HOST }}
username: ubuntu
key: ${{ secrets.KEY }}
script: |
# EC2 인스턴스 접속 후 작업 디렉토리 이동
cd /home/ubuntu
# Docker Login
sudo docker login -u "${{ secrets.DOCKER_USERNAME }}" -p "${{ secrets.DOCKER_PASSWORD }}"
# Stop and Remove Only spring-app container
spring_container=$(sudo docker ps -aqf "name=spring-app")
if [ -n "$spring_container" ]; then
sudo docker rm -f "$spring_container"
fi
# Pull Latest Docker Image
sudo docker pull "${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest"
# .env 환경변수 추가 (기존에 덮어씌우는 방식)
cat <<EOF > /home/ubuntu/.env
DOCKER_USERNAME=${{ secrets.DOCKER_USERNAME }}
DOCKER_REPO=${{ secrets.DOCKER_REPO }}
REDIS_PASSWORD=${{ secrets.REDIS_PASSWORD }}
EOF
# Start Containers with Docker Compose
if [ -f /home/ubuntu/docker-compose.yml ]; then
docker-compose up -d
else
echo "docker-compose.yml not found. Exiting."
exit 1
fi
# Connect All Running Containers to app-network if not connected
if [ "$(sudo docker ps -q)" ]; then
for container_id in $(sudo docker ps -q); do
if ! sudo docker inspect "$container_id" | grep -q '"app-network"'; then
sudo docker network connect app-network "$container_id" || echo "Container $container_id already connected or failed"
fi
done
fi
# Clean Up Unused Docker Images
sudo docker image prune -f