1+ name : Go CI
2+
3+ on :
4+ push :
5+ branches : [ main ]
6+ paths :
7+ - ' **.go'
8+ - ' go.mod'
9+ - ' go.sum'
10+ - ' .github/workflows/go-ci.yml'
11+ pull_request :
12+ branches : [ main ]
13+ paths :
14+ - ' **.go'
15+ - ' go.mod'
16+ - ' go.sum'
17+ - ' .github/workflows/go-ci.yml'
18+
19+ permissions :
20+ contents : read
21+
22+ jobs :
23+ go-test :
24+ name : Go Tests
25+ runs-on : ${{ matrix.os }}
26+ strategy :
27+ matrix :
28+ os : [ubuntu-latest, macos-latest, windows-latest]
29+ go-version : ['1.24']
30+
31+ steps :
32+ - name : Checkout code
33+ uses : actions/checkout@v4
34+
35+ - name : Set up Go
36+ uses : actions/setup-go@v5
37+ with :
38+ go-version : ${{ matrix.go-version }}
39+
40+ - name : Install Rust toolchain (for fallback builds)
41+ uses : dtolnay/rust-toolchain@stable
42+
43+ - name : Run Go linting
44+ uses : golangci/golangci-lint-action@v6
45+ with :
46+ version : latest
47+ args : --timeout=5m
48+
49+ # Download pre-built Rust library for testing
50+ # Falls back to building locally if no rust-v* releases exist yet
51+ - name : Download latest Rust library (Linux)
52+ if : matrix.os == 'ubuntu-latest'
53+ run : |
54+ LATEST_RELEASE=$(gh release list --repo ${{ github.repository }} --limit 10 | grep -E "^rust-v" | head -1 | cut -f1)
55+ if [ -z "$LATEST_RELEASE" ]; then
56+ echo "No Rust release found, building locally"
57+ cargo build --release
58+ echo "TOKENIZERS_LIB_PATH=$(pwd)/target/release/libtokenizers.so" >> $GITHUB_ENV
59+ else
60+ echo "Using Rust release: $LATEST_RELEASE"
61+ gh release download $LATEST_RELEASE --pattern "libtokenizers-x86_64-unknown-linux-gnu.tar.gz"
62+ mkdir -p test-lib
63+ tar -xzf libtokenizers-x86_64-unknown-linux-gnu.tar.gz -C test-lib
64+ echo "TOKENIZERS_LIB_PATH=$(pwd)/test-lib/libtokenizers.so" >> $GITHUB_ENV
65+ fi
66+ env :
67+ GITHUB_TOKEN : ${{ github.token }}
68+
69+ - name : Download latest Rust library (macOS)
70+ if : matrix.os == 'macos-latest'
71+ run : |
72+ ARCH=$(uname -m)
73+ if [ "$ARCH" = "arm64" ]; then
74+ ARCH="aarch64"
75+ elif [ "$ARCH" = "x86_64" ]; then
76+ ARCH="x86_64"
77+ fi
78+ LATEST_RELEASE=$(gh release list --repo ${{ github.repository }} --limit 10 | grep -E "^rust-v" | head -1 | cut -f1)
79+ if [ -z "$LATEST_RELEASE" ]; then
80+ echo "No Rust release found, building locally"
81+ cargo build --release
82+ echo "TOKENIZERS_LIB_PATH=$(pwd)/target/release/libtokenizers.dylib" >> $GITHUB_ENV
83+ else
84+ echo "Using Rust release: $LATEST_RELEASE"
85+ gh release download $LATEST_RELEASE --pattern "libtokenizers-${ARCH}-apple-darwin.tar.gz"
86+ mkdir -p test-lib
87+ tar -xzf libtokenizers-${ARCH}-apple-darwin.tar.gz -C test-lib
88+ echo "TOKENIZERS_LIB_PATH=$(pwd)/test-lib/libtokenizers.dylib" >> $GITHUB_ENV
89+ fi
90+ env :
91+ GITHUB_TOKEN : ${{ github.token }}
92+
93+ - name : Download latest Rust library (Windows)
94+ if : matrix.os == 'windows-latest'
95+ shell : pwsh
96+ run : |
97+ $latestRelease = gh release list --repo ${{ github.repository }} --limit 10 | Select-String -Pattern "^rust-v" | Select-Object -First 1
98+ if ($latestRelease) {
99+ $releaseTag = ($latestRelease -split "`t")[0]
100+ Write-Host "Using Rust release: $releaseTag"
101+ gh release download $releaseTag --pattern "libtokenizers-x86_64-pc-windows-msvc.tar.gz"
102+ New-Item -ItemType Directory -Force -Path test-lib
103+ tar -xzf libtokenizers-x86_64-pc-windows-msvc.tar.gz -C test-lib
104+ "TOKENIZERS_LIB_PATH=$(Get-Location)\test-lib\tokenizers.dll" | Out-File -FilePath $env:GITHUB_ENV -Append
105+ } else {
106+ Write-Host "No Rust release found, building locally"
107+ cargo build --release
108+ "TOKENIZERS_LIB_PATH=$(Get-Location)\target\release\tokenizers.dll" | Out-File -FilePath $env:GITHUB_ENV -Append
109+ }
110+ env :
111+ GITHUB_TOKEN : ${{ github.token }}
112+
113+ - name : Run Go tests (Unix)
114+ if : matrix.os != 'windows-latest'
115+ run : |
116+ go mod tidy
117+ go test -v -coverprofile=coverage.out -timeout=30m ./...
118+ env :
119+ GITHUB_TOKEN : ${{ github.token }}
120+
121+ - name : Run Go tests (Windows)
122+ if : matrix.os == 'windows-latest'
123+ shell : pwsh
124+ run : |
125+ go mod tidy
126+ go test -v -timeout=30m ./...
127+ env :
128+ GITHUB_TOKEN : ${{ github.token }}
129+
130+ integration-test :
131+ name : Integration Tests
132+ runs-on : ubuntu-latest
133+ needs : go-test
134+
135+ steps :
136+ - name : Checkout code
137+ uses : actions/checkout@v4
138+
139+ - name : Set up Go
140+ uses : actions/setup-go@v5
141+ with :
142+ go-version : ' 1.24'
143+
144+ - name : Install Rust toolchain (for fallback builds)
145+ uses : dtolnay/rust-toolchain@stable
146+
147+ - name : Download latest Rust library
148+ run : |
149+ LATEST_RELEASE=$(gh release list --repo ${{ github.repository }} --limit 10 | grep -E "^rust-v" | head -1 | cut -f1)
150+ if [ -z "$LATEST_RELEASE" ]; then
151+ echo "No Rust release found, building locally"
152+ cargo build --release
153+ echo "TOKENIZERS_LIB_PATH=$(pwd)/target/release/libtokenizers.so" >> $GITHUB_ENV
154+ else
155+ echo "Using Rust release: $LATEST_RELEASE"
156+ gh release download $LATEST_RELEASE --pattern "libtokenizers-x86_64-unknown-linux-gnu.tar.gz"
157+ mkdir -p test-lib
158+ tar -xzf libtokenizers-x86_64-unknown-linux-gnu.tar.gz -C test-lib
159+ echo "TOKENIZERS_LIB_PATH=$(pwd)/test-lib/libtokenizers.so" >> $GITHUB_ENV
160+ fi
161+ env :
162+ GITHUB_TOKEN : ${{ github.token }}
163+
164+ - name : Test download functionality
165+ run : |
166+ go test -v -run "TestDownloadFunctionality|TestGetLibraryInfo"
167+
168+ - name : Test library loading
169+ run : |
170+ go test -v -run "TestGetCachedLibraryPath|TestCacheDirectory"
0 commit comments