Replace all Gogs/Woodpecker references with Gitea/Gitea Actions: README.md: - CI badge → Gitea Actions workflow badge - CI/CD section: Woodpecker → Gitea Actions (amd64 + arm64 runners) - Project structure: .woodpecker/ → .gitea/workflows/ - Releases: arm64 now native (not QEMU) - Phase 11/12 status updated docs/wiki/Home.md: - CI badge, tech stack, phase status updated docs/wiki/Troubleshooting.md: - Remove Woodpecker-specific items (JWT webhooks, orphan containers, plugin-git switch failure, Gogs token quirks) - Add Gitea Actions troubleshooting: container network, apt-get update, job skip on tags, RELEASE_TOKEN, act_runner CONFIG_FILE requirement Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
5.7 KiB
Troubleshooting
CI/CD — Gitea Actions
Build Not Triggering After Push
Check:
- Verify the workflow file exists in
.gitea/workflows/on the pushed branch - Check the Actions tab at
http://172.0.0.29:3000/sarman/tftsr-devops_investigation/actions - Confirm the act_runner is online:
docker logs gitea_act_runner_amd64 --since 5m
Job Container Can't Reach Gitea (172.0.0.29:3000 blocked)
Cause: act_runner creates an isolated Docker network per job (when container: is specified). Traffic from the job container to 172.0.0.29:3000 is blocked by the host firewall.
Fix: Ensure container.network: host is set in the act_runner config AND that CONFIG_FILE=/data/config.yaml is in the container's environment:
# /docker_mounts/gitea/runner/amd64/config.yaml
container:
network: "host"
# docker-compose.yml for act-runner-amd64
environment:
- CONFIG_FILE=/data/config.yaml
Also set capacity: 1 — with capacity > 1, concurrent jobs may not get host networking:
runner:
capacity: 1
Restart runner: docker restart gitea_act_runner_amd64
Unable to locate package git in Rust Job
Cause: rust:1.88-slim has an empty apt package cache.
Fix: Always run apt-get update before apt-get install:
- name: Checkout
run: |
apt-get update -qq && apt-get install -y -qq git
git init
git remote add origin http://172.0.0.29:3000/sarman/tftsr-devops_investigation.git
git fetch --depth=1 origin $GITHUB_SHA
git checkout FETCH_HEAD
exec: "node": executable file not found in $PATH
Cause: actions/checkout@v4 is a Node.js action. rust:1.88-slim and similar slim images don't have Node.
Fix: Don't use actions/checkout@v4 — use direct git commands instead (see above).
Job Skipped (status 6) on Tag Push
Cause: Pattern matching issue with on: push: tags:. Use unquoted glob in the workflow:
# Correct
on:
push:
tags:
- v*
Also add workflow_dispatch for manual triggering during testing:
on:
push:
tags:
- v*
workflow_dispatch:
inputs:
tag:
description: 'Release tag'
required: true
CI=woodpecker Rejected by cargo tauri build
Cause: CI runners set CI=woodpecker (string). Tauri CLI expects true/false.
Fix: Prefix the build command:
- run: CI=true cargo tauri build --target $TARGET
Release Artifacts Not Uploaded
Cause 1: RELEASE_TOKEN secret not set or expired.
# Recreate via admin CLI:
docker exec -u git gitea_app gitea admin user generate-access-token \
--username sarman --token-name gitea-ci-token --raw \
--scopes 'write:repository,read:user'
# Add the token as RELEASE_TOKEN in repo Settings > Actions > Secrets
Cause 2: Each build job uploads its own artifacts independently. All jobs require host network on the runner (see above).
Rust Compilation
MutexGuard Not Send Across Await
error[E0277]: `MutexGuard<'_, Connection>` cannot be sent between threads safely
Fix: Release the mutex lock before any .await point:
let result = {
let db = state.db.lock().map_err(|e| e.to_string())?;
db.query_row(...)?
}; // lock dropped here
async_fn().await?;
Clippy Lints Fail in CI
Common lint fixes required by -D warnings (Rust 1.88+):
format!("{}", x) → format!("{x}")
x >= a && x < b → (a..b).contains(&x)
s.push_str("a") → s.push('a')
Run locally: cargo clippy --manifest-path src-tauri/Cargo.toml -- -D warnings
Auto-fix: cargo clippy --manifest-path src-tauri/Cargo.toml --fix --allow-dirty -- -D warnings
cargo tauri dev Fails — Missing System Libraries
Fix (Fedora/RHEL):
sudo dnf install -y glib2-devel gtk3-devel webkit2gtk4.1-devel \
libsoup3-devel openssl-devel librsvg2-devel
Fix (Debian/Ubuntu):
sudo apt-get install -y libwebkit2gtk-4.1-dev libssl-dev libgtk-3-dev \
libayatana-appindicator3-dev librsvg2-dev patchelf pkg-config
Database
DB Won't Open in Production
Symptom: App fails to start with SQLCipher error.
TFTSR_DB_KEYenv var is set- Key matches what was used when DB was created
- File isn't corrupted:
file tftsr.dbshould saySQLite 3.x database
Migration Fails to Run
Check which migrations have been applied:
SELECT name, applied_at FROM _migrations ORDER BY id;
Frontend
TypeScript Errors After Pulling
npx tsc --noEmit
Ensure tauriCommands.ts matches Rust command signatures exactly (especially IssueDetail nesting).
IssueDetail Field Access Errors
get_issue() returns a nested struct:
// Correct
const title = detail.issue.title;
// Wrong — field doesn't exist at top level
const title = detail.title;
Vitest Tests Fail
Common causes:
- Mocked
invoke()return type doesn't match updated command signature sessionStorestate not reset between tests (callstore.reset()inbeforeEach)
Gitea
API Token Authentication
curl -H "Authorization: token <token_value>" http://172.0.0.29:3000/api/v1/user
Create tokens in Gitea Settings > Applications > Access Tokens, or via admin CLI:
docker exec -u git gitea_app gitea admin user generate-access-token \
--username sarman --token-name mytoken --raw --scopes 'read:user,write:repository'
PostgreSQL Access
docker exec gogs_postgres_db psql -U gogs -d gogsdb -c "SELECT id, lower_name, is_private FROM repository;"
Database is named gogsdb. The PostgreSQL instance uses SCRAM-SHA-256 auth (MD5 also configured for the gogs user for compatibility with older clients).