Logo

GitHub Actions에서 나만의 액션(action) 만들기

많은 분들이 GitHub Actions을 사용하실 때 GitHub Marketplace에 공개된 액션을 사용하실텐데요. 만약에 필요한 액션을 찾지 못했거나 회사에 보안 상의 이유로 승인되지 않은 외부 액션을 사용할 수 없다면 어떻게 해야 할까요?

이번 글에서는 GitHub Actions에서 직접 액션을 만들어보고 워크플로우에서 사용하거나 GitHub Marketplace를 통해 공유하는 방법에 대해서 알아보겠습니다.

액션의 종류

GitHub Actions에서는 도커(Docker) 컨테이너 액션, 자바스크립트 액션, 복합(composite) 액션, 이렇게 3가지 형태의 액션을 만들 수 있는데요.

도커 컨테이너 리눅스에서만 실행할 수 있다는 제한이 있고 도커에 대한 지식이 필요하며, 자바스크립트 액션은 관련 도구 키트를 어떻게 쓰는지 별도로 학습해야 합니다.

따라서 본 글에서는 만들기 제일 간단한 간단한 합성 액션을 한번 만들어보려고 합니다. 합성 액션을 통해서 우리는 여러 워크플로우에서 재사용이 가능한 여러 단계로 이루어진 하나의 액션을 만들 수 있습니다.

액션의 위치

액션은 사설 저장소(private repository)에도 생성할 수 있고, 공개 저장소(public repository)에도 생성할 수 있는데요. 보통 어떤 조직에서 내부적으로 액션을 공유하고 싶을 때 사설 저장소에 액션을 두고, 액션을 조직 외부까지 공개하고 싶을 때는 공개 저장소에 액션을 올립니다.

만약에 액션이 활용 범위가 넓지 않아 특정 저장소 내의 워크플로우에서만 사용하고 싶다면 .github/actions/ 디렉토리 안에 액션을 관리할 수도 있습니다.

저는 액션을 만들어서 GitHub Marketplace까지 올려볼 것이기 때문에 공개 저장소를 사용하겠습니다.

액션 생성

실습을 위해서 우선 자신의 깃허브에 계정에 calc-action라는 이름으로 새로운 코드 저장소를 만들고 시작하겠습니다.

그리고 프로젝트 최상위 디렉토리에 action.yml파일을 생성하고요. name 속성에 해당 액션의 이름을 넣어주셔야 합니다.

덧셈과 뺄셈을 해주는 간단한 액션을 만들 것이기 때문에 일단 아래와 같이 작성해보았습니다.

action.yml
name: Calc Action
runs:
  using: "composite"
  steps:
    - run: echo "Hi, I'm a calculator action!"
      shell: bash

복합 액션을 생성할 때는 runs.using 속성을 composite으로 설정해줘야 합니다. 그리고 runs.steps 속성을 통해서 해당 액션에서 수행해야하는 작업 단계를 나열해줍니다.

간 작업 단계에서는 use 속성을 사용해서 다른 액션을 명시하거나, run 속성을 하여 실행할 명령어를 직접 넣어줍니다. run 속성을 사용할 때는 반드시 shell 속성을 통해서 어떤 쉘을 사용할지를 반드시 명시해줘야 합니다.

액션 파일의 문법이 워크플로우 파일의 문법과 비슷한 것 같지만 자세히 보면 조금씩 다른 부분이 있어서 주의가 필요합니다.

액션 사용

위 실습 액션은 공개 저장소에 생성했기 때문에 깃허브 내의 아무 저장소에서 사용해볼 수 있습니다. 워크플로우 내의 특정 작업 단계의 uses 속성에 소유자/저장소@브랜치 형태로 사용할 액션을 가리켜주면 됩니다.

저는 calculate 작업의 첫 번째 단계로 실습 액션을 사용해보겠습니다.

.github/workflows/main.yml
name: Our Workflow
on: push
jobs:
  calculate:
    runs-on: ubuntu-latest
    steps:
      - uses: DaleSchool/calc-action@main

워크플로우를 저장한 후에 Actions 탭을 클릭하면 calculate 작업의 실행 결과를 확인할 수 있는데요. Hi, I'm a calculator action!라는 메세지가 실행 로그에 출력되면 액션이 정상적으로 작동하는 것입니다.

Log
☑️ Set up Job
☑️ Run DaleSchool/calc-action@main
▶ Run DaleSchool/calc-action@main▶ Run echo "Hi, I'm a calculator action!"Hi, I'm a calculator action!☑️ Complete Job

입력 변수 설정

액션에는 입력 값을 넘기면 재사용성을 높일 수 있는데요. 액션 파일의 inputs 속성을 통해서 입력 변수를 명시할 수 있습니다.

그럼 실습 액션이 두 개의 숫자를 받도록 x, y라는 입력 변수를 추가해볼까요?

action.yml
name: Calc Action
inputs:  x:    default: 0  y:    default: 0runs:
  using: "composite"
  steps:
    - run: echo "Hi, I'm a calculator action!"
      shell: bash
    - run: echo "x = ${{ inputs.x }}, y = ${{ inputs.y }}"      shell: bash

워크플로우에서 액션에 입력 값을 넘길 때는 with 속성을 사용합니다.

.github/workflows/main.yml
name: Our Workflow
on: push
jobs:
  calculate:
    runs-on: ubuntu-latest
    steps:
      - uses: DaleSchool/calc-action@main
        with:          x: 12          y: 3

calculate 작업 로그를 보시면 입력값으로 넘긴 123이 출력되는 것을 볼 수 있으실 것입니다.

Log
☑️ Set up Job
☑️ Run DaleSchool/calc-action@main
▶ Run DaleSchool/calc-action@main▶ Run echo "Hi, I'm a calculator action!"▶ Run echo "x = 12, y = 3"x = 12, y = 3☑️ Complete Job

출력 변수 설정

액션에 출력값이 있는 경우 outputs 속성을 사용하여 액션의 출력 변수를 설정해줄 수 있는데요. outputs 속성에서 각 작업 단계에서 전달해준 값을 읽기 위해서 GitHub Actions의 문맥(context)인 steps.<step_id>.outputs.<output_name> 문법을 사용합니다.

그럼 실습 액션에서 입력으로 넘어온 xy를 더한 결과와 뺀 결과를 각각 plus, minus로 출력해보겠습니다.

action.yml
name: Calc Action
inputs:
  x:
    default: 0
  y:
    default: 0
outputs:  plus:    value: ${{ steps.plus.outputs.result }}  minus:    value: ${{ steps.minus.outputs.result }}runs:
  using: "composite"
  steps:
    - run: echo "Hi, I'm a calculator action!"
      shell: bash
    - run: echo "x = ${{ inputs.x }}, y = ${{ inputs.y }}"
      shell: bash
    - id: plus      run: echo "result=$((${{ inputs.x }} + ${{ inputs.y }}))" >> $GITHUB_OUTPUT      shell: bash    - id: minus      run: echo "result=$((${{ inputs.x }} - ${{ inputs.y }}))" >> $GITHUB_OUTPUT      shell: bash

쉘(shell)에서 덧셈과 뺄샘을 하기 위해서 plusminus라는 두 개의 작업 단계가 추가되었으며 각 단계에서 계산 결과를 $GITHUB_OUTPUT 환경 파일에 전달하고 있습니다.

단계 간 출력 값을 전달하는 방법에 대해서는 별도 글에서 아주 자세히 설명하고 있습니다.

이제 워크플로우에서 실습 액션을 사용하는 단계에 id 속성을 통해 식별자를 부여해줍니다. 그 아래에 액션에서 나온 계선 결과를 출력하기 위한 단계를 추가하겠습니다.

.github/workflows/main.yml
name: Our Workflow
on: push
jobs:
  calculate:
    runs-on: ubuntu-latest
    steps:
      - id: calc        uses: DaleSchool/calc-action@main
        with:
          x: 12
          y: 3
      - name: Print results        run: |          echo "x + y = ${{ steps.calc.outputs.plus }}"          echo "x - y = ${{ steps.calc.outputs.minus }}"

calculate 작업 로그를 보시면 입력값으로 넘긴 xy의 뎃셈과 뺄샘 결과가 출력되는 것을 확인할 수 있습니다.

Log
☑️ Set up Job
☑️ Run DaleSchool/calc-action@main
▶ Run DaleSchool/calc-action@main
▶ Run echo "Hi, I'm a calculator action!"
▶ Run echo "x = 12, y = 3"
x = 12, y = 3
▶ Run echo "result=$((12 + 3))" >> "$GITHUB_OUTPUT"▶ Run echo "result=$((12 - 3))" >> "$GITHUB_OUTPUT"☑️ Print results▶ Run echo "x + y = 15"x + y = 15▶ Run echo "x - y = 9"x - y = 9☑️ Complete Job

액션 공개

우리가 만든 액션을 GitHub Marketplace을 올려서 누구나 쓸 수 있게 된다면 멋지겠죠?

이를 위해서는 반드시 description 속성에 해당 액션에 대한 설명을 넣어줘야 하고요. 필수적으로 README.md 파일에 액션 사용법을 간단히 적어줘야합니다.

action.yml
name: Calc Action
description: Calculate with Two Numbersinputs:
  x:
    default: 0
  y:
    default: 0
outputs:
  plus:
    value: ${{ steps.plus.outputs.result }}
  minus:
    value: ${{ steps.minus.outputs.result }}
runs:
  using: "composite"
  steps:
    - run: echo "Hi, I'm a calculator action!"
      shell: bash
    - run: echo "x = ${{ inputs.x }}, y = ${{ inputs.y }}"
      shell: bash
    - id: plus
      run: echo "result=$((${{ inputs.x }} + ${{ inputs.y }}))" >> "$GITHUB_OUTPUT"
      shell: bash
    - id: minus
      run: echo "result=$((${{ inputs.x }} - ${{ inputs.y }}))" >> "$GITHUB_OUTPUT"
      shell: bash

그 다음에는 액션이 있는 깃허브 저장소에서 v1 태그와 함께 릴리스(release)를 생성합니다. 이 때 Publish this Action to the GitHub Marketplace 체크 박스를 선택해주세요.

드디어 GitHub Marketplace에 액션이 공개되었습니다! 🥳 정말 간단하죠?

이제 이 액션을 사용하고 있는 모든 워크플로우의 uses 속성을 소유자/저장소@태그 형태로 갱신해주는 것이 좋습니다. 추후 바뀔 수 있는 브랜치에 의존하는 것보다는 고정된 태그에 의존하는 것이 일반적으로 더 권장되기 때문입니다.

.github/workflows/main.yml
name: Our Workflow
on: push
jobs:
  calculate:
    runs-on: ubuntu-latest
    steps:
      - id: calc
        uses: DaleSchool/calc-action@v1        with:
          x: 12
          y: 3
      - name: print results
        run: |
          echo "x + y = ${{ steps.calc.outputs.plus }}"
          echo "x - y = ${{ steps.calc.outputs.minus }}"

실습 코드

본 포스팅에서 만든 액션은 GitHub Marketplace에 공개해두었습니다.

https://github.com/marketplace/actions/calc-action

마치면서

지금까지 간단한 실습을 통해서 GitHub Actions에서 어떻게 액션을 직접 만들고 사용할 수 있는지에 대해서 알아보았습니다. 그리고 GitHub Marketplace를 통해 액션을 공유하는 방법도 살펴보았습니다.

참고로 액션은 재사용 가능한 워크플로우처럼 빈번하게 반복되는 일련의 단계를 재사용하기 위해서도 활용할 수 있습니다. 차이점이라고 한다면 액션은 하나의 작업 내에서 여러 단계를 재사용하기 용이한 반면에 재사용 가능한 워크플로우는 여러 작업을 재사용하기 용이합니다. 액션을 라이브러리로 비유하지만 재사용 가능한 워크플로우는 프레임워크에 좀 더 가까울 것 같네요.

GitHub Actions 관련 포스팅은 GitHub Actions 태그를 통해서 쉽게 만나보세요!