mirror of
https://github.com/coder/coder.git
synced 2026-06-02 20:48:20 +00:00
a6a8fd94d7
`make gen` could not run with `-j` because inter-target dependency edges were missing. Multiple recipes compile `coderd/rbac` (which includes generated files like `object_gen.go`), and without explicit ordering, parallel runs produced syntax errors from mid-write reads. Three main changes: **Dependency graph fixes** declare the compile-time chain through `coderd/rbac` so that `object_gen.go` is written before anything that imports it is compiled. The DB generation targets use a GNU Make 4.3+ grouped target (`&:`) so Make knows `generate.sh` co-produces `querier.go`, `unique_constraint.go`, `dbmetrics`, and `dbauthz` in a single invocation. `SKIP_DUMP_SQL=1` avoids re-entrant `make` inside `generate.sh` when the Makefile already guarantees `dump.sql` is fresh. **`scripts/atomicwrite` package** replaces `os.WriteFile` in all gen scripts with a temp-file-in-same-dir + rename pattern, preventing interrupted runs from leaving partial files. **`.PRECIOUS` and shell atomic writes** protect git-tracked generated files from Make's default delete-on-error behavior. Since these files are committed, deletion is worse than staleness -- `git restore` is the recovery path. CI now runs `make -j --output-sync -B gen` (~32s, down from ~85s serial). | Scenario | Before | After | |-----------------------------------|--------------------|----------| | `make gen` (serial) | 95s | 95s | | `make -j gen` (parallel) | race error | **22s** | | CI `make -j --output-sync -B gen` | forced serial ~85s | **~32s** |
47 lines
1.4 KiB
Bash
Executable File
47 lines
1.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
# This script generates swagger description file and required Go docs files
|
|
# from the coderd API.
|
|
|
|
set -euo pipefail
|
|
# shellcheck source=scripts/lib.sh
|
|
source "$(dirname "$(dirname "${BASH_SOURCE[0]}")")/lib.sh"
|
|
|
|
APIDOCGEN_DIR=$(dirname "${BASH_SOURCE[0]}")
|
|
API_MD_TMP_FILE=$(mktemp /tmp/coder-apidocgen.XXXXXX)
|
|
|
|
# SWAG_OUTPUT_DIR controls where swag writes swagger.json and docs.go.
|
|
# The caller may set it to a temp directory to avoid writing directly
|
|
# into the working tree.
|
|
SWAG_OUTPUT_DIR="${SWAG_OUTPUT_DIR:-./coderd/apidoc}"
|
|
|
|
cleanup() {
|
|
rm -f "${API_MD_TMP_FILE}"
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
log "Use temporary file: ${API_MD_TMP_FILE}"
|
|
|
|
pushd "${PROJECT_ROOT}"
|
|
# Use our custom wrapper instead of "go tool swag init" to enable
|
|
# Strict mode, which turns duplicate-route warnings into hard errors.
|
|
# The upstream swag CLI does not expose a --strict flag.
|
|
go run "${APIDOCGEN_DIR}/swaginit/main.go"
|
|
popd
|
|
|
|
pushd "${APIDOCGEN_DIR}"
|
|
|
|
# Make sure that widdershins is installed correctly.
|
|
pnpm exec -- widdershins --version
|
|
# Render the Markdown file from the swagger output.
|
|
pnpm exec -- widdershins \
|
|
--user_templates "./markdown-template" \
|
|
--search false \
|
|
--omitHeader true \
|
|
--language_tabs "shell:curl" \
|
|
--summary "${SWAG_OUTPUT_DIR}/swagger.json" \
|
|
--outfile "${API_MD_TMP_FILE}"
|
|
# Perform the postprocessing
|
|
go run postprocess/main.go -in-md-file-single "${API_MD_TMP_FILE}" -docs-directory "${APIDOCGEN_DOCS_DIR:-../../docs}"
|
|
popd
|