Remove CI/CD, unify Docker image for Docker Hub and HA add-on
- Remove GitHub Actions workflows (ci.yml, docker.yml, release.yml) - Remove GoReleaser configuration - Remove RELEASE.md (replaced by /release_strix skill) - Add HA options.json support in config.go (reads /data/options.json) - Add Version field to Config, pass real version to health endpoint - Change Version from const to var, inject via ldflags at build time - Add ARG VERSION to Dockerfile for build-time version injection - Reset webui/package.json version to 0.0.0 (not used functionally) - Clear probe fields on back navigation in frontend - Add /release_strix and /release_strix_dev skills
This commit is contained in:
@@ -0,0 +1,169 @@
|
||||
---
|
||||
name: release_strix
|
||||
description: Full release of Strix -- merge develop to main, tag, build multiarch Docker image, push to Docker Hub, update hassio-strix, create GitHub Release.
|
||||
disable-model-invocation: true
|
||||
---
|
||||
|
||||
# Strix Release
|
||||
|
||||
You are performing a full release of Strix. Follow every step exactly. Do NOT skip steps. Do NOT ask for confirmation except where explicitly noted below.
|
||||
|
||||
## Repositories
|
||||
|
||||
- Strix: `/home/user/Strix`
|
||||
- hassio-strix: `/home/user/hassio-strix`
|
||||
|
||||
## Step 1: Gather information
|
||||
|
||||
```bash
|
||||
cd /home/user/Strix
|
||||
git checkout develop
|
||||
git pull origin develop
|
||||
git pull origin main
|
||||
|
||||
# Get last release tag
|
||||
git tag --sort=-version:refname | head -1
|
||||
|
||||
# Show all commits since last release
|
||||
git log main..develop --oneline
|
||||
|
||||
# Show changed files
|
||||
git diff main..develop --stat
|
||||
```
|
||||
|
||||
## Step 2: Ask for version (THE ONLY QUESTION)
|
||||
|
||||
Use AskUserQuestion to ask the user which version to release.
|
||||
|
||||
Show them:
|
||||
- The last tag
|
||||
- The list of commits from Step 1
|
||||
|
||||
Offer options:
|
||||
- Next patch (e.g. 1.0.9 -> 1.0.10)
|
||||
- Next minor (e.g. 1.0.9 -> 1.1.0)
|
||||
- Next major (e.g. 1.0.9 -> 2.0.0)
|
||||
- Other (user types custom version)
|
||||
|
||||
Wait for answer. Store the chosen version as VERSION (without "v" prefix).
|
||||
|
||||
## Step 3: Verify build
|
||||
|
||||
```bash
|
||||
cd /home/user/Strix
|
||||
go test ./...
|
||||
go build ./...
|
||||
```
|
||||
|
||||
If tests or build fail -- STOP and report the error. Do not continue.
|
||||
|
||||
## Step 4: Update CHANGELOG.md
|
||||
|
||||
Read `/home/user/Strix/CHANGELOG.md`. Add a new section at the top (after the header lines), based on the commits from Step 1. Follow the existing format exactly:
|
||||
|
||||
```markdown
|
||||
## [VERSION] - YYYY-MM-DD
|
||||
|
||||
### Added
|
||||
- ...
|
||||
|
||||
### Fixed
|
||||
- ...
|
||||
|
||||
### Changed
|
||||
- ...
|
||||
```
|
||||
|
||||
Use today's date. Categorize commits into Added/Fixed/Changed/Technical sections. Only include sections that have entries. Write clear, user-facing descriptions (not raw commit messages).
|
||||
|
||||
## Step 5: Git -- commit, merge, tag, push
|
||||
|
||||
```bash
|
||||
cd /home/user/Strix
|
||||
git add CHANGELOG.md
|
||||
git commit -m "Release v$VERSION"
|
||||
|
||||
git checkout main
|
||||
git merge develop --no-ff -m "Merge develop into main for v$VERSION release"
|
||||
git tag v$VERSION
|
||||
|
||||
git push origin main --tags
|
||||
|
||||
git checkout develop
|
||||
git merge main
|
||||
git push origin develop
|
||||
```
|
||||
|
||||
## Step 6: Build and push Docker image
|
||||
|
||||
```bash
|
||||
cd /home/user/Strix
|
||||
docker buildx build --platform linux/amd64,linux/arm64 \
|
||||
--build-arg VERSION=$VERSION \
|
||||
-t eduard256/strix:$VERSION \
|
||||
-t eduard256/strix:latest \
|
||||
-t eduard256/strix:$(echo $VERSION | cut -d. -f1-2) \
|
||||
-t eduard256/strix:$(echo $VERSION | cut -d. -f1) \
|
||||
--push .
|
||||
```
|
||||
|
||||
## Step 7: Verify Docker Hub
|
||||
|
||||
```bash
|
||||
curl -s "https://hub.docker.com/v2/repositories/eduard256/strix/tags/?page_size=10" | jq '.results[].name'
|
||||
docker manifest inspect eduard256/strix:$VERSION | jq '.manifests[].platform'
|
||||
```
|
||||
|
||||
Verify the new version tag exists and both amd64 and arm64 platforms are present.
|
||||
|
||||
## Step 8: Smoke test
|
||||
|
||||
```bash
|
||||
docker run --rm -d --name strix-smoke-test -p 14567:4567 eduard256/strix:$VERSION
|
||||
sleep 5
|
||||
curl -s http://localhost:14567/api/v1/health | jq '.version'
|
||||
docker stop strix-smoke-test
|
||||
```
|
||||
|
||||
Verify the health endpoint returns the correct version string.
|
||||
|
||||
## Step 9: Update hassio-strix
|
||||
|
||||
```bash
|
||||
cd /home/user/hassio-strix
|
||||
git pull origin main
|
||||
```
|
||||
|
||||
Edit `/home/user/hassio-strix/strix/config.json` -- change `"version"` to the new VERSION.
|
||||
|
||||
Edit `/home/user/hassio-strix/strix/CHANGELOG.md` -- add the same CHANGELOG section as in Step 4.
|
||||
|
||||
```bash
|
||||
cd /home/user/hassio-strix
|
||||
git add strix/config.json strix/CHANGELOG.md
|
||||
git commit -m "Release v$VERSION"
|
||||
git push origin main
|
||||
```
|
||||
|
||||
## Step 10: GitHub Release
|
||||
|
||||
```bash
|
||||
cd /home/user/Strix
|
||||
PREV_TAG=$(git tag --sort=-version:refname | sed -n '2p')
|
||||
gh release create v$VERSION \
|
||||
--title "v$VERSION" \
|
||||
--notes "$(git log --oneline ${PREV_TAG}..v$VERSION)"
|
||||
```
|
||||
|
||||
## Step 11: Final report
|
||||
|
||||
Output a summary:
|
||||
|
||||
```
|
||||
Release v$VERSION complete:
|
||||
- Git: tag v$VERSION pushed to main
|
||||
- Docker Hub: eduard256/strix:$VERSION (amd64 + arm64)
|
||||
- Health check: version "$VERSION" verified
|
||||
- hassio-strix: config.json updated to $VERSION, pushed to main
|
||||
- GitHub Release: <URL from gh release create>
|
||||
```
|
||||
@@ -0,0 +1,64 @@
|
||||
---
|
||||
name: release_strix_dev
|
||||
description: Build and push dev Docker image for Strix, update hassio-strix dev add-on version.
|
||||
disable-model-invocation: true
|
||||
---
|
||||
|
||||
# Strix Dev Build
|
||||
|
||||
You are building and pushing a dev image of Strix. Follow every step exactly. Do NOT ask any questions -- this is fully automated.
|
||||
|
||||
## Repositories
|
||||
|
||||
- Strix: `/home/user/Strix`
|
||||
- hassio-strix: `/home/user/hassio-strix`
|
||||
|
||||
## Step 1: Get commit hash
|
||||
|
||||
```bash
|
||||
cd /home/user/Strix
|
||||
git rev-parse --short HEAD
|
||||
```
|
||||
|
||||
Store this as COMMIT_HASH (e.g. `fe93aa3`).
|
||||
|
||||
## Step 2: Build Docker image
|
||||
|
||||
```bash
|
||||
cd /home/user/Strix
|
||||
docker build --build-arg VERSION=dev-$COMMIT_HASH -t eduard256/strix:dev -t eduard256/strix:dev-$COMMIT_HASH .
|
||||
```
|
||||
|
||||
## Step 3: Push to Docker Hub
|
||||
|
||||
```bash
|
||||
docker push eduard256/strix:dev
|
||||
docker push eduard256/strix:dev-$COMMIT_HASH
|
||||
```
|
||||
|
||||
## Step 4: Update hassio-strix
|
||||
|
||||
```bash
|
||||
cd /home/user/hassio-strix
|
||||
git pull origin main
|
||||
```
|
||||
|
||||
Edit `/home/user/hassio-strix/strix-dev/config.json` -- change `"version"` to `dev-$COMMIT_HASH`.
|
||||
|
||||
```bash
|
||||
cd /home/user/hassio-strix
|
||||
git add strix-dev/config.json
|
||||
git commit -m "Dev build dev-$COMMIT_HASH"
|
||||
git push origin main
|
||||
```
|
||||
|
||||
## Step 5: Report
|
||||
|
||||
Output a summary:
|
||||
|
||||
```
|
||||
Dev build complete:
|
||||
- Commit: $COMMIT_HASH
|
||||
- Docker Hub: eduard256/strix:dev, eduard256/strix:dev-$COMMIT_HASH (amd64)
|
||||
- hassio-strix: strix-dev version updated to dev-$COMMIT_HASH
|
||||
```
|
||||
@@ -1,54 +0,0 @@
|
||||
name: CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
name: Test
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: '1.23'
|
||||
|
||||
- name: Cache Go modules
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/go/pkg/mod
|
||||
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-go-
|
||||
|
||||
- name: Download dependencies
|
||||
run: go mod download
|
||||
|
||||
- name: Run tests
|
||||
run: go test -v -race -coverprofile=coverage.txt -covermode=atomic ./...
|
||||
|
||||
- name: Build
|
||||
run: make build
|
||||
|
||||
lint:
|
||||
name: Lint
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: '1.23'
|
||||
|
||||
- name: Run golangci-lint
|
||||
uses: golangci/golangci-lint-action@v6
|
||||
with:
|
||||
version: latest
|
||||
@@ -1,77 +0,0 @@
|
||||
name: Docker Build and Push
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
tags:
|
||||
- 'v*'
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
|
||||
env:
|
||||
REGISTRY: docker.io
|
||||
IMAGE_NAME: eduard256/strix
|
||||
|
||||
jobs:
|
||||
build-and-push:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Log in to Docker Hub
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_TOKEN }}
|
||||
|
||||
- name: Extract metadata
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env.IMAGE_NAME }}
|
||||
tags: |
|
||||
type=ref,event=branch
|
||||
type=ref,event=pr
|
||||
type=semver,pattern={{version}}
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
type=semver,pattern={{major}}
|
||||
type=raw,value=latest,enable={{is_default_branch}}
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
build-args: |
|
||||
VERSION=${{ steps.meta.outputs.version }}
|
||||
|
||||
- name: Docker Hub Description
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: peter-evans/dockerhub-description@v4
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_TOKEN }}
|
||||
repository: ${{ env.IMAGE_NAME }}
|
||||
readme-filepath: ./README.md
|
||||
short-description: "Smart IP Camera Stream Discovery System"
|
||||
@@ -1,32 +0,0 @@
|
||||
name: Release
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v*'
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
goreleaser:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up Go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: '1.23'
|
||||
|
||||
- name: Run GoReleaser
|
||||
uses: goreleaser/goreleaser-action@v6
|
||||
with:
|
||||
distribution: goreleaser
|
||||
version: latest
|
||||
args: release --clean
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -1,112 +0,0 @@
|
||||
# GoReleaser configuration for Strix
|
||||
version: 2
|
||||
|
||||
before:
|
||||
hooks:
|
||||
- go mod tidy
|
||||
- go mod download
|
||||
|
||||
builds:
|
||||
- id: strix
|
||||
main: ./cmd/strix/main.go
|
||||
binary: strix
|
||||
env:
|
||||
- CGO_ENABLED=0
|
||||
goos:
|
||||
- linux
|
||||
- windows
|
||||
- darwin
|
||||
goarch:
|
||||
- amd64
|
||||
- arm64
|
||||
- arm
|
||||
goarm:
|
||||
- "7"
|
||||
ignore:
|
||||
- goos: windows
|
||||
goarch: arm
|
||||
- goos: darwin
|
||||
goarch: arm
|
||||
ldflags:
|
||||
- -s -w
|
||||
- -X main.Version={{.Version}}
|
||||
- -X main.BuildDate={{.Date}}
|
||||
- -X main.GitCommit={{.ShortCommit}}
|
||||
|
||||
archives:
|
||||
- id: strix-archive
|
||||
format: tar.gz
|
||||
name_template: >-
|
||||
{{ .ProjectName }}_
|
||||
{{- .Version }}_
|
||||
{{- .Os }}_
|
||||
{{- if eq .Arch "amd64" }}x86_64
|
||||
{{- else if eq .Arch "386" }}i386
|
||||
{{- else }}{{ .Arch }}{{ end }}
|
||||
{{- if .Arm }}v{{ .Arm }}{{ end }}
|
||||
format_overrides:
|
||||
- goos: windows
|
||||
format: zip
|
||||
files:
|
||||
- README.md
|
||||
- LICENSE
|
||||
- webui/**/*
|
||||
- cameras/**/*
|
||||
|
||||
checksum:
|
||||
name_template: 'checksums.txt'
|
||||
algorithm: sha256
|
||||
|
||||
changelog:
|
||||
sort: asc
|
||||
use: github
|
||||
filters:
|
||||
exclude:
|
||||
- '^docs:'
|
||||
- '^test:'
|
||||
- '^chore:'
|
||||
- typo
|
||||
groups:
|
||||
- title: '🚀 Features'
|
||||
regexp: '^.*?feat(\([[:word:]]+\))??!?:.+$'
|
||||
order: 0
|
||||
- title: '🐛 Bug Fixes'
|
||||
regexp: '^.*?fix(\([[:word:]]+\))??!?:.+$'
|
||||
order: 1
|
||||
- title: '📝 Documentation'
|
||||
regexp: '^.*?docs(\([[:word:]]+\))??!?:.+$'
|
||||
order: 2
|
||||
- title: '🔧 Other'
|
||||
order: 999
|
||||
|
||||
release:
|
||||
github:
|
||||
owner: eduard256
|
||||
name: Strix
|
||||
draft: false
|
||||
prerelease: auto
|
||||
name_template: "v{{.Version}}"
|
||||
header: |
|
||||
## 🦉 Strix v{{.Version}}
|
||||
|
||||
Smart IP Camera Stream Discovery System
|
||||
|
||||
### Installation
|
||||
|
||||
Download the appropriate binary for your platform below and extract it.
|
||||
|
||||
### Usage
|
||||
|
||||
```bash
|
||||
./strix
|
||||
```
|
||||
|
||||
Then open http://localhost:4567 in your browser.
|
||||
|
||||
footer: |
|
||||
**Full Changelog**: https://github.com/eduard256/Strix/compare/{{ .PreviousTag }}...{{ .Tag }}
|
||||
|
||||
snapshot:
|
||||
name_template: "{{ incpatch .Version }}-next"
|
||||
|
||||
dist: dist
|
||||
+3
-1
@@ -4,6 +4,8 @@
|
||||
# Stage 1: Builder
|
||||
FROM golang:1.24-alpine AS builder
|
||||
|
||||
ARG VERSION=dev
|
||||
|
||||
WORKDIR /build
|
||||
|
||||
# Install build dependencies
|
||||
@@ -18,7 +20,7 @@ COPY . .
|
||||
|
||||
# Build static binary
|
||||
RUN CGO_ENABLED=0 GOOS=linux GOARCH=${TARGETARCH} go build \
|
||||
-ldflags="-s -w -X main.Version=docker" \
|
||||
-ldflags="-s -w -X main.Version=${VERSION}" \
|
||||
-o strix \
|
||||
cmd/strix/main.go
|
||||
|
||||
|
||||
-281
@@ -1,281 +0,0 @@
|
||||
# Release Process Documentation
|
||||
|
||||
This document describes the complete release process for Strix and its Home Assistant add-on.
|
||||
|
||||
## Overview
|
||||
|
||||
Strix consists of two repositories:
|
||||
- **Strix** - Main application (Go binary, Docker image)
|
||||
- **hassio-strix** - Home Assistant add-on
|
||||
|
||||
Both repositories must be released together to maintain version consistency.
|
||||
|
||||
## Version Files
|
||||
|
||||
### Strix Repository
|
||||
|
||||
| File | Line | Purpose |
|
||||
|------|------|---------|
|
||||
| `cmd/strix/main.go` | 23 | Application version constant |
|
||||
| `webui/package.json` | 3 | Frontend version |
|
||||
| `CHANGELOG.md` | Top | Release notes |
|
||||
|
||||
### hassio-strix Repository
|
||||
|
||||
| File | Line | Purpose |
|
||||
|------|------|---------|
|
||||
| `strix/config.json` | 3 | Home Assistant add-on version |
|
||||
| `strix/CHANGELOG.md` | Top | Release notes |
|
||||
|
||||
## Release Workflow
|
||||
|
||||
### Prerequisites
|
||||
|
||||
1. Ensure you're on the `develop` branch with all changes committed
|
||||
2. All tests pass: `go test ./...`
|
||||
3. Application builds successfully: `go build ./...`
|
||||
|
||||
### Step 1: Update Strix Repository
|
||||
|
||||
```bash
|
||||
cd /home/user/Strix
|
||||
git checkout develop
|
||||
|
||||
# 1. Update version in code
|
||||
# Edit cmd/strix/main.go - line 23
|
||||
# Version = "1.0.X"
|
||||
|
||||
# 2. Update frontend version
|
||||
# Edit webui/package.json - line 3
|
||||
# "version": "1.0.X"
|
||||
|
||||
# 3. Update CHANGELOG.md
|
||||
# Add new section at the top:
|
||||
# ## [1.0.X] - YYYY-MM-DD
|
||||
# ### Fixed/Added/Changed
|
||||
# - Description of changes
|
||||
|
||||
# 4. Commit version bump
|
||||
git add cmd/strix/main.go webui/package.json CHANGELOG.md
|
||||
git commit -m "Release v1.0.X: Brief description"
|
||||
|
||||
# 5. Merge to main
|
||||
git checkout main
|
||||
git merge develop --no-ff -m "Merge develop into main for v1.0.X release"
|
||||
|
||||
# 6. Create tag
|
||||
git tag -a v1.0.X -m "Release v1.0.X: Brief description"
|
||||
|
||||
# 7. Push everything
|
||||
git push origin main --tags
|
||||
git push origin develop
|
||||
```
|
||||
|
||||
### Step 2: Update hassio-strix Repository
|
||||
|
||||
```bash
|
||||
cd /home/user/hassio-strix
|
||||
|
||||
# 1. Update add-on version
|
||||
# Edit strix/config.json - line 3
|
||||
# "version": "1.0.X"
|
||||
|
||||
# 2. Update CHANGELOG
|
||||
# Edit strix/CHANGELOG.md - add same section as in Strix
|
||||
|
||||
# 3. Commit and push
|
||||
git add strix/config.json strix/CHANGELOG.md
|
||||
git commit -m "Release v1.0.X: Brief description"
|
||||
git push origin main
|
||||
|
||||
# 4. Create tag
|
||||
git tag -a v1.0.X -m "Release v1.0.X: Brief description"
|
||||
git push origin --tags
|
||||
```
|
||||
|
||||
### Step 3: Verify GitHub Actions
|
||||
|
||||
After pushing tags, GitHub Actions will automatically:
|
||||
|
||||
**Strix (eduard256/Strix):**
|
||||
- ✅ `release.yml` - GoReleaser creates GitHub Release with binaries
|
||||
- ✅ `docker.yml` - Builds and pushes Docker images to Docker Hub
|
||||
- Tags: `1.0.X`, `1.0`, `1`, `latest`
|
||||
- Platforms: `linux/amd64`, `linux/arm64`
|
||||
|
||||
**hassio-strix (eduard256/hassio-strix):**
|
||||
- ✅ `builder.yml` - Builds and pushes HA add-on to GHCR
|
||||
- Image: `ghcr.io/eduard256/hassio-strix-{arch}`
|
||||
- Architectures: `amd64`, `aarch64`
|
||||
|
||||
Check status:
|
||||
```bash
|
||||
# Check Strix actions
|
||||
gh run list --repo eduard256/Strix --limit 5
|
||||
|
||||
# Check hassio-strix actions
|
||||
gh run list --repo eduard256/hassio-strix --limit 5
|
||||
```
|
||||
|
||||
### Step 4: Verify Release
|
||||
|
||||
1. **GitHub Release**: https://github.com/eduard256/Strix/releases/tag/v1.0.X
|
||||
- Should have binaries for all platforms
|
||||
|
||||
2. **Docker Hub**: https://hub.docker.com/r/eduard256/strix/tags
|
||||
- Should show new version tag
|
||||
|
||||
3. **GHCR**: https://github.com/eduard256/hassio-strix/pkgs/container/hassio-strix-amd64
|
||||
- Should show new version
|
||||
|
||||
4. **Home Assistant Add-on Store**:
|
||||
- Users will see update notification automatically
|
||||
|
||||
## Quick Release Script
|
||||
|
||||
For automated release, use this script:
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# release.sh - Automated release script
|
||||
|
||||
VERSION=$1
|
||||
|
||||
if [ -z "$VERSION" ]; then
|
||||
echo "Usage: ./release.sh 1.0.X"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "🚀 Releasing v$VERSION"
|
||||
|
||||
# Strix repo
|
||||
cd /home/user/Strix
|
||||
git checkout develop
|
||||
|
||||
# Update versions
|
||||
sed -i "s/Version = \".*\"/Version = \"$VERSION\"/" cmd/strix/main.go
|
||||
sed -i "s/\"version\": \".*\"/\"version\": \"$VERSION\"/" webui/package.json
|
||||
|
||||
# Update CHANGELOG (manual step reminder)
|
||||
echo "⚠️ Please update CHANGELOG.md manually"
|
||||
read -p "Press enter when done..."
|
||||
|
||||
# Commit and merge
|
||||
git add cmd/strix/main.go webui/package.json CHANGELOG.md
|
||||
git commit -m "Release v$VERSION"
|
||||
git checkout main
|
||||
git merge develop --no-ff -m "Merge develop into main for v$VERSION release"
|
||||
git tag -a "v$VERSION" -m "Release v$VERSION"
|
||||
git push origin main --tags
|
||||
git push origin develop
|
||||
|
||||
# hassio-strix repo
|
||||
cd /home/user/hassio-strix
|
||||
|
||||
# Update version
|
||||
sed -i "s/\"version\": \".*\"/\"version\": \"$VERSION\"/" strix/config.json
|
||||
|
||||
# Update CHANGELOG (manual step reminder)
|
||||
echo "⚠️ Please update strix/CHANGELOG.md manually"
|
||||
read -p "Press enter when done..."
|
||||
|
||||
# Commit and tag
|
||||
git add strix/config.json strix/CHANGELOG.md
|
||||
git commit -m "Release v$VERSION"
|
||||
git push origin main
|
||||
git tag -a "v$VERSION" -m "Release v$VERSION"
|
||||
git push origin --tags
|
||||
|
||||
echo "✅ Release v$VERSION complete!"
|
||||
echo "Check GitHub Actions:"
|
||||
echo " - https://github.com/eduard256/Strix/actions"
|
||||
echo " - https://github.com/eduard256/hassio-strix/actions"
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Docker Build Fails
|
||||
|
||||
**Symptom**: "Docker Hub Description" step shows `Forbidden` error
|
||||
|
||||
**Cause**: Docker Hub Personal Access Token expired or lacks permissions
|
||||
|
||||
**Solution**:
|
||||
1. Go to Docker Hub → Account Settings → Security → Personal Access Tokens
|
||||
2. Create new token with `Read, Write, Delete` scopes
|
||||
3. Update GitHub secret: https://github.com/eduard256/Strix/settings/secrets/actions
|
||||
4. Update `DOCKER_TOKEN` secret
|
||||
|
||||
**Note**: This only affects README updates on Docker Hub. Docker images still build successfully.
|
||||
|
||||
### Home Assistant Add-on Build Fails
|
||||
|
||||
**Symptom**: Builder workflow fails
|
||||
|
||||
**Solution**:
|
||||
1. Check `strix/Dockerfile` for correct Go version
|
||||
2. Verify `strix/build.yaml` has correct base images
|
||||
3. Check logs: `gh run view <run-id> --repo eduard256/hassio-strix --log`
|
||||
|
||||
### Version Mismatch
|
||||
|
||||
**Symptom**: Strix shows different version than add-on
|
||||
|
||||
**Solution**:
|
||||
1. Verify both `cmd/strix/main.go` and `strix/config.json` have same version
|
||||
2. Ensure both repositories have matching tags: `git tag -l`
|
||||
3. If needed, delete wrong tag: `git tag -d v1.0.X && git push origin :refs/tags/v1.0.X`
|
||||
|
||||
## Release Checklist
|
||||
|
||||
Before releasing:
|
||||
- [ ] All changes merged to `develop`
|
||||
- [ ] Tests pass: `go test ./...`
|
||||
- [ ] Build succeeds: `go build ./...`
|
||||
- [ ] CHANGELOG.md updated in both repos
|
||||
- [ ] Version numbers match in all files
|
||||
- [ ] Commit messages don't mention AI/Claude Code
|
||||
|
||||
After releasing:
|
||||
- [ ] GitHub Release created with binaries
|
||||
- [ ] Docker images pushed to Docker Hub
|
||||
- [ ] HA add-on images pushed to GHCR
|
||||
- [ ] Home Assistant users can see update
|
||||
|
||||
## Version Numbering
|
||||
|
||||
Strix follows [Semantic Versioning](https://semver.org/):
|
||||
|
||||
- **MAJOR.MINOR.PATCH** (e.g., 1.0.9)
|
||||
- **MAJOR**: Breaking changes
|
||||
- **MINOR**: New features (backward compatible)
|
||||
- **PATCH**: Bug fixes
|
||||
|
||||
## GitHub Actions Overview
|
||||
|
||||
### Strix Repository
|
||||
|
||||
**Triggers:**
|
||||
- `release.yml`: On push tag `v*`
|
||||
- `docker.yml`: On push tag `v*` or push to `main`
|
||||
- `ci.yml`: On push to any branch
|
||||
|
||||
**Secrets Required:**
|
||||
- `GITHUB_TOKEN` (automatic)
|
||||
- `DOCKER_USERNAME`
|
||||
- `DOCKER_TOKEN`
|
||||
|
||||
### hassio-strix Repository
|
||||
|
||||
**Triggers:**
|
||||
- `builder.yml`: On push tag `v*` or manual workflow dispatch
|
||||
|
||||
**Secrets Required:**
|
||||
- `GITHUB_TOKEN` (automatic)
|
||||
|
||||
## Notes
|
||||
|
||||
- Always release both repositories together
|
||||
- Keep version numbers synchronized
|
||||
- Test in Home Assistant Ingress mode before releasing
|
||||
- Docker/direct mode should work without changes (backward compatibility)
|
||||
+6
-6
@@ -18,12 +18,12 @@ import (
|
||||
"github.com/go-chi/chi/v5"
|
||||
)
|
||||
|
||||
const (
|
||||
// Version is the application version
|
||||
Version = "1.0.9"
|
||||
// Version is set at build time via ldflags:
|
||||
//
|
||||
// go build -ldflags="-X main.Version=1.0.10" ./cmd/strix
|
||||
var Version = "dev"
|
||||
|
||||
// Banner is the application banner
|
||||
Banner = `
|
||||
const Banner = `
|
||||
███████╗████████╗██████╗ ██╗██╗ ██╗
|
||||
██╔════╝╚══██╔══╝██╔══██╗██║╚██╗██╔╝
|
||||
███████╗ ██║ ██████╔╝██║ ╚███╔╝
|
||||
@@ -34,7 +34,6 @@ const (
|
||||
Smart IP Camera Stream Discovery System
|
||||
Version: %s
|
||||
`
|
||||
)
|
||||
|
||||
func main() {
|
||||
// Print banner
|
||||
@@ -43,6 +42,7 @@ func main() {
|
||||
|
||||
// Load configuration
|
||||
cfg := config.Load()
|
||||
cfg.Version = Version
|
||||
|
||||
// Setup logger
|
||||
slogger := cfg.SetupLogger()
|
||||
|
||||
@@ -139,7 +139,7 @@ func (s *Server) setupRoutes() {
|
||||
|
||||
// API routes (mounted at /api/v1 in main.go)
|
||||
// Health check
|
||||
s.router.Get("/health", handlers.NewHealthHandler("1.0.0", s.logger).ServeHTTP)
|
||||
s.router.Get("/health", handlers.NewHealthHandler(s.config.Version, s.logger).ServeHTTP)
|
||||
|
||||
// Camera search
|
||||
s.router.Post("/cameras/search", handlers.NewSearchHandler(s.searchEngine, s.logger).ServeHTTP)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"os"
|
||||
@@ -14,6 +15,7 @@ import (
|
||||
|
||||
// Config holds application configuration
|
||||
type Config struct {
|
||||
Version string // Application version, set by caller after Load()
|
||||
Server ServerConfig
|
||||
Database DatabaseConfig
|
||||
Scanner ScannerConfig
|
||||
@@ -104,8 +106,14 @@ func Load() *Config {
|
||||
},
|
||||
}
|
||||
|
||||
// Load from strix.yaml if exists
|
||||
// Load from Home Assistant options.json if running as HA add-on
|
||||
// Priority: defaults < HA options < strix.yaml < ENV
|
||||
configSource := "default"
|
||||
if err := loadHAOptions(cfg); err == nil {
|
||||
configSource = "/data/options.json (Home Assistant)"
|
||||
}
|
||||
|
||||
// Load from strix.yaml if exists (overrides HA options)
|
||||
if err := loadYAML(cfg); err == nil {
|
||||
configSource = "strix.yaml"
|
||||
}
|
||||
@@ -150,6 +158,42 @@ func loadYAML(cfg *Config) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// haOptions represents the structure of Home Assistant /data/options.json.
|
||||
// When Strix runs as a Home Assistant add-on, HA creates this file from the
|
||||
// add-on configuration UI. Fields are optional -- zero values are ignored.
|
||||
type haOptions struct {
|
||||
LogLevel string `json:"log_level"`
|
||||
Port int `json:"port"`
|
||||
}
|
||||
|
||||
// loadHAOptions loads configuration from Home Assistant's /data/options.json.
|
||||
// This file only exists when running inside the HA add-on environment.
|
||||
// Returns an error if the file doesn't exist or can't be parsed (callers
|
||||
// should treat errors as "not running in HA" and silently continue).
|
||||
func loadHAOptions(cfg *Config) error {
|
||||
data, err := os.ReadFile("/data/options.json")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var opts haOptions
|
||||
if err := json.Unmarshal(data, &opts); err != nil {
|
||||
return fmt.Errorf("failed to parse /data/options.json: %w", err)
|
||||
}
|
||||
|
||||
if opts.LogLevel != "" {
|
||||
cfg.Logger.Level = opts.LogLevel
|
||||
}
|
||||
if opts.Port > 0 {
|
||||
cfg.Server.Listen = fmt.Sprintf(":%d", opts.Port)
|
||||
}
|
||||
|
||||
// Home Assistant add-on always uses JSON logging for the HA log viewer
|
||||
cfg.Logger.Format = "json"
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// validateListen validates the listen address format and port range
|
||||
func validateListen(listen string) error {
|
||||
if listen == "" {
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "webui",
|
||||
"version": "1.0.9",
|
||||
"version": "0.0.0",
|
||||
"type": "module",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
|
||||
@@ -87,6 +87,12 @@ class StrixApp {
|
||||
|
||||
// Screen 2: Configuration form
|
||||
document.getElementById('btn-back-to-address').addEventListener('click', () => {
|
||||
// Clear probe-filled fields so stale data doesn't persist
|
||||
document.getElementById('camera-model').value = '';
|
||||
document.getElementById('camera-model').disabled = false;
|
||||
document.getElementById('camera-model').placeholder = 'Start typing...';
|
||||
document.getElementById('model-disabled-hint').classList.add('hidden');
|
||||
this.probeResult = null;
|
||||
this.showScreen('address');
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user