修复 Jenkins 内部 Git checkout 鉴权
为生产构建和导入导出流水线的 GitSCM checkout 增加 Jenkins 凭据。 保留 genarrative-station HTTP 主源,并增加本地 Gitea SSH 凭据备用源。 让 jenkins-checkout-source.sh 可复用已鉴权的浅克隆结果。 同步生产运维文档和项目共享记忆。
This commit is contained in:
@@ -7,12 +7,14 @@ COMMIT_HASH="${COMMIT_HASH:-}"
|
||||
GIT_REMOTE_URL="${GIT_REMOTE_URL:-}"
|
||||
GIT_REMOTE_FALLBACK_URL="${GIT_REMOTE_FALLBACK_URL:-}"
|
||||
SOURCE_COMMIT_FILE="${SOURCE_COMMIT_FILE:-.jenkins-source-commit}"
|
||||
GENARRATIVE_JENKINS_REUSE_EXISTING_CHECKOUT="${GENARRATIVE_JENKINS_REUSE_EXISTING_CHECKOUT:-false}"
|
||||
|
||||
# Windows PowerShell 5.1 的 UTF-8 输出可能带 BOM;下游参数校验前先剥离不可见字节。
|
||||
SOURCE_BRANCH="$(printf "%s" "${SOURCE_BRANCH}" | sed $'s/^\xef\xbb\xbf//' | tr -d '\r\n')"
|
||||
COMMIT_HASH="$(printf "%s" "${COMMIT_HASH}" | sed $'s/^\xef\xbb\xbf//' | tr -d '\r\n')"
|
||||
GIT_REMOTE_URL="$(printf "%s" "${GIT_REMOTE_URL}" | sed $'s/^\xef\xbb\xbf//' | tr -d '\r\n')"
|
||||
GIT_REMOTE_FALLBACK_URL="$(printf "%s" "${GIT_REMOTE_FALLBACK_URL}" | sed $'s/^\xef\xbb\xbf//' | tr -d '\r\n')"
|
||||
GENARRATIVE_JENKINS_REUSE_EXISTING_CHECKOUT="$(printf "%s" "${GENARRATIVE_JENKINS_REUSE_EXISTING_CHECKOUT}" | sed $'s/^\xef\xbb\xbf//' | tr -d '\r\n' | tr '[:upper:]' '[:lower:]')"
|
||||
|
||||
if [[ ! "${SOURCE_BRANCH}" =~ ^[0-9A-Za-z._/-]+$ ]]; then
|
||||
echo "[jenkins-checkout-source] SOURCE_BRANCH 只能包含数字、字母、点、下划线、短横线和斜杠: ${SOURCE_BRANCH}" >&2
|
||||
@@ -118,10 +120,48 @@ resolve_requested_commit_with_deepen() {
|
||||
resolve_requested_commit_if_on_branch "${requested_commit}"
|
||||
}
|
||||
|
||||
# 中文注释:Jenkins GitSCM 已经用凭据完成浅克隆时,优先复用当前 checkout,避免 shell 再次无凭据 fetch 私有仓库。
|
||||
resolve_existing_checkout_if_requested() {
|
||||
local current_commit
|
||||
local branch_commit
|
||||
local requested_commit
|
||||
|
||||
if [[ "${GENARRATIVE_JENKINS_REUSE_EXISTING_CHECKOUT}" != "true" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
current_commit="$(git rev-parse --verify HEAD^{commit} 2>/dev/null)" || return 1
|
||||
|
||||
if [[ -n "${COMMIT_HASH}" ]]; then
|
||||
requested_commit="$(resolve_requested_commit_if_on_branch "${COMMIT_HASH}")" || return 1
|
||||
if [[ "${current_commit}" != "${requested_commit}" ]]; then
|
||||
return 1
|
||||
fi
|
||||
printf "%s\n" "${requested_commit}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
branch_commit="$(git rev-parse --verify "refs/remotes/origin/${SOURCE_BRANCH}^{commit}" 2>/dev/null)" || return 1
|
||||
if [[ "${current_commit}" != "${branch_commit}" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
printf "%s\n" "${current_commit}"
|
||||
}
|
||||
|
||||
add_git_remote_candidate "${GIT_REMOTE_URL}"
|
||||
add_git_remote_candidate "${GIT_REMOTE_FALLBACK_URL}"
|
||||
|
||||
git reset --hard HEAD
|
||||
if RESOLVED_COMMIT="$(resolve_existing_checkout_if_requested)"; then
|
||||
git checkout --detach "${RESOLVED_COMMIT}"
|
||||
git reset --hard HEAD
|
||||
git clean -fd
|
||||
printf "%s\n" "${RESOLVED_COMMIT}" >"${SOURCE_COMMIT_FILE}"
|
||||
echo "[jenkins-checkout-source] 复用 Jenkins GitSCM checkout: branch=${SOURCE_BRANCH} commit=${RESOLVED_COMMIT}"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ "${#GIT_REMOTE_CANDIDATES[@]}" -eq 0 ]]; then
|
||||
fetch_source_branch ""
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user