[GitHub] GitHub Actions를 사용한 CI

Drumj·2024년 5월 2일
0

GitHub

목록 보기
1/2

GitHub Actions를 사용한 CI를 해보자

옛날옛적 프로젝트를 할 때 CI/CD라는 단어를 들어본 적이 있다. 물론 그때부터 지금까지 항상 들어온 단어. 정확하게 무슨 뜻인지는 모르고 자동 빌드 및 테스트(CI), 배포(CD) 이렇게만 이해하고 넘어갔다.

그렇다면 CI/CD란 무엇일까?

전지전능한 ChatGPT에게 물어봤다.

  • CI (Continuous Integration , 지속적 통합) :
    지속적 통합은 개발자들이 작성한 코드를 자동으로 빌드하고 테스트하는 프로세스를 의미합니다. 주요 목표는 코드 변경 사항이 주기적으로 통합되고 버그를 신속하게 발견하고 수정함으로써 소프트웨어 품질을 유지하고 개발자 팀 간의 협업을 촉진하는 것입니다. 일반적으로 CI 프로세스는 코드 저장소(예: GitHub)에 푸시될 때 트리거됩니다.

  • CD (Continuous Deployment, 지속적 배포) :
    지속적 배포는 지속적으로 통합된 코드를 실제 환경에 자동으로 배포하는 프로세스를 의미합니다. 주요 목표는 변경 사항을 신속하게 사용자에게 제공하여 피드백을 수집하고 제품을 지속적으로 개선하는 것입니다. CD는 자동화된 빌드 및 배포 파이프라인을 사용하여 배포 과정을 표준화하고 안정성을 높입니다.

음... 내가 이해한 것이 대강 맞는 것 같다.


CI를 만들어 보자!

얼마전 개인 프로젝트를 작게 진행할 때 배포는 하지 않을 거라서 CI만 적용해 본 적이 있다.
되게 쉽게 했었고 따로 정리도 하지 않아서.. 어떻게 했더라... 하는 생각을 가지고 처음부터 다시 하게 되었다. 코드는 남아있어서 조금 더 수월하게 할 수 있었고 CI를 만드는 것은 그렇게 어려운 일은 아니었다.

우선 GitHub의 Repository로 가서 Actions 를 찾아보자.

처음 Actions로 들어가면 위와 같은 화면이 나오는데 여기서 Java with Gradle을 선택해준다. 본인의 프로젝트가 Maven 이라면 아마 Java with Maven 을 선택하면 될 것이다.


코드

선택하면 기본적인 코드가 바로 나타난다.
중간에 나오는 자바 버전을 꼭!! 확인해주세요!

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/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
    permissions:
      contents: read

    steps:
    - uses: actions/checkout@v4
    - name: Set up JDK 17
      uses: actions/setup-java@v4
      with:
        java-version: '17' #!!!기본으로 17이 설정되어 있는데 본인 프로젝트에 맞는 자바 버전으로 변경하면 됩니다.
        distribution: 'temurin'

    # Configure Gradle for optimal use in GiHub Actions, including caching of downloaded dependencies.
    # See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md
    - name: Setup Gradle
      uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0

    - name: Build with Gradle Wrapper
      run: ./gradlew build

    # NOTE: The Gradle Wrapper is the default and recommended way to run Gradle (https://docs.gradle.org/current/userguide/gradle_wrapper.html).
    # If your project does not have the Gradle Wrapper configured, you can use the following configuration to run Gradle with a specified version.
    #
    # - name: Setup Gradle
    #   uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0
    #   with:
    #     gradle-version: '8.5'
    #
    # - name: Build with Gradle 8.5
    #   run: gradle build

  dependency-submission:

    runs-on: ubuntu-latest
    permissions:
      contents: write

    steps:
    - uses: actions/checkout@v4
    - name: Set up JDK 17
      uses: actions/setup-java@v4
      with:
        java-version: '17'
        distribution: 'temurin'

    # Generates and submits a dependency graph, enabling Dependabot Alerts for all project dependencies.
    # See: https://github.com/gradle/actions/blob/main/dependency-submission/README.md
    - name: Generate and submit dependency graph
      uses: gradle/actions/dependency-submission@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0

분명 얼마전까지만 해도 dependency-submission: 이란 부분은 없었는데... 뭔지 몰라서 코드에서 제거했다.

그리고 해당 코드를 가지고 바로 빌드를 하면 gradlew 에 대한 권한이 없다고 Permission denied 에러가 발생한다.

권한 추가

 - name: Gradle 명령 실행을 위한 권한을 부여합니다
      run: chmod +x gradlew

해당 코드를 Setup Gradle 전에 추가해주자!!

Gradle 버전 변경

사실 이 부분은 내가 에러를 잘 못 파악해서 추가한 부분... 해당 부분은 수정하지 않으셔도 제대로 동작 할 것입니다.

#수정 전
# Configure Gradle for optimal use in GiHub Actions, including caching of downloaded dependencies.
# See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md
- name: Setup Gradle
    uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0

- name: Build with Gradle Wrapper
    run: ./gradlew build

    # NOTE: The Gradle Wrapper is the default and recommended way to run Gradle (https://docs.gradle.org/current/userguide/gradle_wrapper.html).
    # If your project does not have the Gradle Wrapper configured, you can use the following configuration to run Gradle with a specified version.
    #
    # - name: Setup Gradle
    #   uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0
    #   with:
    #     gradle-version: '8.5'
    #
    # - name: Build with Gradle 8.5
    #   run: gradle build


#수정 후
- name: Setup Gradle
    uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0
    with:
        gradle-version: '8.5'
    
- name: Build with Gradle 8.5
    run: gradle build

해당 코드는 단순히 기존에 있던 코드에서 주석 처리된 부분과 기본으로 작성 되어있는 코드를 바꾼 것 밖에 없다.

application.yml 에서 변수 값을 GitHub Secrets의 값을 받아서 사용하고 싶어서 처리해놓은 부분 때문에 test가 실패한 에러였는데
Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.
해당 메세지만 보고 버전이 안 맞아서 그런가...? 라는 생각에 코드를 수정했기 때문... 앞서 말했듯이 굳이 바꾸지 않아도 제대로 동작 할 것 같다.

그리고 방금 말한 GitHub Secrets 관련해서는 바로 다음 포스트에 작성하도록 하겠다.


최종 코드

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle

name: Java CI with Gradle(finale CI)

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:

    runs-on: ubuntu-latest
    permissions:
      contents: read

    steps:
    - uses: actions/checkout@v4
    - name: Set up JDK 17
      uses: actions/setup-java@v4
      with:
        java-version: '17'
        distribution: 'temurin'

    - name: Gradle 명령 실행을 위한 권한을 부여합니다
      run: chmod +x gradlew
    
    - name: Setup Gradle
      uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0
      with:
        gradle-version: '8.5'
    
    - name: Build with Gradle 8.5
      run: gradle build

GitHub Secrets 관련 코드는 삭제한 최종 코드이다. application.yml 파일에서 Secrets 변수를 사용하지 않는다면 제대로 동작할 것이다.
이전 프로젝트에서도 제대로 동작했기 때문에 따로 테스트는 해보지 않았다.


마무리

이렇게 아주 간단하게 CI를 완성할 수 있었다.

Repository에 gradle 관련 파일들이 있어야 하기 때문에 gradle 관련 파일들을 gitignore 했다면 꼭! 풀어주시고

Permission dinied가 발생하면 권한을 꼭! 추가해주세요.

모두 쉽게 CI를 사용했으면 좋겠습니다.

0개의 댓글