GitHub Custom Actions는 개발자가 CI/CD 워크플로우 내에서 재사용 가능한 작업(Job)을 정의할 수 있게 해줍니다. 이러한 액션은 특정 용도에 맞춰 만들거나 GitHub 커뮤니티를 통해 공유할 수 있습니다. Custom Actions를 활용하면 개발팀은 워크플로우를 간소화하고 전체적인 효율성을 높일 수 있습니다.
이 가이드에서는 Custom Actions의 기본 개념과 다양한 유형, 그리고 이를 효과적으로 생성하고 관리하는 방법을 다룹니다. 또한, 버전 관리 및 비공개 리포지토리에서 액션을 사용하는 방법도 설명합니다.
GitHub Custom Actions란?
GitHub의 Custom Actions는 워크플로우 내에서 특정 작업을 수행하는 스크립트나 명령을 재사용 가능한 단위로 묶은 것입니다. 이러한 액션은 조직 내에서 공유하거나 공용으로 사용할 수 있습니다. Custom Actions는 복잡한 워크플로우를 모듈화하고, 여러 작업을 재사용할 수 있게 해주어 워크플로우를 간소화하는 데 도움을 줍니다.
Custom Actions의 유형
Custom Actions는 세 가지 주요 유형이 있습니다.
- Docker 컨테이너 액션: Docker 컨테이너를 사용해 액션을 정의합니다.
- JavaScript 액션: GitHub 호스팅 러너 내에서 직접 실행할 수 있도록 JavaScript로 작성된 액션입니다.
- Composite 액션: 여러 워크플로우 단계를 하나의 재사용 가능한 액션으로 결합합니다. Composite 액션은 여러 명령을 하나로 묶어 워크플로우를 간소화하는 데 유용합니다.
Composite Actions 설명
Composite Actions는 여러 워크플로우 단계를 하나의 작업(Job)으로 묶어 실행할 수 있게 해줍니다. 이를 통해 관련된 명령들을 정리하여 여러 워크플로우에서 재사용할 수 있습니다. 예를 들어, 애플리케이션을 빌드하고 배포하는 과정을 하나의 Composite Action으로 만들어 여러 워크플로우에서 간단하게 참조할 수 있습니다.
Java Maven 애플리케이션을 위한 Custom Action 만들기
Custom Action을 만드는 방법을 설명하기 위해, Maven을 사용하여 Java 애플리케이션을 패키징하고 Azure Blob Storage에 업로드하는 Custom Action을 만들어 보겠습니다. 이 과정은 다음 단계를 포함합니다:
- 리포지토리 체크아웃
- Maven 설정 구성
- Maven으로 애플리케이션 패키징
- Azure CLI 로그인
- 패키지 파일을 Azure Blob Storage에 업로드
action.yml 파일 예시
name: Integration Java application
description: Integration Java Application using maven, azurecli and blob
inputs:
gh-admin-token:
required: true
azure-credentials:
required: true
storage-account:
required: true
storage-container:
required: true
app-name:
required: true
runs:
using: "composite"
steps:
- name: Check out the repo
uses: actions/checkout@v4.1.7
with:
token: ${{ inputs.gh-admin-token }}
fetch-depth: 1
- name: Configure maven settings.xml
run: |
cat <<EOF > ./settings.xml
<settings>
<servers>
<server>
<id>github</id>
<username>${{ github.actor }}</username>
<password>${{ inputs.gh-admin-token }}</password>
</server>
</servers>
</settings>
EOF
- name: Package artifact file
run: mvn -B -DskipTests package --file ./pom.xml -s ./settings.xml
- name: Log in to Azure CLI
run: |
echo "$AZURE_CREDENTIALS" > azure_credentials.json
az login --service-principal --username $(jq -r .clientId azure_credentials.json) \
-p=$(jq -r .clientSecret azure_credentials.json) \
--tenant $(jq -r .tenantId azure_credentials.json)
az account set --subscription $(jq -r .subscriptionId azure_credentials.json)
- name: Upload war file to Object Storage
run: |
az storage blob upload \
--account-name ${{ inputs.storage-account }} \
--container-name ${{ inputs.storage-container }} \
--file ./target/*.war \
--name ${{ inputs.app-name }}.war \
--overwrite --auth-mode login
조직 내에서 Custom Actions 공유하기
Custom Actions는 GitHub 조직 내에서 공유하여 재사용할 수 있습니다. 이를 위해 리포지토리 권한을 적절하게 설정해, 다른 워크플로우에서 액션을 사용할 수 있도록 해야 합니다. 자세한 내용은 GitHub 문서를 참고하세요.
Custom Actions를 위한 릴리스 관리
Custom Actions의 업데이트를 관리하려면 릴리스 관리를 사용하는 것이 좋습니다. 버전을 태깅하여, 워크플로우가 항상 올바른 버전의 액션을 사용하도록 보장할 수 있습니다.
릴리스를 생성 명령
gh release create v1.0.0 --title "v1.0.0" --notes "this is a test release"
릴리스를 생성한 후 워크플로우에서 태그를 다음과 같이 참조할 수 있습니다.
uses: <org>/<repo>@v1.0.1
비공개 리포지토리에서 Custom Actions 사용하기
비공개 리포지토리에 있는 Custom Actions를 사용하려면 추가 설정이 필요합니다. 한 가지 방법은 Personal Access Token(PAT)을 사용해 해당 리포지토리를 체크아웃한 후, 상대 경로를 사용해 액션을 실행하는 것입니다.
Private Repository에서 Custom Action 사용 예시
steps:
- name: Check out deploy-ssh-blob-vm repository
uses: actions/checkout@v4
with:
repository: <org>/<repository>
ref: v1.0.1
token: "${{ secrets.<MY_REPO_ACCESS_TOKEN> }}"
path: .github/deploy-ssh-blob-vm
- name: Deploy java app
uses: ./.github/deploy-ssh-blob-vm
효율적인 워크플로우 재사용
중복을 방지하려면 Custom Actions를 하나의 공용 리포지토리에 중앙 집중화하고, 모든 워크플로우에서 참조하는 것이 좋습니다. 또한, 태그와 릴리스 관리를 사용하여 안정적이고 테스트된 버전의 액션이 워크플로우에서 사용되도록 해야 합니다.
Custom Actions를 만들어 재사용 가능한 워크플로우를 관리함으로써, CI/CD 프로세스의 복잡성을 크게 줄일 수 있습니다. 액션을 조직 내에서 공유하거나 릴리스 관리를 통해 업데이트를 관리하면 개발팀의 워크플로우는 더 모듈화되고 확장 가능해집니다.