注意
此功能目前处于公开预览阶段,可能会发生变化。
关于容器自定义
GitHub Actions 允许您在容器内运行作业,在您的工作流文件中使用container:
语句。有关更多信息,请参阅“在容器中运行作业”。为了处理基于容器的作业,自托管运行器会为每个作业创建一个容器。
GitHub Actions 支持允许您自定义自托管运行器创建容器方式的命令。例如,您可以使用这些命令通过 Kubernetes 或 Podman 管理容器,还可以自定义用于调用容器的docker run
或docker create
命令。自定义命令由脚本运行,该脚本在运行器上设置特定环境变量时会自动触发。有关更多信息,请参阅下面“触发自定义脚本”。
此自定义功能仅适用于基于 Linux 的自托管运行器,并且不需要 root 用户访问权限。
容器自定义命令
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
:可选。要映射到容器中的源:目标端口的关键值哈希。
services
:可选。要启动的服务容器数组。contextName
:必需。作业上下文中服务的名称。image
:必需。包含 Docker 镜像的字符串。createOptions
:可选。YAML 中指定的可选创建选项。有关更多信息,请参阅“在容器中运行作业”。environmentVariables
:可选。设置关键环境变量的映射。userMountVolumes
:可选。要挂载到容器中的挂载点的数组,字段与上述相同。sourceVolumePath
:必需。将挂载到 Docker 容器中的卷的源路径。targetVolumePath
:必需。将挂载到 Docker 容器中的卷的目标路径。readOnly
:必需。确定挂载是否应为只读。
registry
可选。私有容器注册表的 Docker 注册表凭据。username
:可选。注册表帐户的用户名。password
:可选。注册表帐户的密码。serverUrl
:可选。注册表 URL。
portMappings
:可选。要映射到容器中的源:目标端口的关键值哈希。
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
:可选。要映射到容器中的源:目标端口的关键值哈希。
镜像的示例输入
如果您使用的是 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 生成自定义脚本。
注意
生成的脚本可用于测试目的,您需要确定它们是否适合您的要求。
-
将 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
环境变量中,如下一节所述。
触发自定义脚本
自定义脚本必须位于运行器上,但不得存储在自托管运行器应用程序目录中(即您下载并解压缩运行器软件的目录)。脚本在运行运行器服务的服务帐户的安全上下文中执行。
注意
触发的脚本是同步处理的,因此它将在运行时阻塞作业执行。
当运行器具有以下包含脚本绝对路径的环境变量时,脚本将自动执行
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
执行的脚本没有可用的超时设置。因此,您可以考虑在脚本中添加超时处理。
查看工作流运行日志
要确认您的脚本是否正在执行,您可以查看该作业的日志。有关检查日志的更多信息,请参阅“使用工作流运行日志”。