Skip to content

기술공유 09. GitHub Actions로 CI CD 구성하기

Aeree Cho edited this page Dec 19, 2019 · 3 revisions

2018년 깃헙에서 베타 서비스로 공개한 GitHub Actions 는 github에서 제공하는 자체 호스팅 서버를 이용하여 특정 이벤트 발생 시 YAML구문으로 정의한 일련의 workflow를 실행할 수 있는 도구입니다. 이를 이용하면 코드를 빌드하고 테스트 및 배포하는 CI / CD를 쉽게 구성할 수 있습니다. 저희는 추후 CI/CD프로세스에 깃헙 액션을 적극 도입하기 위해 공식문서 등을 읽고 공부해보았습니다.

CI

빌드하고 성공하면 테스트하고 로그 남기기

GitHub Actions로 코드 빌드 및 테스트를 자동화하는 사용자 지정 CI workflow를 만들 수 있습니다.

CI에서 진행할수 있는 테스트는 code linters, security checks, code coverage, functional tests, and other custom checks (린트, 보안, 커버리지, 기능 테스트, 등)이 있습니다.

리포지토리에 CI를 설정할 때 리포지토리의 언어 및 프레임 워크를 기반으로 사용합니다. 예를 들어 Node.js 를 사용하는 경우 깃헙 액션 호스팅 러너에 Node.js 패키지를 설치하고 테스트를 실행하는 템플릿 파일을 사용할 수 있습니다.

CD

테스트 통과하면 자동으로 배포하기

지속적인 배포는 지속적인 통합을 기반으로합니다. 새 코드가 커밋되고 CI 테스트를 통과하면 코드가 자동으로 프로덕션에 배포됩니다. GitHub Actions로 CD workflows를 생성하여 저장소의 모든 클라우드, 자체 호스팅 서비스 또는 플랫폼에 코드를 자동으로 배포 할 수 있습니다.

GitHub 액션의 장점

  • 지속적인 통합 및 지속적인 배포를 수행 할 수있는 자동화를 제공
  • 가상 머신 또는 Docker 컨테이너에서 직접 실행
  • 코드를 배포하거나 앱을 제공 할 필요가 없음
  • 시크릿키을 생성하고 사용하기위한 간단한 인터페이스를 통해 액션을 사용하는 사람의 자격 증명을 저장할 필요없이 타사 서비스와 상호 작용할 수 있음.

TIP

  • action을 공유하려면 퍼블릭 레포여야함

  • 다른 사람들과 공유할 액션을 개발하는 경우 다른 애플리케이션 코드와 번들로 묶지 않고 자체 리포지토리에 액션을 유지하는게 좋음


GitHub Actions에서 사용되는 용어

Workflow

  • 워크 플로우는 레포지토리에서 GitHub의 프로젝트를 빌드, 테스트, 패키지, 릴리스 또는 배포하기 위해 설정할 수있는 사용자 지정 자동화 프로세스입니다.
  • YAML 구문을 사용하여 워크 플로우를 구성하고 이를 저장소에 ./github/workflows 경로에 저장해야합니다. 워크 플로우를 트리거하면 워크 플로우의 각 단계에 대한 빌드 로그, 테스트 결과, 아티팩트 및 상태가 표시됩니다.
  • GitHub 액션에 이메일 또는 웹 알림을 활성화하면 트리거 한 워크 플로 실행이 완료되면 알림이 표시됩니다. 알림에는 워크 플로 실행 상태 (성공, 실패, 중립 및 취소 된 실행 포함)가 포함됩니다. 워크 플로 실행이 실패한 경우에만 알림을 받도록 선택할 수도 있습니다. 설정방법
  • 레포지토리 리드미에 워크플로우 상태를 배지로 추가할수 있습니다. 참고

Runner

깃헙 액션 러너 어플리케이션이 설치 된 모든 머신. 자체 러너를 호스팅 할 수 있습니다!

trigger event

  • GitHub에서 이벤트가 발생한 후 워크 플로우를 트리거하려면 on:워크 플로우 이름 뒤에 이벤트 값을 추가해야합니다 . 예를 들어, 아래의 워크 플로우는 변경 사항이 저장소로 푸시 될 때 트리거됩니다.
  • 워크 플로우를 스케줄하기 위해 워크 플로우 파일에서 POSIX cron 구문을 사용할 수 있습니다. 예약 된 워크 플로를 실행할 수있는 가장 짧은 간격은 5 분마다 한 번씩입니다. 예를 들아래 워크 플로는 1 시간마다 트리거됩니다.
on:
  schedule:
    - cron:  '0 * * * *'
  • 외부 이벤트가 발생한 후 워크 플로우를 트리거하려면 저장소의 디스패치 이벤트를 작성하고 REST API 엔드 포인트를 호출하여 웹 후크 이벤트를 호출 할 수 있습니다 . 리포지토리 디스패치 이벤트 만들기

machine

여러 운영 체제, 플랫폼 및 언어 버전을 동시에 테스트하기 위해 빌드 매트릭스를 구성 할 수 있습니다.

runs-on: ${{ matrix.os }}
strategy:
  matrix:
    os: [ubuntu-14.04, ubuntu-18.04]
    node: [6, 8, 10]

환경변수

워크 플로우 실행의 모든 단계에서 사용할 수있는 기본 환경 변수를 설정할수 있습니다. 환경 변수는 대소 문자를 구분합니다.

사용자 정의 환경 변수를 설정하려면 워크 플로우 파일에서 변수를 지정해야합니다. step, job 또는 전체 workflow 대한 환경 변수를 정의 할 수 있습니다. job.step.env, job.env, env 모두 가능합니다.

steps:
  - name: Hello world
    run: echo Hello world $FIRST_NAME $middle_name $Last_Name!
    env:
      FIRST_NAME: Mona
      middle_name: The
      Last_Name: Octocat

secrets

  • 저장소 settings 탭에서 생성 된 암호화 된 환경 변수이며 GitHub 작업에서만 사용할 수 있습니다.

  • 최대 100 개까지 등록 가능합니다.

  • 공개 키 인증 암호화 및 Poly1305 암호 알고리즘을 사용하여 웹 브라우저에서 암호화

  • 워크 플로우 파일에서 secrets컨텍스트를 사용하여 시크릿을 입력 또는 환경 변수로 설정해야합니다.

    steps:
      - name: Hello world action
        with: # Set the secret as an input
          super_secret: ${{ secrets.SuperSecret }}
        env: # Or as an environment variable
          super_secret: ${{ secrets.SuperSecret }}

yaml 메타데이터

  • name - 필수

  • author

  • description - 필수

  • inputs - 액션 실행 시 필요한 데이터를 명시할 수 있음 - 자체적으로 환경변수로 변환함

  • ouputs - 후속액션이 사용할 데이터를 출력할수 있음 - 즉 후속 액션에서 인풋으로 사용할 수 있음

  • runs -필수

  • env

  • Main - 자바스크립트로 run할때 필요

  • image - 도커로 run할때 필요

  • entrypoint - 도커로 run할때 사용. 도커의 엔트리포인트(도커파일)

  • args - 도커로 run할때 사용 도커 컨테이너의 입력을 정의하는 일 / 도커파일의 CMD부분을 대신할 수 있음


자바스크립트 / 도커 액션 비교

index.js의 소스를 노드 환경에서 실행할 것을 명시한 액션메타데이터 파일 입니다.

name: 'Hello World'
description: 'Greet someone and record the time'
inputs:
  who-to-greet:  # id of input
    description: 'Who to greet'
    required: true
    default: 'World'
outputs:
  time: # id of output
    description: 'The time we greeted you'
runs:
  using: 'node12'
  main: 'index.js'

# 도커일때
runs:
  using: 'docker'
  image: 'Dockerfile'
  args:
    - ${{ inputs.who-to-greet }}

자바스크립트로 실행할때 index.js

const core = require('@actions/core');
const github = require('@actions/github');

try {
  // `who-to-greet` input defined in action metadata file
  const nameToGreet = core.getInput('who-to-greet');
  console.log(`Hello ${nameToGreet}!`);
  const time = (new Date()).toTimeString();
  core.setOutput("time", time);
  // Get the JSON webhook payload for the event that triggered the workflow
  const payload = JSON.stringify(github.context.payload, undefined, 2)
  console.log(`The event payload: ${payload}`);
} catch (error) {
  core.setFailed(error.message);
}

도커로 실행할 때 Dockerfile

# Container image that runs your code
FROM alpine:3.10

# Copies your code file from your action repository to the filesystem path `/` of the container
COPY entrypoint.sh /entrypoint.sh

# Code file to execute when the docker container starts up (`entrypoint.sh`)
ENTRYPOINT ["/entrypoint.sh"]

entrypoint.sh

output 변수를 인식하려면 ##[set-output name=<output name>]<value>. 이와 같은 형식으로 구문을 사용해야합니다. 참고

#!/bin/sh -l

echo "Hello $1"
time=$(date)
echo ::set-output name=time::$time

워크플로우

# 워크플로우
on: [push]

jobs:  #
  hello_world_job:
    runs-on: ubuntu-latest
    name: A job to say hello
    steps:  # 스텝1
    - name: Hello world action step
      id: hello
      uses: actions/hello-world-javascript-action@v1  # 액션 메타 데이터 파일
      with: # 인풋, 아웃풋, 환경변수
        who-to-greet: 'Mona the Octocat' 

    - name: Get the output time # 스텝2
      run: echo "The time was ${{ steps.hello.outputs.time }}"

워크 플로에서 사용할 수있는 몇 가지 표준 작업

  • checkout 액션

    • 호스팅 서버에 자기저장소 복제가 필요할 때 사용합니다.

    • jobs:
        build:
          runs-on: ubuntu-latest
          steps:
            # This step checks out a copy of your repository.
            - uses: actions/checkout@v1
            # This step references the directory that contains the action.
            - uses: ./.github/actions/hello-world-action
Clone this wiki locally