Tech story/Cloud

What is DevOps? - Github Action

kt cloud 테크블로그 2024. 11. 11. 16:10

[kt cloud DevOps팀 이효원 님]

 

What is DevOps? - Github Action

 

1. Github 구성 요소

Github은 소스 코드 관리를 넘어, 개발자와 팀이 협업하고 프로젝트를 관리하는 다양한 도구를 제공하는 플랫폼입니다.
Github은 크게 Organization, Team, Repository로 구성됩니다.

 

1-1. Organization

Github Organization은 여러 팀과 프로젝트를 효율적으로 관리할 수 있는 Github의 그룹 단위입니다.
기업이나 큰 팀의 경우, Organization을 생성해 프로젝트와 리소스를 통합 관리할 수 있습니다.
Organization은 다음과 같은 기능을 제공합니다.

  • 중앙 관리: 조직 내 모든 사용자와 Repository를 중앙에서 관리할 수 있습니다.
  • 권한 설정: 팀별로 세분화된 권한을 설정하여 특정 팀에만 Repository 접근을 허용하거나 제한할 수 있습니다.
  • 빌링 통합: 유료 플랜에서는 모든 구성원의 사용량을 통합적으로 관리할 수 있습니다.

 

1-2. Team

Team은 Organization 하위에서 사용자들을 그룹으로 묶어 프로젝트 접근 권한을 관리하는 단위입니다.
Team을 통해 조직 내의 특정 Repository와 파일에 접근할 수 있는 사람을 지정할 수 있습니다.

  • 팀별 역할 분배
    : 팀마다 역할과 권한을 설정하여 A팀은 읽기만 가능하게 하고
    B팀은 Pull 및 Push 권한을 부여하는 등, 구성원에 따른 Hiearachy를 설정할 수 있습니다.
  • 효율적인 협업: 팀 단위로 Issue 및 Pull Request를 할당할 수 있어 협업과 업무 분배가 용이합니다.

 

1-3. Repository

Repository는 프로젝트의 소스 코드와 Issue, Pull Request, Wiki 등을 저장하고 관리하는 기본 단위입니다.
Github에서 프로젝트별로 코드를 저장하고 협업을 진행하는 공간으로,
프로젝트 관련 모든 데이터를 보관합니다.

  • 코드 저장소: Git을 통해 프로젝트의 코드와 히스토리를 저장하고 버전 관리를 수행합니다.
  • Issue 및 Pull Request 관리
    : 코드 리뷰, 버그 트래킹 등을 지원하여 개발 프로세스의 흐름을 체계적으로 관리할 수 있습니다.
  • Wiki 및 문서화: Repository 단위로 Wiki를 제공하여 작업 내용을 문서화 할 수 있습니다.

 

2. Github Actions

Github Actions는 Github에서 제공하는 CI/CD(지속적인 통합 및 배포) 도구로,
Github Repository에서 코드의 Build, Test, 배포를 자동화 할 수 있도록 돕습니다.


 
 

Github Actions는 Commit, Pull Request, Issue 등 이벤트가 발생할 때 트리거 되어 자동화 Workflow를 실행하는 방식으로 동작합니다.
Github Actions는 개발자들이 효율적으로 반복 작업을 줄이고 팀의 코드 품질을 높이며,
보다 빠르고 안정적으로 서비스 릴리즈를 수행할 수 있도록 지원합니다.

3. Github Actions 구성 요소

Github Actions의 Workflow를 구성하는 기본 요소에는 Action, Runner, Runner Group, Package가 있습니다.

3-1. Action

Action은 Github Actions Workflow의 개별 작업 단위를 의미합니다.
Build, Test, 코드 스타일 체크, 배포 등 다양한 작업을 Action으로 정의할 수 있으며,
여러 Action을 결합하여 하나의 Workflow를 구성합니다.

  • 개발자 정의 가능
    : Action은 직접 작성하거나, Github Marketplace에서 미리 만들어진 Action을 사용할 수 있습니다.
  • 모듈화와 재사용성
    : Action을 재사용할 수 있도록 모듈화하여 팀 내에서 효율적으로 공유하고 활용할 수 있습니다.
  • 자주 사용되는 Action 예시
    • Node.js Test 실행
    • Docker 이미지 Build
    • MS Azure에 애플리케이션 배포

 

3-2. Runner

Runner는 Github Actions Workflow에서 Action을 실행하는 컴퓨팅 리소스를 의미합니다.
Action이 정의한 작업이 Runner에서 실행되며, Github는 기본적으로 Github에서 제공하는 Runner와 사용자 정의 Runner를 지원합니다.

  • Github Hosted Runner
    : Github에서 제공하는 클라우드 기반 Runner로,
    Linux, Windows, macOS 환경을 다양한 스펙으로 제공합니다.
  • Self Hosted Runner
    : 사용자가 직접 서버나 가상 머신을 설정해 Runner로 사용하는 방식으로,
    특정 요구 사항에 맞게 커스텀 할 수 있습니다.

 

 

3-3. Runner Group

Runner Group 여러 Runner를 그룹화함으로써 특정 Workflow에서 필요에 따라 사용할 수 있도록 지원합니다.
특히 조직 내 여러 프로젝트에서 사용하는 Runner를 그룹화 해 리소스를 공유할 때 유용합니다.
하나의 Runner Group을 지정하면 하위 다수 Runners를 스케줄링하여 작업을 할당하기 때문에
보다 안정적인 운영이 가능하다는 장점이 있습니다.

  • 리소스 관리
    : Runner Group을 사용하면 각 프로젝트나 Repository에서 사용할 수 있는 Runner를 제한할 수 있습니다.
  • 조직 단위 활용
    : 조직 내에서 Runner Group을 활용해 특정 Runner를 팀 또는 Repository에 할당함으로써
    효율적으로 리소스를 관리합니다.

 

3-4. Package

Package는 Github Actions에서 프로젝트 Build 결과물을 저장하고 배포하는 데 사용되는 기능입니다.
Github Packages를 통해 라이브러리나 도커 이미지를 저장할 수 있으며,
버전 관리를 지원하여 CI/CD 파이프라인에서 활용할 수 있습니다.


 
  • 저장소
    : Github Packages는 프로젝트의 아티팩트를 저장하는 저장소 역할을 하며
    Github Actions Workflow와 통합하여 Build와 배포를 자동화할 수 있습니다.
  • 버전 관리
    : 패키지 버전 관리를 통해 라이브러리나 애플리케이션의 특정 버전을 배포할 수 있어
    안정적인 배포 프로세스를 지원합니다.
  • 주요 패키지 유형
    : npm, Docker, Maven, Gradle 등을 지원하여 다양한 패키지 관리가 가능합니다.

 

4. Github Actions Workflow 구성 요소

Github Actions의 Workflow는 YAML 파일 형식으로 정의되며, 주로 .Github/workflows/ 폴더에 위치합니다.
Workflow는 이벤트에 반응하여 실행되며 Workflow 파일을 통해 실행할 작업의 순서를 정의할 수 있습니다.


 
  • Event Trigger
    : Commit, Pull Request 생성, Issue 생성 등 Github 이벤트가 발생할 때 Workflow가 트리거됩니다.
  • Jobs
    : 하나의 Workflow에는 여러 작업(Job)을 포함할 수 있으며,
    각 Job은 병렬 또는 순차적으로 실행할 수 있습니다.
  • Steps
    : Job은 여러 개의 Step으로 구성되며, Step은 Action을 실행하는 기본 단위입니다.

 

5. Github Actions로 CI/CD 파이프라인 구축하기

Github Actions를 활용하여 CI/CD 파이프라인을 구축할 수 있습니다.
예를 들어 Azure에 애플리케이션을 배포하기 위한 CI/CD 파이프라인을 구성하는 경우 다음과 같은 단계로 구성됩니다.

 

  1. Build 및 Test 단계
    : Commit이나 Pull Request가 발생하면 Workflow가 트리거되어
    프로젝트의 의존성을 설치하고 Build한 후, 자동 Test를 실행합니다.
  2. 패키징 및 아티팩트 저장
    : Test가 성공하면 Build된 결과물을 Github Packages에 업로드하거나
    Harbor와 같은 외부 Registry에 Push합니다.
  3. 프로덕션 배포
    : 조건부로 프로덕션 환경에 배포하도록 설정하여 안정적인 배포가 가능하도록 합니다.
    이를 통해 변경 사항이 빠르게 반영됩니다.

 

6. Github Actions 장점

Github Actions는 Github 환경에 통합된 CI/CD 도구로서 다음과 같은 장점이 있습니다:

  • Github과의 통합성
    : Github Repository 내에서 직접 Workflow를 관리하므로,
    기존의 버전 관리와 Issue 트래킹과 원활하게 연결됩니다.
  • 자동화와 유연성
    : 다양한 이벤트와 조건에 따라 파이프라인을 자유롭게 설계할 수 있으며,
    Github Marketplace에서 원하는 Action을 가져와 바로 활용할 수 있습니다.
  • 비용 절감
    : 오픈소스 프로젝트와 유료 사용자는 Github Actions의 무료 사용량을 지원받을 수 있어
    별도의 CI/CD 인프라 구축 비용을 절감할 수 있습니다.




7. GitHub Actions Workflow

GitHub Actions는 GitHub Repository에서 Build, 테스트, 배포 작업을 자동화하는 도구로,
Action Workflow는 GitHub Actions에서 수행할 일련의 작업을 정의하는 파일입니다.
Workflow 파일을 작성함으로써 코드 Push, Pull Request 등 특정 이벤트 발생 시 원하는 작업을 자동으로 실행할 수 있습니다.
Workflow 파일은 YAML 형식으로 작성되며, GitHub Repository의 .github/workflows/ 폴더에 저장됩니다.
예를 들어 CI/CD 파이프라인을 위한 Workflow 파일을 .github/workflows/ci.yml에 작성할 수 있습니다.

8. Actions Workflow 구성 요소

Workflow 파일은 다음과 같이 구성됩니다.


 
  • name: Workflow의 이름을 정의하며, GitHub Actions 탭에서 Workflow를 구분할 때 사용됩니다.
  • on
    : Workflow를 트리거할 이벤트를 지정합니다.
    예를 들어 push, pull_request와 같은 GitHub 이벤트를 설정할 수 있습니다.
  • permissions: Workflow 실행 시 필요한 권한을 설정합니다.
  • env: Workflow에서 사용하는 전역 환경 변수를 지정합니다.
  • jobs
    : Workflow 내에서 실행할 작업을 정의하는 부분으로 하나 이상의 Job을 포함할 수 있습니다.
    Job은 병렬 또는 순차적으로 실행 가능합니다.

 

9. Jobs 구성 요소

Job은 Workflow에서 독립적으로 실행되는 단위입니다.
각 Job은 다음과 같은 구성 요소로 이루어집니다.


 
  • runs-on
    : Job이 실행될 환경을 지정합니다.
    예를 들어, ubuntu-latest는 최신 Ubuntu 환경에서 실행되도록 설정합니다.
  • steps
    : Job 내에서 실행할 단계별 작업을 정의합니다.
    각 Step은 name, uses, env, run 등을 포함할 수 있습니다.

 

10. Step 구성 요소

Step은 Job 내에서 실행되는 개별 작업으로, 다음과 같은 요소를 포함할 수 있습니다:

  • name
    : Step의 이름을 지정하여, GitHub Actions 실행 로그에서 해당 작업을 쉽게 구분할 수 있습니다.
  • uses
    : GitHub Actions에서 제공하는 프리셋 Action을 사용하거나, 커스텀 Action을 사용할 수 있습니다.
  • env: Step에 필요한 환경 변수를 설정합니다.
  • run: 명령어를 실행하는 부분으로, 스크립트나 쉘 명령어를 작성할 수 있습니다.

 

 

11. 예제: Gradle Build 및 Docker Image Push Workflow 작성하기

다음은 Gradle을 사용하여 Application을 Build하고,
Build 결과를 Docker Image로 만들어 Docker Hub에 Push하는 Workflow 예제입니다.
이 예제에서는 GitHub Actions에서 자주 사용하는 Checkout Action, Gradle Build Action, Artifact Upload/Download Action, Docker Login Action, Docker Push Action을 포함합니다.

Workflow 파일 예제 (.github/workflows/ci.yml)위 Workflow 예제는 크게 두 가지 Job으로 구성되어 있습니다.

name: CI/CD Pipeline

on:
  push:
    branches:
      - main

permissions:
  contents: read

env:
  DOCKER_REGISTRY: docker.io
  DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
  DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
  IMAGE_NAME: my-app

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Check out the repository
        uses: actions/checkout@v2

      - name: Set up JDK 11
        uses: actions/setup-java@v2
        with:
          java-version: '11'

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

      - name: Upload build artifact
        uses: actions/upload-artifact@v2
        with:
          name: build-output
          path: build/libs/

  docker:
    runs-on: ubuntu-latest
    needs: build
    steps:
      - name: Download build artifact
        uses: actions/download-artifact@v2
        with:
          name: build-output

      - name: Log in to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ env.DOCKER_USERNAME }}
          password: ${{ env.DOCKER_PASSWORD }}

      - name: Build Docker image
        run: docker build -t ${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_USERNAME }}/${{ env.IMAGE_NAME }}:latest .

      - name: Push Docker image
        run: docker push ${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_USERNAME }}/${{ env.IMAGE_NAME }}:latest

 

1) “build” Job

  • runs-on: ubuntu-latest: 이 Job은 최신 Ubuntu 환경에서 실행됩니다.
  • Step 1: Repository Checkout
    • Action 사용
      : Actions/checkout@v2을 사용하여 Repository를 Checkout하고, 코드를 Download합니다.
  • Step 2: JDK 설치
    • Gradle Build를 위해 JDK를 설치합니다.
    • Actions/setup-java@v2을 사용해 Java 11 버전을 설정합니다.
  • Step 3: Gradle Build
    • ./gradlew build 명령어를 통해 Gradle을 사용하여 프로젝트를 Build합니다.
  • Step 4: Artifact 업로드
    • Build 결과물인 JAR 파일을 업로드하여 다음 Job에서도 사용할 수 있도록 합니다.
    • Actions/upload-artifact@v2를 사용하여 build/libs/ 폴더의 내용을 업로드합니다.

 

2) “docker” Job

  • runs-on: ubuntu-latest: 이 Job 역시 최신 Ubuntu 환경에서 실행됩니다.
  • needs: build
    : Job간 의존성을 설정하는 기능으로, Job은 병렬 실행이 Default이기 때문에 Job간 실행 순서를 설정하고 싶을 때 사용합니다.
    build Job이 성공적으로 완료된 후에만 이 Job이 실행됩니다.
  • Step 1: Artifact Download
    • Actions/download-artifact@v2를 사용하여 이전 build Job에서 업로드한 Build 결과물을 Download합니다.
  • Step 2: Docker Hub Login
    • docker/login-Action@v2를 사용해 Docker Hub에 Login합니다.
    • GitHub Secrets에 저장된 DOCKER_USERNAME과 DOCKER_PASSWORD를 사용하여 보안을 유지합니다.
  • Step 3: Docker Image Build
    • Build된 Artifact를 기반으로 Docker Image를 Build합니다.
    • ${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_USERNAME }}/${{ env.IMAGE_NAME }}:latest 형식의 Image 태그를 사용합니다.
  • Step 4: Docker Image Push
    • 마지막으로, Build된 Docker Image를 Docker Hub에 Push합니다.

 

 

마무리

 

Github Actions는 Github Repository를 효율적으로 관리하고 개발 및 배포 작업을 자동화할 수 있는 강력한 도구입니다.

kt cloud에서는 Github Enterprise를 기반으로 Github Action CI 파이프라인을 구성함으로써

소스코드 작성 및 빌드, 컨테이너화 및 레지스트리 연계, 이후 배포 과정까지 자동화된 프로세스를 제공하고 있습니다.

Slack, Jira 등 다양한 커뮤니케이션과의 연동도 지원함으로써 User Experience 또한 크게 개선하였습니다 :)

 

이 포스팅에서는 GitHub Actions Workflow 파일 작성법과 기본 구성 요소를 살펴보았습니다.

kt cloud에서는 자체 구축한 Self-hosted Runner를 사용하여 반복적인 Build 및 배포 작업을 자동화 하고 있습니다.

단순한 CI/CD 작업 외에도 다양한 플러그인 및 Application 연동도 지원하니 Github Action Workflow를 활용한 파이프라인을 구축해 보세요!

 

 

관련글

https://www.google.com/url?sa=i&url=https%3A%2F%2Fgist.github.com%2Fsabman%2F617c2b2cd0d9239c25f64fd784af9300&psig=AOvVaw20L3cYor8s5MAC4dl4gkhz&ust=1730970374549000&source=images&cd=vfe&opi=89978449&ved=0CBcQjhxqFwoTCODg76Stx4kDFQAAAAAdAAAAABAJ

https://www.google.com/url?sa=i&url=https%3A%2F%2Fgist.github.com%2Fsabman%2F617c2b2cd0d9239c25f64fd784af9300&psig=AOvVaw20L3cYor8s5MAC4dl4gkhz&ust=1730970374549000&source=images&cd=vfe&opi=89978449&ved=0CBcQjhxqFwoTCODg76Stx4kDFQAAAAAdAAAAABAJ

https://www.google.com/url?sa=i&url=https%3A%2F%2Fdocs.github.com%2Fko%2Factions%2Fhosting-your-own-runners%2Fmanaging-self-hosted-runners-with-actions-runner-controller%2Fabout-actions-runner-controller&psig=AOvVaw13PXdixrq_X8I94TUyCtXm&ust=1730970537136000&source=images&cd=vfe&opi=89978449&ved=0CBcQjhxqFwoTCLiD2vOtx4kDFQAAAAAdAAAAABAE

https://www.google.com/url?sa=i&url=https%3A%2F%2Flearn.microsoft.com%2Fko-kr%2Fdevops%2Fdeliver%2Fiac-github-actions&psig=AOvVaw1yro6CNy3x0Zj3xjsAdDJw&ust=1730970593566000&source=images&cd=vfe&opi=89978449&ved=0CBcQjhxqFwoTCJiL_4yux4kDFQAAAAAdAAAAABAJ

https://www.google.com/search?q=github+action+pipeline&sca_esv=aaf21fd86605b0cd&rlz=1C5CHFA_enKR1015KR1035&udm=2&biw=1991&bih=1146&sxsrf=ADLYWILzFIIYpBO1iNtG0uxGQFPFzyI1EQ%3A1730884260097&ei=pDIrZ_3KBZOX0-kPj-qjuAg&ved=0ahUKEwj9rOGrrseJAxWTyzQHHQ_1CIcQ4dUDCBA&uact=5&oq=github+action+pipeline&gs_lp=EgNpbWciFmdpdGh1YiBhY3Rpb24gcGlwZWxpbmUyBRAAGIAEMgQQABgeMgQQABgeMgQQABgeMgYQABgIGB4yBhAAGAgYHjIGEAAYCBgeMgYQABgIGB4yBhAAGAUYHjIGEAAYBRgeSMYgUOMCWLcfcAR4AJABAJgBtwGgAYQYqgEEMC4yNbgBA8gBAPgBAZgCFaAC_RLCAgQQIxgnwgIIEAAYgAQYsQPCAgsQABiABBixAxiDAcICBBAAGAOYAwCIBgGSBwQyLjE5oAfpnAE&sclient=img#vhid=xATtP_yKFSzBnM&vssid=mosaic:~:text=%EC%9D%B4%EB%AF%B8%EC%A7%80%20%EB%82%B4%20%EA%B2%80%EC%83%89-,GitHub%20Actions%20%EB%B0%8F%20GitFlow%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%20AKS%20%EC%95%B1%EC%9A%A9%20CI/CD%20%2D%20Azure%20Example%20Scenarios%20%7C%20Microsoft%20Learn,-%EB%B0%A9%EB%AC%B8

https://www.google.com/url?sa=i&url=https%3A%2F%2Fstackoverflow.com%2Fquestions%2F69840694%2Fwhat-does-ubuntu-latest-mean-for-github-actions&psig=AOvVaw3fdVYnx5Sl8aG8TmLDQjD_&ust=1730972624389000&source=images&cd=vfe&opi=89978449&ved=0CBQQjRxqFwoTCJirgdW1x4kDFQAAAAAdAAAAABAd

https://github.com/kt-cloud-org-example/sddc-gateway/actions/runs/11495298860

 

 

관련글