<aside>

</aside>

๐Ÿ“Šย AWS CodePipeline๊ณผ GitHub Actions

AWS CodePipeline Github Actions
ํŽธ์˜์„ฑ IAM ๊ถŒํ•œ, ์—ฐ๊ฒฐ ๋ฆฌ์†Œ์Šค ์„ค์ • ๋“ฑ ๋ณต์žกํ•œ ์ ˆ์ฐจ๊ฐ€ ํ•„์š” GitHub ์ €์žฅ์†Œ ๋‚ด์—์„œ ๋ฐ”๋กœ CI/CD ์„ค์ • ๊ฐ€๋Šฅ
์‹คํ–‰ ๋ฐฉ์‹ Stage ๋‹จ์œ„ ์ˆœ์ฐจ์  ์‹คํ–‰ Job ๋‹จ์œ„ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ
๊ด€๋ฆฌ AWS์—์„œ ๋”ฐ๋กœ ๊ด€๋ฆฌ GitHub์—์„œ ์ค‘์•™ ์ง‘์ค‘ํ˜• ๊ด€๋ฆฌ
ํ™•์žฅ์„ฑ AWS ์„œ๋น„์Šค ์—ฐ๋™์— ์œ ๋ฆฌ AWS ์™ธ์˜ ์™ธ๋ถ€ ํด๋ผ์šฐ๋“œ ์—ฐ๋™์— ์œ ๋ฆฌ
๋น„์šฉ ๊ตฌ์กฐ ์‚ฌ์šฉ๋Ÿ‰ ๊ธฐ๋ฐ˜ ๊ณผ๊ธˆ ๋Œ€๋ถ€๋ถ„ ๋ฌด๋ฃŒ, ๊ณ ์„ฑ๋Šฅ์šฉ ์‚ฌ์šฉ ์‹œ ๊ณผ๊ธˆ

GitHub Actions๋กœ ์„ ์ •ํ•œ ์ด์œ 

๐Ÿ› ๏ธ ๊ตฌ์กฐ (Workflow)

์•„ํ‚คํ…์ณ ๊ตฌ์กฐ.png

โš™๏ธ GitHub Actions๋กœ CICD ๊ตฌ์ถ•

๐Ÿ“‘ Code Deploy ํŒŒ์ผ

  1. GitHub Actions Workflow ํŠธ๋ฆฌ๊ฑฐ ์„ค์ •

    1. main ๋ธŒ๋žœ์น˜์— PR์ด ์™„๋ฃŒ๋  ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰
    on:
      pull_request:
        branches: [ main ]
        types: [closed]
    
  2. ๋นŒ๋“œ ์‹œ, ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑ

    1. Redis์™€ Elasticsearch
    2. health-cmd ๋กœ ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ™•์ธ
    jobs:
      build:
        runs-on: ubuntu-latest
    
        services:
    	    # Redis ์„œ๋น„์Šค ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
          redis:
            image: redis:7.2
            ports:
              - 6379:6379
            options: >-
              --health-cmd "redis-cli ping"     # Redis๊ฐ€ ์‘๋‹ตํ•˜๋Š”์ง€ ํ—ฌ์Šค์ฒดํฌ
              --health-interval 10s             # 10์ดˆ๋งˆ๋‹ค ํ—ฌ์Šค์ฒดํฌ
              --health-timeout 5s               # 5์ดˆ ์ด์ƒ ์‘๋‹ต ์—†์œผ๋ฉด ์‹คํŒจ
              --health-retries 5                # 5๋ฒˆ ์—ฐ์† ์‹คํŒจ ์‹œ unhealthy ํŒ์ •
              
          # Elasticsearch ์„œ๋น„์Šค ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰    
          elasticsearch:
            image: docker.elastic.co/elasticsearch/elasticsearch:8.13.4
            env:
              discovery.type: single-node
              xpack.security.enabled: "false"     # ํ…Œ์ŠคํŠธ ๊ฐ„ํŽธํ™”
              ES_JAVA_OPTS: "-Xms512m -Xmx512m"   # JVM ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ
            ports: [ "9200:9200" ]                # ํ˜ธ์ŠคํŠธ <-> ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ ๋งคํ•‘
            options: >-
              --health-cmd "curl -fsS <http://localhost:9200/_cluster/health> || exit 1"
              --health-interval 10s   # 10์ดˆ๋งˆ๋‹ค ํ—ฌ์Šค์ฒดํฌ
              --health-timeout 5s     # 5์ดˆ ์ด์ƒ ์‘๋‹ต ์—†์œผ๋ฉด ์‹คํŒจ
              --health-retries 10     # 10๋ฒˆ ์—ฐ์† ์‹คํŒจ ์‹œ unhealthy ํŒ์ •
    
  3. CI ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ

    1. ์†Œ์Šค์ฝ”๋“œ ์ฒดํฌ ์•„์›ƒ โ†’ JDK ์„ค์น˜ โ†’ ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ โ†’ JAR ํŒŒ์ผ ์—…๋กœ๋“œ
        steps:
    	    # ์ €์žฅ์†Œ์˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์›Œํฌํ”Œ๋กœ์šฐ ์‹คํ–‰ ํ™˜๊ฒฝ์œผ๋กœ ์ฒดํฌ์•„์›ƒ
          - name: Checkout source code
            uses: actions/checkout@v4
    
    			# JDK 17์„ ์„ค์น˜
          - name: Set up JDK
            uses: actions/setup-java@v4
            with:
              distribution: 'temurin'
              java-version: '17'
    
    			# Linuxํ™˜๊ฒฝ์—์„œ gradlew ์‹คํ–‰ ๊ถŒํ•œ ๋ถ€์—ฌ
          - name: Grant permission to gradlew
            run: chmod +x ./gradlew
    
    			# Gradle ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ ์‹คํ–‰
          - name: Run tests
            run: ./gradlew build --no-daemon
    
    			# ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์„ GitHub Actions ์•„ํ‹ฐํŒฉํŠธ๋กœ ์—…๋กœ๋“œ
          - name: Upload JAR
            uses: actions/upload-artifact@v4
            with:
              name: app
              path: build/libs/*.jar
    
  4. ๋ฐฐํฌ ์ž๋™ํ™”

    1. ๋นŒ๋“œ๋œ JAR ํŒŒ์ผ์„ EC2 ์„œ๋ฒ„์— ์ž๋™์œผ๋กœ ๋ฐฐํฌ
      deploy:
        needs: build
    
        runs-on: ubuntu-latest
    
        steps:
    		  # ๋นŒ๋“œ ๋‹จ๊ณ„์—์„œ ์—…๋กœ๋“œํ–ˆ๋˜ JAR ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๋‹ค์šด๋กœ๋“œ
          - name: Download JAR
            uses: actions/download-artifact@v4
            with:
              name: app
    
    			# EC2 ์„œ๋ฒ„๋กœ JAR ํŒŒ์ผ ์ „์†ก
          - name: Deploy to EC2
            uses: appleboy/scp-action@master
            with:
              host: ${{ secrets.EC2_HOST }}
              username: ubuntu
              key: ${{ secrets.EC2_KEY }}
              source: "*.jar"
              target: "/home/ubuntu/app"
    
    			# EC2 ์„œ๋ฒ„์—์„œ ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰
          - name: Run app via SSH
            uses: appleboy/ssh-action@master
            with:
              host: ${{ secrets.EC2_HOST }}
              username: ubuntu
              key: ${{ secrets.EC2_KEY }}
              script: |
                bash /home/ubuntu/app/run-deploy.sh