mirror of
https://github.com/GreptimeTeam/greptimedb.git
synced 2026-09-06 05:28:57 +00:00
* ci: batch fuzz targets in GitHub Actions Signed-off-by: WenyXu <wenymedia@gmail.com> * ci: improve fuzz test observability Signed-off-by: WenyXu <wenymedia@gmail.com> * fix(ci): preserve fuzz setup failure artifacts Signed-off-by: WenyXu <wenymedia@gmail.com> * test(ci): keep fuzz mock output in logs Signed-off-by: WenyXu <wenymedia@gmail.com> * ci: optimize fuzz worker cache Signed-off-by: WenyXu <wenymedia@gmail.com> * ci: warm fuzz target binaries Signed-off-by: WenyXu <wenymedia@gmail.com> * ci: isolate fuzz workflow Signed-off-by: WenyXu <wenymedia@gmail.com> * ci: centralize fuzz target preparation Signed-off-by: WenyXu <wenymedia@gmail.com> * ci: split general workflows Signed-off-by: WenyXu <wenymedia@gmail.com> * ci: streamline docs required checks Signed-off-by: WenyXu <wenymedia@gmail.com> * fix: transfer fuzz targets as artifacts Signed-off-by: WenyXu <wenymedia@gmail.com> * fix: preserve fuzz binary permissions Signed-off-by: WenyXu <wenymedia@gmail.com> * ci: streamline fuzz workers Signed-off-by: WenyXu <wenymedia@gmail.com> * ci: cache PR build dependencies Signed-off-by: WenyXu <wenymedia@gmail.com> * ci: retain main build cache policy Signed-off-by: WenyXu <wenymedia@gmail.com> * ci: address fuzz review feedback Signed-off-by: WenyXu <wenymedia@gmail.com> --------- Signed-off-by: WenyXu <wenymedia@gmail.com>
137 lines
3.8 KiB
Bash
Executable File
137 lines
3.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -uo pipefail
|
|
|
|
if [[ "$#" -ne 2 ]]; then
|
|
echo "Usage: $0 <target> <target-artifact-dir>" >&2
|
|
exit 2
|
|
fi
|
|
|
|
target="$1"
|
|
target_dir="$2"
|
|
namespace="${GT_FUZZ_NS:-my-greptimedb}"
|
|
collection_log="${target_dir}/artifact-collection.log"
|
|
monitor_collector="${FUZZ_MONITOR_COLLECTOR:-.github/scripts/collect-fuzz-monitor-artifacts.sh}"
|
|
failed=false
|
|
|
|
mkdir -p "${target_dir}"
|
|
exec > >(tee -a "${collection_log}") 2>&1
|
|
|
|
log() {
|
|
printf '[collect-fuzz-target-artifacts] %s\n' "$*"
|
|
}
|
|
|
|
collect() {
|
|
local name="$1"
|
|
shift
|
|
|
|
log "collect ${name}"
|
|
if "$@"; then
|
|
return
|
|
fi
|
|
|
|
log "failed to collect ${name}"
|
|
failed=true
|
|
}
|
|
|
|
write_setup_failure_manifest() {
|
|
local artifact_root
|
|
local result_path="${target_dir}/result.json"
|
|
local manifest_path
|
|
local summary_path
|
|
local collection_status
|
|
local completed_at
|
|
|
|
artifact_root="$(dirname "$(dirname "${target_dir}")")"
|
|
manifest_path="${artifact_root}/manifest.json"
|
|
summary_path="${artifact_root}/summary.md"
|
|
completed_at="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
if [[ "${failed}" == true ]]; then
|
|
collection_status="failed"
|
|
else
|
|
collection_status="success"
|
|
fi
|
|
|
|
jq -n \
|
|
--arg target "${target}" \
|
|
--arg group "${FUZZ_GROUP:-setup-failure}" \
|
|
--arg git_sha "${GITHUB_SHA:-}" \
|
|
--arg completed_at "${completed_at}" \
|
|
--arg artifact_collection "${collection_status}" \
|
|
'{
|
|
target: $target,
|
|
group: $group,
|
|
git_sha: $git_sha,
|
|
status: "failure",
|
|
phase: "setup",
|
|
started_at: null,
|
|
completed_at: $completed_at,
|
|
duration_secs: null,
|
|
exit_code: null,
|
|
max_total_time_secs: null,
|
|
after_prior_failure: false,
|
|
artifact_collection: $artifact_collection
|
|
}' >"${result_path}"
|
|
jq -s '.' "${result_path}" >"${manifest_path}"
|
|
|
|
{
|
|
printf '## Fuzz target results: `%s`\n\n' "${FUZZ_GROUP:-setup-failure}"
|
|
printf -- '- Failure phase: `setup`\n'
|
|
printf -- '- Artifact collection: `%s`\n\n' "${collection_status}"
|
|
printf '| Target | Status | Exit code | Artifacts |\n'
|
|
printf '| --- | --- | ---: | --- |\n'
|
|
printf '| `%s` | failure | - | %s |\n' "${target}" "${collection_status}"
|
|
} >"${summary_path}"
|
|
|
|
if [[ -n "${GITHUB_STEP_SUMMARY:-}" ]]; then
|
|
cat "${summary_path}" >>"${GITHUB_STEP_SUMMARY}"
|
|
fi
|
|
}
|
|
|
|
log "collect artifacts for target ${target} under ${target_dir}"
|
|
|
|
if [[ -n "${FUZZ_SERVICE_LOG:-}" && -f "${FUZZ_SERVICE_LOG}" ]]; then
|
|
mkdir -p "${target_dir}/service"
|
|
collect "service log" cp "${FUZZ_SERVICE_LOG}" "${target_dir}/service/greptime.log"
|
|
fi
|
|
|
|
case "${FUZZ_COLLECT_CLUSTER_ARTIFACTS:-false}" in
|
|
false)
|
|
;;
|
|
true)
|
|
mkdir -p "${target_dir}/kind" "${target_dir}/kubernetes" "${target_dir}/monitor"
|
|
collect "Kubernetes nodes" \
|
|
bash -c 'kubectl describe nodes >"$1" 2>&1' _ \
|
|
"${target_dir}/kubernetes/nodes.txt"
|
|
collect "Kubernetes pods" \
|
|
bash -c 'kubectl get pods -A -o wide >"$1" 2>&1 && kubectl describe pod -n "$2" >>"$1" 2>&1' _ \
|
|
"${target_dir}/kubernetes/pods.txt" "${namespace}"
|
|
collect "Kubernetes events" \
|
|
bash -c 'kubectl get events -A --sort-by=.lastTimestamp >"$1" 2>&1' _ \
|
|
"${target_dir}/kubernetes/events.txt"
|
|
collect "Kind logs" kind export logs "${target_dir}/kind"
|
|
collect "monitor dumps" \
|
|
env \
|
|
GT_FUZZ_NS="${namespace}" \
|
|
GT_FUZZ_CLUSTER="${GT_FUZZ_CLUSTER:-my-greptimedb}" \
|
|
GT_MONITOR_HTTP_LOCAL_PORT="${GT_MONITOR_HTTP_LOCAL_PORT:-14000}" \
|
|
GT_MONITOR_ARTIFACT_DIR="${target_dir}/monitor" \
|
|
GT_MONITOR_SERVER_EXPORT_DIR="${GT_MONITOR_SERVER_EXPORT_DIR:-/tmp/gt-monitor-dump/${target}}" \
|
|
bash "${monitor_collector}"
|
|
;;
|
|
*)
|
|
log "FUZZ_COLLECT_CLUSTER_ARTIFACTS must be true or false"
|
|
exit 2
|
|
;;
|
|
esac
|
|
|
|
if [[ "${target}" == setup ]]; then
|
|
write_setup_failure_manifest
|
|
fi
|
|
|
|
if [[ "${failed}" == true ]]; then
|
|
exit 1
|
|
fi
|
|
|
|
log "artifact collection completed"
|