mirror of
https://github.com/moons-14/dotfiles.git
synced 2026-10-06 20:54:07 +09:00
gitea update
Update Nix binary cache / Build every host and publish new cache objects (push) Has been cancelled
Update Nix binary cache / Build every host and publish new cache objects (push) Has been cancelled
This commit is contained in:
@@ -14,8 +14,10 @@ ref_name=${CACHE_REF_NAME:-unknown}
|
|||||||
index_tag=${CACHE_INDEX_TAG:-cache-latest}
|
index_tag=${CACHE_INDEX_TAG:-cache-latest}
|
||||||
generation_prefix=${CACHE_GENERATION_PREFIX:-nix-cache-generation-}
|
generation_prefix=${CACHE_GENERATION_PREFIX:-nix-cache-generation-}
|
||||||
upload_jobs=${CACHE_UPLOAD_JOBS:-4}
|
upload_jobs=${CACHE_UPLOAD_JOBS:-4}
|
||||||
max_upload_bytes=${CACHE_MAX_UPLOAD_BYTES:-90000000}
|
max_upload_bytes=${CACHE_MAX_UPLOAD_BYTES:-}
|
||||||
key_file=${NIX_CACHE_KEY_FILE:-}
|
key_file=${NIX_CACHE_KEY_FILE:-}
|
||||||
|
api_is_internal=0
|
||||||
|
api_curl_options=()
|
||||||
|
|
||||||
for command in curl jq nix awk comm sed find sort; do
|
for command in curl jq nix awk comm sed find sort; do
|
||||||
if ! command -v "$command" >/dev/null 2>&1; then
|
if ! command -v "$command" >/dev/null 2>&1; then
|
||||||
@@ -49,7 +51,7 @@ if [[ ! $upload_jobs =~ ^[1-9][0-9]*$ ]]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ ! $max_upload_bytes =~ ^[0-9]+$ ]]; then
|
if [[ -n $max_upload_bytes && ! $max_upload_bytes =~ ^[0-9]+$ ]]; then
|
||||||
echo "CACHE_MAX_UPLOAD_BYTES must be zero or a positive integer." >&2
|
echo "CACHE_MAX_UPLOAD_BYTES must be zero or a positive integer." >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -89,7 +91,7 @@ api_request() {
|
|||||||
local path=$2
|
local path=$2
|
||||||
shift 2
|
shift 2
|
||||||
|
|
||||||
curl --fail-with-body --silent --show-error \
|
curl "${api_curl_options[@]}" --fail-with-body --silent --show-error \
|
||||||
--retry 5 --retry-delay 2 --retry-all-errors \
|
--retry 5 --retry-delay 2 --retry-all-errors \
|
||||||
--request "$method" \
|
--request "$method" \
|
||||||
--header "Authorization: token ${GITEA_TOKEN}" \
|
--header "Authorization: token ${GITEA_TOKEN}" \
|
||||||
@@ -103,7 +105,7 @@ api_get_optional() {
|
|||||||
local output=$2
|
local output=$2
|
||||||
local status
|
local status
|
||||||
|
|
||||||
status=$(curl --silent --show-error \
|
status=$(curl "${api_curl_options[@]}" --silent --show-error \
|
||||||
--retry 5 --retry-delay 2 --retry-all-errors \
|
--retry 5 --retry-delay 2 --retry-all-errors \
|
||||||
--output "$output" --write-out '%{http_code}' \
|
--output "$output" --write-out '%{http_code}' \
|
||||||
--header "Authorization: token ${GITEA_TOKEN}" \
|
--header "Authorization: token ${GITEA_TOKEN}" \
|
||||||
@@ -170,7 +172,7 @@ upload_asset() {
|
|||||||
size=$(stat -c '%s' "$file")
|
size=$(stat -c '%s' "$file")
|
||||||
size_mib=$(((size + 1048575) / 1048576))
|
size_mib=$(((size + 1048575) / 1048576))
|
||||||
|
|
||||||
if status=$(curl --silent --show-error \
|
if status=$(curl "${api_curl_options[@]}" --silent --show-error \
|
||||||
--retry 5 --retry-delay 2 --retry-all-errors \
|
--retry 5 --retry-delay 2 --retry-all-errors \
|
||||||
--request POST \
|
--request POST \
|
||||||
--header "Authorization: token ${GITEA_TOKEN}" \
|
--header "Authorization: token ${GITEA_TOKEN}" \
|
||||||
@@ -201,7 +203,7 @@ upload_asset_response() {
|
|||||||
local file=$2
|
local file=$2
|
||||||
local name=$3
|
local name=$3
|
||||||
|
|
||||||
curl --fail-with-body --silent --show-error \
|
curl "${api_curl_options[@]}" --fail-with-body --silent --show-error \
|
||||||
--retry 5 --retry-delay 2 --retry-all-errors \
|
--retry 5 --retry-delay 2 --retry-all-errors \
|
||||||
--request POST \
|
--request POST \
|
||||||
--header "Authorization: token ${GITEA_TOKEN}" \
|
--header "Authorization: token ${GITEA_TOKEN}" \
|
||||||
@@ -277,6 +279,64 @@ list_all_releases() {
|
|||||||
jq -s '.' "$releases_jsonl" >"$all_releases_file"
|
jq -s '.' "$releases_jsonl" >"$all_releases_file"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
configure_api_transport() {
|
||||||
|
local candidate
|
||||||
|
local candidate_url
|
||||||
|
local public_authority
|
||||||
|
local version_json
|
||||||
|
|
||||||
|
if [[ -n ${CACHE_API_SERVER_URL:-} ]]; then
|
||||||
|
api_is_internal=1
|
||||||
|
echo "Using configured Gitea origin API: ${api_server_url}"
|
||||||
|
elif [[ $server_url == https://* ]]; then
|
||||||
|
public_authority=${server_url#https://}
|
||||||
|
public_authority=${public_authority%%/*}
|
||||||
|
|
||||||
|
for candidate in host.containers.internal host.docker.internal; do
|
||||||
|
if version_json=$(curl --silent --show-error \
|
||||||
|
--noproxy '*' --connect-timeout 3 --max-time 5 \
|
||||||
|
--connect-to "${public_authority}:443:${candidate}:443" \
|
||||||
|
"${server_url}/api/v1/version" 2>/dev/null) &&
|
||||||
|
jq -e '.version | type == "string"' <<<"$version_json" >/dev/null; then
|
||||||
|
api_curl_options=(
|
||||||
|
--noproxy '*'
|
||||||
|
--connect-to "${public_authority}:443:${candidate}:443"
|
||||||
|
)
|
||||||
|
api_is_internal=1
|
||||||
|
echo "Using direct Gitea HTTPS transport through ${candidate}:443; Cloudflare is bypassed."
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if ((api_is_internal == 0)); then
|
||||||
|
for candidate in host.containers.internal host.docker.internal; do
|
||||||
|
candidate_url="http://${candidate}:3000"
|
||||||
|
if version_json=$(curl --silent --show-error \
|
||||||
|
--noproxy '*' --connect-timeout 3 --max-time 5 \
|
||||||
|
"${candidate_url}/api/v1/version" 2>/dev/null) &&
|
||||||
|
jq -e '.version | type == "string"' <<<"$version_json" >/dev/null; then
|
||||||
|
api_server_url=$candidate_url
|
||||||
|
api_base="${api_server_url}/api/v1/repos/${repository}"
|
||||||
|
api_curl_options=(--noproxy '*')
|
||||||
|
api_is_internal=1
|
||||||
|
echo "Using direct Gitea API through ${candidate}:3000; Cloudflare is bypassed."
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z $max_upload_bytes ]]; then
|
||||||
|
if ((api_is_internal)); then
|
||||||
|
max_upload_bytes=0
|
||||||
|
echo "No workflow-side NAR size limit is applied on the internal API transport."
|
||||||
|
else
|
||||||
|
max_upload_bytes=90000000
|
||||||
|
echo "No internal Gitea API was reachable; using the public endpoint and limiting NAR uploads to ${max_upload_bytes} bytes."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
initialize_manifest() {
|
initialize_manifest() {
|
||||||
jq -n \
|
jq -n \
|
||||||
--arg uri "$cache_uri" \
|
--arg uri "$cache_uri" \
|
||||||
@@ -300,6 +360,8 @@ initialize_manifest() {
|
|||||||
}' >"$manifest_file"
|
}' >"$manifest_file"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
configure_api_transport
|
||||||
|
|
||||||
index_release_file="${work_dir}/index-release.json"
|
index_release_file="${work_dir}/index-release.json"
|
||||||
if api_get_optional "/releases/tags/${index_tag}" "$index_release_file"; then
|
if api_get_optional "/releases/tags/${index_tag}" "$index_release_file"; then
|
||||||
if [[ $mode == bootstrap ]]; then
|
if [[ $mode == bootstrap ]]; then
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ jobs:
|
|||||||
CACHE_REPOSITORY: moons-14/dotfiles
|
CACHE_REPOSITORY: moons-14/dotfiles
|
||||||
CACHE_SERVER_URL: https://git.yutakobayashi.com
|
CACHE_SERVER_URL: https://git.yutakobayashi.com
|
||||||
CACHE_API_SERVER_URL: ${{ vars.NIX_CACHE_API_SERVER_URL }}
|
CACHE_API_SERVER_URL: ${{ vars.NIX_CACHE_API_SERVER_URL }}
|
||||||
CACHE_MAX_UPLOAD_BYTES: "90000000"
|
|
||||||
CACHE_COMMIT: ${{ github.sha }}
|
CACHE_COMMIT: ${{ github.sha }}
|
||||||
CACHE_REF_NAME: ${{ github.ref_name }}
|
CACHE_REF_NAME: ${{ github.ref_name }}
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -40,7 +40,6 @@ jobs:
|
|||||||
CACHE_REPOSITORY: moons-14/dotfiles
|
CACHE_REPOSITORY: moons-14/dotfiles
|
||||||
CACHE_SERVER_URL: https://git.yutakobayashi.com
|
CACHE_SERVER_URL: https://git.yutakobayashi.com
|
||||||
CACHE_API_SERVER_URL: ${{ vars.NIX_CACHE_API_SERVER_URL }}
|
CACHE_API_SERVER_URL: ${{ vars.NIX_CACHE_API_SERVER_URL }}
|
||||||
CACHE_MAX_UPLOAD_BYTES: "90000000"
|
|
||||||
CACHE_COMMIT: ${{ github.sha }}
|
CACHE_COMMIT: ${{ github.sha }}
|
||||||
CACHE_REF_NAME: ${{ github.ref_name }}
|
CACHE_REF_NAME: ${{ github.ref_name }}
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -74,12 +74,18 @@ The origin reverse proxy request-body limit and Gitea's
|
|||||||
Protect an origin hostname with a firewall or another access control that still
|
Protect an origin hostname with a firewall or another access control that still
|
||||||
allows the Actions runner to reach it.
|
allows the Actions runner to reach it.
|
||||||
|
|
||||||
When server-side limits cannot be changed, the workflows enforce
|
Without an explicit origin variable, the workflow automatically probes the
|
||||||
`CACHE_MAX_UPLOAD_BYTES=90000000`. NARs larger than that limit and their
|
Podman/Docker host through `host.containers.internal` and
|
||||||
narinfo files are not uploaded. They are recorded under `skipped` in
|
`host.docker.internal`. It first connects directly to host port 443 while
|
||||||
|
preserving the public hostname and TLS SNI, then tries Gitea's conventional
|
||||||
|
HTTP port 3000. A successful probe bypasses Cloudflare and disables the
|
||||||
|
workflow-side NAR size limit.
|
||||||
|
|
||||||
|
If no internal route is reachable, the workflow uses the public endpoint and
|
||||||
|
enforces `CACHE_MAX_UPLOAD_BYTES=90000000`. NARs larger than that limit and
|
||||||
|
their narinfo files are not uploaded. They are recorded under `skipped` in
|
||||||
`cache-manifest.json`. Nix clients can still substitute every smaller store
|
`cache-manifest.json`. Nix clients can still substitute every smaller store
|
||||||
path and obtain a skipped path from another substituter or build it locally.
|
path and obtain a skipped path from another substituter or build it locally.
|
||||||
Set the value to `0` only when the upload path has no smaller request limit.
|
|
||||||
|
|
||||||
## NixOS client configuration
|
## NixOS client configuration
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user