참고: GitHub 호스트 실행기는 현재 GitHub Enterprise Server에서 지원되지 않습니다. GitHub public roadmap에 예정된 향후 지원에 대해 자세히 알아볼 수 있습니다.
소개
이 가이드에서는 패키지된 Docker 컨테이너 작업을 만들고 사용하는 데 필요한 기본 구성 요소에 대해 알아봅니다. 작업을 패키지하는 데 필요한 구성 요소에 가이드의 초점을 맞추기 위해 작업 코드의 기능은 최소화됩니다. 사용자 지정 이름을 제공하면 로그에 "Hello World" 또는 "Hello [인사할 사람]"이 출력됩니다.
이 프로젝트를 완료한 후에는 고유한 Docker 컨테이너 작업을 빌드하고 워크플로에서 테스트하는 방법을 이해해야 합니다.
자체 호스팅 실행기는 Linux 운영 체제를 사용해야 하며 Docker 컨테이너 작업을 실행하기 위해 Docker가 설치되어 있어야 합니다. 자체 호스트 실행기의 요구 사항에 대한 자세한 내용은 “자체 호스트형 실행기 정보”를 참조하세요.
경고: 워크플로 및 작업을 만들 때 코드가 가능한 공격자의 신뢰할 수 없는 입력을 실행할 수 있는지 항상 고려해야 합니다. 공격자가 자신의 악성 콘텐츠를 삽입할 수 있으므로 특정 컨텍스트는 신뢰할 수 없는 입력으로 처리되어야 합니다. 자세한 내용은 "GitHub Actions에 대한 보안 강화"을(를) 참조하세요.
필수 조건
- GitHub에 리포지토리를 만들고 워크스테이션에 복제해야 합니다. 자세한 내용은 "새 리포지토리 만들기" 및 "리포지토리 복제" 항목을 참조하세요.
- 리포지토리에서 Git LFS을(를) 사용하는 경우 리포지토리의 보관 파일에 개체를 포함해야 합니다. 자세한 내용은 "리포지토리의 보관 계층에 있는 Git LFS 개체 관리"을 참조하세요.
- GitHub Actions 환경 변수 및 Docker 컨테이너 파일 시스템을 기본적으로 이해하는 것이 유용할 수 있습니다. 자세한 내용은 "Store information in variables" 및 "GitHub 호스팅 실행기 사용"을(를) 참조하세요.
Dockerfile을 만듭니다.
새 hello-world-docker-action
디렉터리에서 Dockerfile
이라는 새 파일을 만듭니다. 문제가 있는 경우 파일 이름이 대문자로 올바르게 시작되는지 확인합니다(대문자 D
은 사용하고 대문자 f
는 사용하지 말 것). 자세한 내용은 "GitHub Actions에 대한 Dockerfile 지원"을 참조하세요.
Dockerfile
# Container image that runs your code FROM alpine:3.10 # Copies your code file from your action repository to the filesystem path `/` of the container COPY entrypoint.sh /entrypoint.sh # Code file to execute when the docker container starts up (`entrypoint.sh`) ENTRYPOINT ["/entrypoint.sh"]
# Container image that runs your code
FROM alpine:3.10
# Copies your code file from your action repository to the filesystem path `/` of the container
COPY entrypoint.sh /entrypoint.sh
# Code file to execute when the docker container starts up (`entrypoint.sh`)
ENTRYPOINT ["/entrypoint.sh"]
작업 메타데이터 파일 만들기
위에서 만든 hello-world-docker-action
디렉터리에 새 action.yml
파일을 만듭니다. 자세한 내용은 "GitHub Actions에 대한 메타데이터 구문"을 참조하세요.
action.yml
# action.yml name: 'Hello World' description: 'Greet someone and record the time' inputs: who-to-greet: # id of input description: 'Who to greet' required: true default: 'World' outputs: time: # id of output description: 'The time we greeted you' runs: using: 'docker' image: 'Dockerfile' args: - ${{ inputs.who-to-greet }}
# action.yml
name: 'Hello World'
description: 'Greet someone and record the time'
inputs:
who-to-greet: # id of input
description: 'Who to greet'
required: true
default: 'World'
outputs:
time: # id of output
description: 'The time we greeted you'
runs:
using: 'docker'
image: 'Dockerfile'
args:
- ${{ inputs.who-to-greet }}
이 메타데이터는 하나의 who-to-greet
입력과 하나의 time
출력 매개 변수를 정의합니다. Docker 컨테이너에 입력을 전달하려면 inputs
을 사용하여 입력을 선언하고 args
키워드에 입력을 전달해야 합니다. args
에 포함된 모든 항목은 컨테이너로 전달되지만 작업 사용자가 더 쉽게 검색할 수 있도록 입력을 사용하는 것이 좋습니다.
GitHub은(는) Dockerfile
에서 이미지를 빌드하고 해당 이미지를 사용하여 새 컨테이너에서 명령을 실행합니다.
작업 코드 작성
기본 Docker 이미지와 작업에 대해 어떤 언어든 선택할 수 있습니다. 다음 셸 스크립트 예에서는 who-to-greet
입력 변수를 사용하여 로그 파일에 "Hello [인사할 사람]"을 출력합니다.
다음으로 스크립트는 현재 시간을 가져오고 나중에 작업에서 실행되는 작업에서 사용할 수 있는 출력 변수로 설정합니다. GitHub이(가) 출력 변수를 인식하려면 $GITHUB_OUTPUT
환경 파일: echo "<output name>=<value>" >> $GITHUB_OUTPUT
에 작성해야 합니다. 자세한 내용은 "GitHub Actions에 대한 워크플로 명령"을(를) 참조하세요.
-
hello-world-docker-action
디렉터리에 새entrypoint.sh
파일을 만듭니다. -
entrypoint.sh
파일에코드(entrypoint.sh)를 추가합니다.
Shell #!/bin/sh -l echo "Hello $1" time=$(date) echo "time=$time" >> $GITHUB_OUTPUT
#!/bin/sh -l echo "Hello $1" time=$(date) echo "time=$time" >> $GITHUB_OUTPUT
entrypoint.sh
이(가) 오류 없이 실행되면 작업 상태가success
으(로) 설정됩니다. 작업 코드에서 종료 코드를 명시적으로 설정하여 작업의 상태를 제공할 수도 있습니다. 자세한 내용은 "작업의 종료 코드 설정"을 참조하세요. -
entrypoint.sh
파일을 실행 가능하게 만듭니다. Git은 클론/포크가 있을 때마다 다시 설정되지 않도록 파일의 사용 권한 모드를 명시적으로 변경하는 방법을 제공합니다.Shell git add entrypoint.sh git update-index --chmod=+x entrypoint.sh
git add entrypoint.sh git update-index --chmod=+x entrypoint.sh
-
필요에 따라 git 인덱스의 파일 사용 권한 모드를 검사 다음 명령을 실행합니다.
Shell git ls-files --stage entrypoint.sh
git ls-files --stage entrypoint.sh
같은
100755 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 entrypoint.sh
출력은 파일에 실행 권한이 있는 것을 의미합니다. 이 예제에서는755
실행 권한을 표시합니다.
추가 정보 만들기
사람들에게 작업을 사용하는 방법을 알리기 위해 추가 정보 파일을 만들 수 있습니다. 추가 정보는 작업을 공개적으로 공유하려는 경우에 가장 유용하지만 사용자 또는 팀에게 작업 사용 방법을 알려주는 좋은 방법이기도 합니다.
hello-world-docker-action
디렉터리에서 다음 정보를 지정하는 README.md
파일을 만듭니다.
- 작업이 수행하는 작업에 대한 자세한 설명입니다.
- 필수 입력 및 출력 인수입니다.
- 선택적 입력 및 출력 인수입니다.
- 작업에서 사용하는 비밀입니다.
- 작업에서 사용하는 환경 변수입니다.
- 워크플로에서 작업을 사용하는 방법의 예입니다.
README.md
# Hello world docker action This action prints "Hello World" or "Hello" + the name of a person to greet to the log. ## Inputs ## `who-to-greet` **Required** The name of the person to greet. Default `"World"`. ## Outputs ## `time` The time we greeted you. ## Example usage uses: actions/hello-world-docker-action@v2 with: who-to-greet: 'Mona the Octocat'
# Hello world docker action
This action prints "Hello World" or "Hello" + the name of a person to greet to the log.
## Inputs
## `who-to-greet`
**Required** The name of the person to greet. Default `"World"`.
## Outputs
## `time`
The time we greeted you.
## Example usage
uses: actions/hello-world-docker-action@v2
with:
who-to-greet: 'Mona the Octocat'
커밋, 태그 지정, GitHub Enterprise Server에 대한 작업 푸시
터미널에서 action.yml
, entrypoint.sh
, Dockerfile
, README.md
파일을 커밋합니다.
또한 작업 릴리스에 대한 버전 태그를 추가하는 것이 가장 좋습니다. 작업의 버전 관리 방법에 대한 자세한 내용은 “사용자 지정 작업 정보”를 참조하세요.
git add action.yml entrypoint.sh Dockerfile README.md git commit -m "My first action is ready" git tag -a -m "My first action release" v1 git push --follow-tags
git add action.yml entrypoint.sh Dockerfile README.md
git commit -m "My first action is ready"
git tag -a -m "My first action release" v1
git push --follow-tags
워크플로에서 작업 테스트
이제 워크플로에서 작업을 테스트할 준비가 되었습니다.
- 작업이 프라이빗 리포지토리에 있는 경우 액세스할 수 있는 사용자를 제어할 수 있습니다. 자세한 내용은 "리포지토리에 대한 GitHub Actions 설정 관리"을(를) 참조하세요. - 작업이 내부 리포지토리에 있는 경우 이에 액세스할 수 있는 사용자를 제어할 수 있습니다. 자세한 내용은 "리포지토리에 대한 GitHub Actions 설정 관리"을 참조하세요.
- 퍼블릭 작업은 모든 리포지토리의 워크플로에서 사용할 수 있습니다.
참고: GitHub Enterprise Server의 GitHub Actions는 GitHub.com 또는 GitHub Marketplace의 작업에 대한 액세스가 제한될 수 있습니다. 자세한 내용은 "GitHub.com의 작업에 대한 액세스 관리"을 참조하고 GitHub Enterprise 사이트 관리자에게 문의하세요.
퍼블릭 작업을 사용하는 예제
다음 워크플로 코드는 퍼블릭 actions/hello-world-docker-action
리포지토리에서 완료된 hello world 작업을 사용합니다. 다음 워크플로 예제 코드를 .github/workflows/main.yml
파일에 복사하고 actions/hello-world-docker-action
를 리포지토리 및 작업 이름으로 바꿉니다. who-to-greet
입력을 자신의 이름으로 바꿀 수도 있습니다.
.github/workflows/main.yml
on: [push] jobs: hello_world_job: runs-on: ubuntu-latest name: A job to say hello steps: - name: Hello world action step id: hello uses: actions/hello-world-docker-action@v2 with: who-to-greet: 'Mona the Octocat' # Use the output from the `hello` step - name: Get the output time run: echo "The time was ${{ steps.hello.outputs.time }}"
on: [push]
jobs:
hello_world_job:
runs-on: ubuntu-latest
name: A job to say hello
steps:
- name: Hello world action step
id: hello
uses: actions/hello-world-docker-action@v2
with:
who-to-greet: 'Mona the Octocat'
# Use the output from the `hello` step
- name: Get the output time
run: echo "The time was ${{ steps.hello.outputs.time }}"
프라이빗 작업을 사용하는 예제
다음 예제 워크플로 코드를 작업 리포지토리의 .github/workflows/main.yml
파일에 복사합니다. who-to-greet
입력을 자신의 이름으로 바꿀 수도 있습니다.
.github/workflows/main.yml
on: [push] jobs: hello_world_job: runs-on: ubuntu-latest name: A job to say hello steps: # To use this repository's private action, # you must check out the repository - name: Checkout uses: actions/checkout@v4 - name: Hello world action step uses: ./ # Uses an action in the root directory id: hello with: who-to-greet: 'Mona the Octocat' # Use the output from the `hello` step - name: Get the output time run: echo "The time was ${{ steps.hello.outputs.time }}"
on: [push]
jobs:
hello_world_job:
runs-on: ubuntu-latest
name: A job to say hello
steps:
# To use this repository's private action,
# you must check out the repository
- name: Checkout
uses: actions/checkout@v4
- name: Hello world action step
uses: ./ # Uses an action in the root directory
id: hello
with:
who-to-greet: 'Mona the Octocat'
# Use the output from the `hello` step
- name: Get the output time
run: echo "The time was ${{ steps.hello.outputs.time }}"
리포지토리에서 작업 탭을 클릭하고 최신 워크플로 실행을 선택합니다. 작업 아래 또는 시각화 그래프에서 인사할 작업을 클릭합니다.
Hello world 동작 단계 클릭하면 “Hello Mona Octocat” 또는 who-to-greet
입력에 사용한 이름이 로그에 표시되어야 합니다.. 타임스탬프를 보려면 출력 시간 가져오기를 클릭합니다.
컨테이너 작업으로 만든 파일에 액세스
컨테이너 작업이 실행되면 실행기에서 기본 작업 디렉터리(GITHUB_WORKSPACE
)를 컨테이너의 /github/workspace
디렉터리에 자동으로 매핑합니다. 컨테이너의 이 디렉터리에 추가된 모든 파일은 동일한 작업의 모든 후속 단계에서 사용할 수 있습니다. 예를 들어 프로젝트를 빌드하는 컨테이너 작업이 있고 빌드 출력을 아티팩트로 업로드하려는 경우 다음 단계를 사용할 수 있습니다.
workflow.yml
jobs: build: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 # Output build artifacts to /github/workspace on the container. - name: Containerized Build uses: ./.github/actions/my-container-action - name: Upload Build Artifacts uses: actions/upload-artifact@v3 with: name: workspace_artifacts path: ${{ github.workspace }}
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
# Output build artifacts to /github/workspace on the container.
- name: Containerized Build
uses: ./.github/actions/my-container-action
- name: Upload Build Artifacts
uses: actions/upload-artifact@v3
with:
name: workspace_artifacts
path: ${{ github.workspace }}
빌드 출력을 아티팩트로 업로드하는 방법에 대한 자세한 내용은 "워크플로에서 데이터 저장 및 공유"을 참조하세요.
GitHub.com에 대한 Docker 컨테이너 작업 예제
GitHub.com에서 Docker 컨테이너 작업의 많은 예를 찾을 수 있습니다.