From 2098d78cdb66ed150f24afaad6bd038c45ac2680 Mon Sep 17 00:00:00 2001 From: "jason.liao" Date: Tue, 2 Jun 2026 15:22:55 +0800 Subject: [PATCH] release --- .github/workflows/release.yml | 140 +++++++++++ README.md | 25 +- README_CN.md | 456 ++++++++++++++++++++++++++++++++++ images/img01.webp | Bin 0 -> 17832 bytes images/img02.webp | Bin 0 -> 29564 bytes images/img03.webp | Bin 0 -> 19402 bytes scripts/install.ps1 | 83 +++++++ scripts/install.sh | 121 +++++++++ webhook.go | 4 +- 9 files changed, 821 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/release.yml create mode 100644 README_CN.md create mode 100644 images/img01.webp create mode 100644 images/img02.webp create mode 100644 images/img03.webp create mode 100644 scripts/install.ps1 create mode 100755 scripts/install.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..f4153a1 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,140 @@ +name: release + +on: + push: + tags: + - "v*" + workflow_dispatch: + inputs: + version: + description: "Release version, for example v2.8.4" + required: true + type: string + +permissions: + contents: write + +jobs: + test: + env: + GOTOOLCHAIN: local + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version: "1.22.x" + - name: Test + run: go test -v ./... + + build: + env: + CGO_ENABLED: "0" + GOTOOLCHAIN: local + needs: test + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - goos: darwin + goarch: amd64 + - goos: darwin + goarch: arm64 + - goos: freebsd + goarch: 386 + - goos: freebsd + goarch: amd64 + - goos: freebsd + goarch: arm64 + - goos: linux + goarch: 386 + - goos: linux + goarch: amd64 + - goos: linux + goarch: arm + - goos: linux + goarch: arm64 + - goos: openbsd + goarch: 386 + - goos: openbsd + goarch: amd64 + - goos: openbsd + goarch: arm64 + - goos: windows + goarch: 386 + - goos: windows + goarch: amd64 + - goos: windows + goarch: arm64 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version: "1.22.x" + + - name: Resolve version + id: version + shell: bash + run: | + version="${{ github.event.inputs.version || github.ref_name }}" + version="${version#v}" + echo "version=$version" >> "$GITHUB_OUTPUT" + + - name: Build archive + shell: bash + run: | + target="webhook-${{ matrix.goos }}-${{ matrix.goarch }}" + mkdir -p "dist/$target" + + binary="webhook" + if [ "${{ matrix.goos }}" = "windows" ]; then + binary="webhook.exe" + fi + + GOOS="${{ matrix.goos }}" GOARCH="${{ matrix.goarch }}" \ + go build -trimpath -ldflags="-s -w -X main.version=${{ steps.version.outputs.version }}" \ + -o "dist/$target/$binary" . + + cp LICENSE README.md "dist/$target/" + tar -czf "dist/$target.tar.gz" -C dist "$target" + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: webhook-${{ matrix.goos }}-${{ matrix.goarch }} + path: dist/*.tar.gz + if-no-files-found: error + + publish: + needs: build + runs-on: ubuntu-latest + steps: + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + path: dist + merge-multiple: true + + - name: Generate checksums + shell: bash + run: | + cd dist + sha256sum *.tar.gz > checksums.txt + + - name: Resolve tag + id: tag + shell: bash + run: | + tag="${{ github.event.inputs.version || github.ref_name }}" + echo "tag=$tag" >> "$GITHUB_OUTPUT" + + - name: Publish GitHub release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ steps.tag.outputs.tag }} + name: ${{ steps.tag.outputs.tag }} + files: | + dist/*.tar.gz + dist/checksums.txt + generate_release_notes: true diff --git a/README.md b/README.md index 18826c4..9a46e43 100644 --- a/README.md +++ b/README.md @@ -45,11 +45,26 @@ If you are using Debian linux ("stretch" or later), you can install webhook usin #### FreeBSD If you are using FreeBSD, you can install webhook using `pkg install webhook`. -### Download prebuilt binaries -Prebuilt binaries for different architectures are available at [GitHub Releases](https://github.com/adnanh/webhook/releases). - -## Configuration -Next step is to define some hooks you want [webhook][w] to serve. +### Download prebuilt binaries +Prebuilt binaries for different architectures are available at [GitHub Releases](https://github.com/xtulnx/webhook/releases). + +### One-line install or update +The install scripts download the latest GitHub Release asset for your platform and replace the local binary. + +Linux, macOS, FreeBSD, or OpenBSD: +```bash +curl -fsSL https://raw.githubusercontent.com/xtulnx/webhook/master/scripts/install.sh | sh +``` + +Windows PowerShell: +```powershell +irm https://raw.githubusercontent.com/xtulnx/webhook/master/scripts/install.ps1 | iex +``` + +Set `WEBHOOK_VERSION` to install a specific release tag, `WEBHOOK_REPO` to install from a fork, or `WEBHOOK_INSTALL_DIR` to choose the destination directory. + +## Configuration +Next step is to define some hooks you want [webhook][w] to serve. [webhook][w] supports JSON or YAML configuration files, but we'll focus primarily on JSON in the following example. Begin by creating an empty file named `hooks.json`. This file will contain an array of hooks the [webhook][w] will serve. Check [Hook definition page](docs/Hook-Definition.md) to see the detailed description of what properties a hook can contain, and how to use them. diff --git a/README_CN.md b/README_CN.md new file mode 100644 index 0000000..d53c85c --- /dev/null +++ b/README_CN.md @@ -0,0 +1,456 @@ +# webhook 中文使用指南 + +`webhook` 是一个用 Go 编写的轻量级 HTTP 回调服务。它可以把请求中的 header、query、payload、文件等数据映射到命令参数或环境变量,并在规则校验通过后执行指定命令。 + +本仓库是从 `adnanh/webhook` fork 而来的增强版本,仓库地址为 [xtulnx/webhook](https://github.com/xtulnx/webhook)。除了上游原有能力外,本版本补充了 YAML 总配置、Admin 管理界面、命令超时、并发限制、反向代理真实 IP、PID 文件、一键安装脚本和 GitHub Release 编译发布流程。 + +![Admin 登录界面](images/img01.webp) + +## 主要特性 + +- 支持 JSON/YAML hook 配置。 +- 支持 `-c`、`-config`、`--config` 加载 YAML 总配置文件。 +- 支持 Admin UI 在线管理已加载的 hooks 文件。 +- Admin 登录使用 TOTP 动态验证码,登录后使用短期 JWT 会话。 +- 支持全局和单 hook 的命令执行超时。 +- 支持全局和单 hook 的并发执行限制。 +- 支持反向代理后的真实客户端 IP 提取,适配 `ip-whitelist`。 +- 支持 multipart 上传文件以临时环境变量形式传给命令。 +- 支持 PID 文件、日志文件、热重载、自定义响应头、TLS、Unix socket。 +- 提供 Linux/macOS/BSD 的 shell 一键安装脚本和 Windows PowerShell 一键安装脚本。 +- 提供 GitHub Actions 自动编译、打包、校验和发布脚本。 + +## 快速安装或更新 + +Linux、macOS、FreeBSD、OpenBSD: + +```bash +curl -fsSL https://raw.githubusercontent.com/xtulnx/webhook/master/scripts/install.sh | sh +``` + +Windows PowerShell: + +```powershell +irm https://raw.githubusercontent.com/xtulnx/webhook/master/scripts/install.ps1 | iex +``` + +安装脚本默认安装最新 GitHub Release,并进行 SHA256 校验。再次执行同一条命令即可更新到最新版本。 + +可通过环境变量调整安装行为: + +```bash +curl -fsSL https://raw.githubusercontent.com/xtulnx/webhook/master/scripts/install.sh | \ + WEBHOOK_VERSION=v2.8.4 WEBHOOK_INSTALL_DIR="$HOME/.local/bin" sh +``` + +PowerShell 示例: + +```powershell +$env:WEBHOOK_VERSION = "v2.8.4" +$env:WEBHOOK_INSTALL_DIR = "$env:USERPROFILE\bin" +irm https://raw.githubusercontent.com/xtulnx/webhook/master/scripts/install.ps1 | iex +``` + +常用变量: + +- `WEBHOOK_REPO`: GitHub 仓库,默认 `xtulnx/webhook`。 +- `WEBHOOK_VERSION`: 版本 tag,默认 `latest`。 +- `WEBHOOK_INSTALL_DIR`: 安装目录。Unix 默认 `/usr/local/bin`,Windows 默认 `%LOCALAPPDATA%\Programs\webhook`。 +- `WEBHOOK_BINARY_NAME`: 安装后的 binary 名称,默认 `webhook` 或 `webhook.exe`。 + +## 从源码构建 + +需要 Go 1.21 或更新版本。 + +```bash +git clone https://github.com/xtulnx/webhook.git +cd webhook +go build +./webhook -version +``` + +运行测试: + +```bash +go test ./... +``` + +生成本地 release 包: + +```bash +make release +make release-windows +``` + +## 最小可用示例 + +创建 hook 文件 `hooks.yaml`: + +```yaml +- id: deploy + execute-command: /usr/local/bin/deploy.sh + command-working-directory: /srv/app + http-methods: + - POST + response-message: Deploy triggered + trigger-rule: + match: + type: value + value: my-secret + parameter: + source: header + name: X-Webhook-Secret +``` + +启动服务: + +```bash +webhook -hooks hooks.yaml -verbose +``` + +触发 hook: + +```bash +curl -X POST \ + -H "X-Webhook-Secret: my-secret" \ + http://127.0.0.1:9000/hooks/deploy +``` + +默认监听地址是 `0.0.0.0:9000`,默认 hook URL 前缀是 `/hooks/`。 + +## 使用 YAML 总配置文件 + +本 fork 新增了总配置文件能力。可以把命令行参数写进 YAML 文件,再用 `-c`、`-config` 或 `--config` 启动。 + +示例 `webhook.yaml`: + +```yaml +ip: 0.0.0.0 +port: 1987 +urlprefix: wh +hooks: + - /etc/webhook/admin.yaml + - /etc/webhook/hooks.yaml +hotreload: true +nopanic: true +verbose: true +logfile: /var/log/webhook.log +pidfile: /var/run/webhook.pid +command-timeout: 30s +max-concurrency: 4 +``` + +启动: + +```bash +webhook -c /etc/webhook/webhook.yaml +``` + +命令行参数优先级高于配置文件。例如: + +```bash +webhook -c /etc/webhook/webhook.yaml -port 9000 -debug +``` + +完整示例可参考 [webhook.yaml.example](webhook.yaml.example)。 + +## Admin 管理界面 + +本 fork 内置 Admin UI 和 API,可在线查看、新增、编辑和删除已加载的 hooks 文件。 + +![Hook 结构化编辑器](images/img02.webp) + +启用方式: + +```yaml +admin: true +admin-path: admin +admin-totp-secret: "BASE32_TOTP_SECRET" +admin-jwt-secret: "replace-with-a-long-random-secret" +admin-session-ttl: 12h +``` + +启动后访问: + +```text +http://127.0.0.1:1987/admin/ +``` + +生成 TOTP Base32 密钥: + +```bash +python3 -c 'import base64, os; print(base64.b32encode(os.urandom(20)).decode().rstrip("="))' +``` + +把生成的密钥配置到 Google Authenticator、Microsoft Authenticator、1Password 等认证器中,然后在 Admin 登录页输入当前 6 位动态码。 + +注意事项: + +- `admin-path` 不能和 `urlprefix` 相同。 +- `admin-totp-secret` 必须是 Base32 编码。 +- `admin-jwt-secret` 必须设置为足够长的随机字符串。 +- 如果启用了 `template: true`,Admin 写入会进入只读模式,避免覆盖模板配置。 +- 生产环境建议放在 HTTPS 或受保护的反向代理后面。 + +![参数、规则与 JSON 预览](images/img03.webp) + +## Hook 配置要点 + +Hook 至少需要 `id` 和 `execute-command`: + +```yaml +- id: example + execute-command: /usr/local/bin/example.sh +``` + +常用字段: + +- `command-working-directory`: 命令工作目录。 +- `pass-arguments-to-command`: 把请求值作为命令参数传入。 +- `pass-environment-to-command`: 把请求值作为环境变量传入。 +- `pass-file-to-command`: 把文件参数传入命令。 +- `parse-parameters-as-json`: 把指定参数按 JSON 解析。 +- `trigger-rule`: 触发规则,支持 `and`、`or`、`not`、`match`。 +- `response-message`: 成功响应文本。 +- `success-http-response-code`: 成功响应状态码。 +- `trigger-rule-mismatch-http-response-code`: 规则不匹配时的状态码。 +- `include-command-output-in-response`: 把命令输出写入响应。 +- `include-command-output-in-response-on-error`: 命令失败时也返回命令输出。 +- `command-timeout`: 覆盖全局命令超时。 +- `max-concurrency`: 覆盖全局并发限制。 +- `keep-file-environment`: 暴露上传文件临时路径给命令。 + +更完整的字段说明请参考 [docs/Hook-Definition.md](docs/Hook-Definition.md)。 + +## 命令超时与并发限制 + +全局命令超时: + +```bash +webhook -hooks hooks.yaml -command-timeout 30s +``` + +单个 hook 覆盖: + +```yaml +- id: slow-task + execute-command: /usr/local/bin/slow-task.sh + command-timeout: 2m +``` + +`0` 表示禁用超时: + +```yaml +- id: no-timeout-task + execute-command: /usr/local/bin/task.sh + command-timeout: "0" +``` + +全局并发限制: + +```bash +webhook -hooks hooks.yaml -max-concurrency 2 +``` + +单个 hook 覆盖: + +```yaml +- id: deploy + execute-command: /usr/local/bin/deploy.sh + max-concurrency: 1 +``` + +当并发达到上限时,请求会返回 `503 Service Unavailable`。 + +## 反向代理与真实 IP + +如果 webhook 部署在 Nginx、Traefik、Caddy 等反向代理后面,直接使用 `RemoteAddr` 会拿到代理 IP,而不是真实客户端 IP。本 fork 支持可信代理配置,配合 `ip-whitelist` 使用。 + +配置示例: + +```yaml +real-ip-header: X-Real-Ip +trusted-proxies: "127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16" +``` + +Nginx 示例: + +```nginx +location / { + proxy_pass http://127.0.0.1:1987; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +} +``` + +只有当请求来源属于 `trusted-proxies` 时,webhook 才会信任 `real-ip-header`,防止客户端伪造 IP header 绕过白名单。 + +## 上传文件处理 + +multipart 表单中,符合条件的 JSON 文件或被 `parse-parameters-as-json` 指定的文件会被解析到 payload。 + +如果命令需要直接读取上传文件,可启用: + +```yaml +- id: upload + execute-command: /usr/local/bin/handle-upload.sh + keep-file-environment: true +``` + +字段名为 `pkg` 的上传文件会在命令运行期间暴露为: + +```text +HOOK_FILE_PKG=/tmp/... +HOOK_FILENAME_PKG=original-file-name.tar.gz +``` + +命令结束后临时文件会被清理。建议 multipart 字段名只使用字母、数字和下划线,方便 shell 脚本读取。 + +## HTTPS、日志和 PID 文件 + +HTTPS: + +```bash +webhook -hooks hooks.yaml -secure -cert /etc/webhook/cert.pem -key /etc/webhook/key.pem +``` + +指定 TLS 最低版本: + +```bash +webhook -hooks hooks.yaml -secure -tls-min-version 1.2 +``` + +日志文件: + +```bash +webhook -hooks hooks.yaml -verbose -logfile /var/log/webhook.log +``` + +PID 文件: + +```bash +webhook -hooks hooks.yaml -pidfile /var/run/webhook.pid +``` + +热重载: + +```bash +webhook -hooks hooks.yaml -hotreload +``` + +## systemd 示例 + +`/etc/systemd/system/webhook.service`: + +```ini +[Unit] +Description=Webhook service +After=network.target + +[Service] +Type=simple +ExecStart=/usr/local/bin/webhook -c /etc/webhook/webhook.yaml +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +``` + +启用并启动: + +```bash +sudo systemctl daemon-reload +sudo systemctl enable --now webhook +sudo systemctl status webhook +``` + +## GitHub 编译发布流程 + +本仓库新增 [release workflow](.github/workflows/release.yml)。当推送 `v*` tag 时,会自动: + +1. 运行测试。 +2. 为 Linux、macOS、FreeBSD、OpenBSD、Windows 构建多架构 binary。 +3. 打包为 `webhook-{os}-{arch}.tar.gz`。 +4. 生成 `checksums.txt`。 +5. 发布到 GitHub Releases。 + +发布新版本: + +```bash +git tag v2.8.4 +git push origin v2.8.4 +``` + +也可以在 GitHub Actions 页面手动运行 `release` workflow,并填写版本号。 + +发布前建议确认: + +- `webhook.go` 中默认版本号已更新,或确认 workflow 注入的 tag 版本符合预期。 +- GitHub Actions 对仓库有 `contents: write` 权限。 +- 目标 tag 不要重复使用,除非你明确要覆盖 Release。 + +## 常见问题 + +### 一键安装下载失败 + +检查 GitHub Release 是否已经存在对应平台资产。例如 Linux amd64 需要: + +```text +webhook-linux-amd64.tar.gz +``` + +也可以指定仓库和版本: + +```bash +curl -fsSL https://raw.githubusercontent.com/xtulnx/webhook/master/scripts/install.sh | \ + WEBHOOK_REPO=xtulnx/webhook WEBHOOK_VERSION=v2.8.4 sh +``` + +### Admin 无法登录 + +优先检查: + +- `admin: true` 是否启用。 +- `admin-totp-secret` 是否为 Base32。 +- 认证器时间是否准确。 +- `admin-jwt-secret` 是否为空。 +- 请求路径是否为配置的 `admin-path`。 + +### IP 白名单在反向代理后不生效 + +需要同时配置: + +- 反向代理写入 `X-Real-IP` 或 `X-Forwarded-For`。 +- webhook 设置 `real-ip-header`。 +- webhook 设置 `trusted-proxies`,并包含代理服务器 IP。 + +### Hook 文件无法通过 Admin 修改 + +如果使用 `template: true`,Admin 写入会被禁用。请关闭模板模式,或手动编辑模板源文件。 + +## 目录说明 + +- `webhook.go`: 主入口和 CLI 参数。 +- `config.go`: YAML 总配置加载。 +- `admin.go`、`admin_store.go`、`admin_ui.go`: Admin UI/API 和配置写入。 +- `execution.go`: 命令超时和并发控制。 +- `realip.go`: 反向代理真实 IP 处理。 +- `internal/hook/`: hook 解析、规则判断和请求映射。 +- `internal/middleware/`: HTTP 日志和请求辅助中间件。 +- `internal/pidfile/`: PID 文件处理。 +- `adminui/`: 内嵌 Admin 前端页面。 +- `scripts/`: 一键安装脚本。 +- `.github/workflows/`: GitHub Actions 构建和发布脚本。 + +## 安全建议 + +- 不要提交真实密钥、生产 hook 定义或 TOTP/JWT secret。 +- Admin UI 建议放在 HTTPS 后面,并限制访问来源。 +- `trusted-proxies` 只填写你真正控制的代理地址。 +- `include-command-output-in-response` 可能泄露命令输出,生产环境谨慎开启。 +- hook 执行的脚本要自行做好权限、参数校验和日志记录。 + +## 许可证 + +本项目沿用上游 MIT License。详见 [LICENSE](LICENSE)。 diff --git a/images/img01.webp b/images/img01.webp new file mode 100644 index 0000000000000000000000000000000000000000..f0729caadda1bfc62abda48e6307374ac7a2c0bb GIT binary patch literal 17832 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 TKmY&%ZbATTRvzM3Xp8^=T|9|O literal 0 HcmV?d00001 diff --git a/images/img02.webp b/images/img02.webp new file mode 100644 index 0000000000000000000000000000000000000000..4046071dfbb999daa7342908ebe054615b85655a GIT binary patch literal 29564 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
    58!*TddlD4n7Fx6M>H@+ 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 Kxc^xR0Q?`g&9h7Z literal 0 HcmV?d00001 diff --git a/images/img03.webp b/images/img03.webp new file mode 100644 index 0000000000000000000000000000000000000000..e2f98a21021e7e686d266823da5dc01182da8bd9 GIT binary patch literal 19402 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/dev/null 2>&1; then + echo "error: required command not found: $1" >&2 + exit 1 + fi +} + +detect_os() { + os="$(uname -s | tr '[:upper:]' '[:lower:]')" + case "$os" in + darwin|freebsd|linux|openbsd) printf '%s' "$os" ;; + *) echo "error: unsupported OS: $os" >&2; exit 1 ;; + esac +} + +detect_arch() { + arch="$(uname -m)" + case "$arch" in + x86_64|amd64) printf 'amd64' ;; + aarch64|arm64) printf 'arm64' ;; + i386|i686) printf '386' ;; + armv6l|armv7l|arm) printf 'arm' ;; + *) echo "error: unsupported architecture: $arch" >&2; exit 1 ;; + esac +} + +download() { + url="$1" + output="$2" + + if command -v curl >/dev/null 2>&1; then + curl -fsSL "$url" -o "$output" + elif command -v wget >/dev/null 2>&1; then + wget -q "$url" -O "$output" + else + echo "error: curl or wget is required" >&2 + exit 1 + fi +} + +verify_checksum() { + checksums="$1" + archive="$2" + asset="$3" + + expected="$(grep " $asset\$" "$checksums" | awk '{print $1}')" + if [ -z "$expected" ]; then + echo "error: checksum for $asset not found" >&2 + exit 1 + fi + + if command -v sha256sum >/dev/null 2>&1; then + actual="$(sha256sum "$archive" | awk '{print $1}')" + elif command -v shasum >/dev/null 2>&1; then + actual="$(shasum -a 256 "$archive" | awk '{print $1}')" + elif command -v sha256 >/dev/null 2>&1; then + actual="$(sha256 -q "$archive")" + else + echo "warning: no SHA256 command found; skipping checksum verification" >&2 + return + fi + + if [ "$actual" != "$expected" ]; then + echo "error: checksum mismatch for $asset" >&2 + exit 1 + fi +} + +install_binary() { + src="$1" + dst="$2" + + mkdir -p "$install_dir" 2>/dev/null || true + if [ -w "$install_dir" ]; then + install -m 0755 "$src" "$dst" + elif command -v sudo >/dev/null 2>&1; then + sudo mkdir -p "$install_dir" + sudo install -m 0755 "$src" "$dst" + else + echo "error: $install_dir is not writable and sudo is not available" >&2 + exit 1 + fi +} + +need uname +need tar + +os="$(detect_os)" +arch="$(detect_arch)" +asset="webhook-$os-$arch.tar.gz" + +if [ "$version" = "latest" ]; then + url="https://github.com/$repo/releases/latest/download/$asset" + checksums_url="https://github.com/$repo/releases/latest/download/checksums.txt" +else + url="https://github.com/$repo/releases/download/$version/$asset" + checksums_url="https://github.com/$repo/releases/download/$version/checksums.txt" +fi + +tmp="$(mktemp -d)" +trap 'rm -rf "$tmp"' EXIT INT TERM + +archive="$tmp/$asset" +echo "Downloading $repo $version for $os/$arch..." +download "$url" "$archive" +download "$checksums_url" "$tmp/checksums.txt" +verify_checksum "$tmp/checksums.txt" "$archive" "$asset" + +tar -xzf "$archive" -C "$tmp" +install_binary "$tmp/webhook-$os-$arch/webhook" "$install_dir/$binary_name" + +echo "Installed $binary_name to $install_dir" +"$install_dir/$binary_name" -version diff --git a/webhook.go b/webhook.go index 1c57733..1945615 100644 --- a/webhook.go +++ b/webhook.go @@ -25,9 +25,7 @@ import ( "github.com/gorilla/mux" ) -const ( - version = "2.8.3" -) +var version = "2.8.3" var ( ip = flag.String("ip", "0.0.0.0", "ip the webhook should serve hooks on")