Skip to content

Github Action

ccxz84 edited this page Sep 5, 2023 · 1 revision

Github Action

  1. Github Action 이란? GitHub Actions는 GitHub에서 제공하는 서비스로, 빌드, 테스트, 배포 파이프라인을 자동화할 수 있는 CI(Continuous Integration, 지속 통합)와 CD(Continuous Deployment, 지속 배포) 플랫폼이다. GitHub Actions를 사용하면 GitHub 리포지토리에서 손쉽게 CI/CD 결과를 확인하고 관리할 수 있다. 또한, YAML 포맷을 사용하여 가독성이 높고, 이미 구현되어 있는 수많은 액션을 활용하여 간단하게 CI/CD 플로우를 작성할 수 있다.

  2. Github Action의 요소 2-1. Workflow

  • 저장소에서 자동화 프로세스를 구성하는 방법을 정의한다.
  • 워크플로우는 하나 이상의 job으로 구성된다.
  • 각 워크플로우는 .github/workflows/ 디렉토리 내의 .yml 또는 .yaml 파일로 정의된다.

지금 book-server에서는 .github/workflow 안에 build 라는 Workflow가 존재하며 수행되고 있다.

2-2. Events

  • 워크플로우를 실행시키는 트리거를 말한다.
  • 예를 들어, push, pull_request, schedule 등 다양한 이벤트가 있다.

현재 book-server의 .github/workflow/build.yaml에서

on:
  push:
    branches:
      - main

이렇게 정의되어 있는데, 이것은 main 브랜치에 push되었을 때를 나타낸다.

on:
  schedule:
    - cron:  '0 0 * * *'

이런 식으로 cron을 통해 일정 시간마다 수행하는 것도 가능하다. 2-3. Jobs

  • 워크플로우 내에서 실행되는 일련의 스텝으로 구성된 단위이다.
  • 각 작업은 다른 운영체제에서 실행될 수 있다 (runs-on으로 지정).
  • 기본적으로, 작업은 병렬로 실행되지만, needs 키워드를 사용하여 종속성을 지정할 수 있다.
jobs:
  build:
    name: Build
    runs-on: ubuntu-latest
    steps:

이것은 job의 이름은 build이며 우분투 환경에서 여러 스텝을 수행하겠다는 것을 나타낸다. 2-4. Steps

  • 각 작업(job) 내에서 실행되는 명령 또는 action이다.
  • 순서대로 실행된다.
  • 스텝은 run 키워드를 사용하여 직접 쉘 명령을 실행하거나, uses 키워드를 사용하여 준비된 Action을 실행할 수 있다.

밑에 정의된 yaml에서 steps 아래에 배열로 된 부분이 실행되는 step이다. 2-6. Runners

  • 워크플로우를 실행하는 환경이다.
  • GitHub은 ubuntu-latest, macos-latest, windows-latest 등의 러너를 제공하지만, 자체 호스팅 러너를 설정하여 사용할 수도 있다.

아래의 yaml에서는 runs-on: ubuntu-latest로 지정되어 있다. 2-7. Secrets

  • 암호, 토큰, API 키와 같은 민감한 정보를 안전하게 저장하고 워크플로우에서 사용할 수 있게 해주는 기능이다.

아래의 yaml에서 ${{ secrets.SONAR_TOKEN }} 등이 secret으로 정의된 부분이다.

Yaml 주석

name: Build // workflow 이름

on:         // 이벤트 정의
  push:
    branches:
      - main     // 메인 branch에 push 될 때, 해당 workflow를 수행하겠다.


jobs:
  build:
    name: Build   // job의 이름을 build이다.
    runs-on: ubuntu-latest  // ubuntu 환경에서 수행
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0  # Shallow clones should be disabled for a better relevancy of analysis // 레포의 코드를 실행되는 runner에 체크아웃.
      - name: Setup JDK 11             //JDK 11 설정
        uses: actions/setup-java@v1
        with:
          java-version: 11
      - name: Cache SonarQube packages
        uses: actions/cache@v1                   // actions/cache@v1 외부 액션 사용
        with:                                    // 매개변수 지정
          path: ~/.sonar/cache                   // 캐시할 디렉터리 지정
          key: ${{ runner.os }}-sonar            // 캐시의 고유한 key 지정
          restore-keys: ${{ runner.os }}-sonar   // 캐시 복원 시 참조할 대체 key 지정
      - name: Cache Gradle packages
        uses: actions/cache@v1
        with:
          path: ~/.gradle/caches
          key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
          restore-keys: ${{ runner.os }}-gradle
      - name: Build and analyze
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}  # Needed to get PR information, if any
          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
          SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
        run: ./gradlew build sonar
Clone this wiki locally