제가 공부한 내용을 정리하는 블로그입니다.
아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁

해당 포스팅은 Github Action 사용법 정리입니다.

 

서론

GitHub Actions는 소프트웨어 워크플로우를 자동화하는 도구입니다. 이를 통해 코드를 빌드하고, 테스트하고, 배포하는 과정을 간소화할 수 있습니다. 특히 GitHub Actions는 YAML 파일을 기반으로 정의되며, 다양한 이벤트(예: push, pull request, cron 등)에 따라 실행됩니다.


이번 포스팅에서는 GitHub Actions의 기본 개념과 함께, API를 기능별로 자동화하거나 Python 프로젝트에서 유용하게 사용할 수 있는 예제를 소개합니다.

 

Github Actions 기본개념

GitHub Actions를 이해하기 위해 알아야 할 주요 개념은 다음과 같습니다

  1. Workflow
    • 자동화된 프로세스의 가장 상위 개념으로, 여러 Job으로 구성됩니다.
    • YAML 파일로 정의되며, .github/workflows 폴더에 저장됩니다.
  2. Event
    • Workflow를 실행하는 특정 조건이나 규칙입니다.
      예: 브랜치로의 push, pull_request, schedule(cron) 등.
  3. Job
    • 특정 작업 단위를 정의하며, 여러 Step으로 구성됩니다.
    • 독립적으로 실행되거나 다른 Job과 병렬 실행이 가능합니다.
  4. Step
    • 각 작업(Job)을 구성하는 단위로, 커맨드 실행 또는 액션 사용이 가능합니다.
  5. Action
    • Workflow의 재사용 가능한 가장 작은 구성 요소입니다.
      예: actions/checkout@v2를 사용하여 리포지토리를 체크아웃.

Workflow 정의 방법

GitHub Actions의 Workflow는 .github/workflows 디렉토리에 .yml 파일로 작성됩니다. 아래는 간단한 Workflow 예제입니다.

on:
    push:
      branches: [ master ]
    pull_request:
      branches: [ master ]
  • on (이벤트 정의)
    Workflow를 Trigger(실행)하는 조건을 정의합니다.
    • 주요 이벤트:
      • push: 특정 브랜치나 태그로 코드가 푸시될 때 실행.
      • pull_request: 특정 브랜치로 PR(Pull Request)이 생성되거나 업데이트될 때 실행.
      • schedule: 특정 시간에 반복적으로 실행(Cron 표현식 사용).
      • 여러 이벤트를 정의할 수 있으며, 배열로 작성 가능합니다.
jobs:
    build:
      runs-on: ubuntu-latest

      steps:
      - uses: actions/checkout@v2
      - name: Run a one-line script
        run: echo Hello, world!

      - name: Run a multi-line script
        run: |
          echo Add other actions to build,
          echo test, and deploy your project.
  • jobs
    Workflow는 여러 Job으로 구성되며, 각 Job은 독립적으로 실행됩니다.
    • 병렬 실행: 기본적으로 여러 Job은 병렬로 실행됩니다.
    • build라는 job을 생성하고, 그 아래에 2개의 step이 존재하는 구조
      • runs-on은 어떤 OS에서 실행될지 지정
      • name: Job의 이름을 지정.
      • runs-on: Job이 실행될 운영 체제(OS) 환경을 지정
      • env: 환경변수 등록Job의 주요 요소:
    • steps의 uses는 어떤 액션을 사용할지 지정함. 이미 만들어진 액션을 사용할 때 지정

기본 Workflow 예제

name: CI workflow

on:
  push:
    branches:
      - dev
  pull_request:
    branches:
      - dev

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Code
        uses: actions/checkout@v3

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

      - name: Grant execute permission for gradlew
        run: chmod +x ./gradlew

      - name: Build with Gradle
        run: ./gradlew clean build --info

      - name: Upload Artifact
        uses: actions/upload-artifact@v3
        with:
          name: spring-app
          path: build/libs/*.jar

  deploy:
    needs: build
    runs-on: ubuntu-latest

    steps:
      - name: Download Artifact
        uses: actions/download-artifact@v3
        with:
          name: spring-app

      - name: Deploy JAR to AWS
        uses: appleboy/scp-action@v0.1.4
        with:
          host: ${{ secrets.AWS_SERVER_IP }}
          username: ${{ secrets.AWS_USERNAME }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          source: "*.jar"
          target: "~/proj"

      - name: Restart Application on AWS
        uses: appleboy/ssh-action@v0.1.10
        with:
          host: ${{ secrets.AWS_SERVER_IP }}
          username: ${{ secrets.AWS_USERNAME }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            # Define variables
            DEPLOY_DIR=~/proj
            JAR_FILE=server-0.0.1-SNAPSHOT.jar

            # Kill process on port 8080
            echo "Stopping existing server..."
            PID=$(sudo lsof -t -i:8080)
            if [ -n "$PID" ]; then
              sudo kill -9 $PID
            fi

            # Navigate to deployment directory
            cd $DEPLOY_DIR || exit

            # Start the new server
            echo "Starting new server..."
            nohup java -jar $JAR_FILE > app.log 2>&1 &
            echo "Server restarted. Logs can be found in $DEPLOY_DIR/app.log"

YAML 파일 설명

해당 yaml은 dev 브랜치에 이벤트가 발생할 때마다 AWS 서버에 실행 중인 서버를 껏다가 업데이트 된 것으로 실행하는 workflow입니다.

  1. build Job:
    • GitHub Actions에서 코드 체크아웃, JDK 설치, 빌드, 그리고 생성된 JAR 파일을 아티팩트로 업로드합니다.
  2. deploy Job:
    • 빌드된 JAR 파일을 다운로드하여 AWS 서버로 전송한 후, 애플리케이션을 재시작합니다.
    • 기존 서버 프로세스를 종료하고 새 JAR 파일로 서버를 실행합니다.

분석

이벤트 트리거

  • on:
    • push 또는 pull_request 이벤트가 dev 브랜치에서 발생하면 Workflow가 실행됩니다.

build Job

  • runs-on:
    • Job이 실행될 환경으로 ubuntu-latest를 사용합니다.
  • steps:
    1. actions/checkout: 리포지토리를 체크아웃합니다.
    2. actions/setup-java: JDK 17을 설치합니다.
    3. gradlew clean build: Gradle을 사용해 소스 코드를 빌드합니다.
    4. actions/upload-artifact: 빌드 결과물(JAR 파일)을 업로드합니다.
  • with:
    1. uses로 지정한 Action에 인자(Arguments)를 전달할 때 사용됩니다.
    2. Action의 동작을 세부적으로 설정하는 데 필요합니다.
옵션이름 설명 필수여부
host 원격 서버의 IP 주소 또는 도메인 필수
username 원격 서버에 로그인할 사용자 이름 필수
key SSH 접속을 위한 개인 키 필수
source 전송할 파일 또는 디렉토리 경로 필수
target 원격 서버에서 파일을 저장할 대상 경로 필수
port SSH 연결에 사용할 포트 선택
timeout 연결 시간 초과 시간 선택
overwrite 파일이 이미 존재할 경우 덮어쓸지 여부 선택

 

deploy Job

  • needs:
    • build Job이 성공적으로 완료된 후 실행됩니다.
  • steps:
    1. actions/download-artifact: 빌드된 JAR 파일을 다운로드합니다.
    2. appleboy/scp-action: 다운로드된 JAR 파일을 AWS 서버로 전송합니다.
    3. appleboy/ssh-action:
      • 기존 서버 프로세스를 종료합니다.
      • 새로운 JAR 파일로 서버를 시작합니다.
  • run:
    1. 정의:
    2. Job에서 실행할 커맨드(Command)를 지정합니다.
    3. 단일 명령어 또는 여러 줄 명령어를 실행할 수 있습니다.

'CICD' 카테고리의 다른 글

[Shell] Bash Shell 프로그래밍 문법 정리  (0) 2025.01.10

+ Recent posts