Note
이 기능은 현재 공개 미리 보기 버전이며 변경될 수 있습니다.
컨테이너 사용자 지정 정보
GitHub Actions을(를) 사용하면 워크플로 파일에 container:
문을 사용하여 컨테이너 내에서 작업을 실행할 수 있습니다. 자세한 내용은 "컨테이너에서 작업 실행"을 참조하세요. 컨테이너 기반 작업을 처리하기 위해 자체 호스트형 실행기는 각 작업에 대한 컨테이너를 만듭니다.
GitHub Actions은(는) 자체 호스트형 실행기에서 컨테이너를 만드는 방법을 사용자 지정할 수 있는 명령을 지원합니다. 예를 들어 이러한 명령을 사용하여 Kubernetes 또는 Podman을 통해 컨테이너를 관리하고 컨테이너를 호출하는 데 사용되는 docker run
또는 docker create
명령을 사용자 지정할 수도 있습니다. 사용자 지정 명령은 실행기에서 특정 환경 변수를 설정할 때 자동으로 트리거되는 스크립트에 의해 실행됩니다. 자세한 내용은 아래의 "사용자 지정 스크립트 트리거"를 참조하세요.
이 사용자 지정은 Linux 기반 자체 호스트형 실행기에서만 사용할 수 있으며 루트 사용자 액세스는 필요하지 않습니다.
컨테이너 사용자 지정 명령
GitHub Actions에는 컨테이너 사용자 지정을 위한 다음 명령이 포함되어 있습니다.
prepare_job
: 작업이 시작될 때 호출됩니다.cleanup_job
: 작업이 종료될 때 호출됩니다.run_container_step
: 작업의 각 컨테이너 작업에 대해 한 번씩 호출됩니다.run_script_step
: 컨테이너 작업이 아닌 모든 단계를 실행합니다.
이러한 사용자 지정 명령은 각각 자체 JSON 파일에 정의되어야 합니다. 파일 이름은 확장명이 .json
인 명령 이름과 일치해야 합니다. 예를 들어 prepare_job
명령은 prepare_job.json
에 정의되어 있습니다. 그런 다음 이러한 JSON 파일은 자체 호스트형 실행기에서 주 index.js
스크립트의 일부로 함께 실행됩니다. 이 프로세스는 "사용자 지정 스크립트 생성"에서 자세히 설명합니다.
이러한 명령에는 아래에 자세히 설명된 구성 인수도 포함됩니다.
prepare_job
작업이 시작될 때 prepare_job
명령이 호출됩니다. GitHub Actions은(는) 작업에 있는 모든 작업 컨테이너 또는 서비스 컨테이너를 전달합니다. 이 명령은 작업에 서비스 컨테이너 또는 작업 컨테이너가 있는 경우 호출됩니다.
GitHub Actions은(는) prepare_job
명령에서 다음 작업을 수행한다고 가정합니다.
- 필요한 경우 이전 작업에서 항목을 정리합니다.
- 필요한 경우 네트워크를 만듭니다.
- 작업 및 서비스 컨테이너를 끌어옵니다.
- 작업 컨테이너를 시작합니다.
- 서비스 컨테이너를 시작합니다.
- GitHub Actions에 필요한 모든 정보를 응답 파일에 씁니다.
- 필수 사항: 컨테이너가
alpine
Linux 컨테이너인지 여부를 나타냅니다(isAlpine
부울 사용). - 선택 사항: 작업 컨텍스트에서 설정하려는 모든 컨텍스트 필드. 설정하지 않으면 사용자가 필드를 사용할 수 없습니다. 자세한 내용은 "워크플로 실행에 대한 컨텍스트 정보에 액세스"을 참조하세요.
- 필수 사항: 컨테이너가
- 상태 검사가 성공하고 작업/서비스 컨테이너가 시작되면
0
을 반환합니다.
prepare_job
의 인수
jobContainer
: 선택 사항. 지정된 작업 컨테이너에 대한 정보를 포함하는 개체입니다.image
: 필수 사항. Docker 이미지를 포함하는 문자열입니다.workingDirectory
: 필수 사항. 작업 디렉터리의 절대 경로를 포함하는 문자열입니다.createOptions
: 선택 사항. YAML에 지정된 선택적 생성 옵션입니다. 자세한 내용은 "컨테이너에서 작업 실행"을 참조하세요.environmentVariables
: 선택 사항. 주요 환경 변수의 맵을 설정합니다.userMountVolumes
: 선택 사항. YAML에 설정된 사용자 탑재 볼륨의 배열입니다. 자세한 내용은 "컨테이너에서 작업 실행"을 참조하세요.sourceVolumePath
: 필수 사항. Docker 컨테이너에 탑재될 볼륨의 원본 경로입니다.targetVolumePath
: 필수 사항. Docker 컨테이너에 탑재될 볼륨의 대상 경로입니다.readOnly
: 필수 사항. 탑재가 읽기 전용이어야 하는지 여부를 결정합니다.
systemMountVolumes
: 필수 사항. 컨테이너에 탑재할 탑재의 배열입니다(위와 동일한 필드).sourceVolumePath
: 필수 사항. Docker 컨테이너에 탑재될 볼륨의 원본 경로입니다.targetVolumePath
: 필수 사항. Docker 컨테이너에 탑재될 볼륨의 대상 경로입니다.readOnly
: 필수 사항. 탑재가 읽기 전용이어야 하는지 여부를 결정합니다.
registry
선택 사항. 프라이빗 컨테이너 레지스트리에 대한 Docker 레지스트리 자격 증명입니다.username
: 선택 사항. 레지스트리 계정의 사용자 이름입니다.password
: 선택 사항. 레지스트리 계정의 암호입니다.serverUrl
: 선택 사항. 레지스트리 URL입니다.
portMappings
: 선택 사항. 컨테이너에 매핑할 source:target 포트의 키 값 해시입니다.
services
: 선택 사항. 스핀업할 서비스 컨테이너의 배열입니다.contextName
: 필수 사항. 작업 컨텍스트에 있는 서비스의 이름입니다.image
: 필수 사항. Docker 이미지를 포함하는 문자열입니다.createOptions
: 선택 사항. YAML에 지정된 선택적 생성 옵션입니다. 자세한 내용은 "컨테이너에서 작업 실행"을 참조하세요.environmentVariables
: 선택 사항. 주요 환경 변수의 맵을 설정합니다.userMountVolumes
: 선택 사항. 컨테이너에 탑재할 탑재의 배열입니다(위와 동일한 필드).sourceVolumePath
: 필수 사항. Docker 컨테이너에 탑재될 볼륨의 원본 경로입니다.targetVolumePath
: 필수 사항. Docker 컨테이너에 탑재될 볼륨의 대상 경로입니다.readOnly
: 필수 사항. 탑재가 읽기 전용이어야 하는지 여부를 결정합니다.
registry
선택 사항. 프라이빗 컨테이너 레지스트리에 대한 Docker 레지스트리 자격 증명입니다.username
: 선택 사항. 레지스트리 계정의 사용자 이름입니다.password
: 선택 사항. 레지스트리 계정의 암호입니다.serverUrl
: 선택 사항. 레지스트리 URL입니다.
portMappings
: 선택 사항. 컨테이너에 매핑할 source:target 포트의 키 값 해시입니다.
prepare_job
에 대한 입력 예
{ "command": "prepare_job", "responseFile": "/users/octocat/runner/_work/{guid}.json", "state": {}, "args": { "jobContainer": { "image": "node:18" "workingDirectory": "/__w/octocat-test2/octocat-test2", "createOptions": "--cpus 1", "environmentVariables": { "NODE_ENV": "development" }, "userMountVolumes": [ { "sourceVolumePath": "my_docker_volume", "targetVolumePath": "/volume_mount", "readOnly": false } ], "systemMountVolumes": [ { "sourceVolumePath": "/home/octocat/git/runner/_layout/_work", "targetVolumePath": "/__w", "readOnly": false }, { "sourceVolumePath": "/home/octocat/git/runner/_layout/externals", "targetVolumePath": "/__e", "readOnly": true }, { "sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_temp", "targetVolumePath": "/__w/_temp", "readOnly": false }, { "sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_actions", "targetVolumePath": "/__w/_actions", "readOnly": false }, { "sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_tool", "targetVolumePath": "/__w/_tool", "readOnly": false }, { "sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_temp/_github_home", "targetVolumePath": "/github/home", "readOnly": false }, { "sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_temp/_github_workflow", "targetVolumePath": "/github/workflow", "readOnly": false } ], "registry": { "username": "octocat", "password": "examplePassword", "serverUrl": "https://index.docker.io/v1" }, "portMappings": { "80": "801" } }, "services": [ { "contextName": "redis", "image": "redis", "createOptions": "--cpus 1", "environmentVariables": {}, "userMountVolumes": [], "portMappings": { "80": "801" }, "registry": { "username": "octocat", "password": "examplePassword", "serverUrl": "https://index.docker.io/v1" } } ] } }
{
"command": "prepare_job",
"responseFile": "/users/octocat/runner/_work/{guid}.json",
"state": {},
"args": {
"jobContainer": {
"image": "node:18"
"workingDirectory": "/__w/octocat-test2/octocat-test2",
"createOptions": "--cpus 1",
"environmentVariables": {
"NODE_ENV": "development"
},
"userMountVolumes": [
{
"sourceVolumePath": "my_docker_volume",
"targetVolumePath": "/volume_mount",
"readOnly": false
}
],
"systemMountVolumes": [
{
"sourceVolumePath": "/home/octocat/git/runner/_layout/_work",
"targetVolumePath": "/__w",
"readOnly": false
},
{
"sourceVolumePath": "/home/octocat/git/runner/_layout/externals",
"targetVolumePath": "/__e",
"readOnly": true
},
{
"sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_temp",
"targetVolumePath": "/__w/_temp",
"readOnly": false
},
{
"sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_actions",
"targetVolumePath": "/__w/_actions",
"readOnly": false
},
{
"sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_tool",
"targetVolumePath": "/__w/_tool",
"readOnly": false
},
{
"sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_temp/_github_home",
"targetVolumePath": "/github/home",
"readOnly": false
},
{
"sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_temp/_github_workflow",
"targetVolumePath": "/github/workflow",
"readOnly": false
}
],
"registry": {
"username": "octocat",
"password": "examplePassword",
"serverUrl": "https://index.docker.io/v1"
},
"portMappings": { "80": "801" }
},
"services": [
{
"contextName": "redis",
"image": "redis",
"createOptions": "--cpus 1",
"environmentVariables": {},
"userMountVolumes": [],
"portMappings": { "80": "801" },
"registry": {
"username": "octocat",
"password": "examplePassword",
"serverUrl": "https://index.docker.io/v1"
}
}
]
}
}
prepare_job
에 대한 출력 예
이 예제 출력은 위의 입력에 정의된 responseFile
의 내용입니다.
{ "state": { "network": "example_network_53269bd575972817b43f7733536b200c", "jobContainer": "82e8219701fe096a35941d869cf3d71af1d943b5d8bdd718857fb87ac3042480", "serviceContainers": { "redis": "60972d9aa486605e66b0dad4abb678dc3d9116f536579e418176eedb8abb9105" } }, "context": { "container": { "id": "82e8219701fe096a35941d869cf3d71af1d943b5d8bdd718857fb87ac3042480", "network": "example_network_53269bd575972817b43f7733536b200c" }, "services": { "redis": { "id": "60972d9aa486605e66b0dad4abb678dc3d9116f536579e418176eedb8abb9105", "ports": { "8080": "8080" }, "network": "example_network_53269bd575972817b43f7733536b200c" } }, "isAlpine": true } }
{
"state": {
"network": "example_network_53269bd575972817b43f7733536b200c",
"jobContainer": "82e8219701fe096a35941d869cf3d71af1d943b5d8bdd718857fb87ac3042480",
"serviceContainers": {
"redis": "60972d9aa486605e66b0dad4abb678dc3d9116f536579e418176eedb8abb9105"
}
},
"context": {
"container": {
"id": "82e8219701fe096a35941d869cf3d71af1d943b5d8bdd718857fb87ac3042480",
"network": "example_network_53269bd575972817b43f7733536b200c"
},
"services": {
"redis": {
"id": "60972d9aa486605e66b0dad4abb678dc3d9116f536579e418176eedb8abb9105",
"ports": {
"8080": "8080"
},
"network": "example_network_53269bd575972817b43f7733536b200c"
}
},
"isAlpine": true
}
}
cleanup_job
작업이 종료될 때 cleanup_job
명령이 호출됩니다. GitHub Actions은(는) cleanup_job
명령에서 다음 작업을 수행한다고 가정합니다.
- 실행 중인 서비스 또는 작업 컨테이너(또는 동등한 Pod)를 중지합니다.
- 네트워크를 중지합니다(있는 경우).
- 작업 또는 서비스 컨테이너(또는 동등한 Pod)를 모두 삭제합니다.
- 네트워크를 삭제합니다(있는 경우).
- 작업에 대해 만들어진 다른 모든 항목을 정리합니다.
cleanup_job
의 인수
cleanup_job
에 대한 인수는 제공되지 않습니다.
cleanup_job
에 대한 입력 예
{ "command": "cleanup_job", "responseFile": null, "state": { "network": "example_network_53269bd575972817b43f7733536b200c", "jobContainer": "82e8219701fe096a35941d869cf3d71af1d943b5d8bdd718857fb87ac3042480", "serviceContainers": { "redis": "60972d9aa486605e66b0dad4abb678dc3d9116f536579e418176eedb8abb9105" } }, "args": {} }
{
"command": "cleanup_job",
"responseFile": null,
"state": {
"network": "example_network_53269bd575972817b43f7733536b200c",
"jobContainer": "82e8219701fe096a35941d869cf3d71af1d943b5d8bdd718857fb87ac3042480",
"serviceContainers": {
"redis": "60972d9aa486605e66b0dad4abb678dc3d9116f536579e418176eedb8abb9105"
}
},
"args": {}
}
cleanup_job
에 대한 출력 예
cleanup_job
에 대한 출력은 필요하지 않습니다.
run_container_step
run_container_step
명령은 작업의 각 컨테이너 작업에 대해 한 번씩 호출됩니다. GitHub Actions은(는) run_container_step
명령에서 다음 작업을 수행한다고 가정합니다.
- 필요한 컨테이너를 끌어오거나 빌드합니다(불가능할 경우 실패함).
- 컨테이너 작업을 실행하고 컨테이너의 종료 코드를 반환합니다.
- 모든 단계 로그 출력을 stdout 및 stderr로 스트리밍합니다.
- 실행 후 컨테이너를 정리합니다.
run_container_step
의 인수
image
: 선택 사항. Docker 이미지를 포함하는 문자열입니다. 그렇지 않으면 dockerfile을 제공해야 합니다.dockerfile
: 선택 사항. Dockerfile에 대한 경로를 포함하는 문자열입니다. 그렇지 않으면 이미지를 제공해야 합니다.entryPointArgs
: 선택 사항. 진입점 인수를 포함하는 목록입니다.entryPoint
: 선택 사항. 기본 이미지 진입점을 덮어써야 하는 경우 사용할 컨테이너 진입점입니다.workingDirectory
: 필수 사항. 작업 디렉터리의 절대 경로를 포함하는 문자열입니다.createOptions
: 선택 사항. YAML에 지정된 선택적 생성 옵션입니다. 자세한 내용은 "컨테이너에서 작업 실행"을 참조하세요.environmentVariables
: 선택 사항. 주요 환경 변수의 맵을 설정합니다.prependPath
: 선택 사항.$PATH
변수 앞에 추가할 추가 경로의 배열입니다.userMountVolumes
: 선택 사항. YAML에 설정된 사용자 탑재 볼륨의 배열입니다. 자세한 내용은 "컨테이너에서 작업 실행"을 참조하세요.sourceVolumePath
: 필수 사항. Docker 컨테이너에 탑재될 볼륨의 원본 경로입니다.targetVolumePath
: 필수 사항. Docker 컨테이너에 탑재될 볼륨의 대상 경로입니다.readOnly
: 필수 사항. 탑재가 읽기 전용이어야 하는지 여부를 결정합니다.
systemMountVolumes
: 필수 사항. 위와 동일한 필드를 사용하여 컨테이너에 탑재할 탑재 배열입니다.sourceVolumePath
: 필수 사항. Docker 컨테이너에 탑재될 볼륨의 원본 경로입니다.targetVolumePath
: 필수 사항. Docker 컨테이너에 탑재될 볼륨의 대상 경로입니다.readOnly
: 필수 사항. 탑재가 읽기 전용이어야 하는지 여부를 결정합니다.
registry
선택 사항. 프라이빗 컨테이너 레지스트리에 대한 Docker 레지스트리 자격 증명입니다.username
: 선택 사항. 레지스트리 계정의 사용자 이름입니다.password
: 선택 사항. 레지스트리 계정의 암호입니다.serverUrl
: 선택 사항. 레지스트리 URL입니다.
portMappings
: 선택 사항. 컨테이너에 매핑할 source:target 포트의 키 값 해시입니다.
이미지에 대한 예제 입력
Docker 이미지를 사용하는 경우 "image":
매개 변수에 이미지 이름을 지정할 수 있습니다.
{ "command": "run_container_step", "responseFile": null, "state": { "network": "example_network_53269bd575972817b43f7733536b200c", "jobContainer": "82e8219701fe096a35941d869cf3d71af1d943b5d8bdd718857fb87ac3042480", "serviceContainers": { "redis": "60972d9aa486605e66b0dad4abb678dc3d9116f536579e418176eedb8abb9105" } }, "args": { "image": "node:18", "dockerfile": null, "entryPointArgs": ["-f", "/dev/null"], "entryPoint": "tail", "workingDirectory": "/__w/octocat-test2/octocat-test2", "createOptions": "--cpus 1", "environmentVariables": { "NODE_ENV": "development" }, "prependPath": ["/foo/bar", "bar/foo"], "userMountVolumes": [ { "sourceVolumePath": "my_docker_volume", "targetVolumePath": "/volume_mount", "readOnly": false } ], "systemMountVolumes": [ { "sourceVolumePath": "/home/octocat/git/runner/_layout/_work", "targetVolumePath": "/__w", "readOnly": false }, { "sourceVolumePath": "/home/octocat/git/runner/_layout/externals", "targetVolumePath": "/__e", "readOnly": true }, { "sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_temp", "targetVolumePath": "/__w/_temp", "readOnly": false }, { "sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_actions", "targetVolumePath": "/__w/_actions", "readOnly": false }, { "sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_tool", "targetVolumePath": "/__w/_tool", "readOnly": false }, { "sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_temp/_github_home", "targetVolumePath": "/github/home", "readOnly": false }, { "sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_temp/_github_workflow", "targetVolumePath": "/github/workflow", "readOnly": false } ], "registry": null, "portMappings": { "80": "801" } } }
{
"command": "run_container_step",
"responseFile": null,
"state": {
"network": "example_network_53269bd575972817b43f7733536b200c",
"jobContainer": "82e8219701fe096a35941d869cf3d71af1d943b5d8bdd718857fb87ac3042480",
"serviceContainers": {
"redis": "60972d9aa486605e66b0dad4abb678dc3d9116f536579e418176eedb8abb9105"
}
},
"args": {
"image": "node:18",
"dockerfile": null,
"entryPointArgs": ["-f", "/dev/null"],
"entryPoint": "tail",
"workingDirectory": "/__w/octocat-test2/octocat-test2",
"createOptions": "--cpus 1",
"environmentVariables": {
"NODE_ENV": "development"
},
"prependPath": ["/foo/bar", "bar/foo"],
"userMountVolumes": [
{
"sourceVolumePath": "my_docker_volume",
"targetVolumePath": "/volume_mount",
"readOnly": false
}
],
"systemMountVolumes": [
{
"sourceVolumePath": "/home/octocat/git/runner/_layout/_work",
"targetVolumePath": "/__w",
"readOnly": false
},
{
"sourceVolumePath": "/home/octocat/git/runner/_layout/externals",
"targetVolumePath": "/__e",
"readOnly": true
},
{
"sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_temp",
"targetVolumePath": "/__w/_temp",
"readOnly": false
},
{
"sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_actions",
"targetVolumePath": "/__w/_actions",
"readOnly": false
},
{
"sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_tool",
"targetVolumePath": "/__w/_tool",
"readOnly": false
},
{
"sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_temp/_github_home",
"targetVolumePath": "/github/home",
"readOnly": false
},
{
"sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_temp/_github_workflow",
"targetVolumePath": "/github/workflow",
"readOnly": false
}
],
"registry": null,
"portMappings": { "80": "801" }
}
}
Dockerfile에 대한 예제 입력
컨테이너가 Dockerfile에 의해 정의된 경우 이 예제에서는 "dockerfile":
매개 변수를 사용하여 입력에 Dockerfile
경로를 지정하는 방법을 보여줍니다.
{ "command": "run_container_step", "responseFile": null, "state": { "network": "example_network_53269bd575972817b43f7733536b200c", "jobContainer": "82e8219701fe096a35941d869cf3d71af1d943b5d8bdd718857fb87ac3042480", "services": { "redis": "60972d9aa486605e66b0dad4abb678dc3d9116f536579e418176eedb8abb9105" } }, "args": { "image": null, "dockerfile": "/__w/_actions/foo/dockerfile", "entryPointArgs": ["hello world"], "entryPoint": "echo", "workingDirectory": "/__w/octocat-test2/octocat-test2", "createOptions": "--cpus 1", "environmentVariables": { "NODE_ENV": "development" }, "prependPath": ["/foo/bar", "bar/foo"], "userMountVolumes": [ { "sourceVolumePath": "my_docker_volume", "targetVolumePath": "/volume_mount", "readOnly": false } ], "systemMountVolumes": [ { "sourceVolumePath": "/home/octocat/git/runner/_layout/_work", "targetVolumePath": "/__w", "readOnly": false }, { "sourceVolumePath": "/home/octocat/git/runner/_layout/externals", "targetVolumePath": "/__e", "readOnly": true }, { "sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_temp", "targetVolumePath": "/__w/_temp", "readOnly": false }, { "sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_actions", "targetVolumePath": "/__w/_actions", "readOnly": false }, { "sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_tool", "targetVolumePath": "/__w/_tool", "readOnly": false }, { "sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_temp/_github_home", "targetVolumePath": "/github/home", "readOnly": false }, { "sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_temp/_github_workflow", "targetVolumePath": "/github/workflow", "readOnly": false } ], "registry": null, "portMappings": { "80": "801" } } }
{
"command": "run_container_step",
"responseFile": null,
"state": {
"network": "example_network_53269bd575972817b43f7733536b200c",
"jobContainer": "82e8219701fe096a35941d869cf3d71af1d943b5d8bdd718857fb87ac3042480",
"services": {
"redis": "60972d9aa486605e66b0dad4abb678dc3d9116f536579e418176eedb8abb9105"
}
},
"args": {
"image": null,
"dockerfile": "/__w/_actions/foo/dockerfile",
"entryPointArgs": ["hello world"],
"entryPoint": "echo",
"workingDirectory": "/__w/octocat-test2/octocat-test2",
"createOptions": "--cpus 1",
"environmentVariables": {
"NODE_ENV": "development"
},
"prependPath": ["/foo/bar", "bar/foo"],
"userMountVolumes": [
{
"sourceVolumePath": "my_docker_volume",
"targetVolumePath": "/volume_mount",
"readOnly": false
}
],
"systemMountVolumes": [
{
"sourceVolumePath": "/home/octocat/git/runner/_layout/_work",
"targetVolumePath": "/__w",
"readOnly": false
},
{
"sourceVolumePath": "/home/octocat/git/runner/_layout/externals",
"targetVolumePath": "/__e",
"readOnly": true
},
{
"sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_temp",
"targetVolumePath": "/__w/_temp",
"readOnly": false
},
{
"sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_actions",
"targetVolumePath": "/__w/_actions",
"readOnly": false
},
{
"sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_tool",
"targetVolumePath": "/__w/_tool",
"readOnly": false
},
{
"sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_temp/_github_home",
"targetVolumePath": "/github/home",
"readOnly": false
},
{
"sourceVolumePath": "/home/octocat/git/runner/_layout/_work/_temp/_github_workflow",
"targetVolumePath": "/github/workflow",
"readOnly": false
}
],
"registry": null,
"portMappings": { "80": "801" }
}
}
run_container_step
에 대한 출력 예
run_container_step
에 대한 출력은 필요하지 않습니다.
run_script_step
GitHub Actions은(는) 사용자가 다음 작업을 수행한다고 가정합니다.
- 작업 컨테이너 내에서 제공된 스크립트를 호출하고 종료 코드를 반환합니다.
- 모든 단계 로그 출력을 stdout 및 stderr로 스트리밍합니다.
run_script_step
의 인수
entryPointArgs
: 선택 사항. 진입점 인수를 포함하는 목록입니다.entryPoint
: 선택 사항. 기본 이미지 진입점을 덮어써야 하는 경우 사용할 컨테이너 진입점입니다.prependPath
: 선택 사항.$PATH
변수 앞에 추가할 추가 경로의 배열입니다.workingDirectory
: 필수 사항. 작업 디렉터리의 절대 경로를 포함하는 문자열입니다.environmentVariables
: 선택 사항. 주요 환경 변수의 맵을 설정합니다.
run_script_step
에 대한 입력 예
{ "command": "run_script_step", "responseFile": null, "state": { "network": "example_network_53269bd575972817b43f7733536b200c", "jobContainer": "82e8219701fe096a35941d869cf3d71af1d943b5d8bdd718857fb87ac3042480", "serviceContainers": { "redis": "60972d9aa486605e66b0dad4abb678dc3d9116f536579e418176eedb8abb9105" } }, "args": { "entryPointArgs": ["-e", "/runner/temp/example.sh"], "entryPoint": "bash", "environmentVariables": { "NODE_ENV": "development" }, "prependPath": ["/foo/bar", "bar/foo"], "workingDirectory": "/__w/octocat-test2/octocat-test2" } }
{
"command": "run_script_step",
"responseFile": null,
"state": {
"network": "example_network_53269bd575972817b43f7733536b200c",
"jobContainer": "82e8219701fe096a35941d869cf3d71af1d943b5d8bdd718857fb87ac3042480",
"serviceContainers": {
"redis": "60972d9aa486605e66b0dad4abb678dc3d9116f536579e418176eedb8abb9105"
}
},
"args": {
"entryPointArgs": ["-e", "/runner/temp/example.sh"],
"entryPoint": "bash",
"environmentVariables": {
"NODE_ENV": "development"
},
"prependPath": ["/foo/bar", "bar/foo"],
"workingDirectory": "/__w/octocat-test2/octocat-test2"
}
}
run_script_step
에 대한 출력 예
run_script_step
에 대한 출력은 필요하지 않습니다.
사용자 지정 스크립트 생성
GitHub은(는) Docker 및 Kubernetes에 대한 사용자 지정 스크립트를 생성하는 방법을 보여주는 예제 리포지토리를 만들었습니다.
Note
결과 스크립트는 테스트 목적으로 사용할 수 있으며 사용자는 해당 스크립트가 요구 사항에 적합한지 확인해야 합니다.
-
actions/runner-container-hooks 리포지토리를 자체 호스트형 실행기에 복제합니다.
-
examples/
디렉터리에는 각각 고유한 JSON 파일이 있는 기존 사용자 지정 명령이 일부 포함되어 있습니다. 이러한 예제를 검토하고 사용자 지정 명령의 시작점으로 사용할 수 있습니다.prepare_job.json
run_script_step.json
run_container_step.json
-
npm 패키지를 빌드합니다. 다음 명령은
packages/docker/dist
및packages/k8s/dist
내부에서index.js
파일을 생성합니다.npm install && npm run bootstrap && npm run build-all
index.js
가 GitHub Actions에 의해 트리거되면 JSON 파일에 정의된 사용자 지정 명령을 실행합니다. index.js
를 트리거하려면 다음 섹션에 설명된 대로 ACTIONS_RUNNER_REQUIRE_JOB_CONTAINER
환경 변수를 추가해야 합니다.
사용자 지정 스크립트 트리거
사용자 지정 스크립트는 런처에 있어야 하지만 자체 호스팅된 런처 애플리케이션 디렉토리(즉, 런처 소프트웨어를 다운로드하고 압축을 푼 디렉토리)에 저장되어서는 안 됩니다. 스크립트는 실행기 서비스를 실행하는 서비스 계정의 보안 컨텍스트에서 실행됩니다.
Note
트리거된 스크립트는 동기적으로 처리되므로 실행되는 동안 작업 실행을 차단합니다.
실행기에 스크립트의 절대 경로를 포함하는 다음 환경 변수가 있는 경우 스크립트가 자동으로 실행됩니다.
ACTIONS_RUNNER_CONTAINER_HOOKS
: 작업이 실행기에 할당된 경우 작업 실행이 시작되기 전에 이 환경 변수에 정의된 스크립트가 트리거됩니다.
이 환경 변수를 설정하기 위해 운영 체제에 추가하거나, 자체 호스트형 실행기 애플리케이션 디렉터리 내의 .env
파일에 추가할 수 있습니다. 예를 들어 다음 .env
항목은 각 컨테이너 기반 작업이 실행되기 전에 실행기가 /Users/octocat/runner/index.js
에서 스크립트를 자동으로 실행하도록 합니다.
ACTIONS_RUNNER_CONTAINER_HOOKS=/Users/octocat/runner/index.js
작업이 항상 컨테이너 내부에서 실행되고 이후에 항상 컨테이너 사용자 지정을 적용하도록 하려면 자체 호스팅 실행기에서 ACTIONS_RUNNER_REQUIRE_JOB_CONTAINER
변수를 true
로 설정할 수 있습니다. 이렇게 하면 작업 컨테이너를 지정하지 않는 작업이 실패합니다.
문제 해결
시간 제한 설정 없음
현재 ACTIONS_RUNNER_CONTAINER_HOOKS
에서 실행하는 스크립트에 사용할 수 있는 시간 제한 설정이 없습니다. 따라서 스크립트에 시간 제한 처리를 추가하는 것이 좋습니다.
워크플로 실행 로그 검토
스크립트가 실행되고 있는지 확인하기 위해 해당 작업에 대한 로그를 검토할 수 있습니다. 로그 확인에 대한 자세한 내용은 "워크플로 실행 로그 사용"을 참조하세요.