init
This commit is contained in:
+29
@@ -1,7 +1,36 @@
|
||||
kind: pipeline
|
||||
name: default
|
||||
|
||||
clone:
|
||||
disable: true
|
||||
|
||||
steps:
|
||||
- name: clone
|
||||
image: alpine:3.22
|
||||
commands:
|
||||
- apk add --no-cache git ca-certificates
|
||||
- git --version
|
||||
- |
|
||||
set -eu
|
||||
set +x
|
||||
test -n "$${DRONE_GIT_HTTP_URL:-}" || { echo 'DRONE_GIT_HTTP_URL is required'; exit 1; }
|
||||
test -n "$${DRONE_COMMIT_SHA:-}" || { echo 'DRONE_COMMIT_SHA is required'; exit 1; }
|
||||
if test -n "$${DRONE_NETRC_MACHINE:-}"; then
|
||||
(umask 077; printf 'machine %s\nlogin %s\npassword %s\n' "$DRONE_NETRC_MACHINE" "$DRONE_NETRC_USERNAME" "$DRONE_NETRC_PASSWORD" > "$HOME/.netrc")
|
||||
fi
|
||||
git clone --no-checkout -- "$DRONE_GIT_HTTP_URL" .
|
||||
printf 'Repository object format: '
|
||||
git rev-parse --show-object-format
|
||||
if test -n "$${DRONE_COMMIT_REF:-}"; then
|
||||
git fetch --no-tags origin "$DRONE_COMMIT_REF"
|
||||
fi
|
||||
if ! git cat-file -e "$DRONE_COMMIT_SHA^{commit}" 2>/dev/null; then
|
||||
git fetch --no-tags origin "$DRONE_COMMIT_SHA"
|
||||
fi
|
||||
git checkout --detach "$DRONE_COMMIT_SHA"
|
||||
test "$(git rev-parse HEAD)" = "$DRONE_COMMIT_SHA" || { echo 'Checked out commit does not match this build'; exit 1; }
|
||||
git log -1 --format='Checked out commit: %H'
|
||||
|
||||
# docker 打包
|
||||
- name: docker
|
||||
image: plugins/docker
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
# 变更原因与设计记录
|
||||
|
||||
## Drone 自动识别 SHA-256 仓库与精确检出(2026-09-23)
|
||||
|
||||
原因:默认克隆方式及前一版协议 v0 兼容配置不满足自动识别 SHA-256 仓库的要求。保留 `clone.disable: true` 和 Docker 发布步骤,改用 Alpine 3.22 安装 Git/CA,通过 `git clone --no-checkout` 协商 SHA-1/SHA-256 格式,不预先初始化仓库。克隆后补取构建引用及缺失的指定提交,detached checkout 并严格核对 `DRONE_COMMIT_SHA`,支持分支继续前进时重建旧提交以及非普通分支引用。日志显示 Git 版本、对象格式与最终提交;认证文件仅写入克隆容器 HOME,保持 TLS 校验。仅影响 CI 克隆,新增 Alpine 软件源访问依赖,无运行时或数据迁移;此前强制协议 v0 的兼容方案由此替代。
|
||||
|
||||
实际验证:读取 YAML 中的真实克隆脚本,模拟 Drone 的美元符号转义后,在 Windows Git Bash / Git 2.54.0 中使用隔离本地 SHA-1、SHA-256 仓库各验证旧提交、tag、PR 引用、按 SHA 补取和缺失提交失败,共 10 项通过;成功用例均核对对象格式、detached HEAD 和完整提交 ID。使用虚拟凭据验证其未写入共享源码目录、未出现在命令输出中。YAML 解析及 `git diff --check` 通过。测试使用 file transport fixture,不代表 Alpine 容器、真实 Drone runner、Gitea HTTP 克隆或私有仓库认证验证通过;未运行无关后端/前端测试。
|
||||
|
||||
## Drone 克隆阶段协议兼容(2026-09-23)
|
||||
|
||||
原因:实际构建在源码 `git fetch` 阶段报 `fatal: expected flush after ref listing`,不是打包命令没有运行,也不是未触发构建。保留当前 Docker 镜像发布配置,将自动克隆替换为显式 `drone/git:1` 步骤,通过 Git 环境配置使用协议 v0 和 HTTP/1.1,并允许两次重试,绕开可能的协议协商兼容问题;不认定已证实反向代理或 Gitea 故障。继续使用 Drone 的认证和提交引用,保持 TLS 校验,不引入额外凭据。影响范围仅 CI 克隆阶段,无运行时或数据迁移。实际验证:本机 Git v2 和 v0/HTTP/1.1 的远端引用读取均成功;这不代表 runner 网络或镜像中的克隆已验证,仍需真实 Drone 重跑确认。
|
||||
|
||||
## Drone 产物可见性与 Gitea 包发布(2026-09-23)
|
||||
|
||||
补充:Gitea 上传步骤使用 Alpine 镜像且没有安装 Git,push 发布版本现直接读取 Drone 提供的 `DRONE_COMMIT_SHA`,缺失时明确失败,避免已完成打包却在发布阶段报 `git: not found`。仅影响 push 的包版本取值实现,版本仍为完整提交 SHA;无迁移。本地 YAML 解析与事件检查通过,真实 Drone runner 未验证。
|
||||
|
||||
@@ -1,5 +1,17 @@
|
||||
# Drone CI 与发布包
|
||||
|
||||
## 当前 Docker 流水线与克隆排错
|
||||
|
||||
当前 `.drone.yml` 已切换为 Docker 镜像构建与发布,使用 `docker_username` / `docker_password` Secret;下文 Linux 归档及 Gitea/IPFS 发布配置为此前方案,不是当前流水线的步骤。
|
||||
|
||||
若日志在 `git fetch` 报 `fatal: expected flush after ref listing`,说明构建已触发,但源码克隆未完成,Docker 构建尚未执行。该日志本身不足以确定根因。
|
||||
|
||||
当前禁用默认 clone,改用 `alpine:3.22` 安装新版 Git 和 CA 证书,再执行 `git clone --no-checkout` 自动协商远端 SHA-1/SHA-256 对象格式;不再先执行 `git init` 或强制协议 v0。日志打印 Git 版本、对象格式和最终提交。克隆后补取 `DRONE_COMMIT_REF`(包括 PR 等非普通分支引用),必要时按提交 ID 补取对象,再以 detached HEAD 检出并核对 `DRONE_COMMIT_SHA`,不以分支最新提交替代本次构建提交;获取不到指定提交时直接失败。
|
||||
|
||||
私有仓库继续使用 Drone 注入的 `DRONE_NETRC_*` 凭据,关闭 shell 跟踪并以受限权限写入克隆容器的 `$HOME/.netrc`,不写入共享源码目录,也不关闭 TLS 校验。该步骤需要能访问 Alpine 软件源及仓库。若仍失败,提供新 clone 步骤完整日志并检查 Gitea/反向代理日志;不要提供令牌或 `.netrc` 内容。
|
||||
|
||||
## 此前的 Linux 归档发布方案
|
||||
|
||||
Drone 的 push、pull_request、tag 流水线先执行 Go 测试、`go vet` 和前端构建,再编译 Linux amd64 无 CGO 单文件程序。打包前运行 `scripts/verify-package.mjs`,在隔离临时目录检查版本信息、内嵌网页、健康检查与登录。所有事件均生成 `bin/releases/serviceport-<VERSION>-linux-amd64.tar.gz`,日志打印归档路径和 SHA256;push 和 tag 可上传 Gitea Generic Packages,仅 tag 可选上传 IPFS。不发布 Windows 程序或容器镜像。
|
||||
|
||||
若 Drone 页面没有任何构建记录,先在 Drone 启用该 Gitea 仓库,确认 Gitea webhook 投递成功、Linux amd64 Docker runner 在线,再推送新提交或重新触发构建;修改 YAML 本身不能启动 Drone。流水线归档位于临时工作区,构建结束后不会自动出现在仓库附件中。
|
||||
|
||||
Reference in New Issue
Block a user