LYnLab

소개블로그취미로그

게시물의 썸네일 이미지

GitHub Actions Cheatsheet

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

2020-02-20#프로그래밍

💡 이 글은 작성된지 1년 이상 지났습니다. 정보글의 경우 최신 내용이 아닐 수 있음에 유의해주세요.

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

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

관련된 글

Rails와 GitHub Actions에 커버리지 레포트를 달아보자

이 블로그의 CMS이기도 한 Shiori를 대폭 리팩토링하면서 테스트가 얼마나 잘 작성되어있는지 궁금해졌습니다.

Rails Global ID로 전역 객체 식별하기

Global ID는 Rails의 모든 객체를 식별할 수 있는 URI(Uniform Resource Identifier)입니다.

Ruby on WebAssembly: 살짝 맛보기

Ruby 3.2에 추가된 WebAssembly 지원을 간단하게 테스트해봅시다.

작성한 댓글은 giscus를 통해 GitHub Discussion에 저장됩니다.

크리에이티브 커먼즈 라이선스크리에이티브 커먼즈 저작자표시크리에이티브 커먼즈 동일조건변경허락

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

© 2011 - 2024 Hoerin Doh, All rights reserved.

LYnLab 로고About MeGitHubTwitterInstagram