Compare commits
11 Commits
ebb0743fcb
...
7b79c4034d
| Author | SHA1 | Date | |
|---|---|---|---|
| 7b79c4034d | |||
| 2e6f4b0a10 | |||
| 65a1a11b39 | |||
| 90d591b7bb | |||
| aa8f801a04 | |||
| f1fae1819f | |||
| cdeba0a725 | |||
| 1c226afb69 | |||
| be5e4c87de | |||
| 9373a42841 | |||
| baec7940a5 |
@@ -11,84 +11,9 @@ on:
|
|||||||
- "latest"
|
- "latest"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
validate:
|
|
||||||
runs-on: ubuntu-22.04
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
shell: bash
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
env:
|
|
||||||
SERVER_URL: ${{ github.server_url }}
|
|
||||||
REPOSITORY: ${{ github.repository }}
|
|
||||||
COMMIT_SHA: ${{ github.sha }}
|
|
||||||
GIT_USERNAME: ${{ github.actor }}
|
|
||||||
GIT_TOKEN: ${{ github.token }}
|
|
||||||
run: |
|
|
||||||
case "$SERVER_URL" in
|
|
||||||
http://*)
|
|
||||||
AUTH_SERVER_URL="http://${GIT_USERNAME}:${GIT_TOKEN}@${SERVER_URL#http://}"
|
|
||||||
;;
|
|
||||||
https://*)
|
|
||||||
AUTH_SERVER_URL="https://${GIT_USERNAME}:${GIT_TOKEN}@${SERVER_URL#https://}"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
AUTH_SERVER_URL="$SERVER_URL"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if [ ! -d .git ]; then
|
|
||||||
git init .
|
|
||||||
fi
|
|
||||||
|
|
||||||
if git remote get-url origin >/dev/null 2>&1; then
|
|
||||||
git remote set-url origin "${AUTH_SERVER_URL}/${REPOSITORY}.git"
|
|
||||||
else
|
|
||||||
git remote add origin "${AUTH_SERVER_URL}/${REPOSITORY}.git"
|
|
||||||
fi
|
|
||||||
|
|
||||||
git fetch --depth=1 origin "$COMMIT_SHA"
|
|
||||||
git checkout --force --detach FETCH_HEAD
|
|
||||||
git clean -ffdx
|
|
||||||
|
|
||||||
- name: Install Bun
|
|
||||||
run: |
|
|
||||||
case "$(uname -m)" in
|
|
||||||
x86_64)
|
|
||||||
BUN_ARCH="x64"
|
|
||||||
;;
|
|
||||||
aarch64|arm64)
|
|
||||||
BUN_ARCH="aarch64"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Unsupported architecture: $(uname -m)"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
BUN_ASSET="bun-linux-${BUN_ARCH}.zip"
|
|
||||||
BUN_MIRROR_URL="https://ghproxy.net/https://github.com/oven-sh/bun/releases/latest/download/${BUN_ASSET}"
|
|
||||||
|
|
||||||
curl -fL --retry 3 --retry-delay 5 "$BUN_MIRROR_URL" -o /tmp/bun.zip
|
|
||||||
rm -rf "$HOME/.bun"
|
|
||||||
mkdir -p "$HOME/.bun/bin"
|
|
||||||
unzip -qo /tmp/bun.zip -d /tmp
|
|
||||||
install -m 0755 "/tmp/bun-linux-${BUN_ARCH}/bun" "$HOME/.bun/bin/bun"
|
|
||||||
echo "$HOME/.bun/bin" >> "$GITHUB_PATH"
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: bun install --frozen-lockfile
|
|
||||||
|
|
||||||
- name: Run checks
|
|
||||||
run: bun run check
|
|
||||||
|
|
||||||
docker-image:
|
docker-image:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
needs: validate
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master'
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
defaults:
|
defaults:
|
||||||
@@ -137,20 +62,26 @@ jobs:
|
|||||||
RAW_REF: ${{ github.ref }}
|
RAW_REF: ${{ github.ref }}
|
||||||
RAW_REF_NAME: ${{ github.ref_name }}
|
RAW_REF_NAME: ${{ github.ref_name }}
|
||||||
run: |
|
run: |
|
||||||
|
RAW_REGISTRY_HOST="$(printf '%s' "${RAW_REGISTRY_HOST}" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
|
||||||
|
|
||||||
|
if [ -z "${RAW_REGISTRY_HOST}" ]; then
|
||||||
|
echo "Missing required repository variable: REGISTRY_HOST"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
REGISTRY_HOST="${RAW_REGISTRY_HOST#http://}"
|
REGISTRY_HOST="${RAW_REGISTRY_HOST#http://}"
|
||||||
REGISTRY_HOST="${REGISTRY_HOST#https://}"
|
REGISTRY_HOST="${REGISTRY_HOST#https://}"
|
||||||
REGISTRY_HOST="${REGISTRY_HOST%/}"
|
REGISTRY_HOST="${REGISTRY_HOST%/}"
|
||||||
|
|
||||||
|
if [ -z "${REGISTRY_HOST}" ]; then
|
||||||
|
echo "Repository variable REGISTRY_HOST resolves to an empty host"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
REPOSITORY_PATH="${RAW_REPOSITORY#/}"
|
REPOSITORY_PATH="${RAW_REPOSITORY#/}"
|
||||||
IMAGE_REPOSITORY_PATH="$(printf '%s' "$REPOSITORY_PATH" | tr '[:upper:]' '[:lower:]')"
|
IMAGE_REPOSITORY_PATH="$(printf '%s' "$REPOSITORY_PATH" | tr '[:upper:]' '[:lower:]')"
|
||||||
IMAGE_NAME="${REGISTRY_HOST}/${IMAGE_REPOSITORY_PATH}"
|
IMAGE_NAME="${REGISTRY_HOST}/${IMAGE_REPOSITORY_PATH}"
|
||||||
case "$RAW_REF" in
|
|
||||||
refs/heads/main|refs/heads/master)
|
|
||||||
IMAGE_TAG="latest"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
IMAGE_TAG="${RAW_REF_NAME}"
|
IMAGE_TAG="${RAW_REF_NAME}"
|
||||||
;;
|
|
||||||
esac
|
|
||||||
{
|
{
|
||||||
echo "REGISTRY_HOST=${REGISTRY_HOST}"
|
echo "REGISTRY_HOST=${REGISTRY_HOST}"
|
||||||
echo "REPOSITORY_PATH=${REPOSITORY_PATH}"
|
echo "REPOSITORY_PATH=${REPOSITORY_PATH}"
|
||||||
@@ -161,13 +92,38 @@ jobs:
|
|||||||
} >> "$GITHUB_ENV"
|
} >> "$GITHUB_ENV"
|
||||||
|
|
||||||
- name: Login to Gitea Container Registry
|
- name: Login to Gitea Container Registry
|
||||||
|
env:
|
||||||
|
REGISTRY_USERNAME: ${{ secrets.REGISTRY_USERNAME }}
|
||||||
|
REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }}
|
||||||
run: |
|
run: |
|
||||||
echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login "$REGISTRY_HOST" \
|
if [ -z "${REGISTRY_HOST:-}" ]; then
|
||||||
--username "${{ secrets.REGISTRY_USERNAME }}" \
|
echo "Missing resolved environment value: REGISTRY_HOST"
|
||||||
|
echo "The previous step should write REGISTRY_HOST into GITHUB_ENV."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${REGISTRY_USERNAME}" ]; then
|
||||||
|
echo "Missing required repository secret: REGISTRY_USERNAME"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${REGISTRY_PASSWORD}" ]; then
|
||||||
|
echo "Missing required repository secret: REGISTRY_PASSWORD"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Logging into registry host: ${REGISTRY_HOST}"
|
||||||
|
echo "${REGISTRY_PASSWORD}" | docker login "$REGISTRY_HOST" \
|
||||||
|
--username "${REGISTRY_USERNAME}" \
|
||||||
--password-stdin
|
--password-stdin
|
||||||
|
|
||||||
- name: Build and Push Image
|
- name: Build and Push Image
|
||||||
run: |
|
run: |
|
||||||
|
if [ -z "${IMAGE_NAME:-}" ] || [ -z "${IMAGE_TAG:-}" ]; then
|
||||||
|
echo "Missing resolved image metadata: IMAGE_NAME or IMAGE_TAG"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
push_with_retry() {
|
push_with_retry() {
|
||||||
image_ref="$1"
|
image_ref="$1"
|
||||||
attempt=1
|
attempt=1
|
||||||
@@ -209,10 +165,17 @@ jobs:
|
|||||||
post_deploy_webhook() {
|
post_deploy_webhook() {
|
||||||
label="$1"
|
label="$1"
|
||||||
payload="$2"
|
payload="$2"
|
||||||
|
webhook_url="${{ vars.DEPLOY_WEBHOOK_URL }}"
|
||||||
|
token="${{ secrets.DEPLOY_WEBHOOK_TOKEN }}"
|
||||||
|
|
||||||
http_code=$(curl -sS -D /tmp/deploy_headers.txt -o /tmp/deploy_response.txt -w "%{http_code}" -X POST "${{ vars.DEPLOY_WEBHOOK_URL }}" \
|
# Trim whitespace
|
||||||
|
webhook_url=$(echo "$webhook_url" | xargs)
|
||||||
|
|
||||||
|
echo "[$label] Calling webhook: $webhook_url"
|
||||||
|
|
||||||
|
http_code=$(curl -sS -D /tmp/deploy_headers.txt -o /tmp/deploy_response.txt -w "%{http_code}" -X POST "$webhook_url" \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
-H "Authorization: Bearer ${{ secrets.DEPLOY_WEBHOOK_TOKEN }}" \
|
-H "Authorization: Bearer $token" \
|
||||||
-d "$payload")
|
-d "$payload")
|
||||||
|
|
||||||
echo "[$label] webhook HTTP status: ${http_code}"
|
echo "[$label] webhook HTTP status: ${http_code}"
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
node_modules
|
||||||
|
package-lock.json
|
||||||
|
.gitignore
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
{
|
||||||
|
"lockfileVersion": 1,
|
||||||
|
"configVersion": 0,
|
||||||
|
"workspaces": {
|
||||||
|
"": {
|
||||||
|
"dependencies": {
|
||||||
|
"@opencode-ai/plugin": "1.14.41",
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^24.7.2",
|
||||||
|
"typescript": "^5.9.3",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"packages": {
|
||||||
|
"@msgpackr-extract/msgpackr-extract-linux-x64": ["@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3", "", { "os": "linux", "cpu": "x64" }, "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg=="],
|
||||||
|
|
||||||
|
"@opencode-ai/plugin": ["@opencode-ai/plugin@1.14.41", "", { "dependencies": { "@opencode-ai/sdk": "1.14.41", "effect": "4.0.0-beta.59", "zod": "4.1.8" }, "peerDependencies": { "@opentui/core": ">=0.2.2", "@opentui/solid": ">=0.2.2" }, "optionalPeers": ["@opentui/core", "@opentui/solid"] }, "sha512-Q/QdDKSfHyYX+Xqd79o4XgyZKqF8h5qgqgfmOQbKVLhbduc9zMYdpV2yvWT6gaJPrpOftpka/kpr56PCqzetYQ=="],
|
||||||
|
|
||||||
|
"@opencode-ai/sdk": ["@opencode-ai/sdk@1.14.41", "", { "dependencies": { "cross-spawn": "7.0.6" } }, "sha512-RYb2dCUv0TWIvBNnnO6ANbAPYri6rKuWizSoVFw/Pw+SCDj9ASHM5gAZ+jkskp8gYMfLLHe/Fpkun/9mr8m0IQ=="],
|
||||||
|
|
||||||
|
"@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
|
||||||
|
|
||||||
|
"@types/node": ["@types/node@24.12.4", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA=="],
|
||||||
|
|
||||||
|
"cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
|
||||||
|
|
||||||
|
"detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
|
||||||
|
|
||||||
|
"effect": ["effect@4.0.0-beta.59", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "fast-check": "^4.6.0", "find-my-way-ts": "^0.1.6", "ini": "^6.0.0", "kubernetes-types": "^1.30.0", "msgpackr": "^1.11.9", "multipasta": "^0.2.7", "toml": "^4.1.1", "uuid": "^13.0.0", "yaml": "^2.8.3" } }, "sha512-xyUDLeHSe8d6lWGOvR6Fgn2HL6gYeTZ/S4Jzk9uc4ZUxMPPsNZlNXrvk0C7/utQFzeX7uAWcVnG2BjbA0SRoAA=="],
|
||||||
|
|
||||||
|
"fast-check": ["fast-check@4.8.0", "", { "dependencies": { "pure-rand": "^8.0.0" } }, "sha512-GOJ158CUMnN6cSahsv4+ExARvIDuzzinFjkp0E9WtiBa5zcVeLozVkWaE4IzFcc+Y48Wp1EDlUZsXRyAztQcSg=="],
|
||||||
|
|
||||||
|
"find-my-way-ts": ["find-my-way-ts@0.1.6", "", {}, "sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA=="],
|
||||||
|
|
||||||
|
"ini": ["ini@6.0.0", "", {}, "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ=="],
|
||||||
|
|
||||||
|
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
|
||||||
|
|
||||||
|
"kubernetes-types": ["kubernetes-types@1.30.0", "", {}, "sha512-Dew1okvhM/SQcIa2rcgujNndZwU8VnSapDgdxlYoB84ZlpAD43U6KLAFqYo17ykSFGHNPrg0qry0bP+GJd9v7Q=="],
|
||||||
|
|
||||||
|
"msgpackr": ["msgpackr@1.11.12", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "sha512-RBdJ1Un7yGlXWajrkxcSa93nvQ0w4zBf60c0yYv7YtBelP8H2FA7XsfBbMHtXKXUMUxH7zV3Zuozh+kUQWhHvg=="],
|
||||||
|
|
||||||
|
"msgpackr-extract": ["msgpackr-extract@3.0.3", "", { "dependencies": { "node-gyp-build-optional-packages": "5.2.2" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" } }, "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA=="],
|
||||||
|
|
||||||
|
"multipasta": ["multipasta@0.2.7", "", {}, "sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA=="],
|
||||||
|
|
||||||
|
"node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.2.2", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw=="],
|
||||||
|
|
||||||
|
"path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
|
||||||
|
|
||||||
|
"pure-rand": ["pure-rand@8.4.0", "", {}, "sha512-IoM8YF/jY0hiugFo/wOWqfmarlE6J0wc6fDK1PhftMk7MGhVZl88sZimmqBBFomLOCSmcCCpsfj7wXASCpvK9A=="],
|
||||||
|
|
||||||
|
"shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
|
||||||
|
|
||||||
|
"shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
|
||||||
|
|
||||||
|
"toml": ["toml@4.1.1", "", {}, "sha512-EBJnVBr3dTXdA89WVFoAIPUqkBjxPMwRqsfuo1r240tKFHXv3zgca4+NJib/h6TyvGF7vOawz0jGuryJCdNHrw=="],
|
||||||
|
|
||||||
|
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
|
||||||
|
|
||||||
|
"undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
|
||||||
|
|
||||||
|
"uuid": ["uuid@13.0.2", "", { "bin": "dist-node/bin/uuid" }, "sha512-vzi9uRZ926x4XV73S/4qQaTwPXM2JBj6/6lI/byHH1jOpCzb0zDbfytgA9LcN/hzb2l7WQSQnxITOVx5un/wGw=="],
|
||||||
|
|
||||||
|
"which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
|
||||||
|
|
||||||
|
"yaml": ["yaml@2.9.0", "", { "bin": "bin.mjs" }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="],
|
||||||
|
|
||||||
|
"zod": ["zod@4.1.8", "", {}, ""],
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"typecheck": "tsc --noEmit -p tsconfig.json"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@opencode-ai/plugin": "1.14.41"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^24.7.2",
|
||||||
|
"typescript": "^5.9.3"
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
FROM oven/bun:1 AS bun-bin
|
FROM oven/bun:canary-slim AS bun-bin
|
||||||
|
|
||||||
FROM smanx/opencode:latest AS base
|
FROM smanx/opencode:latest AS base
|
||||||
USER root
|
USER root
|
||||||
|
|||||||
@@ -248,7 +248,7 @@ docker compose down
|
|||||||
| `bun run start` | 直接运行 `src/server.ts` |
|
| `bun run start` | 直接运行 `src/server.ts` |
|
||||||
| `bun run start:prod` | 先类型检查再启动 |
|
| `bun run start:prod` | 先类型检查再启动 |
|
||||||
| `bun run install:opencode` | 手动安装 `.opencode` 依赖 |
|
| `bun run install:opencode` | 手动安装 `.opencode` 依赖 |
|
||||||
| `bun run pipeline:trigger` | 通过强制更新远端 `main` 分支触发 Gitea CI/CD;分支触发时只发布/覆盖 `latest` 镜像 |
|
| `bun run pipeline:trigger` | 通过重建并强推 annotated `latest` tag 触发 Gitea CI/CD,只发布/覆盖 `latest` 镜像 |
|
||||||
|
|
||||||
### 模型与 API 配置
|
### 模型与 API 配置
|
||||||
|
|
||||||
|
|||||||
@@ -3,12 +3,13 @@
|
|||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
|
if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
|
||||||
echo "Usage: bash scripts/trigger-gitea-pipeline.sh [remote] [branch]"
|
echo "Usage: bash scripts/trigger-gitea-pipeline.sh [remote] [tag]"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Examples:"
|
echo "Examples:"
|
||||||
echo " bash scripts/trigger-gitea-pipeline.sh"
|
echo " bash scripts/trigger-gitea-pipeline.sh"
|
||||||
echo " bash scripts/trigger-gitea-pipeline.sh gitea main"
|
echo " bash scripts/trigger-gitea-pipeline.sh gitea latest"
|
||||||
echo " bash scripts/trigger-gitea-pipeline.sh origin main"
|
echo " bash scripts/trigger-gitea-pipeline.sh origin latest"
|
||||||
|
echo " bash scripts/trigger-gitea-pipeline.sh gitea v2026.05.19.1"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -27,7 +28,7 @@ resolve_default_remote() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
REMOTE="${1:-}"
|
REMOTE="${1:-}"
|
||||||
BRANCH="${2:-main}"
|
TAG="${2:-latest}"
|
||||||
|
|
||||||
if ! git rev-parse --git-dir >/dev/null 2>&1; then
|
if ! git rev-parse --git-dir >/dev/null 2>&1; then
|
||||||
echo "[ERROR] Current directory is not a git repository."
|
echo "[ERROR] Current directory is not a git repository."
|
||||||
@@ -51,12 +52,16 @@ if ! git remote get-url "$REMOTE" >/dev/null 2>&1; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
HEAD_SHA="$(git rev-parse --short HEAD)"
|
HEAD_SHA="$(git rev-parse --short HEAD)"
|
||||||
|
MESSAGE="manual trigger: ${TAG} $(date '+%F %T')"
|
||||||
|
|
||||||
echo "[INFO] HEAD: ${HEAD_SHA}"
|
echo "[INFO] HEAD: ${HEAD_SHA}"
|
||||||
echo "[INFO] Force-push HEAD to remote branch '${BRANCH}'"
|
echo "[INFO] Recreate annotated tag '${TAG}'"
|
||||||
git push "$REMOTE" "HEAD:refs/heads/${BRANCH}" --force
|
git tag -fa "$TAG" -m "$MESSAGE"
|
||||||
|
|
||||||
echo "[INFO] Verify remote branch reference"
|
echo "[INFO] Push '${TAG}' to remote '${REMOTE}' (force update)"
|
||||||
git ls-remote "$REMOTE" "refs/heads/${BRANCH}"
|
git push "$REMOTE" "refs/tags/${TAG}" --force
|
||||||
|
|
||||||
echo "[DONE] Pipeline trigger request sent by updating branch '${BRANCH}'."
|
echo "[INFO] Verify remote tag reference"
|
||||||
|
git ls-remote --tags "$REMOTE" "refs/tags/${TAG}"
|
||||||
|
|
||||||
|
echo "[DONE] Pipeline trigger request sent by updating tag '${TAG}'."
|
||||||
|
|||||||
Reference in New Issue
Block a user