제가 공부한 내용을 정리하는 블로그입니다.
아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
해당 포스팅은 Github Action 사용법 정리입니다.
서론
GitHub Actions는 소프트웨어 워크플로우를 자동화하는 도구입니다. 이를 통해 코드를 빌드하고, 테스트하고, 배포하는 과정을 간소화할 수 있습니다. 특히 GitHub Actions는 YAML 파일을 기반으로 정의되며, 다양한 이벤트(예: push, pull request, cron 등)에 따라 실행됩니다.
이번 포스팅에서는 GitHub Actions의 기본 개념과 함께, API를 기능별로 자동화하거나 Python 프로젝트에서 유용하게 사용할 수 있는 예제를 소개합니다.
Github Actions 기본개념
GitHub Actions를 이해하기 위해 알아야 할 주요 개념은 다음과 같습니다
- Workflow
- 자동화된 프로세스의 가장 상위 개념으로, 여러 Job으로 구성됩니다.
- YAML 파일로 정의되며, .github/workflows 폴더에 저장됩니다.
- Event
- Workflow를 실행하는 특정 조건이나 규칙입니다.
예: 브랜치로의 push, pull_request, schedule(cron) 등.
- Workflow를 실행하는 특정 조건이나 규칙입니다.
- Job
- 특정 작업 단위를 정의하며, 여러 Step으로 구성됩니다.
- 독립적으로 실행되거나 다른 Job과 병렬 실행이 가능합니다.
- Step
- 각 작업(Job)을 구성하는 단위로, 커맨드 실행 또는 액션 사용이 가능합니다.
- Action
- Workflow의 재사용 가능한 가장 작은 구성 요소입니다.
예: actions/checkout@v2를 사용하여 리포지토리를 체크아웃.
- Workflow의 재사용 가능한 가장 작은 구성 요소입니다.
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입니다.
- build Job:
- GitHub Actions에서 코드 체크아웃, JDK 설치, 빌드, 그리고 생성된 JAR 파일을 아티팩트로 업로드합니다.
- deploy Job:
- 빌드된 JAR 파일을 다운로드하여 AWS 서버로 전송한 후, 애플리케이션을 재시작합니다.
- 기존 서버 프로세스를 종료하고 새 JAR 파일로 서버를 실행합니다.
분석
이벤트 트리거
- on:
- push 또는 pull_request 이벤트가 dev 브랜치에서 발생하면 Workflow가 실행됩니다.
build Job
- runs-on:
- Job이 실행될 환경으로 ubuntu-latest를 사용합니다.
- steps:
- actions/checkout: 리포지토리를 체크아웃합니다.
- actions/setup-java: JDK 17을 설치합니다.
- gradlew clean build: Gradle을 사용해 소스 코드를 빌드합니다.
- actions/upload-artifact: 빌드 결과물(JAR 파일)을 업로드합니다.
- with:
- uses로 지정한 Action에 인자(Arguments)를 전달할 때 사용됩니다.
- Action의 동작을 세부적으로 설정하는 데 필요합니다.
옵션이름 | 설명 | 필수여부 |
host | 원격 서버의 IP 주소 또는 도메인 | 필수 |
username | 원격 서버에 로그인할 사용자 이름 | 필수 |
key | SSH 접속을 위한 개인 키 | 필수 |
source | 전송할 파일 또는 디렉토리 경로 | 필수 |
target | 원격 서버에서 파일을 저장할 대상 경로 | 필수 |
port | SSH 연결에 사용할 포트 | 선택 |
timeout | 연결 시간 초과 시간 | 선택 |
overwrite | 파일이 이미 존재할 경우 덮어쓸지 여부 | 선택 |
deploy Job
- needs:
- build Job이 성공적으로 완료된 후 실행됩니다.
- steps:
- actions/download-artifact: 빌드된 JAR 파일을 다운로드합니다.
- appleboy/scp-action: 다운로드된 JAR 파일을 AWS 서버로 전송합니다.
- appleboy/ssh-action:
- 기존 서버 프로세스를 종료합니다.
- 새로운 JAR 파일로 서버를 시작합니다.
- run:
- 정의:
- Job에서 실행할 커맨드(Command)를 지정합니다.
- 단일 명령어 또는 여러 줄 명령어를 실행할 수 있습니다.
'CICD' 카테고리의 다른 글
[Shell] Bash Shell 프로그래밍 문법 정리 (0) | 2025.01.10 |
---|