From a44465858dbbf919f832a7eac7ff2b3f05298fd6 Mon Sep 17 00:00:00 2001 From: okxlin Date: Fri, 17 Nov 2023 00:38:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0act=5Frunner=E5=88=B0?= =?UTF-8?q?=E5=88=97=E8=A1=A8#173?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/act_runner/0.2.6/.env.sample | 6 ++ apps/act_runner/0.2.6/data.yml | 37 ++++++++ apps/act_runner/0.2.6/docker-compose.yml | 24 +++++ apps/act_runner/README.md | 106 ++++++++++++++++++++++ apps/act_runner/data.yml | 20 ++++ apps/act_runner/latest/.env.sample | 6 ++ apps/act_runner/latest/data.yml | 37 ++++++++ apps/act_runner/latest/docker-compose.yml | 24 +++++ apps/act_runner/logo.png | Bin 0 -> 7043 bytes 9 files changed, 260 insertions(+) create mode 100644 apps/act_runner/0.2.6/.env.sample create mode 100644 apps/act_runner/0.2.6/data.yml create mode 100644 apps/act_runner/0.2.6/docker-compose.yml create mode 100644 apps/act_runner/README.md create mode 100644 apps/act_runner/data.yml create mode 100644 apps/act_runner/latest/.env.sample create mode 100644 apps/act_runner/latest/data.yml create mode 100644 apps/act_runner/latest/docker-compose.yml create mode 100644 apps/act_runner/logo.png diff --git a/apps/act_runner/0.2.6/.env.sample b/apps/act_runner/0.2.6/.env.sample new file mode 100644 index 00000000..dfe219c0 --- /dev/null +++ b/apps/act_runner/0.2.6/.env.sample @@ -0,0 +1,6 @@ +CONTAINER_NAME="act_runner" +DATA_PATH="./data" +GITEA_INSTANCE_URL="http://1.2.3.4:567" +RUNNER_REGISTRATION_TOKEN="xxx" +RUNNER_NAME="xxx" +RUNNER_LABELS="xxx" diff --git a/apps/act_runner/0.2.6/data.yml b/apps/act_runner/0.2.6/data.yml new file mode 100644 index 00000000..44ac8333 --- /dev/null +++ b/apps/act_runner/0.2.6/data.yml @@ -0,0 +1,37 @@ +additionalProperties: + formFields: + - default: ./data + edit: true + envKey: DATA_PATH + labelEn: Data folder path + labelZh: 数据文件夹路径 + required: true + type: text + - default: http://1.2.3.4:567 + edit: true + envKey: GITEA_INSTANCE_URL + labelEn: Gitea instance URL + labelZh: Gitea 实例 URL + required: true + type: text + - default: '' + edit: true + envKey: RUNNER_REGISTRATION_TOKEN + labelEn: Gitea runner REGISTRATION TOKEN + labelZh: Gitea runner REGISTRATION TOKEN + required: true + type: text + - default: '' + edit: true + envKey: RUNNER_NAME + labelEn: Gitea runner name + labelZh: Gitea runner name + required: true + type: text + - default: '' + edit: true + envKey: RUNNER_LABELS + labelEn: Gitea runner labels + labelZh: Gitea runner labels + required: true + type: text diff --git a/apps/act_runner/0.2.6/docker-compose.yml b/apps/act_runner/0.2.6/docker-compose.yml new file mode 100644 index 00000000..eeb38af4 --- /dev/null +++ b/apps/act_runner/0.2.6/docker-compose.yml @@ -0,0 +1,24 @@ +version: '3' +services: + act_runner: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + volumes: + #- ${DATA_PATH}/config.yaml:/config.yaml # 可选配置 + - ${DATA_PATH}/data:/data + - /var/run/docker.sock:/var/run/docker.sock + environment: + #- CONFIG_FILE=/config.yaml + - GITEA_INSTANCE_URL=${GITEA_INSTANCE_URL} + - GITEA_RUNNER_REGISTRATION_TOKEN=${RUNNER_REGISTRATION_TOKEN} + - GITEA_RUNNER_NAME=${RUNNER_NAME} + - GITEA_RUNNER_LABELS=${RUNNER_LABELS} + image: gitea/act_runner:0.2.6 + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/act_runner/README.md b/apps/act_runner/README.md new file mode 100644 index 00000000..4810b283 --- /dev/null +++ b/apps/act_runner/README.md @@ -0,0 +1,106 @@ +# act runner + +Act runner is a runner for Gitea based on [Gitea fork](https://gitea.com/gitea/act) of [act](https://github.com/nektos/act). + +## Installation + +### Prerequisites + +Docker Engine Community version is required for docker mode. To install Docker CE, follow the official [install instructions](https://docs.docker.com/engine/install/). + +### Download pre-built binary + +Visit [here](https://dl.gitea.com/act_runner/) and download the right version for your platform. + +### Build from source + +```bash +make build +``` + +### Build a docker image + +```bash +make docker +``` + +## Quickstart + +Actions are disabled by default, so you need to add the following to the configuration file of your Gitea instance to enable it: + +```ini +[actions] +ENABLED=true +``` + +### Register + +```bash +./act_runner register +``` + +And you will be asked to input: + +1. Gitea instance URL, like `http://192.168.8.8:3000/`. You should use your gitea instance ROOT_URL as the instance argument + and you should not use `localhost` or `127.0.0.1` as instance IP; +2. Runner token, you can get it from `http://192.168.8.8:3000/admin/actions/runners`; +3. Runner name, you can just leave it blank; +4. Runner labels, you can just leave it blank. + +The process looks like: + +```text +INFO Registering runner, arch=amd64, os=darwin, version=0.1.5. +WARN Runner in user-mode. +INFO Enter the Gitea instance URL (for example, https://gitea.com/): +http://192.168.8.8:3000/ +INFO Enter the runner token: +fe884e8027dc292970d4e0303fe82b14xxxxxxxx +INFO Enter the runner name (if set empty, use hostname: Test.local): + +INFO Enter the runner labels, leave blank to use the default labels (comma-separated, for example, ubuntu-20.04:docker://node:16-bullseye,ubuntu-18.04:docker://node:16-buster,linux_arm:host): + +INFO Registering runner, name=Test.local, instance=http://192.168.8.8:3000/, labels=[ubuntu-latest:docker://node:16-bullseye ubuntu-22.04:docker://node:16-bullseye ubuntu-20.04:docker://node:16-bullseye ubuntu-18.04:docker://node:16-buster]. +DEBU Successfully pinged the Gitea instance server +INFO Runner registered successfully. +``` + +You can also register with command line arguments. + +```bash +./act_runner register --instance http://192.168.8.8:3000 --token --no-interactive +``` + +If the registry succeed, it will run immediately. Next time, you could run the runner directly. + +### Run + +```bash +./act_runner daemon +``` + +### Run with docker + +```bash +docker run -e GITEA_INSTANCE_URL=https://your_gitea.com -e GITEA_RUNNER_REGISTRATION_TOKEN= -v /var/run/docker.sock:/var/run/docker.sock --name my_runner gitea/act_runner:nightly +``` + +### Configuration + +You can also configure the runner with a configuration file. +The configuration file is a YAML file, you can generate a sample configuration file with `./act_runner generate-config`. + +```bash +./act_runner generate-config > config.yaml +``` + +You can specify the configuration file path with `-c`/`--config` argument. + +```bash +./act_runner -c config.yaml register # register with config file +./act_runner -c config.yaml daemon # run with config file +``` + +### Example Deployments + +Check out the [examples](examples) directory for sample deployment types. diff --git a/apps/act_runner/data.yml b/apps/act_runner/data.yml new file mode 100644 index 00000000..4f52521d --- /dev/null +++ b/apps/act_runner/data.yml @@ -0,0 +1,20 @@ +name: Act runner +tags: + - CI/CD +title: Gitea Actions 的 Runner +type: CI/CD +description: Gitea Actions 的 Runner +additionalProperties: + key: act_runner + name: Act runner + tags: + - CI/CD + shortDescZh: Gitea Actions 的 Runner + shortDescEn: A runner for Gitea based on Gitea fork of act + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://gitea.com/gitea/act_runner + github: https://gitea.com/gitea/act_runner + document: https://docs.gitea.com/next/usage/actions/act-runner \ No newline at end of file diff --git a/apps/act_runner/latest/.env.sample b/apps/act_runner/latest/.env.sample new file mode 100644 index 00000000..dfe219c0 --- /dev/null +++ b/apps/act_runner/latest/.env.sample @@ -0,0 +1,6 @@ +CONTAINER_NAME="act_runner" +DATA_PATH="./data" +GITEA_INSTANCE_URL="http://1.2.3.4:567" +RUNNER_REGISTRATION_TOKEN="xxx" +RUNNER_NAME="xxx" +RUNNER_LABELS="xxx" diff --git a/apps/act_runner/latest/data.yml b/apps/act_runner/latest/data.yml new file mode 100644 index 00000000..44ac8333 --- /dev/null +++ b/apps/act_runner/latest/data.yml @@ -0,0 +1,37 @@ +additionalProperties: + formFields: + - default: ./data + edit: true + envKey: DATA_PATH + labelEn: Data folder path + labelZh: 数据文件夹路径 + required: true + type: text + - default: http://1.2.3.4:567 + edit: true + envKey: GITEA_INSTANCE_URL + labelEn: Gitea instance URL + labelZh: Gitea 实例 URL + required: true + type: text + - default: '' + edit: true + envKey: RUNNER_REGISTRATION_TOKEN + labelEn: Gitea runner REGISTRATION TOKEN + labelZh: Gitea runner REGISTRATION TOKEN + required: true + type: text + - default: '' + edit: true + envKey: RUNNER_NAME + labelEn: Gitea runner name + labelZh: Gitea runner name + required: true + type: text + - default: '' + edit: true + envKey: RUNNER_LABELS + labelEn: Gitea runner labels + labelZh: Gitea runner labels + required: true + type: text diff --git a/apps/act_runner/latest/docker-compose.yml b/apps/act_runner/latest/docker-compose.yml new file mode 100644 index 00000000..9346c05d --- /dev/null +++ b/apps/act_runner/latest/docker-compose.yml @@ -0,0 +1,24 @@ +version: '3' +services: + act_runner: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + volumes: + #- ${DATA_PATH}/config.yaml:/config.yaml # 可选配置 + - ${DATA_PATH}/data:/data + - /var/run/docker.sock:/var/run/docker.sock + environment: + #- CONFIG_FILE=/config.yaml + - GITEA_INSTANCE_URL=${GITEA_INSTANCE_URL} + - GITEA_RUNNER_REGISTRATION_TOKEN=${RUNNER_REGISTRATION_TOKEN} + - GITEA_RUNNER_NAME=${RUNNER_NAME} + - GITEA_RUNNER_LABELS=${RUNNER_LABELS} + image: gitea/act_runner:latest + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/act_runner/logo.png b/apps/act_runner/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b810ad1e310fa14128b86adc57de19439dcd2ec1 GIT binary patch literal 7043 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 literal 0 HcmV?d00001