diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..df91dfe --- /dev/null +++ b/.env.example @@ -0,0 +1,17 @@ +# Gitea Actions Runner Configuration + +# Gitea instance URL (external, accessible from runner host) +GITEA_INSTANCE_URL=https://gitea.gynther.se + +# Runner registration token +# Hämta från: https://gitea.gynther.se/repo/settings/actions/runners +# Klicka "Create New Runner" eller "Create Instance-level Runner" +# Kopiera tokenen och sätt här +GITEA_RUNNER_REGISTRATION_TOKEN= + +# Runner name (optional, defaults to hostname if empty) +GITEA_RUNNER_NAME=recipe-app + +# Runner labels (optional, defaults to ubuntu-latest if empty) +# Format: label:docker://image,label:docker://image +GITEA_RUNNER_LABELS=backend-node24:docker://node:24-bullseye,flutter-3-41:docker://ghcr.io/cirruslabs/flutter:stable diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..216bf2e --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +# Environment and secrets +.env +.env.local + +# Runner data and state +/data +.runner + +# Docker and system +.DS_Store +*.log + +# IDE +.vscode/ +.idea/ +*.swp +*.swo diff --git a/README.md b/README.md index e69de29..2b44539 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,147 @@ +# Gitea Actions Runner for Recipe App + +Dedikerad runner för att köra Gitea Actions workflows för Recipe App CI/CD pipeline. + +## Förutsättningar + +- Docker och Docker Compose installerat +- Åtkomst till Gitea-instansen (`https://gitea.gynther.se`) +- En registrerings-token från Gitea + +## Snabbstart + +### 1. Kopiera miljövariabler + +```bash +cp .env.example .env +``` + +### 2. Hämta registrerings-token från Gitea + +Gå till en av dessa URL:er beroende på var du vill registrera runnern: + +**Instance-level runner (kör jobb för alla repos):** +``` +https://gitea.gynther.se/-/admin/actions/runners +``` + +**Organization-level runner (kör jobb för org):** +``` +https://gitea.gynther.se/din-org/settings/actions/runners +``` + +**Repository-level runner (kör jobb bara för repo):** +``` +https://gitea.gynther.se/owner/recipe-app/settings/actions/runners +``` + +Klicka "Create Runner" eller "Create New Runner", kopiera **registrerings-tokenen**. + +### 3. Konfigurера `.env` + +```bash +nano .env +``` + +Sätt dessa värden: + +```env +GITEA_INSTANCE_URL=https://gitea.gynther.se +GITEA_RUNNER_REGISTRATION_TOKEN= +GITEA_RUNNER_NAME=recipe-app +GITEA_RUNNER_LABELS=backend-node24:docker://node:24-bullseye,flutter-3-41:docker://ghcr.io/cirruslabs/flutter:stable +``` + +### 4. Starta runnern + +```bash +docker compose up -d +``` + +### 5. Verifiera att den är online + +```bash +docker compose logs -f +``` + +Du bör se output som: +``` +level=info msg="Runner registered successfully." +level=info msg="Listening on..." +``` + +Gå sedan till Gitea-instansen och verifiera att runnern visas som **online** under Actions → Runners. + +## Daglig drift + +```bash +# Se status och loggar +docker compose logs -f + +# Starta om runnern +docker compose restart + +# Stoppa runnern +docker compose down + +# Rensa runner-data (varning: raderar allt data) +docker compose down -v +``` + +## Labels och Job-matchning + +Workflown i `recipe-app` definieras i [recipe-app/.gitea/workflows/test.yml](../recipe-app/.gitea/workflows/test.yml). + +Aktuella labels: +- **`backend-node24`**: Node.js 24 i Bullseye — för backend-jobb (build, test, linting) +- **`flutter-3-41`**: Flutter 3.41 — för Flutter-jobb (analyze, test) + +Om en workflow kör med `runs-on: backend-node24` eller `runs-on: flutter-3-41`, kommer denna runner att köra jobbet i motsvarande Docker-image. + +## Troubleshooting + +### Runner visas som offline + +**Kontrollera loggarna:** +```bash +docker compose logs +``` + +Vanliga felorsaker: +- Token är fel eller utgånget → skapa ny token i Gitea +- URL är felaktig → verifiera att `https://gitea.gynther.se` är nåbar från runner-hosten +- Docker-socketen är inte tillgänglig → verifiera att `runner` är medlem av `docker`-gruppen eller att socketen är monterad + +### Jobb slutförs inte + +**Verifiera labels:** +Säkra att workflow använder en av de definierade labels. Om `runs-on` matchar ingen label, kommer jobbet att sitta i kö. + +**Verifiera Docker-image:** +```bash +docker pull node:24-bullseye +docker pull ghcr.io/cirruslabs/flutter:stable +``` + +### Token är exponerad + +Skapa omedelbar en ny token i Gitea och uppdatera `.env`: +```bash +# Skapa ny token i Gitea UI +nano .env +# Uppdatera GITEA_RUNNER_REGISTRATION_TOKEN + +docker compose restart +``` + +## Säkerhet + +- **Secrets:** `.env`-filen innehåller sensitiv data. Lägg den ALDRIG i Git. +- **Docker socket:** Montering av `/var/run/docker.sock` ger effektivt root-access. Använd enbart på betrodda hostar. +- **Runner data:** Allt runner-tillstånd lagras under `./data`. Säkerhetskopiera denna mapp regelbundet. + +## Referenser + +- [Gitea Actions Documentation](https://docs.gitea.com/usage/actions/overview) +- [Act Runner Setup Guide](https://docs.gitea.com/usage/actions/act-runner) +- [Recipe App CI Workflow](.../recipe-app/.gitea/workflows/test.yml) diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..e0671ca --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,14 @@ +services: + gitea-runner: + image: gitea/act_runner:latest + container_name: gitea-runner + restart: unless-stopped + environment: + GITEA_INSTANCE_URL: ${GITEA_INSTANCE_URL} + GITEA_RUNNER_REGISTRATION_TOKEN: ${GITEA_RUNNER_REGISTRATION_TOKEN} + GITEA_RUNNER_NAME: ${GITEA_RUNNER_NAME:-recipe-app} + GITEA_RUNNER_LABELS: ${GITEA_RUNNER_LABELS:-backend-node24:docker://node:24-bullseye,flutter-3-41:docker://ghcr.io/cirruslabs/flutter:stable} + volumes: + - ./data:/data + - /var/run/docker.sock:/var/run/docker.sock + restart: always