티스토리 뷰

❖ 워크플로우 작성

  • 프로젝트 최상단에 .github/workflows 디렉토리를 만들고 ci or cd 스크립트를 실행할 yml or yaml 파일을 생성합니다.
  • 여러개의 파일을 구분하여 워크플로우를 작성할 수 있습니다.
.github/workflows/ci.yml
.github/workflows/cd.yml
...
  • 워크플로우 파일 예제
# 선택사항 - 워크플로우 이름
name: learn-github-actions

#선택사항 - github repository's "Actions" tab에 보여질 이름입니다.
run-name: ${{ github.actor }} is learning GitHub Actions

# 트리거를 지정합니다.
on: [push]

jobs:
  check-bats-version: # check-bats-version으로 job 이름 정의
    runs-on: ubuntu-latest # 우분투 최신버전으로 실행한다.
    steps:
      - uses: actions/checkout@v4 # 체크아웃 합니다.
      - uses: actions/setup-node@v4 # node 20 version을 설치합니다.
        with:
          node-version: '20'
      - run: npm install -g bats # bats를 설치합니다.
      - run: bats -v # bats 버전을 출력합니다.

❖ 워크플로우 옵션

◆ ON

1. push - 레포지토리에 변경사항이 푸시될 때 워크플로우가 실행됩니다.

  • branches - 특정 브랜치에 푸시된 경우 워크플로우가 실행됩니다.
  • tags - 매칭되는 특정 태그가 푸시된 경우 워크플로우가 실행됩니다.
  • paths - 특정 파일 경로나 패턴에 맞는 파일이 푸시된 경우 워크플로우가 실행됩니다.
on:
  push:
    branches:
      - main
    tags:
      - 'v1.*'
    paths:
      - 'src/**'

 

2. pull_request - 풀 리퀘스트가 열리거가 업데이트 될 때 실행됩니다.

  • types
    • opened - 새로운 풀 리퀘스트가 생성될때
    • synchronize - 이미 열린 풀리퀘스트에 새로운 커밋이 추가될 때
    • reopened - 풀 리퀘스트를 다시 요청할 경우
on:
  pull_request:
    branches:
      - main
    types:
      - opened
      - synchronize
      - reopened

 

3. schedule - 정기적으로 실행합니다.

  • cron - 스케줄을 정의합니다.
  • minute (0 - 59), hour (0 - 23), day of the month (1 - 31), month (1 - 12 or JAN-DEC), day of the week (0 - 6 or SUN-SAT)
on:
  schedule:
    - cron: '0 0 * * 1'

 

4. workflow_dispatch

name: Deploy

on:
  workflow_dispatch:
    inputs:
      stage:
        description: '배포할 환경을 선택하세요'
        required: true
        default: 'dev'
        type: choice
        options:
          - dev
          - stg
          - qa
          - prod

jobs:
    print_data:
        name: build
        runs-on: ubuntu-latest

        steps:
            - uses: actions/checkout@v2
            - name: print env
              run: |
                echo "stage: ${{ github.event.inputs.stage }}"
                echo "Branch name: ${GITHUB_REF#refs/heads/}"
                echo "Tag name: ${GITHUB_REF#refs/tags/}"
                echo "ref name: ${github.ref_name}" # 브랜치라면 브랜치명, tag라면 tag명이 설정된다.

◆ job

  • 기본구조
이름 설명
jobs 여러개의 job을 정의할 수 있는 상위 키워드입니다.
job_id 각 job의 고유 식별자, 다른 job에서 의존성을 설정 할 때 사용됩니다.
name 각 job에 대한 설명적인 이름을 정의합니다.
runs-on job이 실행될 가상환경을 지정합니다.
step job에서 수행될 구체적인 작업 단계들이며, 각 단계는 순차적으로 실행됩니다.

 

1. runs-on

jobs:
  example-job:
    runs-on: ubuntu-latest
    steps:
      - name: Check Ubuntu version
        run: lsb_release -a
jobs:
  self-hosted-job:
    runs-on: [self-hosted, linux, x64, gpu]
    steps:
      - name: Run on self-hosted runner
        run: echo "Running on self-hosted runner!"

 

2. steps

  • steps는 job 내에서 실행될 구체적인 작업을 정의하는 부분입니다.
  • name - 각 step의 이름
  • uses - 다른 액션 또는 재사용 가능한 작업을 실행할 때 사용합니다.
               github에서 제공하는 기본 액션이나 사용자 정의 액션을 실행할 때 사용됩니다.
  • run - 직접 쉘 명령을 실행할 때 사용합니다. 스크립트나 명령을 실행할 때 주로 사용됩니다.
  • evn - 각 단계에서 사용할 환경 변수를 설정 할 수 있습니다.
jobs:
  example-job:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Run a script
        run: |
          echo "This is a multi-line script"
          ls -al
          
		  - name: Print a custom environment variable
		    run: echo "My variable is $MY_ENV_VAR"
		    env:
		      MY_ENV_VAR: "Hello World"

 

3. job간의 의존성 설정

  • needs 키워드를 사용하여 특정 job이 다른 job의 실행 결과에 의존하도록 설정 할 수 있습니다.
  • 여러개의 job의 의존성을 연결을 할 경우 대괄호로 정의합니다. [job1, job2]
  • needs에 설정 된 job이 완료가 되면 해당 job이 실행됩니다.
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Build the project
        run: echo "Building..."

  test:
    runs-on: ubuntu-latest
    needs: build  # build job이 완료된 후에 실행됨
    steps:
      - name: Test the project
        run: echo "Testing..."

 

4. 조건부 실행

  • job 레벨 조건부
jobs:
  conditional-job:
    runs-on: ubuntu-latest
    if: github.event_name == 'push'  # push 이벤트일 때만 실행
    steps:
      - run: echo "This job runs only on push events"
  • step 레벨의 조건부
jobs:
  example-job:
    runs-on: ubuntu-latest
    steps:
      - name: Conditional step
        run: echo "This step runs only on the main branch"
        if: github.ref == 'refs/heads/main'

 

5. strategy

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [10, 12, 14]
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Setup Node.js
        uses: actions/setup-node@v2
        with:
          node-version: ${{ matrix.node-version }}

      - name: Run tests
        run: npm test

 

6. timeout-minutes

  • job이 너무 오래 실행 될 경우 자동으로 종료되도록 제한 시간을 설정 할 수 있습니다.
jobs:
  example-job:
    runs-on: ubuntu-latest
    timeout-minutes: 10  # 10분 후에 작업이 자동으로 중단됨
    steps:
      - run: sleep 600

 

7. continue-on-error

  • 특정 job이 실패해도 워크플로우의 나머지 작업이 계속되도록 설정할 수 있습니다.
jobs:
  example-job:
    runs-on: ubuntu-latest
    continue-on-error: true
    steps:
      - run: exit 1  # 실패하지만 계속 진행

'git' 카테고리의 다른 글

github action으로 AWS ECS에 CD(배포) 구현  (0) 2024.11.08
gitgub actions 의 주요 개념  (0) 2024.11.05
CI / CD란?  (0) 2024.11.05
git commit 순서 바꾸기  (1) 2022.03.19
댓글
공지사항