lynlab logo

blog

about

#development#github#ci/cd

GitHub Actions Cheatsheet

GitHub Actions에서 워크플로우를 작성할 때 자주 사용하는 문법들을 모아보았습니다.

profile picture

Hoerin Doh | 2020. 02. 20

GitHub Actions 워크플로우를 작성할 때 자주 사용하는 문법들을 분류별로 정리해보았습니다. (2020년 3월 4일 기준)

on: 실행 조건

# 푸시 했을 때
on: push

# 푸시 했거나 PR을 열었을 때
on: [push, pull_request]

# 특정 브랜치를 푸시했을 때
on:
  push:
    branches:
    - master
    - feature/*

# 특정 태그를 푸시했을 때
on:
  push:
    tags:
    - v*

# Cron 스케줄에 따라 (시간대 기준은 UTC)
on:
  schedule:
  - cron: '*/30 * * * *'

# GitHub API로 수동 트리거
on: repository_dispatch

이벤트 종류

워크플로우를 실행할 수 있는 이벤트의 목록은 이 문서에서 확인할 수 있으며, 그 중에 자주 사용하는 것들을 간추리면 다음과 같습니다.

  • create : 브랜치, 태그를 새로 만들었을 떄
  • issues : 이슈를 생성, 삭제, 수정 등의 작업했을 때 (이슈를 메신저로 쏴주는 등의 워크플로우를 만들 수 있습니다.)
  • pull_request : 위 issues의 PR 버전
  • push : 커밋, 태그를 푸시했을 때

env: 환경변수 설정

모든 워크플로우 전역에 환경변수 값을 설정합니다.

env:
  DATABASE_URL: 127.0.0.1
  DATABASE_PORT: 5432

jobs: 워크플로우 Job 설정

이름이 jobs의 복수형인 것에서 확인할 수 있듯이 여러 개의 job을 실행할 수도 있습니다. 기본적으로 job들은 병렬로 실행되나, needs 문법을 이용하여 job간의 의존성 관계를 명시할 수 있습니다.

jobs:
  build:
    name: Run Tests and Build
    runs-on: ubuntu-18.04

    env:
      DATABASE_NAME: mydb_test
      DATABASE_USER: myuser

    # DB 등 job 실행에 필요한 서비스
    services:
      mysql:
        image: mysql:5.7
        env:
          MYSQL_ROOT_PASSWORD: mypassword
        ports:
        - 3306

    # Job을 복수의 서로 다른 환경으로 실행.
    strategy:
      matrix:
        node_version: [8, 10, 12]  # 각 step에서 ${{ matrix.node_version }} 으로 접근

    # 예제는 'Job의 실행 조건' 문단 참조
    if: github.event_name == 'push'

    steps:
    - name: Run something
      run: |
        echo 'Hello, world'
    - name: Notify results
      if: success()  # 예제는 'Step의 실행 조건' 문단 참조
      run: |
        curl -X POST ...

  deploy:
    name: Deploy
    needs: build  # 먼저 실행되어야하는 job id. 앞선 job이 실패하면 이 job은 실행되지 않는다.

jobs.<job_id>.if: Job의 실행 조건

Job이 실행되어야하는 조건을 설정할 수 있습니다.

# 특정 브랜치로 푸시했을 때
if: github.event_name == 'push' && github.ref == 'refs/heads/master'

# 특정 패턴의 태그를 푸시했을 때
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')

# master 브랜치로의 PR을 열었을 때
if: github.event_name == 'pull_request' && github.base_ref == 'refs/heads/master'

# Windows 대상 빌드일 때
if: runner.os == 'Windows'

# 특정 환경변수가 설정되어 있을 때
if: env.NODE_ENV == 'test'

jobs.<job_id>.steps.if: Step의 실행 조건

해당 Step이 실행되어야하는 조건을 설정할 수 있습니다.

### 모든 'Job의 실행 조건' 에 해당하는 문법 사용 가능 ###

# 앞선 Step이 성공하였을 때만
if: success()

# 앞선 Step이 실패하였을 때만
if: failure()

# 앞선 Step의 성공/실패 여부와 무관하게 항상 (결과를 Slack 등으로 발송할 때 유용)
if: always()

# 특정 strategy 에서만
if: ${{ matrix.node_version }} >= 8

더 추가되었으면 좋을 것 같은 내용은 댓글로 제보 부탁드립니다.

관련 포스트

asdf — 하나의 명령어로 관리하는 버전 매니저 썸네일

asdf — 하나의 명령어로 관리하는 버전 매니저

요즘 세상에 하나의 언어로 모든 시스템을 개발하는 경우는 보기 드뭅니다. asdf는 각각의 개발 환경을 플러그인 형식으로 만들어 하나의 명령어로 관리하기 위해 탄생했습니다.

Keybase와 GPG 키를 이용해 Git 커밋에 서명하기 썸네일

Keybase와 GPG 키를 이용해 Git 커밋에 서명하기

Git은 커밋한 사람의 이메일 주소를 검증하지 않습니다. 하지만 GPG 키를 이용해 커밋에 서명을 남기면 커밋한 사람이 본인임을 증명할 수 있습니다.

[Drone] 인메모리 볼륨을 활용해 CI 속도 향상하기 썸네일

[Drone] 인메모리 볼륨을 활용해 CI 속도 향상하기

데이터 IO 작업으로 인해 CI/CD 프로세스에 병목이 생긴다면, 인메모리 볼륨을 활용해 속도를 크게 향상시킬 수 있습니다.

크리에이티브 커먼즈 라이선스

본 사이트의 저작물은 별도의 언급이 없는 한 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0  국제 라이선스에 따라 이용할 수 있습니다.

© 2011 - 2021 Hoerin Doh, All rights reserved.