복합 액션(Composite Action) 만들기

복합 액션(Composite Action) 만들기

이 튜토리얼에서는 복합 액션을 직접 만들어 보는 방법을 알려드릴게요. 워크플로우 job 단계들을 하나의 액션으로 묶는 복합 액션의 기본 구성 요소를 배울 수 있어요.

출처: 문서

본문

Introduction

이 가이드에서는 패키징된 복합 액션을 만들고 사용하는 데 필요한 기본 구성 요소를 배우게 돼요. 이 가이드는 액션을 패키징하는 데 필요한 구성 요소에 초점을 맞추기 때문에 액션 코드의 기능은 최소한으로 유지해요. 이 액션은 "Hello World"를 출력한 다음 "Goodbye"를 출력하고, 사용자 지정 이름을 제공하면 "Hello [who-to-greet]"를 출력한 다음 "Goodbye"를 출력해요. 또한 액션은 무작위 숫자를 random-number 출력 변수에 매핑하고, goodbye.sh라는 스크립트를 실행해요.

이 프로젝트를 완료하면 복합 액션을 직접 만들고 워크플로우에서 테스트하는 방법을 이해할 수 있게 돼요.

[!WARNING] 워크플로우와 액션을 만들 때는 항상 코드가 잠재적인 공격자의 신뢰할 수 없는 입력을 실행할 수 있는지 고려해야 해요. 특정 컨텍스트는 신뢰할 수 없는 입력으로 취급해야 해요. 공격자가 자신의 악성 콘텐츠를 삽입할 수 있기 때문이에요. 자세한 내용은 Secure use reference 문서를 참고하세요.

Composite actions and reusable workflows

복합 액션을 사용하면 일련의 워크플로우 job 단계를 하나의 액션으로 모아서 여러 워크플로우에서 단일 job 단계로 실행할 수 있어요. 재사용 가능한 워크플로우는 다른 워크플로우 내에서 전체 워크플로우를 실행할 수 있게 해 주어 중복을 피하는 또 다른 방법을 제공해요. 자세한 내용은 Reusing workflow configurations 문서를 참고하세요.

Prerequisites

[!NOTE] 이 예시는 별도의 저장소에서 복합 액션을 만드는 방법을 설명해요. 하지만 같은 저장소 내에서도 복합 액션을 만들 수 있어요. 자세한 내용은 Creating a composite action 문서를 참고하세요.

시작하기 전에 GitHub에 저장소를 만들 거예요.

  1. GitHub에서 새 공개 저장소를 만드세요. 원하는 저장소 이름을 선택하거나 다음 hello-world-composite-action 예시를 사용할 수 있어요. 프로젝트를 GitHub에 푸시한 후에 이 파일들을 추가할 수 있어요. 자세한 내용은 Creating a new repository 문서를 참고하세요.

  2. 저장소를 컴퓨터에 복제하세요. 자세한 내용은 Cloning a repository 문서를 참고하세요.

  3. 터미널에서 새 저장소로 디렉터리를 변경하세요.

    cd hello-world-composite-action
    
  4. hello-world-composite-action 저장소에 예시 코드로 goodbye.sh라는 새 파일을 만드세요.

    echo "echo Goodbye" > goodbye.sh
    
  5. 터미널에서 goodbye.sh를 실행 가능하게 만드세요.

    chmod +x goodbye.sh
    
    chmod +x goodbye.sh
    
    git add --chmod=+x -- goodbye.sh
    
  6. 터미널에서 goodbye.sh 파일을 커밋하세요.

    git add goodbye.sh
    git commit -m "Add goodbye script"
    git push
    
    git add goodbye.sh
    git commit -m "Add goodbye script"
    git push
    
    git commit -m "Add goodbye script"
    git push
    

Creating an action metadata file

  1. hello-world-composite-action 저장소에 action.yml이라는 새 파일을 만들고 다음 예시 코드를 추가하세요. 이 문법에 대한 자세한 내용은 Metadata syntax reference 문서를 참고하세요.

    name: 'Hello World'
    description: 'Greet someone'
    inputs:
      who-to-greet:  # id of input
        description: 'Who to greet'
        required: true
        default: 'World'
    outputs:
      random-number:
        description: "Random number"
        value: ${{ steps.random-number-generator.outputs.random-number }}
    runs:
      using: "composite"
      steps:
        - name: Set Greeting
          run: echo "Hello $INPUT_WHO_TO_GREET."
          shell: bash
          env:
            INPUT_WHO_TO_GREET: ${{ inputs.who-to-greet }}
    
        - name: Random Number Generator
          id: random-number-generator
          run: echo "random-number=$(echo $RANDOM)" >> $GITHUB_OUTPUT
          shell: bash
    
        - name: Set GitHub Path
          run: echo "$GITHUB_ACTION_PATH" >> $GITHUB_PATH
          shell: bash
          env:
            GITHUB_ACTION_PATH: ${{ github.action_path }}
    
        - name: Run goodbye.sh
          run: goodbye.sh
          shell: bash
    
    

    이 파일은 who-to-greet 입력을 정의하고, 생성된 무작위 숫자를 random-number 출력 변수에 매핑하고, 액션의 경로를 러너 시스템 경로에 추가하며(실행 중 goodbye.sh 스크립트를 찾기 위해), goodbye.sh 스크립트를 실행해요.

    출력 관리에 대한 자세한 내용은 Metadata syntax reference 문서를 참고하세요.

    github.action_path 사용 방법에 대한 자세한 내용은 Contexts reference 문서를 참고하세요.

  2. 터미널에서 action.yml 파일을 커밋하세요.

    git add action.yml
    git commit -m "Add action"
    git push
    
  3. 터미널에서 태그를 추가하세요. 이 예시에서는 v1이라는 태그를 사용해요. 자세한 내용은 Managing custom actions 문서를 참고하세요.

    git tag -a -m "Description of this release" v1
    git push --follow-tags
    

Testing out your action in a workflow

다음 워크플로우 코드는 Creating a composite action에서 만든 완성된 hello world 액션을 사용해요.

워크플로우 코드를 다른 저장소의 .github/workflows/main.yml 파일에 복사하고, OWNERSHA를 각각 저장소 소유자와 사용하려는 커밋의 SHA로 바꾸세요. who-to-greet 입력도 자신의 이름으로 바꿀 수 있어요.

on: [push]

jobs:
  hello_world_job:
    runs-on: ubuntu-latest
    name: A job to say hello
    steps:
      - uses: actions/checkout@v6
      - id: foo
        uses: OWNER/hello-world-composite-action@SHA
        with:
          who-to-greet: 'Mona the Octocat'
      - run: echo random-number "$RANDOM_NUMBER"
        shell: bash
        env:
          RANDOM_NUMBER: ${{ steps.foo.outputs.random-number }}

저장소에서 Actions 탭을 클릭하고 가장 최근 워크플로우 실행을 선택하세요. 출력에는 "Hello Mona the Octocat", "Goodbye" 스크립트의 결과, 그리고 무작위 숫자가 포함되어야 해요.

Creating a composite action within the same repository

  1. hello-world-composite-action이라는 새 하위 폴더를 만드세요. 저장소 내 어떤 하위 폴더에든 배치할 수 있어요. 하지만 구성을 더 쉽게 하기 위해 .github/actions 하위 폴더에 배치하는 것이 좋아요.

  2. hello-world-composite-action 폴더에서 goodbye.sh 스크립트를 만들기 위해 동일한 단계를 수행하세요.

    echo "echo Goodbye" > goodbye.sh
    
    chmod +x goodbye.sh
    
    chmod +x goodbye.sh
    
    git add --chmod=+x -- goodbye.sh
    
    git add goodbye.sh
    git commit -m "Add goodbye script"
    git push
    
    git add goodbye.sh
    git commit -m "Add goodbye script"
    git push
    
    git commit -m "Add goodbye script"
    git push
    
  3. hello-world-composite-action 폴더에서 Creating a composite action의 단계를 기반으로 action.yml 파일을 만드세요.

  4. 액션을 사용할 때 uses 키에 복합 액션의 action.yml 파일이 있는 폴더의 상대 경로를 사용하세요. 아래 예시는 .github/actions/hello-world-composite-action 폴더에 있다고 가정해요.

on: [push]

jobs:
  hello_world_job:
    runs-on: ubuntu-latest
    name: A job to say hello
    steps:
      - uses: actions/checkout@v6
      - id: foo
        uses: ./.github/actions/hello-world-composite-action
        with:
          who-to-greet: 'Mona the Octocat'
      - run: echo random-number "$RANDOM_NUMBER"
        shell: bash
        env:
          RANDOM_NUMBER: ${{ steps.foo.outputs.random-number }}

더 알아보기 (Learn more)