Adds constrained Crabbox setup and the exact OpenClaw Crabbox skill for maintainer validation.
127 lines
3.7 KiB
YAML
127 lines
3.7 KiB
YAML
name: Crabbox Hydrate
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
inputs:
|
|
crabbox_id:
|
|
description: 'Crabbox lease ID'
|
|
required: true
|
|
type: string
|
|
ref:
|
|
description: 'Git ref to hydrate'
|
|
required: false
|
|
type: string
|
|
crabbox_runner_label:
|
|
description: 'Dynamic Crabbox runner label'
|
|
required: true
|
|
type: string
|
|
crabbox_job:
|
|
description: 'Hydration job identifier expected by Crabbox'
|
|
required: false
|
|
default: 'hydrate'
|
|
type: string
|
|
crabbox_keep_alive_minutes:
|
|
description: 'Minutes to keep the hydrated job alive'
|
|
required: false
|
|
default: '90'
|
|
type: string
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
env:
|
|
NODE_VERSION: '24'
|
|
PNPM_VERSION: '10.33.2'
|
|
|
|
jobs:
|
|
hydrate:
|
|
name: hydrate
|
|
runs-on: [self-hosted, crabbox, openclaw, mcporter, '${{ inputs.crabbox_runner_label }}']
|
|
timeout-minutes: 120
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
ref: ${{ inputs.ref || github.ref }}
|
|
|
|
- uses: pnpm/action-setup@v6.0.8
|
|
with:
|
|
version: ${{ env.PNPM_VERSION }}
|
|
|
|
- uses: actions/setup-node@v6
|
|
with:
|
|
node-version: ${{ env.NODE_VERSION }}
|
|
cache: pnpm
|
|
|
|
- name: Prepare pnpm workspace
|
|
shell: bash
|
|
run: |
|
|
set -euo pipefail
|
|
git fetch --no-tags --depth=50 origin "+refs/heads/main:refs/remotes/origin/main"
|
|
pnpm install --frozen-lockfile
|
|
node --version
|
|
pnpm --version
|
|
pnpm --version
|
|
|
|
- name: Mark Crabbox ready
|
|
shell: bash
|
|
env:
|
|
CRABBOX_ID: ${{ inputs.crabbox_id }}
|
|
CRABBOX_JOB: ${{ inputs.crabbox_job }}
|
|
run: |
|
|
set -euo pipefail
|
|
job="${CRABBOX_JOB}"
|
|
if [ -z "$job" ]; then job=hydrate; fi
|
|
case "$CRABBOX_ID" in
|
|
''|*[!A-Za-z0-9._-]*)
|
|
echo "Invalid crabbox_id" >&2
|
|
exit 2
|
|
;;
|
|
esac
|
|
mkdir -p "$HOME/.crabbox/actions"
|
|
state="$HOME/.crabbox/actions/${CRABBOX_ID}.env"
|
|
env_file="$HOME/.crabbox/actions/${CRABBOX_ID}.env.sh"
|
|
{
|
|
for key in CI GITHUB_ACTIONS GITHUB_WORKSPACE GITHUB_REPOSITORY GITHUB_RUN_ID GITHUB_RUN_NUMBER GITHUB_RUN_ATTEMPT GITHUB_REF GITHUB_REF_NAME GITHUB_SHA GITHUB_EVENT_NAME GITHUB_ACTOR RUNNER_OS RUNNER_ARCH RUNNER_TEMP RUNNER_TOOL_CACHE PATH; do
|
|
value="${!key-}"
|
|
if [ -n "$value" ]; then
|
|
printf 'export %s=%q\n' "$key" "$value"
|
|
fi
|
|
done
|
|
} > "${env_file}.tmp"
|
|
mv "${env_file}.tmp" "$env_file"
|
|
tmp="${state}.tmp"
|
|
{
|
|
echo "WORKSPACE=${GITHUB_WORKSPACE}"
|
|
echo "RUN_ID=${GITHUB_RUN_ID}"
|
|
echo "JOB=${job}"
|
|
echo "ENV_FILE=${env_file}"
|
|
echo "READY_AT=$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
} > "$tmp"
|
|
mv "$tmp" "$state"
|
|
|
|
- name: Keep Crabbox job alive
|
|
shell: bash
|
|
env:
|
|
CRABBOX_ID: ${{ inputs.crabbox_id }}
|
|
CRABBOX_KEEP_ALIVE_MINUTES: ${{ inputs.crabbox_keep_alive_minutes }}
|
|
run: |
|
|
set -euo pipefail
|
|
case "$CRABBOX_ID" in
|
|
''|*[!A-Za-z0-9._-]*)
|
|
echo "Invalid crabbox_id" >&2
|
|
exit 2
|
|
;;
|
|
esac
|
|
minutes="${CRABBOX_KEEP_ALIVE_MINUTES}"
|
|
case "$minutes" in
|
|
''|*[!0-9]*) minutes=90 ;;
|
|
esac
|
|
stop="$HOME/.crabbox/actions/${CRABBOX_ID}.stop"
|
|
deadline=$(( $(date +%s) + minutes * 60 ))
|
|
while [ "$(date +%s)" -lt "$deadline" ]; do
|
|
if [ -f "$stop" ]; then
|
|
exit 0
|
|
fi
|
|
sleep 15
|
|
done
|