initial
Some checks failed
CI / Type Check & Lint (push) Failing after 5s
CI / Build Test (Current Platform) (push) Failing after 5s
CI / Build All Platforms (push) Successful in 49s

This commit is contained in:
2026-01-30 03:16:57 +00:00
commit daaf6559e3
80 changed files with 14430 additions and 0 deletions

179
.gitea/workflows/README.md Normal file
View File

@@ -0,0 +1,179 @@
# Gitea Actions Workflows
This directory contains automated workflows for ModelGrid's CI/CD pipeline.
## Workflows
### CI Workflow (`ci.yml`)
**Triggers:**
- Push to `main` branch
- Push to `migration/**` branches
- Pull requests to `main`
**Jobs:**
1. **Type Check & Lint**
- Runs `deno check` for TypeScript validation
- Runs `deno lint` (continues on error)
- Runs `deno fmt --check` (continues on error)
2. **Build Test (Current Platform)**
- Compiles for Linux x86_64 (host platform)
- Tests binary execution (`--version` and `help`)
3. **Build All Platforms** (Main/Tags only)
- Compiles all 5 platform binaries
- Uploads as artifacts (30-day retention)
- Only runs on `main` branch or tags
### Release Workflow (`release.yml`)
**Triggers:**
- Push tags matching `v*` (e.g., `v1.0.0`)
**Jobs:**
1. **Version Verification**
- Extracts version from tag
- Verifies `deno.json` version matches tag
- Fails if mismatch detected
2. **Compilation**
- Compiles binaries for all 5 platforms:
- `modelgrid-linux-x64` (Linux x86_64)
- `modelgrid-linux-arm64` (Linux ARM64)
- `modelgrid-macos-x64` (macOS Intel)
- `modelgrid-macos-arm64` (macOS Apple Silicon)
- `modelgrid-windows-x64.exe` (Windows x64)
3. **Checksums**
- Generates SHA256 checksums for all binaries
- Creates `SHA256SUMS.txt`
4. **Release Creation**
- Creates Gitea release with tag
- Extracts release notes from CHANGELOG.md (if exists)
- Uploads all binaries + checksums as release assets
## Creating a Release
### Prerequisites
1. Update version in `deno.json`:
```json
{
"version": "1.0.0"
}
```
2. Update `CHANGELOG.md` with release notes (optional but recommended)
3. Commit all changes:
```bash
git add .
git commit -m "chore: bump version to 1.0.0"
```
### Release Process
1. Create and push a tag matching the version:
```bash
git tag v1.0.0
git push origin v1.0.0
```
2. Gitea Actions will automatically:
- Verify version consistency
- Compile all platform binaries
- Generate checksums
- Create release with binaries attached
3. Monitor the workflow:
- Go to: `https://code.foss.global/modelgrid.com/modelgrid/actions`
- Check the "Release" workflow run
### Manual Release (Fallback)
If workflows fail, you can create a release manually:
```bash
# Compile all binaries
bash scripts/compile-all.sh
# Generate checksums
cd dist/binaries
sha256sum * > SHA256SUMS.txt
cd ../..
# Create release on Gitea UI
# Upload binaries manually
```
## Troubleshooting
### Version Mismatch Error
If the release workflow fails with "Version mismatch":
- Ensure `deno.json` version matches the git tag
- Example: tag `v1.0.0` requires `"version": "1.0.0"` in deno.json
### Compilation Errors
If compilation fails:
1. Test locally: `bash scripts/compile-all.sh`
2. Check Deno version compatibility
3. Review TypeScript errors: `deno check mod.ts`
### Upload Failures
If binary upload fails:
1. Check Gitea Actions permissions
2. Verify `GITHUB_TOKEN` secret exists (auto-provided by Gitea)
3. Try manual release creation
## Workflow Secrets
The workflows use the following secrets:
- `GITHUB_TOKEN` - Auto-provided by Gitea Actions (no setup needed)
## Development
### Testing Workflows Locally
You can test compilation locally:
```bash
# Install Deno
curl -fsSL https://deno.land/install.sh | sh
# Test type checking
deno check mod.ts
# Test compilation
bash scripts/compile-all.sh
# Test binary
./dist/binaries/modelgrid-linux-x64 --version
```
### Modifying Workflows
After modifying workflows:
1. Test syntax: Use a YAML validator
2. Commit changes: `git add .gitea/workflows/`
3. Push to feature branch first to test CI
4. Merge to main once verified
## Links
- Gitea Actions Documentation: https://docs.gitea.com/usage/actions/overview
- Deno Compile Documentation: https://docs.deno.com/runtime/manual/tools/compiler
- ModelGrid Repository: https://code.foss.global/modelgrid.com/modelgrid

84
.gitea/workflows/ci.yml Normal file
View File

@@ -0,0 +1,84 @@
name: CI
on:
push:
branches:
- main
- 'migration/**'
pull_request:
branches:
- main
jobs:
check:
name: Type Check & Lint
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Deno
uses: denoland/setup-deno@v1
with:
deno-version: v2.x
- name: Check TypeScript types
run: deno check mod.ts
- name: Lint code
run: deno lint
continue-on-error: true
- name: Format check
run: deno fmt --check
continue-on-error: true
build:
name: Build Test (Current Platform)
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Deno
uses: denoland/setup-deno@v1
with:
deno-version: v2.x
- name: Compile for current platform
run: |
echo "Testing compilation for Linux x86_64..."
deno compile --allow-all --no-check \
--output modelgrid-test \
--target x86_64-unknown-linux-gnu mod.ts
- name: Test binary execution
run: |
chmod +x modelgrid-test
./modelgrid-test --version
./modelgrid-test help
build-all:
name: Build All Platforms
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Deno
uses: denoland/setup-deno@v1
with:
deno-version: v2.x
- name: Compile all platform binaries
run: bash scripts/compile-all.sh
- name: Upload all binaries as artifact
uses: actions/upload-artifact@v3
with:
name: modelgrid-binaries.zip
path: dist/binaries/*
retention-days: 30

View File

@@ -0,0 +1,129 @@
name: Publish to npm
on:
push:
tags:
- 'v*'
jobs:
npm-publish:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Deno
uses: denoland/setup-deno@v1
with:
deno-version: v2.x
- name: Setup Node.js for npm publishing
uses: actions/setup-node@v4
with:
node-version: '18.x'
registry-url: 'https://registry.npmjs.org/'
- name: Get version from tag
id: version
run: |
VERSION=${GITHUB_REF#refs/tags/}
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "version_number=${VERSION#v}" >> $GITHUB_OUTPUT
echo "Publishing version: $VERSION"
- name: Verify deno.json version matches tag
run: |
DENO_VERSION=$(grep -o '"version": "[^"]*"' deno.json | cut -d'"' -f4)
TAG_VERSION="${{ steps.version.outputs.version_number }}"
echo "deno.json version: $DENO_VERSION"
echo "Tag version: $TAG_VERSION"
if [ "$DENO_VERSION" != "$TAG_VERSION" ]; then
echo "ERROR: Version mismatch!"
echo "deno.json has version $DENO_VERSION but tag is $TAG_VERSION"
exit 1
fi
- name: Compile binaries for npm package
run: |
echo "Compiling binaries for npm package..."
deno task compile
echo ""
echo "Binary sizes:"
ls -lh dist/binaries/
- name: Generate SHA256 checksums
run: |
cd dist/binaries
sha256sum * > SHA256SUMS
cat SHA256SUMS
cd ../..
- name: Sync package.json version
run: |
VERSION="${{ steps.version.outputs.version_number }}"
echo "Syncing package.json to version ${VERSION}..."
npm version ${VERSION} --no-git-tag-version --allow-same-version
echo "package.json version: $(grep '"version"' package.json | head -1)"
- name: Create npm package
run: |
echo "Creating npm package..."
npm pack
echo ""
echo "Package created:"
ls -lh *.tgz
- name: Test local installation
run: |
echo "Testing local package installation..."
PACKAGE_FILE=$(ls *.tgz)
npm install -g ${PACKAGE_FILE}
echo ""
echo "Testing modelgrid command:"
modelgrid --version || echo "Note: Binary execution may fail in CI environment"
echo ""
echo "Checking installed files:"
npm ls -g @modelgrid.com/modelgrid || true
- name: Publish to npm
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
run: |
echo "Publishing to npm registry..."
npm publish --access public
echo ""
echo "✅ Successfully published @modelgrid.com/modelgrid to npm!"
echo ""
echo "Package info:"
npm view @modelgrid.com/modelgrid
- name: Verify npm package
run: |
echo "Waiting for npm propagation..."
sleep 30
echo ""
echo "Verifying published package..."
npm view @modelgrid.com/modelgrid
echo ""
echo "Testing installation from npm:"
npm install -g @modelgrid.com/modelgrid
echo ""
echo "Package installed successfully!"
which modelgrid || echo "Binary location check skipped"
- name: Publish Summary
run: |
echo "================================================"
echo " npm Publish Complete!"
echo "================================================"
echo ""
echo "✅ Package: @modelgrid.com/modelgrid"
echo "✅ Version: ${{ steps.version.outputs.version }}"
echo ""
echo "Installation:"
echo " npm install -g @modelgrid.com/modelgrid"
echo ""
echo "Registry:"
echo " https://www.npmjs.com/package/@modelgrid.com/modelgrid"
echo ""

View File

@@ -0,0 +1,249 @@
name: Release
on:
push:
tags:
- 'v*'
jobs:
build-and-release:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Deno
uses: denoland/setup-deno@v1
with:
deno-version: v2.x
- name: Get version from tag
id: version
run: |
VERSION=${GITHUB_REF#refs/tags/}
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "version_number=${VERSION#v}" >> $GITHUB_OUTPUT
echo "Building version: $VERSION"
- name: Verify deno.json version matches tag
run: |
DENO_VERSION=$(grep -o '"version": "[^"]*"' deno.json | cut -d'"' -f4)
TAG_VERSION="${{ steps.version.outputs.version_number }}"
echo "deno.json version: $DENO_VERSION"
echo "Tag version: $TAG_VERSION"
if [ "$DENO_VERSION" != "$TAG_VERSION" ]; then
echo "ERROR: Version mismatch!"
echo "deno.json has version $DENO_VERSION but tag is $TAG_VERSION"
exit 1
fi
- name: Compile binaries for all platforms
run: |
echo "================================================"
echo " ModelGrid Release Compilation"
echo " Version: ${{ steps.version.outputs.version }}"
echo "================================================"
echo ""
# Clean up old binaries and create fresh directory
rm -rf dist/binaries
mkdir -p dist/binaries
echo "→ Cleaned old binaries from dist/binaries"
echo ""
# Linux x86_64
echo "→ Compiling for Linux x86_64..."
deno compile --allow-all --no-check \
--output dist/binaries/modelgrid-linux-x64 \
--target x86_64-unknown-linux-gnu mod.ts
echo " ✓ Linux x86_64 complete"
# Linux ARM64
echo "→ Compiling for Linux ARM64..."
deno compile --allow-all --no-check \
--output dist/binaries/modelgrid-linux-arm64 \
--target aarch64-unknown-linux-gnu mod.ts
echo " ✓ Linux ARM64 complete"
# macOS x86_64
echo "→ Compiling for macOS x86_64..."
deno compile --allow-all --no-check \
--output dist/binaries/modelgrid-macos-x64 \
--target x86_64-apple-darwin mod.ts
echo " ✓ macOS x86_64 complete"
# macOS ARM64
echo "→ Compiling for macOS ARM64..."
deno compile --allow-all --no-check \
--output dist/binaries/modelgrid-macos-arm64 \
--target aarch64-apple-darwin mod.ts
echo " ✓ macOS ARM64 complete"
# Windows x86_64
echo "→ Compiling for Windows x86_64..."
deno compile --allow-all --no-check \
--output dist/binaries/modelgrid-windows-x64.exe \
--target x86_64-pc-windows-msvc mod.ts
echo " ✓ Windows x86_64 complete"
echo ""
echo "All binaries compiled successfully!"
ls -lh dist/binaries/
- name: Generate SHA256 checksums
run: |
cd dist/binaries
sha256sum * > SHA256SUMS.txt
cat SHA256SUMS.txt
cd ../..
- name: Extract changelog for this version
id: changelog
run: |
VERSION="${{ steps.version.outputs.version }}"
# Check if CHANGELOG.md exists
if [ ! -f CHANGELOG.md ]; then
echo "No CHANGELOG.md found, using default release notes"
cat > /tmp/release_notes.md << EOF
## ModelGrid $VERSION
Pre-compiled binaries for multiple platforms.
### Installation
Use the installation script:
\`\`\`bash
curl -sSL https://code.foss.global/modelgrid.com/modelgrid/raw/branch/main/install.sh | sudo bash
\`\`\`
Or download the binary for your platform and make it executable.
### Supported Platforms
- Linux x86_64 (x64)
- Linux ARM64 (aarch64)
- macOS x86_64 (Intel)
- macOS ARM64 (Apple Silicon)
- Windows x86_64
### Checksums
SHA256 checksums are provided in SHA256SUMS.txt
EOF
else
# Try to extract section for this version from CHANGELOG.md
# This is a simple extraction - adjust based on your CHANGELOG format
awk "/## \[$VERSION\]/,/## \[/" CHANGELOG.md | sed '$d' > /tmp/release_notes.md || cat > /tmp/release_notes.md << EOF
## ModelGrid $VERSION
See CHANGELOG.md for full details.
### Installation
Use the installation script:
\`\`\`bash
curl -sSL https://code.foss.global/modelgrid.com/modelgrid/raw/branch/main/install.sh | sudo bash
\`\`\`
EOF
fi
echo "Release notes:"
cat /tmp/release_notes.md
- name: Delete existing release if it exists
run: |
VERSION="${{ steps.version.outputs.version }}"
echo "Checking for existing release $VERSION..."
# Try to get existing release by tag
EXISTING_RELEASE_ID=$(curl -s \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
"https://code.foss.global/api/v1/repos/modelgrid.com/modelgrid/releases/tags/$VERSION" \
| jq -r '.id // empty')
if [ -n "$EXISTING_RELEASE_ID" ]; then
echo "Found existing release (ID: $EXISTING_RELEASE_ID), deleting..."
curl -X DELETE -s \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
"https://code.foss.global/api/v1/repos/modelgrid.com/modelgrid/releases/$EXISTING_RELEASE_ID"
echo "Existing release deleted"
sleep 2
else
echo "No existing release found, proceeding with creation"
fi
- name: Create Gitea Release
run: |
VERSION="${{ steps.version.outputs.version }}"
RELEASE_NOTES=$(cat /tmp/release_notes.md)
# Create the release
echo "Creating release for $VERSION..."
RELEASE_ID=$(curl -X POST -s \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-H "Content-Type: application/json" \
"https://code.foss.global/api/v1/repos/modelgrid.com/modelgrid/releases" \
-d "{
\"tag_name\": \"$VERSION\",
\"name\": \"ModelGrid $VERSION\",
\"body\": $(jq -Rs . /tmp/release_notes.md),
\"draft\": false,
\"prerelease\": false
}" | jq -r '.id')
echo "Release created with ID: $RELEASE_ID"
# Upload binaries as release assets
for binary in dist/binaries/*; do
filename=$(basename "$binary")
echo "Uploading $filename..."
curl -X POST -s \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-H "Content-Type: application/octet-stream" \
--data-binary "@$binary" \
"https://code.foss.global/api/v1/repos/modelgrid.com/modelgrid/releases/$RELEASE_ID/assets?name=$filename"
done
echo "All assets uploaded successfully"
- name: Clean up old releases
run: |
echo "Cleaning up old releases (keeping only last 3)..."
# Fetch all releases sorted by creation date
RELEASES=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
"https://code.foss.global/api/v1/repos/modelgrid.com/modelgrid/releases" | \
jq -r 'sort_by(.created_at) | reverse | .[3:] | .[].id')
# Delete old releases
if [ -n "$RELEASES" ]; then
echo "Found releases to delete:"
for release_id in $RELEASES; do
echo " Deleting release ID: $release_id"
curl -X DELETE -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
"https://code.foss.global/api/v1/repos/modelgrid.com/modelgrid/releases/$release_id"
done
echo "Old releases deleted successfully"
else
echo "No old releases to delete (less than 4 releases total)"
fi
echo ""
- name: Release Summary
run: |
echo "================================================"
echo " Release ${{ steps.version.outputs.version }} Complete!"
echo "================================================"
echo ""
echo "Binaries published:"
ls -lh dist/binaries/
echo ""
echo "Release URL:"
echo "https://code.foss.global/modelgrid.com/modelgrid/releases/tag/${{ steps.version.outputs.version }}"
echo ""
echo "Installation command:"
echo "curl -sSL https://code.foss.global/modelgrid.com/modelgrid/raw/branch/main/install.sh | sudo bash"
echo ""