Compare commits

...

11 Commits

Author SHA1 Message Date
jiang 7b79c4034d 移除验证作业,简化 CI/CD 流程
Agent CI/CD / docker-image (push) Has been skipped
Agent CI/CD / deploy-fallback-log (push) Has been skipped
2026-05-19 15:28:52 +08:00
jiang 2e6f4b0a10 添加部署 webhook 调用,优化 HTTP 请求处理
Agent CI/CD / validate (push) Successful in 23s
Agent CI/CD / docker-image (push) Successful in 8s
Agent CI/CD / deploy-fallback-log (push) Has been skipped
2026-05-19 15:26:02 +08:00
jiang 65a1a11b39 添加 .gitignore 和 bun.lock 文件以管理依赖
Agent CI/CD / docker-image (push) Has been cancelled
Agent CI/CD / deploy-fallback-log (push) Has been cancelled
Agent CI/CD / validate (push) Has been cancelled
2026-05-19 12:11:04 +08:00
jiang 90d591b7bb 更新 Bun 镜像版本为 canary-slim
Agent CI/CD / validate (push) Successful in 33s
Agent CI/CD / docker-image (push) Failing after 1s
Agent CI/CD / deploy-fallback-log (push) Successful in 0s
2026-05-19 12:07:58 +08:00
jiang aa8f801a04 添加环境变量检查,确保注册信息完整
Agent CI/CD / validate (push) Successful in 31s
Agent CI/CD / docker-image (push) Failing after 31s
Agent CI/CD / deploy-fallback-log (push) Successful in 1s
2026-05-19 11:55:17 +08:00
jiang f1fae1819f 添加缺失的环境变量和密钥检查
Agent CI/CD / validate (push) Successful in 31s
Agent CI/CD / docker-image (push) Failing after 16s
Agent CI/CD / deploy-fallback-log (push) Successful in 1s
2026-05-19 11:51:06 +08:00
jiang cdeba0a725 优化 Bun 下载逻辑,简化代码结构 2026-05-19 11:43:31 +08:00
jiang 1c226afb69 添加 package.json 文件,配置依赖和脚本
Agent CI/CD / validate (push) Successful in 33s
Agent CI/CD / docker-image (push) Failing after 16s
Agent CI/CD / deploy-fallback-log (push) Successful in 0s
2026-05-19 11:42:06 +08:00
jiang be5e4c87de 优化 Bun 安装脚本,支持多个下载源
Agent CI/CD / validate (push) Failing after 1m9s
Agent CI/CD / docker-image (push) Has been skipped
Agent CI/CD / deploy-fallback-log (push) Has been skipped
2026-05-19 11:38:03 +08:00
jiang 9373a42841 优化 Bun 安装脚本,简化代码结构
Agent CI/CD / validate (push) Failing after 24s
Agent CI/CD / docker-image (push) Has been skipped
Agent CI/CD / deploy-fallback-log (push) Has been skipped
2026-05-19 11:32:24 +08:00
jiang baec7940a5 更新 Gitea CI/CD 触发逻辑,支持通过标签触发 2026-05-19 11:31:38 +08:00
7 changed files with 155 additions and 99 deletions
+50 -87
View File
@@ -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}"
+3
View File
@@ -0,0 +1,3 @@
node_modules
package-lock.json
.gitignore
+72
View File
@@ -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", "", {}, ""],
}
}
+13
View File
@@ -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
View File
@@ -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
+1 -1
View File
@@ -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 配置
+14 -9
View File
@@ -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}'."