DevJong12

[Picasso] 프로젝트 CI / CD 본문

프로젝트/Picasso

[Picasso] 프로젝트 CI / CD

Jong12 2023. 10. 2. 18:26
728x90

목차

    해당 프로젝트의 경우 CI 와 CD를 전부 Github Actions를 활용하였다. 
    CI와 CD에 사용된 Github WorkFlows를 작성해 보고자 한다.

    먼저 사전에 도움이 되라고, 내 프로젝트의 아키텍쳐이미지를 남겨논다.


    1) CI

    먼저 CI가 해당 프로젝트에서 왜 필요했을 까?부터 정의를 해보고자 한다.
    필자의 프로젝트는 6명이 팀으로 있었고, 대부분이 Git에 미숙한 상황이었다. 하지만 Merge는 안전하게 진행해야 한다고 판단을 내렸으며 이에 따라, Build가 되지 않고 파일이 증발하는등의 위험한 PR을 솎아 내야 한다는 문제가 있었다. 

    해당 문제를 해결하고자 CI를 도입하였고, Build가 되지 않으면 CodeReview를 Approve하지 않고 Merge를 진행하지 않는 방법을 채택하였다.

    CI의 작업은 단순하다. 그냥 gradlew build를 통해 build가능 여부 검증만 진행하였다.

     

    소스코드

    더보기
    name: Picasso Build
    
    # CI의 Target은 Feat, Dev브랜치로 PR이 타겟팅이 되는 경우를 생각하였다.
    on:
      pull_request:
        branches: [ "dev", "feat" ]
        types: [ opened, synchronize, reopened ]
    
    jobs:
      build:
        name: Picasso Build
        runs-on: ubuntu-latest
    
        steps:
          - name: Github Action Version Checkout
            uses: actions/checkout@v2
            with:
              fetch-depth: 0
    
    		# Spring Boot3의 사용에 의한 JDK17
          - name: Set up JDK 17
            uses: actions/setup-java@v1
            with:
              java-version: 17
              distribution: 'zulu'
    
          - name: Grant execute permission for gradlew
            run: chmod +x gradlew
    
          - name: Test with Gradle
            run: ./gradlew test
    
          - name: Build with Gradle
            run: ./gradlew build
    
          - name: Cache Gradle packages
            uses: actions/cache@v1
            with:
              path: ~/.gradle/caches
              key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
              restore-keys: ${{ runner.os }}-gradle

    2) CD

    Proxy 👉 Application Server의 설정에 소요가 많이 들었다.
    기본적으로 필자의 서버는 PEM파일 (RSA)를 반드시 필요로 하였다는 점 필요하다.

    SCP그리고 SSH의 과정에서는 Proxy옵션은 실제 Proxy Server에서 설정한 옵션들, Application Server들에서는 Application설정에 필요한 포트와 정보들을 변수로 기입하였다.

    HOST는 IP
    PORT는 SSH의 설정 포트번호
    KEY는 PEM파일의 내용들 등등으로 설정하였다.

    소스코드

    더보기
    name: Picasso CI/CD
    
    # Target은 Dev, Main브랜치로 Push Event가 발생한 경우로 상정하였다.
    on:
      push:
        branches: [ "dev", "main" ]
    
    # 권한은 읽는것 이상 불필요하다고 생각했다.
    permissions:
      contents: read
    
    jobs:
      build:
        name: Picasso CI/CD
        runs-on: ubuntu-latest
    
        steps:
          - name: Github Action Version Checkout
            uses: actions/checkout@v2
    
          - name: Setup jdk-17
            uses: actions/setup-java@main
            with:
              java-version: 17
              distribution: 'zulu'
    
          - name: Grant execute permission for gradlew
            run: chmod +x ./gradlew
    
          - name: Test with Gradle
            run: ./gradlew test
    
          - name: Build with Gradle
            run: ./gradlew build
    
         # Build를 진행한 파일을 편하게 찾기 위해 파일을 이동해줬다. cd로 이동해도 상관은 없다.
          - name: Move App.jar
            run : mv ./Api/build/libs/app.jar ./
    
          # Proxy Server Connect with SSH
          # scp로 proxy server에 build된 Jar 파일을 보낸다
          # jar 파일을 실행한다. 이 때 storage에 대한 VM Option을 추가하여 실행한다.
          - name: Transfer BuildFile Git Actions To ApplicationServer
            uses: appleboy/scp-action@master
            with:
              proxy_host: ${{ secrets.NCP_PROXY_HOST }}
              proxy_username: root
              proxy_key: ${{ secrets.NCP_PEM }}
              proxy_port: 2222
              host: ${{ secrets.NCP_APP_HOST }}
              username: root
              key: ${{ secrets.NCP_PEM }}
              port: 22
              source: app.jar
              target: /var/app
    
          - name: Run Application
            uses: appleboy/ssh-action@master
            with:
              proxy_host: ${{ secrets.NCP_PROXY_HOST }}
              proxy_username: root
              proxy_key: ${{ secrets.NCP_PEM }}
              proxy_port: 2222
              host: ${{ secrets.NCP_APP_HOST }}
              username: root
              key: ${{ secrets.NCP_PEM }}
              port: 22
              script: |
                cd /var/app
                ./app_run.sh​
    728x90
    Comments