🧩 Github Actions를 활용한 CI/CD 파이프라인
Github Actions란?
- Github에 내장된 CI/CD 도구
- Github에 내장되어 있는 CI/CD라 github와 통합이 쉽고, CI/CD 서버가 내장 되어 따로 구축할 필요 없으며, 일정 수준까지 가격이 무료
- 동작 방식
.github/workflows디렉토리에 필요한 Actions 파일들을 yaml 형식으로 작성- 작성된 actions 파일들이 github에서 자동으로 실행됨
Github Actions 의 CI
CI(Continuous Integration) : 코드를 자주 통합하고 자동 검증하는 것
- test를 통과한 코드만 dev 브랜치와 main 브랜치에 merge되도록 하여 오류를 방지하고 안정적인 코드가 배포되고 버그를 빠르게 발견
- 활용 예시
- dev 브랜치에 merge된 경우 gradle test를 진행
- feat/** 브랜치가 push된 경우 gradle test를 진행
- gradle test가 실패한 경우 slack 등으로 알림을 보내 수정하도록 안내
- 샘플
name: "CI"
# Event Trigger: 특정 액션 등이 명시한 Branch에서 일어나면 동작을 수행함
on:
push:
branches: [dev, feat/*]
pull_request:
branches:
- dev
# 실제 어떤 작업을 실행할지에 대한 명시
jobs:
ci:
runs-on: [ubuntu-latest]
# 실제 실행 스크립트
steps:
- name: checkout
uses: actions/checkout@v4
- name: java setup
uses: actions/setup-java@v2
with:
distribution: "adopt"
java-version: "17"
# 사용자 지정 스크립트 실행
- name: run unittest
run: |
./gradlew clean test
Github Actions의 CD
CD(Continuous Deployment) : 배포를 자동화하는 작업을 기술해서 빠르고 간편하게 배포하는 것
- main 브랜치에 코드가 통합된 경우 운영 환경에 빠르게 배포할 수 있게 함
- 활용 예시
- main 브랜치에 merge된 경우 gradle test를 실행
- main 브랜치의 코드 기준으로 jar 파일을 생성
- 생성된 jar파일을 AWS, GCP 등에 배포
- 샘플
name: 'CD'
on:
push:
branches: [ main ]
jobs:
cd:
runs-on: [ ubuntu-latest ]
steps:
- name: checkout
uses: actions/checkout@v4
- name: java setup
uses: actions/setup-java@v3
with:
distribution: 'adopt'
java-version: '17'
- name: run unittest
run: |
./gradlew clean test
- name: deploy to heroku
uses: akhileshns/heroku-deploy@v3.12.12
with:
heroku_api_key: ${{secrets.HEROKU_API_KEY}}
heroku_app_name: "sampleapp-github-actions"
heroku_email: "sample@example.com"
Github Actions 기본 개념
- Workflow
- 최상위 개념
- 여러 Job으로 구성되고 Event에 의해 트리거될 수 있는 자동화된 프로세스
- Workflow 파일은 YAML으로 작성되고, 깃허브 레포지토리의
.github/workflows폴더 아래에 저장됨
- Event
- Push, PR Open, Issue Open, cron 등의 특정한 규칙
- Workflow를 Trigger함
- Runner
- Github Action Runner App이 설치된 VM
- Workflow가 실행될 인스턴스로, 각각의 Job들은 개별적인 Runner에서 실행됨
- Job
- 하나의 Runner에서 실행될 여러 Step의 모음
- Step
- 실행 가능한 하나의 Shell script 또는 Action
- Actions
- 재사용이 가능한 Workflow의 가장 작은 단위
- Job을 만들기 위해 Step들을 연결
- workflow 구조
name: github actions의 이름on: 이 action이 언제 실행되는지jobs: 실제 실행할 내용runs-on: 어떤 환경에서 실행하는지steps: 실제 실행할 단계들uses: 사용할 플러그인들with: 플러그인에서 사용할 파라미터들run: 실제로 실행할 스크립트
- Github Actions 예제:
.github/workflows/github-actions-demo.yaml(참고)
name: GitHub Actions Demo
run-name: ${{ github.actor }} is testing out GitHub Actions 🚀
on: [push]
jobs:
Explore-GitHub-Actions:
runs-on: ubuntu-latest
steps:
- run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
- run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!"
- run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
- name: Check out repository code
uses: actions/checkout@v4
- run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
- run: echo "🖥️ The workflow is now ready to test your code on the runner."
- name: List files in the repository
run: |
ls ${{ github.workspace }}
- run: echo "🍏 This job's status is ${{ job.status }}."
Github Actions CI 실습하기
GitHub - qkrwns1478/cicd-practice at dev
Contribute to qkrwns1478/cicd-practice development by creating an account on GitHub.
github.com
- .github/workflows/run-test.yml 파일 생성
# Actions 이름 github 페이지에서 볼 수 있다.
name: Run Test
# Event Trigger 특정 액션 (Push, Pull_Request)등이 명시한 Branch에서 일어나면 동작을 수행한다.
on:
push:
# 배열로 여러 브랜치를 넣을 수 있다.
branches: [ dev, feat/* ]
# github pull request 생성시
pull_request:
branches:
- dev # -로 여러 브랜치를 명시하는 것도 가능
# 실제 어떤 작업을 실행할지에 대한 명시
jobs:
build:
# 스크립트 실행 환경 (OS)
# 배열로 선언시 개수 만큼 반복해서 실행한다. ( 예제 : 1번 실행)
runs-on: [ ubuntu-latest ]
# 실제 실행 스크립트
steps:
# uses는 github actions에서 제공하는 플러그인을 실행.(git checkout 실행)
- name: checkout
uses: actions/checkout@v4
# with은 plugin 파라미터 입니다. (java 17버전 셋업)
- name: java setup
uses: actions/setup-java@v2
with:
distribution: 'adopt' # See 'Supported distributions' for available options
java-version: '17'
- name: make executable gradlew
run: chmod +x ./gradlew
# run은 사용자 지정 스크립트 실행
- name: run unittest
run: |
./gradlew clean test
- feat/** 브랜치명으로 커밋 후 푸시
- Run Test가 실행하는 것을 확인할 수 있다.


- feat 브랜치에서 dev 브랜치로 PR을 열면 다시 빌드 테스트가 진행된다.

- 테스트를 Fail하는 커밋을 푸시하면 빌드에 실패한다.

Github Actions CD 실습하기
- 전체 흐름
- 개발자는 feat로 시작하는 브랜치를 만들어서 테스트 코드를 포함한 수정 작업을 완료한 뒤 PR 생성
- (자동화) PR를 만들면 해당 브랜치에 대해 gradle test를 수행
- PR 코드의 test가 실패한 경우 PR를 생성한 개발자는 test 코드를 수정하여 PR를 변경
- PR 코드의 test가 성공한 경우 다른 개발자들의 승인을 기다림
- 다른 개발자들은 PR의 코드를 승인하거나 리뷰를 작성
- (자동화) main 브랜치에 merge 되면 해당 브랜치를 서버에 배포
- PR이 만들어지면 test를 수행하는 Github Action
name: test every pr
on:
workflow_dispatch:
pull_request:
permissions:
contents: read
pull-requests: read
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: setup jdk
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
cache: gradle
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
- name: gradlew test
run: ./gradlew test
- 서버에 main 브랜치를 배포하는 Github Action (아래 내용은 Cloudtype에 배포할 때 예시)
name: Deploy to cloudtype
on:
workflow_dispatch:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Connect deploy key
uses: cloudtype-github-actions/connect@v1
with:
token: ${{ secrets.CLOUDTYPE_TOKEN }}
ghtoken: ${{ secrets.GHP_TOKEN }}
- name: Deploy
uses: cloudtype-github-actions/deploy@v1
with:
token: ${{ secrets.CLOUDTYPE_TOKEN }}
project: nbc.docker/cicd
stage: main
yaml: |
name: cicd
app: java@17
options:
ports: 8080
context:
git:
url: git@github.com:${{ github.repository }}.git
ref: ${{ github.ref }}
preset: java-springboot
- Github Actions와 GCP 연동하기
[Spring Boot] Github Actions를 사용한 GCP 배포 가이드
목표Docker를 사용하지 않고 Spring Boot 프로젝트를 GCP(Google Cloud Platform)의 Compute Engine(VM)에 직접 배포하는 GitHub Actions CD 파이프라인을 구축한다.사전 준비GCP Computer Engine (VM) 인스턴스 생성SSH 키 생
munsik22.tistory.com
'내일배움캠프' 카테고리의 다른 글
| [내일배움캠프] Redis 응용 (0) | 2026.05.08 |
|---|---|
| [내일배움캠프] Redis (1) | 2026.05.07 |
| [내일배움캠프] CI/CD와 AWS ECS (0) | 2026.05.05 |
| [내일배움캠프] Docker와 Docker Compose (0) | 2026.05.04 |
| [내일배움캠프] Controller와 Service를 분리해야 하는 이유 (0) | 2026.04.20 |