10 Commits

Author SHA1 Message Date
fdc4802d68 chore: format
All checks were successful
🚀 Release / release (push) Successful in 3m46s
2026-02-03 15:39:21 +01:00
5a30fce4ec chore(ci): make release script work with sh
Some checks failed
🚀 Release / release (push) Failing after 2m51s
2026-02-03 15:33:25 +01:00
0d0eb65ddd chore(ci): add jq and git to ci docker image 2026-02-03 15:33:12 +01:00
93ca436412 fix(ci): make scripts executable
Some checks failed
🚀 Release / release (push) Failing after 3m36s
2026-02-03 15:18:37 +01:00
ecdb986a96 chore(ci): debug some information
Some checks failed
🚀 Release / release (push) Failing after 3m28s
2026-02-03 15:12:47 +01:00
304abf2866 chore(ci): debug some information
Some checks failed
🚀 Release / release (push) Has been cancelled
2026-02-03 15:09:57 +01:00
a547d86946 chore(ci): debug some information
Some checks failed
🚀 Release / release (push) Has been cancelled
2026-02-03 15:09:22 +01:00
667d140883 docs: add information on how to release to readme
All checks were successful
🚀 Release / release (push) Successful in 3m37s
2026-02-03 14:59:12 +01:00
0ac65fd7a7 feat(ci): add release workflow
All checks were successful
🚀 Release / release (push) Successful in 3m34s
2026-02-03 14:52:24 +01:00
Max Richter
5437e062e1 feat(ci): add release workflow 2026-02-03 14:49:14 +01:00
5 changed files with 171 additions and 67 deletions

View File

@@ -0,0 +1,77 @@
#!/bin/sh
set -eu
TAG="$GITHUB_REF_NAME"
VERSION=$(echo "$TAG" | sed 's/^v//')
DATE=$(date +%Y-%m-%d)
echo "🚀 Creating release for $TAG (safe mode)"
# -------------------------------------------------------------------
# 1. Extract release notes from annotated tag
# -------------------------------------------------------------------
NOTES=$(git tag -l "$TAG" --format='%(contents)')
if [ -z "$NOTES" ]; then
echo "❌ Tag message is empty"
exit 1
fi
git checkout main
# -------------------------------------------------------------------
# 2. Update all package.json versions
# -------------------------------------------------------------------
echo "🔧 Updating package.json versions to $VERSION"
find . -name package.json ! -path "*/node_modules/*" | while read file; do
tmp_file="$file.tmp"
jq --arg v "$VERSION" '.version = $v' "$file" >"$tmp_file"
mv "$tmp_file" "$file"
done
# -------------------------------------------------------------------
# 3. Update CHANGELOG.md (prepend)
# -------------------------------------------------------------------
tmp_changelog="CHANGELOG.tmp"
{
echo "## $TAG ($DATE)"
echo ""
echo "$NOTES"
echo ""
echo "---"
echo ""
if [ -f CHANGELOG.md ]; then
cat CHANGELOG.md
fi
} >"$tmp_changelog"
mv "$tmp_changelog" CHANGELOG.md
# -------------------------------------------------------------------
# 4. Create release commit
# -------------------------------------------------------------------
git config user.name "release-bot"
git config user.email "release-bot@ci"
git add CHANGELOG.md $(find . -name package.json ! -path "*/node_modules/*")
# Skip commit if nothing changed
if git diff --cached --quiet; then
echo "No changes to commit for release $TAG"
exit 0
fi
git commit -m "chore(release): $TAG"
# -------------------------------------------------------------------
# 5. Push changes
# -------------------------------------------------------------------
git push origin main
echo "✅ Release commit for $TAG created successfully (tag untouched)"

View File

@@ -1,60 +0,0 @@
name: 🏗️ Build and Deploy
on:
push:
branches: ["*"]
env:
PNPM_CACHE_FOLDER: ~/.pnpm-store
jobs:
build_and_deploy:
runs-on: ubuntu-latest
container: jimfx/nodes:latest
steps:
- name: 📑 Checkout Code
uses: actions/checkout@v4
- name: 💾 Setup pnpm Cache
uses: actions/cache@v4
with:
path: ${{ env.PNPM_CACHE_FOLDER }}
key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-
- name: 📦 Install Dependencies
run: pnpm install --frozen-lockfile --store-dir ${{ env.PNPM_CACHE_FOLDER }}
- name: 🧹 Run Linter
run: pnpm lint
- name: 🎨 Check Formatting
run: pnpm format:check
- name: 🧬 Type Check
run: pnpm check
- name: 🛠️ Build Site
run: pnpm run build:deploy
- name: 🔑 Configure rclone
if: github.ref == 'refs/heads/main'
run: |
echo "$SSH_PRIVATE_KEY" > /tmp/id_rsa
chmod 600 /tmp/id_rsa
mkdir -p ~/.config/rclone
echo -e "[sftp-remote]\ntype = sftp\nhost = ${SSH_HOST}\nuser = ${SSH_USER}\nport = ${SSH_PORT}\nkey_file = /tmp/id_rsa" > ~/.config/rclone/rclone.conf
env:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
SSH_HOST: ${{ vars.SSH_HOST }}
SSH_PORT: ${{ vars.SSH_PORT }}
SSH_USER: ${{ vars.SSH_USER }}
- name: 🚀 Deploy Changed Files via rclone
if: github.ref == 'refs/heads/main'
run: |
echo "Uploading the rest"
rclone sync --update -v --progress --exclude _astro/** --stats 2s --stats-one-line ./app/build/ sftp-remote:${REMOTE_DIR} --transfers 4
env:
REMOTE_DIR: ${{ vars.REMOTE_DIR }}

View File

@@ -0,0 +1,58 @@
name: 🚀 Release
on:
push:
branches: ["*"]
tags: ["*"]
env:
PNPM_CACHE_FOLDER: ~/.pnpm-store
jobs:
release:
runs-on: ubuntu-latest
container: jimfx/nodes:latest
steps:
- name: 📑 Checkout Code
uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
- name: 💾 Setup pnpm Cache
uses: actions/cache@v4
with:
path: ${{ env.PNPM_CACHE_FOLDER }}
key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-
- name: 📦 Install Dependencies
run: pnpm install --frozen-lockfile --store-dir ${{ env.PNPM_CACHE_FOLDER }}
- name: 🧹 Lint
run: pnpm lint
- name: 🎨 Format Check
run: pnpm format:check
- name: 🧬 Type Check
run: pnpm check
- name: 🛠️ Build
run: pnpm build:deploy
- name: 🚀 Create Release Commit
if: github.ref_type == 'tag'
run: ./.gitea/scripts/create-release.sh
- name: 🏷️ Create Gitea Release
if: github.ref_type == 'tag'
uses: akkuman/gitea-release-action@v1
with:
tag_name: ${{ github.ref_name }}
release_name: Release ${{ github.ref_name }}
body_path: CHANGELOG.md
draft: false
prerelease: false

View File

@@ -1,15 +1,19 @@
FROM node:24-alpine
RUN apk add --no-cache --update curl rclone g++
# Install all required packages in one layer
RUN apk add --no-cache curl git jq g++ make
# Set Rust paths
ENV RUSTUP_HOME=/usr/local/rustup \
CARGO_HOME=/usr/local/cargo \
PATH=/usr/local/cargo/bin:$PATH
# Install Rust, wasm target, and pnpm
RUN curl --silent --show-error --location --fail --retry 3 \
--proto '=https' --tlsv1.2 \
--output /tmp/rustup-init.sh https://sh.rustup.rs \
&& sh /tmp/rustup-init.sh -y --no-modify-path --profile minimal \
&& rm /tmp/rustup-init.sh \
&& rustup target add wasm32-unknown-unknown \
&& npm i -g pnpm
--proto '=https' --tlsv1.2 \
--output /tmp/rustup-init.sh https://sh.rustup.rs \
&& sh /tmp/rustup-init.sh -y --no-modify-path --profile minimal \
&& rm /tmp/rustup-init.sh \
&& rustup target add wasm32-unknown-unknown \
&& rm -rf /usr/local/rustup/toolchains/*/share/doc \
&& npm i -g pnpm

View File

@@ -50,4 +50,29 @@ pnpm dev
### [Now you can create your first node 🤓](./docs/DEVELOPING_NODES.md)
# Releasing
## Creating a Release
1. **Create an annotated tag** with your release notes:
```bash
git tag -a v1.0.0 -m "Release notes for this version"
git push origin v1.0.0
```
2. **The CI workflow will:**
- Run lint, format check, and type check
- Build the project
- Update all `package.json` versions to match the tag
- Generate/update `CHANGELOG.md`
- Create a release commit on `main`
- Publish a Gitea release
## Version Requirements
- Tag must match pattern `v*` (e.g., `v1.0.0`, `v2.3.1`)
- Tag message must not be empty (annotated tag required)
- Tag must be pushed from `main` branch
# Roadmap