From 5ff9375a90b71ce2075f3c317351c58323590b75 Mon Sep 17 00:00:00 2001 From: pooneyy <85266337+pooneyy@users.noreply.github.com> Date: Wed, 1 Oct 2025 16:33:31 +0800 Subject: [PATCH] (feat) Add app action-runner --- apps/action-runner/2.328.0/data.yml | 77 ++++++++++++++++++ apps/action-runner/2.328.0/docker-compose.yml | 26 ++++++ apps/action-runner/README.md | 23 ++++++ apps/action-runner/README_en.md | 23 ++++++ apps/action-runner/data.yml | 19 +++++ apps/action-runner/logo.png | Bin 0 -> 12715 bytes 6 files changed, 168 insertions(+) create mode 100644 apps/action-runner/2.328.0/data.yml create mode 100644 apps/action-runner/2.328.0/docker-compose.yml create mode 100644 apps/action-runner/README.md create mode 100644 apps/action-runner/README_en.md create mode 100644 apps/action-runner/data.yml create mode 100644 apps/action-runner/logo.png diff --git a/apps/action-runner/2.328.0/data.yml b/apps/action-runner/2.328.0/data.yml new file mode 100644 index 000000000..fa70f5562 --- /dev/null +++ b/apps/action-runner/2.328.0/data.yml @@ -0,0 +1,77 @@ +additionalProperties: + formFields: + - default: "repos" + edit: true + envKey: ROLE + labelEn: Role (Repository or Organization) + labelZh: 角色 (个人仓库或者组织) + required: true + type: select + values: + - label: "个人仓库 Repository" + value: "repos" + - label: "企业 Enterprise" + value: "enterprises" + - label: "组织 Organization" + value: "orgs" + + - default: "owner/repo" + edit: true + envKey: REPO + labelEn: Repository name or organization name + labelZh: 仓库名或组织名 + required: true + type: text + + - default: "" + edit: true + envKey: GITHUB_TOKEN + labelEn: Github Token + labelZh: Github 令牌 + required: true + type: text + + - default: "" + edit: true + envKey: RUNNER_NAME + labelEn: Runner Name + labelZh: 运行器名称 + required: false + type: text + + - default: "label1,label2" + edit: true + envKey: RUNNER_LABELS + labelEn: Runner Labels + labelZh: 运行器标签 + required: false + type: text + + - default: "_work" + edit: true + envKey: WORK_FOLDER + labelEn: Work Folder + labelZh: 工作文件夹 + required: false + type: text + + - default: "Default" + edit: true + envKey: RUNNER_GROUP + labelEn: Runner Group + labelZh: 运行器组 + required: false + type: text + + - default: "false" + edit: true + envKey: AUTO_UNREGISTER + labelEn: Unregister the Runner when the container is stopped + labelZh: 是否在容器停止时注销 Runner + required: false + type: select + values: + - label: "True" + value: "true" + - label: "False" + value: "false" diff --git a/apps/action-runner/2.328.0/docker-compose.yml b/apps/action-runner/2.328.0/docker-compose.yml new file mode 100644 index 000000000..c3a8d8147 --- /dev/null +++ b/apps/action-runner/2.328.0/docker-compose.yml @@ -0,0 +1,26 @@ +services: + actions-runner: + image: ghcr.io/pooneyy/actions-runner:2.328.0 + container_name: ${CONTAINER_NAME} + restart: always + privileged: true + networks: + - 1panel-network + labels: + createdBy: "Apps" + environment: + ROLE: ${ROLE} + REPO: ${REPO} + RUNNER_GITHUB_TOKEN: ${GITHUB_TOKEN} + RUNNER_NAME: ${RUNNER_NAME} + RUNNER_LABELS: ${RUNNER_LABELS} + WORK_FOLDER: ${WORK_FOLDER} + RUNNER_GROUP: ${RUNNER_GROUP} + AUTO_UNREGISTER: ${AUTO_UNREGISTER} + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - ./config:/home/runner/.runner_config + +networks: + 1panel-network: + external: true diff --git a/apps/action-runner/README.md b/apps/action-runner/README.md new file mode 100644 index 000000000..43dc94eb0 --- /dev/null +++ b/apps/action-runner/README.md @@ -0,0 +1,23 @@ +# Github Action Runner + +![](https://fastly.jsdelivr.net/gh/actions/runner@main/docs/res/github-graph.png) + +运行在容器中的简单的自托管 GitHub Actions 运行器 + +## 功能 + +- 支持 Docker-in-Docker + +### 环境变量 +| 参数 | 是否必须 | 说明 | +| --- | --- | --- | +| `ROLE` | 必须 | 用于区分企业、组织与个人仓库
企业为 `enterprises` 组织为 `orgs` ,个人仓库为 `repos`
**REST API** | +| `REPO` | 必须 | 企业格式为`enterpriseName`
组织格式为`orgName`
个人仓库格式为 `owner/repo`
**REST API** | +| `RUNNER_GITHUB_TOKEN` | 必须 | [推荐 Fine-grained PAT](https://github.com/settings/personal-access-tokens/new)。
对于企业:
**Fine-grained PAT 不能用于企业**
OAuth 应用令牌和PAT(classic)需要 `manage_runners:enterprise` 权限。
对于组织:
应具备 Self-hosted runners 的读写权限。
OAuth 令牌和PAT(classic)需要 `admin:org` 权限,
此外私有组织仓库还需要 `repo` 权限。
对于个人仓库:
应具备 Administration 的读写权限。
OAuth 令牌和PAT(classic)需要 `repo` 权限。
[如何创建令牌?](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens)
**REST API** | +| `RUNNER_NAME` | | Runner 名称,留空随机生成。
在同一个个人仓库(或企业、组织)中 Runner 名称不能重复。 | +| `RUNNER_LABELS` | | Runner 标签,填写此项会增加新的标签,
若填入多个标签则用半角逗号分隔。
示例: `label1,label2` | +| `WORK_FOLDER` | | 工作文件夹,留空随机生成,几乎用不上。 | +| `RUNNER_GROUP` | | Runner 组,默认值为`Default`,具体参见[文档](https://docs.github.com/en/actions/how-tos/manage-runners/self-hosted-runners/manage-access)。 | +| `AUTO_UNREGISTER` | | 是否在容器停止时从 github.com 注销 Runner,默认为 `false`。 | + +关于标注了**REST API**的问题,参考[文档](https://docs.github.com/en/enterprise-cloud@latest/rest/actions/self-hosted-runners?apiVersion=2022-11-28)。 diff --git a/apps/action-runner/README_en.md b/apps/action-runner/README_en.md new file mode 100644 index 000000000..7a38d4d66 --- /dev/null +++ b/apps/action-runner/README_en.md @@ -0,0 +1,23 @@ +# Simple Github Action Runner In Docker + +![](http://fastly.jsdelivr.net/gh/actions/runner@main/docs/res/github-graph.png) + +A simple self-hosted actions runner running in a container + +## Features + +- Supports Docker-in-Docker + +### Environment Variables +| Parameter | Required | Description | +| --- | --- | --- | +| `ROLE` | Required | Used to differentiate between enterprise, organization, and personal repositories.
Use `enterprises` for enterprise, `orgs` for organization, and `repos` for personal repositories.
**REST API** | +| `REPO` | Required | Format for enterprise: `enterpriseName`
Format for organization: `orgName`
Format for personal repository: `owner/repo`
**REST API** | +| `RUNNER_GITHUB_TOKEN` | Required | [Fine-grained PAT is recommended](https://github.com/settings/personal-access-tokens/new).
For enterprises:
**Fine-grained PAT cannot be used for enterprises**
OAuth app tokens and PAT (classic) require the `manage_runners:enterprise` permission.
For organizations:
Fine-grained PAT should have read and write permissions for Self-hosted runners.
OAuth tokens and PAT (classic) require `admin:org` permissions,
additionally, `repo` permissions are required for private organization repositories.
For personal repositories:
Fine-grained PAT should have read and write permissions for Administration.
OAuth tokens and PAT (classic) require `repo` permissions.
[How to create a token?](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens)
**REST API** | +| `RUNNER_NAME` | | Runner name. If left empty, it will be randomly generated.
Runner names must be unique within the same personal repository (or enterprise/organization). | +| `RUNNER_LABELS` | | Runner labels. Filling this will add new labels..
Use commas to separate multiple labels.
Example: `label1,label2` | +| `WORK_FOLDER` | | Working directory. If left empty, it will be randomly generated. Rarely needed. | +| `RUNNER_GROUP` | | Runner group. The default value is `Default`. For details, refer to the [documentation](https://docs.github.com/en/actions/how-tos/manage-runners/self-hosted-runners/manage-access). | +| `AUTO_UNREGISTER` | | Whether to unregister the Runner from github.com when the container stops.
Default is `false`. It is recommended to map /home/runner/.runner_config
to a local when selecting false. This folder saves Runner's login status. | + +For parameters marked with **REST API**, refer to the [documentation](https://docs.github.com/en/enterprise-cloud@latest/rest/actions/self-hosted-runners?apiVersion=2022-11-28). diff --git a/apps/action-runner/data.yml b/apps/action-runner/data.yml new file mode 100644 index 000000000..689d4a7aa --- /dev/null +++ b/apps/action-runner/data.yml @@ -0,0 +1,19 @@ +name: Action Runner +tags: + - DevOps +title: Github 自托管运行器 +description: Github 自托管运行器 +additionalProperties: + key: action-runner + name: Action Runner + tags: + - DevOps + shortDescZh: Github 自托管运行器 + shortDescEn: The Self-hosted Runner for GitHub Actions + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://github.com/actions/runner + github: https://github.com/actions/runner + document: https://docs.github.com/en/actions/how-tos/manage-runners/self-hosted-runners diff --git a/apps/action-runner/logo.png b/apps/action-runner/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e7917cb3b7cf608e8a099bb2ea8cf09b3f52145b GIT binary patch literal 12715 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 literal 0 HcmV?d00001