feat: unify version management with VERSION file and bump workflow

Add a single VERSION file (0.1.0) as the source of truth for both
Go backend and Android app. Makefile reads from VERSION with git
describe fallback, build.gradle.kts dynamically loads ../VERSION,
and .goreleaser.yaml now has explicit ldflags matching Go variables.
Includes a version-bump GitHub Actions workflow for automated semver
bumps and a release validation step to ensure tag/VERSION consistency.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Kohei 2026-03-01 01:05:28 +09:00
parent 6fbf7ea829
commit a660c7e68f
6 changed files with 76 additions and 2 deletions

View file

@ -30,6 +30,17 @@ jobs:
with:
fetch-depth: 0
- name: Validate version
env:
TAG_VERSION: ${{ inputs.tag }}
run: |
FILE_VERSION=$(cat VERSION)
TAG_VERSION="${TAG_VERSION#v}"
if [ "$FILE_VERSION" != "$TAG_VERSION" ]; then
echo "::error::Tag ($TAG_VERSION) ≠ VERSION file ($FILE_VERSION). Run version-bump first."
exit 1
fi
- name: Create and push tag
shell: bash
env:

54
.github/workflows/version-bump.yml vendored Normal file
View file

@ -0,0 +1,54 @@
name: Version Bump
on:
workflow_dispatch:
inputs:
bump:
description: "Semver bump type"
required: true
type: choice
options:
- patch
- minor
- major
permissions:
contents: write
jobs:
bump:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Read current version
id: current
run: echo "version=$(cat VERSION)" >> "$GITHUB_OUTPUT"
- name: Calculate next version
id: next
run: |
IFS='.' read -r major minor patch <<< "${{ steps.current.outputs.version }}"
case "${{ inputs.bump }}" in
major) major=$((major+1)); minor=0; patch=0 ;;
minor) minor=$((minor+1)); patch=0 ;;
patch) patch=$((patch+1)) ;;
esac
echo "version=${major}.${minor}.${patch}" >> "$GITHUB_OUTPUT"
- name: Update VERSION file
run: echo "${{ steps.next.outputs.version }}" > VERSION
- name: Increment versionCode
run: |
FILE=android/app/build.gradle.kts
CODE=$(grep -oP 'versionCode\s*=\s*\K\d+' "$FILE")
sed -i "s/versionCode\s*=\s*[0-9]\+/versionCode = $((CODE+1))/" "$FILE"
echo "versionCode: $CODE -> $((CODE+1))"
- name: Commit and push
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add VERSION android/app/build.gradle.kts
git commit -m "chore: bump version to ${{ steps.next.outputs.version }}"
git push

View file

@ -18,6 +18,11 @@ builds:
- arm64
- arm
main: ./cmd/clawdroid
ldflags:
- -s -w
- -X main.version={{.Version}}
- -X main.gitCommit={{.Commit}}
- -X main.buildTime={{.Date}}
archives:
- formats: [tar.gz]

View file

@ -7,7 +7,7 @@ CMD_DIR=cmd/$(BINARY_NAME)
MAIN_GO=$(CMD_DIR)/main.go
# Version
VERSION?=$(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
VERSION?=$(shell cat VERSION 2>/dev/null || git describe --tags --always --dirty 2>/dev/null || echo "dev")
GIT_COMMIT=$(shell git rev-parse --short=8 HEAD 2>/dev/null || echo "dev")
BUILD_TIME=$(shell date +%FT%T%z)
GO_VERSION=$(shell $(GO) version | awk '{print $$3}')

1
VERSION Normal file
View file

@ -0,0 +1 @@
0.1.0

View file

@ -13,6 +13,9 @@ val keystoreProperties = Properties().apply {
}
}
val versionFile = rootProject.file("../VERSION")
val appVersionName = if (versionFile.exists()) versionFile.readText().trim() else "0.1.0"
android {
namespace = "io.clawdroid"
compileSdk = libs.versions.android.compileSdk.get().toInt()
@ -22,7 +25,7 @@ android {
minSdk = libs.versions.android.minSdk.get().toInt()
targetSdk = libs.versions.android.targetSdk.get().toInt()
versionCode = 1
versionName = "1.0.0"
versionName = appVersionName
}
signingConfigs {