각종 후기/우아한테크코스

[우아한 테크코스 3기] LEVEL 3 회고 (163일차)

제이온 (Jayon) 2021. 7. 14.

안녕하세요? 제이온입니다.

 

오늘은 오전에 면접을 갔다 오고 오후에는 포비와 면담한 이후에 CD 작업을 마무리했습니다.

 

 

깃허브 액션을 활용하여 CD 구현하기

오늘은 내일도 면접이 있고 기록할 내용들이 좀 있어서 구현 위주로만 이야기를 하겠습니다. 어제 예고한 대로 오늘은 자동 배포를 위한 코드를 작성하기위해 제리와 합의를 좀 보았습니다. 우선, 제리가 전체적인 인프라 구축을 맡아주었는데, 하나의 웹 서버를 두고 2대의 웹 애플리케이션 서버를 두고, 뒷 단에는 DB용 서버로 이루어졌습니다. 저는 2대의 WAS에 대해 스프링 부트 애플리케이션을 배포만 하면 되었고, 프로젝트 내의 docker-compose가 있었기 떄문에 'docker-compose up --build -d' 명령어만 수행하면 끝이었습니다.

 

 

# This workflow will build a Java project with Gradle
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle

name: Java CI with Gradle

on:
  push:
    branches: [ develop/be ]
  pull_request:
    branches: [ develop/be ]

jobs:
  build:

    runs-on: self-hosted

    steps:
    - name: Checkout code 
      uses: actions/checkout@v2
      with:
        token: ${{ secrets.MY_REPO_PAT }}
        submodules: recursive
        
    - name: Set up JDK 11
      uses: actions/setup-java@v2
      with:
        java-version: '11'
        distribution: 'adopt'
        
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
      working-directory: ./backend
      
    - name: Build with Gradle
      run: ./gradlew clean build
      working-directory: ./backend
      
    - name: Copy built project
      if: success()
      uses: appleboy/scp-action@master
      env:
        GIT_USERNAME: ${{ secrets.GIT_USERNAME }}
        GIT_PASSWORD: ${{ secrets.GIT_PASSWORD }}
      with:
        host: ${{ secrets.EC2_HOST }}, ${{ secrets.EC2_HOST_2 }}
        username: ${{ secrets.EC2_USERNAME }}
        key: ${{ secrets.EC2_PRIVATE_KEY }}
        envs: GIT_USERNAME, GIT_PASSWORD
        source: '/home/ubuntu/actions-runner/darass_jayon_build_work/2021-darass/2021-darass'
        target: '/home/ubuntu'
        strip_components: 1
      
    - name: AWS EC2에 ssh로 접속해서 scripts 실행시키기
      if: success()
      uses: appleboy/ssh-action@master
      env:
        GIT_USERNAME: ${{ secrets.GIT_USERNAME }}
        GIT_PASSWORD: ${{ secrets.GIT_PASSWORD }}
      with:
        host: ${{ secrets.EC2_HOST }}, ${{ secrets.EC2_HOST_2 }}
        username: ${{ secrets.EC2_USERNAME }}
        key: ${{ secrets.EC2_PRIVATE_KEY }}
        envs: GIT_USERNAME, GIT_PASSWORD
        script: |
          cd /home/ubuntu
          sudo rm -rf 2021-darass
          mv workspace 2021-darass
          cd 2021-darass/backend
          docker-compose up --build -d

 

 

아무래도 인프라가 확실히 잘 되어 있다 보니, CI/CD를 하는 제 입장에서 굉장히 편했습니다. 오늘도 갓제리를 외쳐 봅니다.

 

 

깃허브 액션과 슬랙을 연동하여 알림 기능 구현

현재까지 CI/CD가 잘 동작하지만, 깃허브를 직접 들어가야 CI/CD가 성공했는지 실패했는지 판단할 수 있습니다. 이러한 번거로움을 해소하기 위하여 깃허브 액션과 슬랙을 연동하여 알림 기능을 구현했습니다. 워낙 유명한 작업이라 그런지 양질의 포스팅이 많았습니다. 저는 해당 포스팅을 따라하였습니다.

 

 

# This workflow will build a Java project with Gradle
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle

name: Java CI with Gradle

on:
  push:
    branches: [ develop/be ]
  pull_request:
    branches: [ develop/be ]

jobs:
  build:

    runs-on: self-hosted

    steps:
    - name: Checkout code 
      uses: actions/checkout@v2
      with:
        token: ${{ secrets.MY_REPO_PAT }}
        submodules: recursive
        
    - name: Set up JDK 11
      uses: actions/setup-java@v2
      with:
        java-version: '11'
        distribution: 'adopt'
        
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
      working-directory: ./backend
      
    - name: Build with Gradle
      run: ./gradlew clean build
      working-directory: ./backend
      
    - name: Copy built project
      if: success()
      uses: appleboy/scp-action@master
      env:
        GIT_USERNAME: ${{ secrets.GIT_USERNAME }}
        GIT_PASSWORD: ${{ secrets.GIT_PASSWORD }}
      with:
        host: ${{ secrets.EC2_HOST }}, ${{ secrets.EC2_HOST_2 }}
        username: ${{ secrets.EC2_USERNAME }}
        key: ${{ secrets.EC2_PRIVATE_KEY }}
        envs: GIT_USERNAME, GIT_PASSWORD
        source: '/home/ubuntu/actions-runner/darass_jayon_build_work/2021-darass/2021-darass'
        target: '/home/ubuntu'
        strip_components: 1
      
    - name: AWS EC2에 ssh로 접속해서 scripts 실행시키기
      if: success()
      uses: appleboy/ssh-action@master
      env:
        GIT_USERNAME: ${{ secrets.GIT_USERNAME }}
        GIT_PASSWORD: ${{ secrets.GIT_PASSWORD }}
      with:
        host: ${{ secrets.EC2_HOST }}, ${{ secrets.EC2_HOST_2 }}
        username: ${{ secrets.EC2_USERNAME }}
        key: ${{ secrets.EC2_PRIVATE_KEY }}
        envs: GIT_USERNAME, GIT_PASSWORD
        script: |
          cd /home/ubuntu
          sudo rm -rf 2021-darass
          mv workspace 2021-darass
          cd 2021-darass/backend
          docker-compose up --build -d
    - name: build result to slack
      uses: 8398a7/action-slack@v3
      with:
        status: ${{ job.status }}
        fields: repo, message, commit, author, action, eventName, ref, workflow, job, took
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}

 

 

위와 같이 작성하고 해당 workflow를 작동시키면 아래와 같이 알림이 옵니다.

 

 

 

 

정리

내일도 면접이 있다 보니 오늘은 여기서 구현을 마무리하려고 합니다. 해당 작업을 완료하고 보니 의문이 하나 생겼습니다. 우리는 feature 브랜치를 생성하고 develop/be에 pr을 날린 후, 문제가 없다면 merge를 하는 방식인데, pr할 때도 CD, merge할 때도 CD를 하여 총 2번 배포를 한다는 것이었습니다. 그래서 내일은 pr할 때는 CI만, merge할 때 비로소 CD를 수행하도록 리팩토링할 예정입니다.

댓글

추천 글