Node.js Koa 배포할 때 사용했던 액션파일

name: Docker CI/CD

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:

  build:

    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Make env
        run: |
          touch ./.env
          echo "${{ secrets.ENV }}" > ./.env
          echo .env
        shell: sh

      - name: Create firesbase key json
        id: create-json
        uses: jsdaniell/[email protected]
        with:
          name: "firebase-key.json"
          json: ${{ secrets.FIREBASE }}
          dir: 'src/'

      - name: Login to DockerHub
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Docker meta
        id: meta
        uses: docker/metadata-action@v4
        with:
          images: |
            ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}
          tags: |
            type=ref,event=branch
            type=semver,pattern={{version}}

      - name: Build and push
        uses: docker/build-push-action@v4
        with:
          context: .
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta.outputs.tags }}

      - name: Deploy
        uses: appleboy/[email protected]
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.AWS_USERNAME }}
          password: ${{ secrets.AWS_PASSWORD }}
          script: |
            docker stop server
            docker rm server
            docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:main
            docker run -d -p 80:8080 --name server ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:main
            docker image prune -f

스프링 배포

name: Java CI with Maven

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Set up JDK 11
        uses: actions/setup-java@v3
        with:
          java-version: '11'
          distribution: 'temurin'
          cache: maven

      - name: make application.properties
        run: |
          cd ./doormate/src/main/resources
          touch ./application.properties
          echo "${{ secrets.PROPERTIES }}" > ./application.properties
        shell: bash

      - name: Make firebase folder
        run: |
          cd doormate/src/main/resources/
          mkdir firebase
        shell: bash

      - name: Create firebase key json
        id: create-json
        uses: jsdaniell/[email protected]
        with:
          name: "firebase_service_key.json"
          json: ${{ secrets.FIREBASE }}
          dir: 'doormate/src/main/resources/firebase/'

      - name: Build with Maven
        run: |
          cd ./doormate
          ls
          mvn -B package --file pom.xml

      # Docker Hub에 이미지 push
      - name: Docker build & push
        run: |
          docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
          docker build -t ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }} --platform linux/amd64 .
          docker push ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}

      # deploy
      - name: Deploy
        uses: appleboy/[email protected]
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.AWS_USERNAME }}
          password: ${{ secrets.AWS_PASSWORD }}
          script: |
            docker stop server
            docker rm server
            docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}
            docker run -d -p 80:8080 -e TZ=Asia/Seoul --name server ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}
            docker image prune -f

사용할 CI/CD 스크립트

CI

name: BE CI
on:
  pull_request:
    branches: [main, dev]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Code
        uses: actions/checkout@v2
      - name: Setup Node.js
        uses: actions/setup-node@v2
        with:
          node-version: 20.x
      - name: Install Dependencies
        run: npm install
      - name: Make .env
        run: |
          cd BE
          touch ./.env
          echo "${{ secrets.BE_ENV }}" > ./.env
      - name: Make Cors Config
        run: |
          cd src/config
          touch ./cors.secure.ts
          echo "${{ secrets.BE_CONFIG }}" > ./cors.secure.ts
        shell: sh
      - name: Run Tests
        run: npm test

CD

name: BE CD

on:
  push:
    branches:
      - dev

jobs:
  build:
    runs-on: self-hosted
    steps:
      - name: Stop Server
        run: sudo docker stop ${{secrets.BE_DOCKER_CONTAINER}}
      - name: Delete Old Docker Container
        run: sudo docker rm ${{secrets.BE_DOCKER_CONTAINER}}
      - name: Pull Docker Image
        run: sudo docker pull ${{secrets.BE_DOCKER_USERNAME}}/${{secrets.BE_DOCKER_REPO}}:latest
      - name: Build and Push Docker Image
        run: |
          sudo docker build -t ${{secrets.BE_DOCKER_USERNAME}}/${{secrets.BE_DOCKER_REPO}}:latest --platform linux/amd64 .
          sudo docker push ${{secrets.BE_DOCKER_USERNAME}}/${{secrets.BE_DOCKER_REPO}}:latest
      - name: Run Docker Container
        run: sudo docker run -d -p 8080:8080 -e TZ=Asia/Seoul --name ${{secrets.BE_DOCKER_CONTAINER}} ${{secrets.BE_DOCKER_USERNAME}}/${{secrets.BE_DOCKER_REPO}}