Merge pull request #149 from Money-Touch/chore/#148 #76
This file contains hidden or 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: 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 |