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

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

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

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

 

오늘은 주말동안 진행한 작업과 오늘 하루 한 일에 대해 기록하려고 합니다.

 

 

깃허브 액션을 활용한 CI 구현

CI는 지속적 통합으로, 코드를 원격 저장소에 push하였을 때 빌드와 테스트를 거쳐서 문제가 없으면 코드를 통합하는 행위를 말합니다. 사실 개발을 혼자 한다면 CI가 없어도 그렇게 문제가 되지 않겠지만, 여러 개발자가 하나의 브랜치에 push하는 상황이라면 골치 아픈 일이 생깁니다. 예를 들어, A라는 개발자가 테스트가 잘 돌아가는 걸 보고 원격 저장소에 push를 하고, B라는 개발자도 마찬가지로 테스트가 잘 돌아가서 원격 저장소에 push하였습니다. 하지만, 막상 통합하고 봤더니 모종의 이유로 해당 프로젝트의 테스트가 실패할 수가 있습니다. 이러한 상황에서 CI를 적용한다면 개발자가 push할 때마다 매번 자동으로 빌드와 테스트를 진행하므로 오류를 잡아낼 수 있습니다.

 

우리 팀은 여러 CI 도구 중에서 깃허브 액션을 채택했습니다. 그 이유는 깃허브 자체가 우리에게 친숙하므로 해당 플랫폼에서 제공하는 도구를 쓰자는 것이었죠. 무언가 낯선 플랫폼에서 학습하기보다는 더 쉽게 익히지 않을까라는 생각이었죠.

 

그리고 깃허브 액션은 기본적으로 CI를 위한 틀을 제공합니다.

 

 

 

 

아주 많은 샘플이 존재하고, 우리는 Gradle 전용 스프링 부트 애플리케이션을 개발하고 있으므로 해당 workflow를 선택했습니다.

 

 

 

 

뭔진 모르겠지만, 위와 같은 명령어들이 쫙 뜹니다. 이를 조금 자세히 보겠습니다.

 

 

# 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: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - name: Checkout source code
      uses: actions/checkout@v2
    - 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
    - name: Build with Gradle
      run: ./gradlew build

 

 

이해를 돕기 위하여 'actions/checkout@v2' 부분에 네이밍을 달아 주었습니다. 해당 workflow는 '현재 저장소에 있는 소스 코드를 가져와서 JDK 11 버전을 설치한 후 빌드를 진행한다.' 라는 흐름으로 진행됩니다. 어때요, 간단하죠?

 

이 상황에서 우리 팀의 사정에 맞게 코드를 덧붙였습니다. 현재, 우리 팀은 설정 파일의 보안을 위해서 서브 모듈을 사용하고 있으며, 디렉토리 구조가 조금 다릅니다.

 

 

[Root dir]
README.md
backend

[backend dir]
src
gradlew
... 등등

 

 

디렉토리 구조가 바로 .gradlew이 있는 것이 아니라 backend를 한 단계 더 거쳐야해서 깃허브 액션 코드를 수정해 주어야 합니다.

 

 

# 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: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - name: Checkout source code
      uses: actions/checkout@v2
    - name: Set up JDK 11
      uses: actions/setup-java@v2
      with:
        java-version: '11'
        distribution: 'adopt'
    - name: Cd backend
      run: cd backend
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
    - name: Build with Gradle
      run: ./gradlew build

 

 

가장 먼저 떠올릴 수 있는 방법은 단순히 'cd backend'를 통해 해당 디렉토리로 이동한 다음 빌드를 수행하는 것입니다. 아쉽게도 제가 깃허브 액션 개념이 얕아서 자세한 이유는 모르겠지만, 이 방식으로는 빌드를 할 수 없습니다. 실행해 보면, gradlew 파일을 찾을 수 없다고 합니다. 그래서 다음과 같은 코드를 작성해야 합니다.

 

 

# 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: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - name: Checkout source code 
      uses: actions/checkout@v2
        
    - 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 build
      working-directory: ./backend

 

 

이렇게 특정 명령어를 실행할 디렉토리를 명시해 주면 됩니다. 이 방법 외에 다른 방법을 아시는 분은 댓글 부탁드립니다.

 

 

다음은 서브 모듈입니다. 위와 같은 코드를 수행하면 설정 파일을 찾을 수 없어서 에러가 발생할 수 있습니다. 그래서 깃허브 액션 측에서 우리의 서브 모듈을 찾을 수 있도록 접근 권한을 주어야 합니다.

 

이곳에 들어가서 PAT를 발급받고, 아래와 같이 workflow에 체크를 해 줍니다.

 

 

 

 

여기서 발급 받은 토큰을 저장소의 시크릿에 등록해 줍니다. 저는 MY_REPO_PAT라는 이름으로 시크릿을 등록하였습니다.

 

 

# 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: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:

    runs-on: ubuntu-latest

    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 build
      working-directory: ./backend

 

 

그리고 소스 코드를 가져오는 과정에서 위와 같이 with 명령어를 통해 서브 모듈에 있는 설정 파일을 함께 가져오도록 만들면 됩니다.

 

 

코로나 검사를 받다.

오전에 평택에서 서울로 올라가던 도중 제이슨에게서 좋지 않은 공지를 받게 되었습니다.

 

 

 

 

잘 안 보일 수도 있는데, 요약하자면 우테코 건물 고층 부에서 근무하시던 직원 분이 코로나 확진을 받게 되어 동선이 겹칠 수 있는 우테코 크루 전원 코로나 검사를 하라는 것이었죠.

 

그래서 잠실에 있던 제리와 만나서 암사역 선별 진료소로 갔습니다. 역시 코로나가 심해서 그런지 사람이 별로 없다고 여긴 암사역 인근 마저 사람이 굉장히 많았습니다. 거의 뭐 놀이 기구 기다리는 급이었고, 약 1시간 동안 땡볕에서 기다리면서 간신히 검사를 받았습니다. 검사 자체는 다행히 이번에는 코가 별로 안아파서 문제는 없었으나, 체력을 다 빼 버려서 저녁 8시가 되어서야 개발을 할 수 있었습니다.

 

아무쪼록 내일 음성 판정이 나길 기대합니다.

 

 

정리

집에 들어오고 나서는 깃허브 액션을 활용한 CD를 구현해 보고 있습니다. ssh를 활용하여 EC2 인스턴스에 접근하는 과정까지 성공하였고, 이후에는 어떻게 배포를 할지 고민 중에 있습니다. 최대한 내일까지 끝내버리려고 합니다.

댓글

추천 글