내일배움캠프

[내일배움캠프] Github Actions와 CI/CD

munsik22 2026. 5. 6. 15:40

🧩 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 실습하기

  • 전체 흐름
    1. 개발자는 feat로 시작하는 브랜치를 만들어서 테스트 코드를 포함한 수정 작업을 완료한 뒤 PR 생성
    2. (자동화) PR를 만들면 해당 브랜치에 대해 gradle test를 수행
    3. PR 코드의 test가 실패한 경우 PR를 생성한 개발자는 test 코드를 수정하여 PR를 변경
    4. PR 코드의 test가 성공한 경우 다른 개발자들의 승인을 기다림
    5. 다른 개발자들은 PR의 코드를 승인하거나 리뷰를 작성
    6. (자동화) 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