chore: initial sanitized public snapshot
This commit is contained in:
Executable
+83
@@ -0,0 +1,83 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
stable_toolchain="${1:-1.88.0}"
|
||||
nightly_toolchain="${2:-nightly}"
|
||||
|
||||
if ! command -v rustup >/dev/null 2>&1; then
|
||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \
|
||||
| sh -s -- -y --profile minimal --default-toolchain none
|
||||
fi
|
||||
|
||||
if [ -f "${HOME}/.cargo/env" ]; then
|
||||
# shellcheck disable=SC1091
|
||||
source "${HOME}/.cargo/env"
|
||||
fi
|
||||
command -v rustup >/dev/null 2>&1 || {
|
||||
echo "rustup is required after bootstrap" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
export RUSTUP_MAX_RETRIES="${RUSTUP_MAX_RETRIES:-3}"
|
||||
|
||||
toolchain_is_installed() {
|
||||
local requested="$1"
|
||||
local installed
|
||||
|
||||
while read -r installed _; do
|
||||
if [[ "${installed}" == "${requested}" || "${installed}" == "${requested}-"* ]]; then
|
||||
return 0
|
||||
fi
|
||||
done < <(rustup toolchain list)
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
component_is_installed() {
|
||||
local toolchain="$1"
|
||||
local component="$2"
|
||||
|
||||
rustup component list --toolchain "${toolchain}" --installed \
|
||||
| awk '{ print $1 }' \
|
||||
| grep -Fxq "${component}"
|
||||
}
|
||||
|
||||
ensure_toolchain() {
|
||||
local toolchain="$1"
|
||||
shift
|
||||
local missing_components=()
|
||||
local install_args=()
|
||||
local component
|
||||
|
||||
if toolchain_is_installed "${toolchain}"; then
|
||||
for component in "$@"; do
|
||||
if ! component_is_installed "${toolchain}" "${component}"; then
|
||||
missing_components+=("${component}")
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "${#missing_components[@]}" -eq 0 ]; then
|
||||
echo "rustup: reusing installed ${toolchain}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
rustup component add --toolchain "${toolchain}" "${missing_components[@]}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
for component in "$@"; do
|
||||
install_args+=(--component "${component}")
|
||||
done
|
||||
|
||||
rustup toolchain install "${toolchain}" --profile minimal "${install_args[@]}"
|
||||
}
|
||||
|
||||
ensure_toolchain "${stable_toolchain}" rustfmt clippy rust-src
|
||||
if [ "${nightly_toolchain}" != "none" ]; then
|
||||
ensure_toolchain "${nightly_toolchain}" rust-src
|
||||
fi
|
||||
rustup default "${stable_toolchain}"
|
||||
|
||||
cargo --version
|
||||
rustc --version
|
||||
rustup show active-toolchain
|
||||
Executable
+53
@@ -0,0 +1,53 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
readonly HEADER_PATTERN='^(feat|fix|perf|refactor|test|docs|build|ci|chore|revert)(\([[:alnum:]./_-]+\))?!?: .+$'
|
||||
|
||||
is_conventional_header() {
|
||||
[[ "$1" =~ ${HEADER_PATTERN} ]]
|
||||
}
|
||||
|
||||
run_self_test() {
|
||||
local subject
|
||||
|
||||
for subject in \
|
||||
'feat(rpc): add request timeout' \
|
||||
'fix!: preserve legacy config behavior' \
|
||||
'docs(release): document versioning'; do
|
||||
is_conventional_header "${subject}" || {
|
||||
echo "expected valid Conventional Commit: ${subject}" >&2
|
||||
exit 1
|
||||
}
|
||||
done
|
||||
|
||||
for subject in 'update dependency' 'feature: invalid type' 'fix missing separator'; do
|
||||
if is_conventional_header "${subject}"; then
|
||||
echo "expected invalid Conventional Commit: ${subject}" >&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
if [ "${1:-}" = "--self-test" ]; then
|
||||
run_self_test
|
||||
echo "Conventional Commit validator self-test passed"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
baseline="${1:-v1.0.0}"
|
||||
git rev-parse --verify "${baseline}^{commit}" >/dev/null
|
||||
|
||||
invalid=0
|
||||
while IFS=$'\t' read -r commit subject; do
|
||||
if ! is_conventional_header "${subject}"; then
|
||||
echo "${commit}: ${subject}" >&2
|
||||
invalid=1
|
||||
fi
|
||||
done < <(git log --format='%H%x09%s' --no-merges "${baseline}..HEAD")
|
||||
|
||||
if [ "${invalid}" -ne 0 ]; then
|
||||
echo "Conventional Commit validation failed after ${baseline}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Conventional Commit validation passed after ${baseline}"
|
||||
Executable
+80
@@ -0,0 +1,80 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
mode="${1:-fast}"
|
||||
stable_toolchain="${2:-1.88.0}"
|
||||
nightly_toolchain="${3:-nightly}"
|
||||
nextest_version="${NEXTEST_VERSION:-0.9.114}"
|
||||
cargo_deny_version="${CARGO_DENY_VERSION:-0.19.8}"
|
||||
cargo_udeps_version="${CARGO_UDEPS_VERSION:-0.1.61}"
|
||||
git_cliff_version="${GIT_CLIFF_VERSION:-2.13.1}"
|
||||
cargo_semver_checks_version="${CARGO_SEMVER_CHECKS_VERSION:-0.44.0}"
|
||||
|
||||
if [ -f "${HOME}/.cargo/env" ]; then
|
||||
# shellcheck disable=SC1091
|
||||
source "${HOME}/.cargo/env"
|
||||
fi
|
||||
command -v cargo >/dev/null 2>&1 || {
|
||||
echo "cargo is required to install CI tools" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
export CARGO_BUILD_JOBS="${CARGO_BUILD_JOBS:-1}"
|
||||
|
||||
install_nextest() {
|
||||
local cargo_home
|
||||
cargo_home="${CARGO_HOME:-${HOME}/.cargo}"
|
||||
|
||||
if cargo nextest --version 2>/dev/null | grep -q " ${nextest_version}"; then
|
||||
return
|
||||
fi
|
||||
|
||||
curl -LsSf "https://get.nexte.st/${nextest_version}/linux" \
|
||||
| tar zxf - -C "${cargo_home}/bin"
|
||||
}
|
||||
|
||||
install_with_binary_fallback() {
|
||||
local toolchain="$1"
|
||||
local crate="$2"
|
||||
shift 2
|
||||
|
||||
if command -v cargo-binstall >/dev/null 2>&1; then
|
||||
cargo binstall -y "${crate}" "$@" && return
|
||||
fi
|
||||
|
||||
cargo +"${toolchain}" install --locked --force --jobs "${CARGO_BUILD_JOBS}" "${crate}" "$@"
|
||||
}
|
||||
|
||||
tool_has_version() {
|
||||
local command_name="$1"
|
||||
local expected_version="$2"
|
||||
|
||||
"${command_name}" --version 2>/dev/null | grep -q " ${expected_version}"
|
||||
}
|
||||
|
||||
install_nextest
|
||||
|
||||
if ! tool_has_version git-cliff "${git_cliff_version}"; then
|
||||
install_with_binary_fallback "${stable_toolchain}" git-cliff --version "${git_cliff_version}"
|
||||
fi
|
||||
|
||||
if [ "${mode}" = "strict" ]; then
|
||||
if ! tool_has_version cargo-deny "${cargo_deny_version}"; then
|
||||
install_with_binary_fallback "${stable_toolchain}" cargo-deny --version "${cargo_deny_version}"
|
||||
fi
|
||||
if ! cargo +"${nightly_toolchain}" udeps --version 2>/dev/null | grep -q " ${cargo_udeps_version}"; then
|
||||
install_with_binary_fallback "${nightly_toolchain}" cargo-udeps --version "${cargo_udeps_version}"
|
||||
fi
|
||||
if ! tool_has_version cargo-semver-checks "${cargo_semver_checks_version}"; then
|
||||
install_with_binary_fallback "${stable_toolchain}" cargo-semver-checks --version "${cargo_semver_checks_version}"
|
||||
fi
|
||||
fi
|
||||
|
||||
cargo nextest --version
|
||||
git-cliff --version
|
||||
|
||||
if [ "${mode}" = "strict" ]; then
|
||||
cargo deny --version
|
||||
cargo +"${nightly_toolchain}" udeps --version
|
||||
cargo semver-checks --version
|
||||
fi
|
||||
Executable
+43
@@ -0,0 +1,43 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
missing=()
|
||||
for command_name in cc curl git jq pkg-config xz; do
|
||||
if ! command -v "${command_name}" >/dev/null 2>&1; then
|
||||
missing+=("${command_name}")
|
||||
fi
|
||||
done
|
||||
if command -v pkg-config >/dev/null 2>&1; then
|
||||
for package_name in libssh2 openssl zlib; do
|
||||
if ! pkg-config --exists "${package_name}"; then
|
||||
missing+=("pkg-config:${package_name}")
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [ "${#missing[@]}" -eq 0 ]; then
|
||||
echo "Linux build dependencies are already available"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "$(id -u)" -ne 0 ]; then
|
||||
printf 'missing Linux build dependencies: %s\n' "${missing[*]}" >&2
|
||||
echo "run this CI job as root or bake the missing dependencies into the runner image" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
apt-get update
|
||||
apt-get install -y --no-install-recommends \
|
||||
build-essential \
|
||||
ca-certificates \
|
||||
curl \
|
||||
git \
|
||||
jq \
|
||||
libssh2-1-dev \
|
||||
libssl-dev \
|
||||
pkg-config \
|
||||
xz-utils \
|
||||
zlib1g-dev
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
Executable
+167
@@ -0,0 +1,167 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
require_env() {
|
||||
local name="$1"
|
||||
if [ -z "${!name:-}" ]; then
|
||||
echo "missing required environment variable: ${name}" >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
require_env GITEA_SERVER_URL
|
||||
require_env GITEA_REPOSITORY
|
||||
require_env GITEA_TOKEN
|
||||
require_env RELEASE_TAG
|
||||
require_env RELEASE_NAME
|
||||
require_env RELEASE_VERSION
|
||||
require_env RELEASE_TARGET
|
||||
|
||||
server="${GITEA_SERVER_URL%/}"
|
||||
repo="${GITEA_REPOSITORY}"
|
||||
tag="${RELEASE_TAG}"
|
||||
name="${RELEASE_NAME}"
|
||||
version="${RELEASE_VERSION}"
|
||||
target="${RELEASE_TARGET}"
|
||||
draft="${RELEASE_DRAFT:-false}"
|
||||
prerelease="${RELEASE_PRERELEASE:-false}"
|
||||
notes_file="${RELEASE_BODY_FILE:-}"
|
||||
|
||||
if [ -z "${notes_file}" ]; then
|
||||
echo "missing required environment variable: RELEASE_BODY_FILE" >&2
|
||||
exit 1
|
||||
fi
|
||||
if [ ! -f "${notes_file}" ]; then
|
||||
echo "release body file does not exist: ${notes_file}" >&2
|
||||
exit 1
|
||||
fi
|
||||
body="$(cat "${notes_file}")"
|
||||
|
||||
asset_name_for() {
|
||||
local family="$1"
|
||||
local file="$2"
|
||||
local base_name
|
||||
base_name="$(basename "${file}")"
|
||||
|
||||
if [ "${base_name}" = "SHA256SUMS.txt" ]; then
|
||||
printf '%s-SHA256SUMS.txt' "${family}"
|
||||
else
|
||||
printf '%s' "${base_name}"
|
||||
fi
|
||||
}
|
||||
|
||||
release_dir="dist/release/v${version}"
|
||||
docker_dir="dist/docker/v${version}"
|
||||
|
||||
declare -a asset_files=()
|
||||
declare -a asset_names=()
|
||||
|
||||
if [ -d "${release_dir}" ]; then
|
||||
while IFS= read -r -d '' file; do
|
||||
asset_files+=("${file}")
|
||||
asset_names+=("$(asset_name_for release "${file}")")
|
||||
done < <(find "${release_dir}" -maxdepth 1 -type f -print0 | sort -z)
|
||||
fi
|
||||
|
||||
if [ -d "${docker_dir}" ]; then
|
||||
while IFS= read -r -d '' file; do
|
||||
asset_files+=("${file}")
|
||||
asset_names+=("$(asset_name_for docker "${file}")")
|
||||
done < <(find "${docker_dir}" -maxdepth 1 -type f -print0 | sort -z)
|
||||
fi
|
||||
|
||||
if [ "${#asset_files[@]}" -eq 0 ]; then
|
||||
echo "no release assets found under ${release_dir} or ${docker_dir}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
api_base="${server}/api/v1/repos/${repo}"
|
||||
auth_header="Authorization: token ${GITEA_TOKEN}"
|
||||
accept_header="Accept: application/json"
|
||||
curl_args=(-sS)
|
||||
|
||||
if [ "${GITEA_CURL_INSECURE:-false}" = "true" ]; then
|
||||
curl_args+=(-k)
|
||||
fi
|
||||
|
||||
release_lookup="$(mktemp)"
|
||||
release_payload="$(mktemp)"
|
||||
trap 'rm -f "${release_lookup}" "${release_payload}"' EXIT
|
||||
|
||||
lookup_status="$(
|
||||
curl "${curl_args[@]}" -o "${release_lookup}" -w '%{http_code}' \
|
||||
-H "${auth_header}" \
|
||||
-H "${accept_header}" \
|
||||
"${api_base}/releases/tags/${tag}"
|
||||
)"
|
||||
|
||||
printf '%s' "${body}" | jq -Rs \
|
||||
--arg tag "${tag}" \
|
||||
--arg name "${name}" \
|
||||
--arg target "${target}" \
|
||||
--argjson draft "${draft}" \
|
||||
--argjson prerelease "${prerelease}" \
|
||||
'{tag_name:$tag,name:$name,target_commitish:$target,body:.,draft:$draft,prerelease:$prerelease}' \
|
||||
> "${release_payload}"
|
||||
|
||||
if [ "${lookup_status}" = "200" ]; then
|
||||
release_id="$(jq -r '.id' "${release_lookup}")"
|
||||
curl -f "${curl_args[@]}" \
|
||||
-X PATCH \
|
||||
-H "${auth_header}" \
|
||||
-H "${accept_header}" \
|
||||
-H 'Content-Type: application/json' \
|
||||
--data @"${release_payload}" \
|
||||
"${api_base}/releases/${release_id}" \
|
||||
> "${release_lookup}"
|
||||
elif [ "${lookup_status}" = "404" ]; then
|
||||
curl -f "${curl_args[@]}" \
|
||||
-X POST \
|
||||
-H "${auth_header}" \
|
||||
-H "${accept_header}" \
|
||||
-H 'Content-Type: application/json' \
|
||||
--data @"${release_payload}" \
|
||||
"${api_base}/releases" \
|
||||
> "${release_lookup}"
|
||||
release_id="$(jq -r '.id' "${release_lookup}")"
|
||||
else
|
||||
echo "failed to look up release ${tag}: Gitea returned HTTP ${lookup_status}" >&2
|
||||
cat "${release_lookup}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
release_id="${release_id:-$(jq -r '.id' "${release_lookup}")}"
|
||||
|
||||
for index in "${!asset_files[@]}"; do
|
||||
file="${asset_files[${index}]}"
|
||||
asset_name="${asset_names[${index}]}"
|
||||
existing_asset_id="$(
|
||||
jq -r --arg name "${asset_name}" '.assets[]? | select(.name == $name) | .id' "${release_lookup}" \
|
||||
| head -n 1
|
||||
)"
|
||||
|
||||
if [ -n "${existing_asset_id}" ] && [ "${existing_asset_id}" != "null" ]; then
|
||||
curl -f "${curl_args[@]}" \
|
||||
-X DELETE \
|
||||
-H "${auth_header}" \
|
||||
-H "${accept_header}" \
|
||||
"${api_base}/releases/${release_id}/assets/${existing_asset_id}" \
|
||||
>/dev/null
|
||||
fi
|
||||
|
||||
encoded_name="$(python3 -c 'import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1]))' "${asset_name}")"
|
||||
|
||||
curl -f "${curl_args[@]}" \
|
||||
-X POST \
|
||||
-H "${auth_header}" \
|
||||
-H "${accept_header}" \
|
||||
-F "attachment=@${file}" \
|
||||
"${api_base}/releases/${release_id}/assets?name=${encoded_name}" \
|
||||
>/dev/null
|
||||
done
|
||||
|
||||
release_url="$(jq -r '.html_url // empty' "${release_lookup}")"
|
||||
echo "Published release ${name} (${tag})"
|
||||
if [ -n "${release_url}" ]; then
|
||||
echo "Release URL: ${release_url}"
|
||||
fi
|
||||
Executable
+22
@@ -0,0 +1,22 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
if [ -f "${HOME}/.cargo/env" ]; then
|
||||
# shellcheck disable=SC1091
|
||||
source "${HOME}/.cargo/env"
|
||||
fi
|
||||
command -v cargo >/dev/null 2>&1 || {
|
||||
echo "cargo is required to run fast gates" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
cargo fmt --all --check
|
||||
cargo check --workspace --all-targets --all-features --locked
|
||||
cargo nextest run --workspace --all-targets --all-features --locked
|
||||
# `clippy::cargo` spawns nested `cargo metadata` from clippy-driver. On the
|
||||
# NAS runner this can wait behind the parent cargo/clippy target lock; keep
|
||||
# dependency policy in strict gates via cargo-deny and cargo-udeps instead.
|
||||
cargo clippy --workspace --all-targets --all-features --locked --no-deps -- \
|
||||
-D warnings \
|
||||
-D clippy::pedantic \
|
||||
-D clippy::nursery
|
||||
Executable
+54
@@ -0,0 +1,54 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
release_type() {
|
||||
local current="${1#v}"
|
||||
local baseline="${2#v}"
|
||||
local current_major current_minor baseline_major baseline_minor
|
||||
|
||||
IFS='.' read -r current_major current_minor _ <<< "${current}"
|
||||
IFS='.' read -r baseline_major baseline_minor _ <<< "${baseline}"
|
||||
|
||||
if [ "${current_major}" != "${baseline_major}" ]; then
|
||||
printf '%s\n' major
|
||||
elif [ "${current_minor}" != "${baseline_minor}" ]; then
|
||||
printf '%s\n' minor
|
||||
else
|
||||
printf '%s\n' patch
|
||||
fi
|
||||
}
|
||||
|
||||
run_self_test() {
|
||||
[ "$(release_type v2.0.0 v1.9.9)" = major ]
|
||||
[ "$(release_type v1.3.0 v1.2.9)" = minor ]
|
||||
[ "$(release_type v1.2.4 v1.2.3)" = patch ]
|
||||
}
|
||||
|
||||
if [ "${1:-}" = "--self-test" ]; then
|
||||
run_self_test
|
||||
echo "SemVer release-type self-test passed"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
release_tag="${1:?release tag is required}"
|
||||
git rev-parse --verify "${release_tag}^{commit}" >/dev/null
|
||||
|
||||
baseline_tag="$({ git tag --merged "${release_tag}" --sort=-version:refname | grep -Fxv "${release_tag}" || true; } | head -n 1)"
|
||||
if [ -z "${baseline_tag}" ]; then
|
||||
echo "No earlier SemVer tag before ${release_tag}; skipping baseline comparison"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
release_kind="$(release_type "${release_tag}" "${baseline_tag}")"
|
||||
for package in \
|
||||
aria2-rust-pro-cli \
|
||||
aria2-rust-pro-compat \
|
||||
aria2-rust-pro-core \
|
||||
aria2-rust-pro-protocol \
|
||||
aria2-rust-pro-rpc \
|
||||
aria2-rust-pro-storage; do
|
||||
cargo semver-checks check-release \
|
||||
--package "${package}" \
|
||||
--baseline-rev "${baseline_tag}" \
|
||||
--release-type "${release_kind}"
|
||||
done
|
||||
Executable
+79
@@ -0,0 +1,79 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
if [ -f "${HOME}/.cargo/env" ]; then
|
||||
# shellcheck disable=SC1091
|
||||
source "${HOME}/.cargo/env"
|
||||
fi
|
||||
command -v cargo >/dev/null 2>&1 || {
|
||||
echo "cargo is required to run strict gates" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
# cargo-udeps injects sysroot crates on nightly; let udeps report real unused deps.
|
||||
nightly_toolchain="${CARGO_NIGHTLY_TOOLCHAIN:-nightly}"
|
||||
RUSTFLAGS="-A unused-crate-dependencies" cargo +"${nightly_toolchain}" udeps --workspace --all-targets --all-features --locked
|
||||
|
||||
deny_db_path="${CARGO_DENY_DB_PATH:-target/cargo-deny-advisory-dbs}"
|
||||
deny_config="${CARGO_DENY_CONFIG:-deny.toml}"
|
||||
mkdir -p "${deny_db_path}"
|
||||
|
||||
cargo_deny() {
|
||||
case "$(uname -s 2>/dev/null || echo unknown)" in
|
||||
MINGW* | MSYS* | CYGWIN*)
|
||||
GIT_CONFIG_COUNT=1 \
|
||||
GIT_CONFIG_KEY_0=http.sslbackend \
|
||||
GIT_CONFIG_VALUE_0=openssl \
|
||||
cargo deny "$@"
|
||||
;;
|
||||
*)
|
||||
cargo deny "$@"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
dump_deny_db_state() {
|
||||
echo "cargo deny version: $(cargo deny --version 2>/dev/null || true)" >&2
|
||||
echo "git version: $(git --version 2>/dev/null || true)" >&2
|
||||
echo "cargo deny db path: ${deny_db_path}" >&2
|
||||
if [ -d "${deny_db_path}" ]; then
|
||||
find "${deny_db_path}" -maxdepth 2 -type d -print >&2
|
||||
else
|
||||
echo "cargo deny db path does not exist" >&2
|
||||
fi
|
||||
}
|
||||
|
||||
fetch_deny_db() {
|
||||
cargo_deny fetch db --config "${deny_config}"
|
||||
}
|
||||
|
||||
if ! fetch_deny_db; then
|
||||
dump_deny_db_state
|
||||
echo "retrying cargo deny advisory DB fetch after clearing ${deny_db_path}" >&2
|
||||
rm -rf "${deny_db_path}"
|
||||
mkdir -p "${deny_db_path}"
|
||||
if ! fetch_deny_db; then
|
||||
dump_deny_db_state
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
if ! find "${deny_db_path}" -mindepth 1 -maxdepth 1 -type d -name 'advisory-db-*' | grep -q .; then
|
||||
echo "cargo deny did not populate advisory DB under ${deny_db_path}" >&2
|
||||
dump_deny_db_state
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cargo_deny --locked check --disable-fetch --config "${deny_config}"
|
||||
|
||||
cargo run --manifest-path ./xtask/Cargo.toml -- release smoke-version --build
|
||||
cargo run --manifest-path ./xtask/Cargo.toml -- docker smoke-local
|
||||
command -v docker >/dev/null 2>&1 || {
|
||||
echo "docker CLI is required for daemon-backed Docker smoke tests" >&2
|
||||
exit 1
|
||||
}
|
||||
docker info >/dev/null 2>&1 || {
|
||||
echo "docker daemon is required for daemon-backed Docker smoke tests" >&2
|
||||
echo "attach a Docker-capable runner or split this gate to a Docker runner label" >&2
|
||||
exit 1
|
||||
}
|
||||
cargo run --manifest-path ./xtask/Cargo.toml -- docker smoke --tag aria2-rust-pro:ci-smoke
|
||||
@@ -0,0 +1,33 @@
|
||||
param(
|
||||
[string]$UpstreamBinary = "",
|
||||
[string]$RustBinary = "",
|
||||
[string]$OutputRoot = ""
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version Latest
|
||||
|
||||
$repoRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
|
||||
$xtaskManifest = Join-Path $repoRoot "xtask\Cargo.toml"
|
||||
|
||||
$arguments = @(
|
||||
"cargo",
|
||||
"run",
|
||||
"--manifest-path",
|
||||
$xtaskManifest,
|
||||
"--",
|
||||
"compat",
|
||||
"capture-cli-goldens"
|
||||
)
|
||||
|
||||
if (-not [string]::IsNullOrWhiteSpace($UpstreamBinary)) {
|
||||
$arguments += @("--upstream-binary", $UpstreamBinary)
|
||||
}
|
||||
if (-not [string]::IsNullOrWhiteSpace($RustBinary)) {
|
||||
$arguments += @("--rust-binary", $RustBinary)
|
||||
}
|
||||
if (-not [string]::IsNullOrWhiteSpace($OutputRoot)) {
|
||||
$arguments += @("--output-root", $OutputRoot)
|
||||
}
|
||||
|
||||
rtk @arguments
|
||||
@@ -0,0 +1,32 @@
|
||||
param(
|
||||
[string]$Tag = "aria2-rust-pro:local",
|
||||
[string]$OutputRoot,
|
||||
[switch]$Build
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version Latest
|
||||
|
||||
$repoRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
|
||||
$xtaskManifest = Join-Path $repoRoot "xtask\Cargo.toml"
|
||||
|
||||
$arguments = @(
|
||||
"cargo",
|
||||
"run",
|
||||
"--manifest-path",
|
||||
$xtaskManifest,
|
||||
"--",
|
||||
"docker",
|
||||
"export-local",
|
||||
"--tag",
|
||||
$Tag
|
||||
)
|
||||
|
||||
if (-not [string]::IsNullOrWhiteSpace($OutputRoot)) {
|
||||
$arguments += @("--output-root", $OutputRoot)
|
||||
}
|
||||
if ($Build) {
|
||||
$arguments += "--build"
|
||||
}
|
||||
|
||||
rtk @arguments
|
||||
@@ -0,0 +1,19 @@
|
||||
param()
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version Latest
|
||||
|
||||
$repoRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
|
||||
$xtaskManifest = Join-Path $repoRoot "xtask\Cargo.toml"
|
||||
|
||||
$arguments = @(
|
||||
"cargo",
|
||||
"run",
|
||||
"--manifest-path",
|
||||
$xtaskManifest,
|
||||
"--",
|
||||
"docker",
|
||||
"smoke-local"
|
||||
)
|
||||
|
||||
rtk @arguments
|
||||
@@ -0,0 +1,36 @@
|
||||
param(
|
||||
[string]$Tag = "aria2-rust-pro:smoke",
|
||||
[bool]$Build = $true,
|
||||
[int]$HostRpcPort = 26800,
|
||||
[string]$RpcSecret = "smoke-secret",
|
||||
[string]$SpecialMode = "move"
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version Latest
|
||||
|
||||
$repoRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
|
||||
$xtaskManifest = Join-Path $repoRoot "xtask\Cargo.toml"
|
||||
$buildValue = $Build.ToString().ToLowerInvariant()
|
||||
|
||||
$arguments = @(
|
||||
"cargo",
|
||||
"run",
|
||||
"--manifest-path",
|
||||
$xtaskManifest,
|
||||
"--",
|
||||
"docker",
|
||||
"smoke",
|
||||
"--tag",
|
||||
$Tag,
|
||||
"--build",
|
||||
$buildValue,
|
||||
"--host-rpc-port",
|
||||
"$HostRpcPort",
|
||||
"--rpc-secret",
|
||||
$RpcSecret,
|
||||
"--special-mode",
|
||||
$SpecialMode
|
||||
)
|
||||
|
||||
rtk @arguments
|
||||
@@ -0,0 +1,45 @@
|
||||
param(
|
||||
[string]$OutputPath,
|
||||
[double]$SampleSize = 10,
|
||||
[double]$MeasurementSeconds = 0.05,
|
||||
[double]$WarmupSeconds = 0.05,
|
||||
[int]$TransferBytes = 8388608,
|
||||
[switch]$SkipBenchExecution
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version Latest
|
||||
|
||||
$repoRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
|
||||
$OutputPath = if ([string]::IsNullOrWhiteSpace($OutputPath)) {
|
||||
Join-Path $repoRoot "docs\perf\local-comparison.md"
|
||||
} else {
|
||||
$OutputPath
|
||||
}
|
||||
$xtaskManifest = Join-Path $repoRoot "xtask\Cargo.toml"
|
||||
|
||||
$arguments = @(
|
||||
"cargo",
|
||||
"run",
|
||||
"--manifest-path",
|
||||
$xtaskManifest,
|
||||
"--",
|
||||
"perf",
|
||||
"collect-local-comparison",
|
||||
"--output-path",
|
||||
$OutputPath,
|
||||
"--sample-size",
|
||||
"$SampleSize",
|
||||
"--measurement-seconds",
|
||||
"$MeasurementSeconds",
|
||||
"--warmup-seconds",
|
||||
"$WarmupSeconds",
|
||||
"--transfer-bytes",
|
||||
"$TransferBytes"
|
||||
)
|
||||
|
||||
if ($SkipBenchExecution) {
|
||||
$arguments += "--skip-bench-execution"
|
||||
}
|
||||
|
||||
rtk @arguments
|
||||
@@ -0,0 +1,83 @@
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[ValidateSet("samply", "flamegraph")]
|
||||
[string]$Profiler = "samply",
|
||||
[int]$ProfileSeconds = 4,
|
||||
[string]$Scenario = "shared_runtime_live_http_transfer/tight_cap_6way",
|
||||
[string]$OutputDir
|
||||
)
|
||||
|
||||
Set-StrictMode -Version Latest
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
$repoRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
|
||||
$OutputDir = if ([string]::IsNullOrWhiteSpace($OutputDir)) {
|
||||
Join-Path $repoRoot "artifacts\shared-runtime-http-pressure-profile"
|
||||
} else {
|
||||
$OutputDir
|
||||
}
|
||||
$manifestPath = Join-Path $repoRoot "Cargo.toml"
|
||||
$null = New-Item -ItemType Directory -Path $OutputDir -Force
|
||||
$artifactStem = ($Scenario -replace "[^A-Za-z0-9._-]", "-").Trim("-")
|
||||
if ([string]::IsNullOrWhiteSpace($artifactStem)) {
|
||||
throw "Scenario must produce a non-empty artifact stem."
|
||||
}
|
||||
|
||||
$cargoArgs = @(
|
||||
"bench",
|
||||
"-p",
|
||||
"aria2-rust-pro-tests",
|
||||
"--bench",
|
||||
"rpc_pressure",
|
||||
$Scenario,
|
||||
"--manifest-path",
|
||||
$manifestPath,
|
||||
"--",
|
||||
"--profile-time",
|
||||
$ProfileSeconds.ToString()
|
||||
)
|
||||
|
||||
$metaPath = Join-Path $OutputDir "meta.txt"
|
||||
@(
|
||||
"timestamp=$([DateTimeOffset]::Now.ToString('O'))"
|
||||
"profiler=$Profiler"
|
||||
"profile_seconds=$ProfileSeconds"
|
||||
"scenario=$Scenario"
|
||||
) | Set-Content -LiteralPath $metaPath -Encoding UTF8
|
||||
|
||||
Push-Location $repoRoot
|
||||
try {
|
||||
switch ($Profiler) {
|
||||
"samply" {
|
||||
$outputPath = Join-Path $OutputDir "$artifactStem-profile.json.gz"
|
||||
& samply record `
|
||||
--save-only `
|
||||
--no-open `
|
||||
--output $outputPath `
|
||||
--profile-name "shared-runtime-http-pressure" `
|
||||
cargo @cargoArgs
|
||||
}
|
||||
"flamegraph" {
|
||||
$outputPath = Join-Path $OutputDir "$artifactStem-flamegraph.svg"
|
||||
& cargo flamegraph `
|
||||
"-p" "aria2-rust-pro-tests" `
|
||||
"--bench" "rpc_pressure" `
|
||||
"--manifest-path" $manifestPath `
|
||||
"--output" $outputPath `
|
||||
"--" `
|
||||
$Scenario `
|
||||
"--profile-time" `
|
||||
$ProfileSeconds
|
||||
}
|
||||
default {
|
||||
throw "Unsupported profiler: $Profiler"
|
||||
}
|
||||
}
|
||||
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
throw "Profiler command failed with exit code $LASTEXITCODE."
|
||||
}
|
||||
}
|
||||
finally {
|
||||
Pop-Location
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[ValidateSet("samply", "flamegraph")]
|
||||
[string]$Profiler = "flamegraph",
|
||||
[int]$ProfileSeconds = 4,
|
||||
[string]$Scenario = "shared_runtime_live_http_transfer/tight_cap_6way",
|
||||
[string]$OutputDir
|
||||
)
|
||||
|
||||
Set-StrictMode -Version Latest
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
$repoRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
|
||||
$OutputDir = if ([string]::IsNullOrWhiteSpace($OutputDir)) {
|
||||
Join-Path $repoRoot "artifacts\shared-runtime-http-pressure-profile"
|
||||
} else {
|
||||
$OutputDir
|
||||
}
|
||||
$profileScript = Join-Path $repoRoot "scripts\perf\profile_shared_runtime_http_pressure.ps1"
|
||||
|
||||
$msudoArgs = @(
|
||||
"--same-console",
|
||||
"--wait",
|
||||
"--user",
|
||||
"admin",
|
||||
"--current-directory",
|
||||
$repoRoot,
|
||||
"--",
|
||||
"pwsh",
|
||||
"-NoLogo",
|
||||
"-NoProfile",
|
||||
"-ExecutionPolicy",
|
||||
"Bypass",
|
||||
"-File",
|
||||
$profileScript,
|
||||
"-Profiler",
|
||||
$Profiler,
|
||||
"-ProfileSeconds",
|
||||
$ProfileSeconds.ToString(),
|
||||
"-Scenario",
|
||||
$Scenario,
|
||||
"-OutputDir",
|
||||
$OutputDir
|
||||
)
|
||||
|
||||
& msudo @msudoArgs
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
throw "Elevated profiler command failed with exit code $LASTEXITCODE."
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Command,
|
||||
[string]$OutputDir,
|
||||
[switch]$AllowNonZeroExit
|
||||
)
|
||||
|
||||
Set-StrictMode -Version Latest
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
$repoRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
|
||||
$OutputDir = if ([string]::IsNullOrWhiteSpace($OutputDir)) {
|
||||
Join-Path $repoRoot "artifacts\admin-command"
|
||||
} else {
|
||||
$OutputDir
|
||||
}
|
||||
$null = New-Item -ItemType Directory -Path $OutputDir -Force
|
||||
|
||||
$stdoutPath = Join-Path $OutputDir "stdout.txt"
|
||||
$stderrPath = Join-Path $OutputDir "stderr.txt"
|
||||
$metaPath = Join-Path $OutputDir "meta.txt"
|
||||
$exitCodePath = Join-Path $OutputDir "exit-code.txt"
|
||||
|
||||
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
|
||||
$principal = [Security.Principal.WindowsPrincipal]::new($identity)
|
||||
$isAdmin = $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
|
||||
|
||||
@(
|
||||
"timestamp=$([DateTimeOffset]::Now.ToString('O'))"
|
||||
"is_admin=$isAdmin"
|
||||
) | Set-Content -LiteralPath $metaPath -Encoding UTF8
|
||||
|
||||
$psi = [System.Diagnostics.ProcessStartInfo]::new()
|
||||
$psi.FileName = "cmd.exe"
|
||||
$psi.Arguments = "/d /c $Command"
|
||||
$psi.WorkingDirectory = (Get-Location).Path
|
||||
$psi.UseShellExecute = $false
|
||||
$psi.RedirectStandardOutput = $true
|
||||
$psi.RedirectStandardError = $true
|
||||
|
||||
$process = [System.Diagnostics.Process]::Start($psi)
|
||||
if ($null -eq $process) {
|
||||
throw "Failed to start command."
|
||||
}
|
||||
|
||||
$stdout = $process.StandardOutput.ReadToEnd()
|
||||
$stderr = $process.StandardError.ReadToEnd()
|
||||
$process.WaitForExit()
|
||||
|
||||
Set-Content -LiteralPath $stdoutPath -Value $stdout -Encoding UTF8
|
||||
Set-Content -LiteralPath $stderrPath -Value $stderr -Encoding UTF8
|
||||
Set-Content -LiteralPath $exitCodePath -Value "$($process.ExitCode)" -Encoding UTF8
|
||||
|
||||
if (-not $AllowNonZeroExit -and $process.ExitCode -ne 0) {
|
||||
throw "Command failed with exit code $($process.ExitCode)."
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[string]$OutputDir,
|
||||
[string]$Command = "whoami /all",
|
||||
[switch]$AllowNonZeroExit
|
||||
)
|
||||
|
||||
Set-StrictMode -Version Latest
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
$repoRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
|
||||
$OutputDir = if ([string]::IsNullOrWhiteSpace($OutputDir)) {
|
||||
Join-Path $repoRoot "artifacts\admin-probe"
|
||||
} else {
|
||||
$OutputDir
|
||||
}
|
||||
$null = New-Item -ItemType Directory -Path $OutputDir -Force
|
||||
|
||||
$stdoutPath = Join-Path $OutputDir "stdout.txt"
|
||||
$stderrPath = Join-Path $OutputDir "stderr.txt"
|
||||
$metaPath = Join-Path $OutputDir "meta.txt"
|
||||
|
||||
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
|
||||
$principal = [Security.Principal.WindowsPrincipal]::new($identity)
|
||||
$isAdmin = $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
|
||||
|
||||
@(
|
||||
"timestamp=$([DateTimeOffset]::Now.ToString('O'))"
|
||||
"is_admin=$isAdmin"
|
||||
) | Set-Content -LiteralPath $metaPath -Encoding UTF8
|
||||
|
||||
$psi = [System.Diagnostics.ProcessStartInfo]::new()
|
||||
$psi.FileName = "cmd.exe"
|
||||
$psi.Arguments = "/d /c $Command"
|
||||
$psi.WorkingDirectory = (Get-Location).Path
|
||||
$psi.UseShellExecute = $false
|
||||
$psi.RedirectStandardOutput = $true
|
||||
$psi.RedirectStandardError = $true
|
||||
|
||||
$process = [System.Diagnostics.Process]::Start($psi)
|
||||
if ($null -eq $process) {
|
||||
throw "Failed to start probe command."
|
||||
}
|
||||
|
||||
$stdout = $process.StandardOutput.ReadToEnd()
|
||||
$stderr = $process.StandardError.ReadToEnd()
|
||||
$process.WaitForExit()
|
||||
|
||||
Set-Content -LiteralPath $stdoutPath -Value $stdout -Encoding UTF8
|
||||
Set-Content -LiteralPath $stderrPath -Value $stderr -Encoding UTF8
|
||||
|
||||
if (-not $AllowNonZeroExit -and $process.ExitCode -ne 0) {
|
||||
throw "Probe command failed with exit code $($process.ExitCode)."
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
param(
|
||||
[switch]$Build,
|
||||
[string]$TargetTriple,
|
||||
[string]$SourceBinary,
|
||||
[string]$OutputRoot,
|
||||
[switch]$SkipVersionSmoke
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version Latest
|
||||
|
||||
$repoRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
|
||||
$xtaskManifest = Join-Path $repoRoot "xtask\Cargo.toml"
|
||||
|
||||
$arguments = @(
|
||||
"cargo",
|
||||
"run",
|
||||
"--manifest-path",
|
||||
$xtaskManifest,
|
||||
"--",
|
||||
"release",
|
||||
"package-local"
|
||||
)
|
||||
|
||||
if ($Build) {
|
||||
$arguments += "--build"
|
||||
}
|
||||
if (-not [string]::IsNullOrWhiteSpace($TargetTriple)) {
|
||||
$arguments += @("--target-triple", $TargetTriple)
|
||||
}
|
||||
if (-not [string]::IsNullOrWhiteSpace($SourceBinary)) {
|
||||
$arguments += @("--source-binary", $SourceBinary)
|
||||
}
|
||||
if (-not [string]::IsNullOrWhiteSpace($OutputRoot)) {
|
||||
$arguments += @("--output-root", $OutputRoot)
|
||||
}
|
||||
if ($SkipVersionSmoke) {
|
||||
$arguments += "--skip-version-smoke"
|
||||
}
|
||||
|
||||
rtk @arguments
|
||||
@@ -0,0 +1,33 @@
|
||||
param(
|
||||
[switch]$Build,
|
||||
[string]$TargetTriple,
|
||||
[string]$BinaryPath
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version Latest
|
||||
|
||||
$repoRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
|
||||
$xtaskManifest = Join-Path $repoRoot "xtask\Cargo.toml"
|
||||
|
||||
$arguments = @(
|
||||
"cargo",
|
||||
"run",
|
||||
"--manifest-path",
|
||||
$xtaskManifest,
|
||||
"--",
|
||||
"release",
|
||||
"smoke-version"
|
||||
)
|
||||
|
||||
if ($Build) {
|
||||
$arguments += "--build"
|
||||
}
|
||||
if (-not [string]::IsNullOrWhiteSpace($TargetTriple)) {
|
||||
$arguments += @("--target-triple", $TargetTriple)
|
||||
}
|
||||
if (-not [string]::IsNullOrWhiteSpace($BinaryPath)) {
|
||||
$arguments += @("--binary-path", $BinaryPath)
|
||||
}
|
||||
|
||||
rtk @arguments
|
||||
@@ -0,0 +1,26 @@
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[switch]$IncludeReleaseSmoke
|
||||
)
|
||||
|
||||
Set-StrictMode -Version Latest
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
$repoRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
|
||||
$xtaskManifest = Join-Path $repoRoot "xtask\Cargo.toml"
|
||||
|
||||
$arguments = @(
|
||||
"cargo",
|
||||
"run",
|
||||
"--manifest-path",
|
||||
$xtaskManifest,
|
||||
"--",
|
||||
"testing",
|
||||
"strict-sweep"
|
||||
)
|
||||
|
||||
if ($IncludeReleaseSmoke) {
|
||||
$arguments += "--include-release-smoke"
|
||||
}
|
||||
|
||||
rtk @arguments
|
||||
Reference in New Issue
Block a user