Skip to content

fix(npm): close download streams in postinstall (GH#3205) #8537

fix(npm): close download streams in postinstall (GH#3205)

fix(npm): close download streams in postinstall (GH#3205) #8537

Workflow file for this run

name: CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
merge_group:
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
# Fast check to ensure all version files are in sync
check-version-consistency:
name: Check version consistency
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Check all versions match
run: ./scripts/check-versions.sh
# Check documentation references match actual CLI flags
check-doc-flags:
name: Check doc flags freshness
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version-file: 'go.mod'
- name: Install ICU4C
run: |
sudo apt-get update
sudo apt-get install -y libicu-dev
- name: Build bd
run: go build -o bd ./cmd/bd/
- name: Validate docs against CLI
run: ./scripts/check-doc-flags.sh ./bd
# Fast check to catch accidental .beads/issues.jsonl changes from contributors
check-no-beads-changes:
name: Check for .beads changes
runs-on: ubuntu-latest
if: github.event_name == 'pull_request'
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Check for .beads/issues.jsonl changes
run: |
if git diff --name-only origin/${{ github.base_ref }}...HEAD | grep -q "^\.beads/issues\.jsonl$"; then
echo "This PR includes changes to .beads/issues.jsonl"
echo ""
echo "This file is the project's issue database and should not be modified in PRs."
echo ""
echo "To fix, run:"
echo " git checkout origin/main -- .beads/issues.jsonl"
echo " git commit --amend"
echo " git push --force"
echo ""
exit 1
fi
echo "No .beads/issues.jsonl changes detected"
# Cross-platform test matrix (Linux/macOS only - Windows uses smoke tests)
test:
name: Test (${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
include:
# Linux: full test suite with coverage
- os: ubuntu-latest
coverage: true
test-flags: '-v -race -short -coverprofile=coverage.out'
# macOS: full test suite, no coverage (faster)
- os: macos-latest
coverage: false
test-flags: '-v -race -short'
steps:
- uses: actions/checkout@v6
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version-file: 'go.mod'
- name: Install ICU4C (Linux)
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get update
sudo apt-get install -y libicu-dev
- name: Install ICU4C (macOS)
if: matrix.os == 'macos-latest'
run: |
brew install icu4c
dir="$(brew --prefix icu4c)"
echo "CGO_CPPFLAGS=-I$dir/include" >> "$GITHUB_ENV"
echo "CGO_LDFLAGS=-L$dir/lib -Wl,-rpath,$dir/lib" >> "$GITHUB_ENV"
echo "PKG_CONFIG_PATH=$dir/lib/pkgconfig" >> "$GITHUB_ENV"
- name: Configure Git
run: |
git config --global user.name "CI Bot"
git config --global user.email "ci@beads.test"
- name: Install gotestsum
if: matrix.coverage
run: go install gotest.tools/gotestsum@latest
- name: Build
run: go build -v ./cmd/bd
- name: Test (with coverage + JUnit XML)
if: matrix.coverage
run: |
gotestsum \
--junitfile junit.xml \
--format testdox \
-- -race -short -coverprofile=coverage.out -skip '^TestEmbedded' ./...
- name: Test
if: ${{ !matrix.coverage }}
run: go test ${{ matrix.test-flags }} -skip '^TestEmbedded' ./...
- name: Upload coverage to Codecov
if: matrix.coverage && !cancelled()
uses: codecov/codecov-action@v6
with:
files: coverage.out
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: false
- name: Upload test results to Codecov
if: matrix.coverage && !cancelled()
uses: codecov/codecov-action@v6
with:
files: junit.xml
token: ${{ secrets.CODECOV_TOKEN }}
report_type: test_results
fail_ci_if_error: false
# Embedded Dolt tests - test the in-process Dolt engine (no server required)
#
# Split into: build → storage tests + parallel cmd test shards.
# Adding new *_embedded_test.go files auto-distributes via hash sharding.
build-embedded:
name: Build (Embedded Dolt)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version-file: 'go.mod'
- name: Install ICU4C
run: |
sudo apt-get update
sudo apt-get install -y libicu-dev
- name: Build embedded bd binary
run: go build -race -o /tmp/bd-embedded-test ./cmd/bd/
- name: Build embedded storage test binary
run: go test -race -c -o /tmp/embeddeddolt-test ./internal/storage/embeddeddolt/
- name: Build embedded cmd test binary
run: go test -race -c -o /tmp/bd-cmd-test ./cmd/bd/
- name: Upload binaries
uses: actions/upload-artifact@v7
with:
name: embedded-test-binaries
path: |
/tmp/bd-embedded-test
/tmp/embeddeddolt-test
/tmp/bd-cmd-test
retention-days: 1
test-embedded-storage:
name: Test (Embedded Dolt Storage)
needs: build-embedded
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Install ICU4C
run: |
sudo apt-get update
sudo apt-get install -y libicu-dev
- name: Download binaries
uses: actions/download-artifact@v8
with:
name: embedded-test-binaries
path: /tmp/
- name: Fix permissions
run: chmod +x /tmp/embeddeddolt-test
- name: Configure Git
run: |
git config --global user.name "CI Bot"
git config --global user.email "ci@beads.test"
- name: Test
env:
BEADS_TEST_EMBEDDED_DOLT: "1"
BEADS_TEST_EMBEDDED_TEST_BINARY: /tmp/embeddeddolt-test
run: /tmp/embeddeddolt-test -test.v -test.count=1 -test.timeout=10m
test-embedded-cmd:
name: Test (Embedded Dolt Cmd ${{ matrix.shard }}/${{ strategy.job-total }})
needs: build-embedded
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
shard: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
steps:
- uses: actions/checkout@v6
- name: Install ICU4C
run: |
sudo apt-get update
sudo apt-get install -y libicu-dev
- name: Download binaries
uses: actions/download-artifact@v8
with:
name: embedded-test-binaries
path: /tmp/
- name: Fix permissions
run: chmod +x /tmp/bd-embedded-test /tmp/embeddeddolt-test /tmp/bd-cmd-test
- name: Configure Git
run: |
git config --global user.name "CI Bot"
git config --global user.email "ci@beads.test"
- name: Test
env:
BEADS_TEST_EMBEDDED_DOLT: "1"
BEADS_TEST_BD_BINARY: /tmp/bd-embedded-test
run: bash .github/scripts/embedded-test-shard.sh ${{ matrix.shard }} 20
# Windows smoke tests only - full test suite times out (see bd-bmev)
# Linux/macOS run comprehensive tests; Windows just verifies binary works
#
# Windows uses -tags gms_pure_go to avoid the ICU regex dependency.
# go-icu-regex's regex_windows.go also uses Go stdlib regexp (build tag: windows).
# CGO is still required for gozstd (bundled C source) and the embedded dolt engine.
test-windows:
name: Test (Windows - smoke)
runs-on: windows-latest
steps:
- uses: actions/checkout@v6
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version-file: 'go.mod'
- name: Configure Git
run: |
git config --global user.name "CI Bot"
git config --global user.email "ci@beads.test"
- name: Build (pure Go regex)
run: go build -v -tags gms_pure_go -o bd.exe ./cmd/bd
- name: Smoke test - version
run: ./bd.exe version
- name: Smoke test - help
run: ./bd.exe help
fmt-check:
name: Check formatting
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version-file: 'go.mod'
- name: Check gofmt
run: make fmt-check
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version-file: 'go.mod'
- name: Install ICU4C (Linux)
run: |
sudo apt-get update
sudo apt-get install -y libicu-dev
- name: golangci-lint
uses: golangci/golangci-lint-action@v9
with:
version: latest
args: --timeout=5m
test-nix:
name: Test Nix Flake
runs-on: ubuntu-latest
# Allow failure until nixpkgs updates Go to 1.25.6+
# (dolthub/driver requires go 1.25.6, nixpkgs-unstable has go 1.25.1)
continue-on-error: true
steps:
- uses: actions/checkout@v6
- uses: cachix/install-nix-action@v31
with:
nix_path: nixpkgs=channel:nixos-unstable
- name: Run bd help via Nix
id: nix_help
continue-on-error: true
run: |
export BEADS_DB="$PWD/.ci-beads/beads.db"
mkdir -p "$(dirname "$BEADS_DB")"
rm -rf .beads
nix run .#default -- --db "$BEADS_DB" init --quiet --prefix ci
nix run .#default -- --db "$BEADS_DB" > help.txt
- name: Verify help text
if: steps.nix_help.outcome == 'success'
run: |
FIRST_LINE=$(head -n 1 help.txt)
EXPECTED="Issues chained together like beads. A lightweight issue tracker with first-class dependency support."
if [ "$FIRST_LINE" != "$EXPECTED" ]; then
echo "First line of help.txt doesn't match expected output"
echo "Expected: $EXPECTED"
echo "Got: $FIRST_LINE"
exit 1
fi
echo "Help text first line is correct"
- name: Note soft-failed Nix run
if: steps.nix_help.outcome != 'success'
run: echo "Nix run is non-blocking until nixpkgs toolchain catches up; skipping help-text assertion."