Merge pull request #170 from Farm-On/feat/estimate #114
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 | |
| run: ./gradlew clean build | |
| # 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 파일을 EC2 인스턴스에 복사 | |
| - name: copy docker-compose to EC2 server | |
| uses: appleboy/[email protected] | |
| with: | |
| host: ${{ secrets.HOST }} | |
| username: ubuntu | |
| key: ${{ secrets.KEY }} | |
| source: docker-compose.yml | |
| 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: | | |
| # Docker Login | |
| sudo docker login -u "${{ secrets.DOCKER_USERNAME }}" -p "${{ secrets.DOCKER_PASSWORD }}" | |
| # Stop and Remove All Running Containers | |
| if [ -n "$(sudo docker ps -aq)" ]; then | |
| sudo docker rm -f $(sudo docker ps -aq) | |
| fi | |
| # Pull Latest Docker Image | |
| sudo docker pull "${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest" | |
| echo "REDIS_PASSWORD=${{ secrets.REDIS_PASSWORD }}" > /home/ubuntu/.env | |
| echo "DOCKER_USERNAME=${{ secrets.DOCKER_USERNAME }}" >> /home/ubuntu/.env | |
| echo "DOCKER_REPO=${{ secrets.DOCKER_REPO }}" >> /home/ubuntu/.env | |
| echo "RABBITMQ_USER=${{ secrets.RABBITMQ_USER }}" >> /home/ubuntu/.env | |
| echo "RABBITMQ_PASSWORD=${{ secrets.RABBITMQ_PASSWORD }}" >> /home/ubuntu/.env | |
| # 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 [ "$(sudo docker ps -q)" ]; then | |
| for container_id in $(sudo docker ps -q); do | |
| sudo docker network connect app-network $container_id || echo "Container $container_id is already connected to app-network" | |
| done | |
| fi | |
| # Clean Up Unused Docker Images | |
| sudo docker image prune -f |