ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Github Actions로 CI/CD 구축하기
    Git 2023. 5. 13. 00:01
    728x90

    [1] Github Actions로 CI 구축하기

    [2] Github Actions로 CD 구축하기

     

     

    Github Action이란?

    코드저장소로 유명한 Github에서 제공하는 CI(Continuous Integration, 지속통합)와 CD(Continuous Deployment, 지속배피)를 위해 추가된 서비스입니다.

     

    다른 서드파티를 사용하는 것보다 관리해야 할 포인트가 줄어드는 이점을 가질 수 있습니다.

    쉽게 생각해서 github이 호스팅 하는 컴퓨터 한 대를 대여하여 CI/CD를 편하게 할 수 있습니다.

     

    Github에서 코드 저장소를 무료로 만들 수 있으며 코드 저장소에 어떤 이벤트(event)가 발생했을 때 특정 작업이 일어나게 하거나 주기적으로 어떤 작업들(workflows)을 반복해서 실행시킬 수 있습니다.

     

    Event의 예시

    • 특정 브랜치로 Push
    • 특정 브랜치로 PR
    • 특정 시간대에 반복(cron)

     

    WorkFlows

    workflows는 쉽게 하나 이상의 작업들을 자동화해 놓은 과정입니다.

    .gibhub/workflows 폴더 아래에 위치한 yaml 파일로 설정되며, 하나의 코드 저장소에는 여러 개의 워크플로우를 가질 수 있습니다.

     

    예를 들어 코드 저장소의  브랜치에 push 이벤트가 발생할 때마다 워크플로우를 실행하기 위해서는 example.yml이 다음과 같이 설정되어야 합니다.

    on:
      pull_request: #pull request가 발생할 때
        branches: 
          - main #main branch에
    
    jobs: #하위를 수행하라
      # 생략

    on 속성을 통해서 해당 워크플로우가 언제 실행되는지를 정의합니다.

     

    Jobs

    Github Actions에서 작업(Job)이란 독립된 가상 머신 또는 컨테이너에서 돌아가는 하나의 처리 단위를 의미합니다.

    하나의 워크플로우는 적어도 하나의 작업을 가져야 합니다.

     

    runs-on

    Jobs의 하위로 job을 둘 때는 독립된 가상 머신 또는 컨테이너에서 수행됩니다.

    이에 따라 필수적으로 runs-on 속성을 통해 리눅스나 윈도우즈와 같은 실행 환경을 지정해주어야 합니다.

     

    예를 들어 우분투의 최신 실행 환경에서 작업을 실행하고 싶다면 다음과 같이 설정합니다.

    on:
      pull_request: #pull request가 발생할 때
        branches: 
          - main #main branch에
    
    jobs: #여러개의 job을 가질 수 있다.
      my-job-name1: #job 이름은 my-job-name1
        runs-on: ubuntu-latest #우분투 최신환경에서 실행하라

     

    Steps

    하나의 작업을 일반적으로 여러 단계의 명령을 순차적으로 실행합니다.

    각 작업(job)이 하나 이상의 단계(step)로 모델링 됩니다.

     

    커맨드나 스크립트를 실행할 때는 run 속성을 사용합니다.

    액션을 사용할 때는 uses 속성을 사용합니다.

     

    uses 속성

    on:
      pull_request: #pull request가 발생할 때
        branches: 
          - main #main branch에
    
    jobs: #여러개의 job을 가질 수 있다.
      my-job-name1: #job 이름은 my-job-name1
        runs-on: ubuntu-latest #우분투 최신환경에서 실행하라
        steps:
          - name: Set up Repository Code
            uses: actions/checkout@v2
            
          - name: Set up JDK 11
            uses: actions/setup-java@v1
            with:
              java-version: 11

    checkout은 현재 작업 중이 리포지토리의 코드를 Action 실행 중에 사용할 수 있도록 작업 디렉토리에 복제하는 역할을 수행합니다.

     

    actions/set-up-java@v1은 현재 워크플로우에서 Java 개발 환경을 설정하는 데 사용됩니다.

    uses는 actions/로 시작하는 액션 이름으로 시작하며 @는 액션의 버전을 뜻합니다.

    여기서 actions/set-up-java@v1는 다른 리포지토리에 작성된 액션을 뜻합니다.

    with 옵션을 통해 JDK 버전을 11로 지정합니다.

     

    run 속성

    on:
      pull_request: #pull request가 발생할 때
        branches: 
          - main #main branch에
    
    jobs: #여러개의 job을 가질 수 있다.
      my-job-name1: #job 이름은 my-job-name1
        runs-on: ubuntu-latest #우분투 최신환경에서 실행하라
        steps:
          - name: Set up Repository Code
            uses: actions/checkout@v2
            
          - name: Set up JDK 11
            uses: actions/setup-java@v1
            with:
              java-version: 11
    
          - name: Grant execute permission for gradlew
            run: chmod +x gradlew
    
          - name: Test with Gradle
            run: ./gradlew --info test

    run 속성을 통해 커맨드를 입력합니다.

    gradlew에 실행권한을 부여하고 테스트를 수행합니다.

     

    이제 main branch에 pull request가 발생할 때 우분투 최신환경에서 JDK 11을 설치하고 gradlew test를 수행하는 workflow가 완성되었습니다.

     

    만약 PR이 생성되었을 때 build(test 포함)를 수행하다가 실패가 나면 github action이 fail 되게 됩니다.

    추후에 github 브랜치 설정을 통해 GithubAction에 실패하면 Merge 자체가 불가능하게 막아 버릴 수도 있습니다.

     

    실전으로 Github Actions 구축하기

    Git Repository -> Actions-> set up a workflow yourself

     자동으로./gitgub/workflows 디렉터리에 main.yml이라는 이름으로 생성됩니다.

    이름은 마음대로 변경할 수 있습니다.

    저는 build.yml으로 이름을 변경했습니다.

     

    이제 위에 작성했던 내용들 채워 넣습니다.

    on:
      pull_request: #pull request가 발생할 때
        branches: 
          - main #main branch에
    
    jobs: #여러개의 job을 가질 수 있다.
      my-job-name1: #job 이름은 my-job-name1
        runs-on: ubuntu-latest #우분투 최신환경에서 실행하라
        steps:
          - name: Set up Repository Code
            uses: actions/checkout@v2
        
          - name: Set up JDK 11
            uses: actions/setup-java@v1
            with:
              java-version: 11
    
          - name: Grant execute permission for gradlew
            run: chmod +x gradlew
    
          - name: Test with Gradle
            run: ./gradlew --info test

     

    Pull Request 수행

    이제 repository에 pull request가 생성되면 test가 잘 수행되는지 확인해야 합니다.

    코드를 살짝 변경해 pull request를 생성해 봅니다.

    PR에서 실패가 났다.

    Github Actions가 실패했습니다.

    하지만 실패해도 Rebase and merge를 수행할 수 있습니다.

     

     

    Githtub Actions 실패시에 Merge 금지시키기

    • Setting > Branches > Branch protection rules > Add Rule -> Require status checks to pass before merging에 체크
    • Branch name pattern 에는 main(브랜치 이름)을 적어놓습니다.
    • 빈칸이 하나 생성되고 여기에 나의 WorkFlow Job 이름을 지정합니다. (저는 my-job-name1 이 job의 이름이었습니다.)
    • Create

     

    이제 Github Action이 실패하면 머지 버튼이 비활성화 머지를 수행할 수 없게 됩니다.

     

     

    실패하는 Workflow 분석하기

    Actions로 가서 workflow를 확인한다
    error 트레킹

    Github Actions 테스트 3을 들어가 보면 error에 대한 원인을 발견할 수 있습니다.

    gradle.wrapper 관련하여 무언가 문제가 발생한 것 같습니다.

    gradle-wrapper.jar가 Github Repository에 존재하지 않아 발생하는 문제입니다.

    gradle-wrapper.jar의 git ignore를 해제하고 원격저장소에 올려줍니다.

     

    이제 정상적으로 Github Actions가 도는 것을 확인할 수 있습니다.

    Github Actions가 성공적으로 돌았으니 merge도 수행가능합니다.

     

    단순히 테스트가 성공한다고 완벽하게 머지되는 코드가 문제가 없음을 보장하진 않습니다.

    하지만 테스트를 통해 어느 정도의 안정성은 보장해 주는 CI가 완성되었습니다.

    다음에는 Github Actions를 활용하여 CD를 구축하여 보겠습니다.

     

     

    참고자료

    https://www.daleseo.com/github-actions-basics/

     

     

    'Git' 카테고리의 다른 글

    git commit전 git hook 거는방법  (0) 2024.02.20
    git init으로 Git Reposiotry 생성하기  (0) 2023.08.15
    Trunked Based Development  (0) 2023.05.07
    Git 특정 commit diff 보는 법  (0) 2023.04.26
    Git 커밋 메시지 바꾸는 방법  (0) 2023.03.24

    댓글

Designed by Tistory.