From 65242ac3c78e2a142ad58e46ae7b3f9b805263f2 Mon Sep 17 00:00:00 2001 From: m Date: Sat, 19 Sep 2026 10:42:57 +0200 Subject: [PATCH] modify ci to gitea --- .gitea/workflows/ci.yml | 171 ++++++++++++++++++++++++++++++ .gitea/workflows/release.yml | 129 +++++++++++++++++++++++ .gitlab-ci.yml | 196 ----------------------------------- backend/Dockerfile | 2 +- 4 files changed, 301 insertions(+), 197 deletions(-) create mode 100644 .gitea/workflows/ci.yml create mode 100644 .gitea/workflows/release.yml delete mode 100644 .gitlab-ci.yml diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml new file mode 100644 index 0000000..c2ed801 --- /dev/null +++ b/.gitea/workflows/ci.yml @@ -0,0 +1,171 @@ +# Pipeline Gitea Actions pour Kazier — lint + test + build + image registre. +# +# Prérequis act_runner (une seule fois) : +# - Runner act_runner enregistré contre l'instance Gitea, labels `linux` dispo. +# - Executor docker : privilégié (jobs docker:dind + containers) — sinon le +# job `docker` et le service `dind` échouent. +# - Gitea app.ini : [actions] ENABLED=true, DEFAULT_ACTIONS_URL=https://github.com +# - Droits d'écriture du runner sur son répertoire de travail/cache. +# +# Secrets (Settings > Actions) : +# - CONTAINER_REGISTRY_TOKEN PAT scope write:packages (registre conteneur) +# - CONTAINER_REGISTRY_USER utilisateur propriétaire du PAT ci-dessus + +name: CI + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +on: + push: + branches: [main] + tags: ["v*"] + pull_request: + +env: + GO_VERSION: "1.26" + ANDROID_IMAGE: cimg/android:2024.01 + CGO_ENABLED: "0" + # Registre conteneur Gitea (ex: cname de l'instance) + REGISTRY_HOST: gitea.thirdshop.fr + +jobs: + lint-backend: + runs-on: linux + container: golang:${{ env.GO_VERSION }}-alpine + steps: + - uses: actions/checkout@v4 + + - uses: actions/cache@v4 + with: + path: | + /go/pkg/mod + ~/.cache/go-build + key: go-${{ runner.os }}-${{ hashFiles('backend/go.sum') }} + restore-keys: | + go-${{ runner.os }}- + + - run: go mod download + working-directory: backend + - run: go vet ./... + working-directory: backend + - run: go install honnef.co/go/tools/cmd/staticcheck@latest && staticcheck ./... + working-directory: backend + + lint-mobile: + runs-on: linux + container: ${{ env.ANDROID_IMAGE }} + steps: + - uses: actions/checkout@v4 + - uses: actions/cache@v4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: gradle-${{ runner.os }}-${{ hashFiles('mobile-kotlin/gradle/libs.versions.toml') }} + restore-keys: | + gradle-${{ runner.os }}- + - run: ./gradlew :app:lint -q + working-directory: mobile-kotlin + + test-backend: + runs-on: linux + container: golang:${{ env.GO_VERSION }}-alpine + services: + postgres: + image: postgres:17-alpine + env: + POSTGRES_DB: kazier_test + POSTGRES_USER: kazier + POSTGRES_PASSWORD: kazier + steps: + - uses: actions/checkout@v4 + - uses: actions/cache@v4 + with: + path: | + /go/pkg/mod + ~/.cache/go-build + key: go-${{ runner.os }}-${{ hashFiles('backend/go.sum') }} + restore-keys: | + go-${{ runner.os }}- + - run: go test ./... + working-directory: backend + env: + TEST_DATABASE_URL: postgres://kazier:kazier@postgres:5432/kazier_test?sslmode=disable + + test-mobile: + runs-on: linux + container: ${{ env.ANDROID_IMAGE }} + steps: + - uses: actions/checkout@v4 + - uses: actions/cache@v4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: gradle-${{ runner.os }}-${{ hashFiles('mobile-kotlin/gradle/libs.versions.toml') }} + restore-keys: | + gradle-${{ runner.os }}- + - run: ./gradlew :app:testDebugUnitTest -q + working-directory: mobile-kotlin + + build-backend: + runs-on: linux + container: golang:${{ env.GO_VERSION }}-alpine + needs: [lint-backend, test-backend] + steps: + - uses: actions/checkout@v4 + - run: | + export VERSION="$(cat VERSION)" + CGO_ENABLED=0 GOOS=linux go build \ + -trimpath \ + -ldflags "-s -w -X main.version=${VERSION}" \ + -o bin/kazier-server \ + cmd/server/main.go + ./bin/kazier-server --version + working-directory: backend + - uses: actions/upload-artifact@v4 + with: + name: kazier-server + path: backend/bin/kazier-server + if-no-files-found: error + + docker: + runs-on: linux + needs: [build-backend] + # Push branches uniquement : pas sur PR (pas de build d'image à la review), + # pas sur tag (c'est release.yml qui construit, évite une course dans le + # registre entre le job `docker` et `release-docker`). + if: github.event_name == 'push' && github.ref_type == 'branch' + container: + image: docker:27 + env: + DOCKER_HOST: tcp://docker:2375 + DOCKER_TLS_CERTDIR: "" + services: + docker: + image: docker:27-dind + steps: + - uses: actions/checkout@v4 + + - name: Login registre Gitea + env: + CONTAINER_REGISTRY_TOKEN: ${{ secrets.CONTAINER_REGISTRY_TOKEN }} + CONTAINER_REGISTRY_USER: ${{ secrets.CONTAINER_REGISTRY_USER }} + run: | + : "${CONTAINER_REGISTRY_TOKEN:?CONTAINER_REGISTRY_TOKEN manquant (PAT scope write:packages)}" + : "${CONTAINER_REGISTRY_USER:?CONTAINER_REGISTRY_USER manquant (propriétaire du PAT)}" + echo "$CONTAINER_REGISTRY_TOKEN" | docker login "$REGISTRY_HOST" -u "$CONTAINER_REGISTRY_USER" --password-stdin + echo "REGISTRY_IMAGE=${REGISTRY_HOST}/${{ github.repository_owner }}/kasier" >> "$GITHUB_ENV" + echo "IMAGE_TAG=${GITHUB_REF_NAME}" >> "$GITHUB_ENV" + + - name: Build + push (registre Gitea) + run: | + docker build \ + --build-arg VERSION="$(cat VERSION)" \ + --build-arg BUILD_DATE="$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ + -t "$REGISTRY_IMAGE:$IMAGE_TAG" \ + ./backend + docker push "$REGISTRY_IMAGE:$IMAGE_TAG" + docker run --rm "$REGISTRY_IMAGE:$IMAGE_TAG" --version \ No newline at end of file diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml new file mode 100644 index 0000000..70a023a --- /dev/null +++ b/.gitea/workflows/release.yml @@ -0,0 +1,129 @@ +# Pipeline Gitea Actions pour Kazier — Release (tags vX.Y.Z uniquement). +# +# Construit l'APK signé (assembleRelease), crée la Release Gitea avec l'APK en +# asset (API, équivalent de `glab release create`), puis pousse l'image +# kazier-server sur le registre conteneur Gitea + Docker Hub (tag + latest). +# +# Secrets (Settings > Actions) : +# - RELEASE_KEYSTORE_B64 base64 du keystore release Android (jamais en clair) +# - SIGNING_STORE_PASSWORD SIGNING_KEY_ALIAS SIGNING_KEY_PASSWORD +# - RELEASE_API_TOKEN PAT scope write:repository (API : création Release) +# - CONTAINER_REGISTRY_TOKEN PAT scope write:packages (registre conteneur Gitea) +# - CONTAINER_REGISTRY_USER utilisateur propriétaire du PAT ci-dessus +# - DOCKERHUB_USER DOCKERHUB_TOKEN PAT Docker Hub (push public) + +name: Release + +on: + push: + tags: ["v*"] + +env: + ANDROID_IMAGE: cimg/android:2024.01 + DOCKERHUB_IMAGE: docker.io/thirdshop/kasier + # API Gitea (host de l'instance) + API_HOST: gitea.thirdshop.fr + +jobs: + release-apk: + runs-on: linux + container: ${{ env.ANDROID_IMAGE }} + steps: + - uses: actions/checkout@v4 + - uses: actions/cache@v4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: gradle-${{ runner.os }}-${{ hashFiles('mobile-kotlin/gradle/libs.versions.toml') }} + restore-keys: | + gradle-${{ runner.os }}- + + - name: Signer + assembler l'APK release + working-directory: mobile-kotlin + env: + RELEASE_KEYSTORE_B64: ${{ secrets.RELEASE_KEYSTORE_B64 }} + SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_STORE_PASSWORD }} + SIGNING_KEY_ALIAS: ${{ secrets.SIGNING_KEY_ALIAS }} + SIGNING_KEY_PASSWORD: ${{ secrets.SIGNING_KEY_PASSWORD }} + run: | + if [ -z "${RELEASE_KEYSTORE_B64:-}" ]; then + echo "RELEASE_KEYSTORE_B64 manquant — release non signée." >&2 + exit 1 + fi + echo "$RELEASE_KEYSTORE_B64" | base64 -d > app/release.keystore + cat > app/signing.properties </dev/null)" || NOTES="" + RELEASE_JSON="$(curl -sSf -X POST "${API}/repos/${GITHUB_REPOSITORY}/releases" \ + -H "${AUTH}" \ + -H "Content-Type: application/json" \ + -d "{\"tag_name\":\"v${VERSION}\",\"name\":\"Kazier v${VERSION}\",\"body\":${NOTES}}")" + RELEASE_ID="$(printf '%s' "${RELEASE_JSON}" | grep -o '"id":[0-9]*' | head -1 | cut -d: -f2)" + curl -sSf -X POST \ + "${API}/repos/${GITHUB_REPOSITORY}/releases/${RELEASE_ID}/assets?name=app-release.apk" \ + -H "${AUTH}" \ + -F "attachment=@mobile-kotlin/app/build/outputs/apk/release/app-release.apk" + + release-docker: + runs-on: linux + container: + image: docker:27 + env: + DOCKER_HOST: tcp://docker:2375 + DOCKER_TLS_CERTDIR: "" + services: + docker: + image: docker:27-dind + steps: + - uses: actions/checkout@v4 + + - name: Login registre Gitea + env: + CONTAINER_REGISTRY_TOKEN: ${{ secrets.CONTAINER_REGISTRY_TOKEN }} + CONTAINER_REGISTRY_USER: ${{ secrets.CONTAINER_REGISTRY_USER }} + run: | + : "${CONTAINER_REGISTRY_TOKEN:?CONTAINER_REGISTRY_TOKEN manquant (PAT scope write:packages)}" + : "${CONTAINER_REGISTRY_USER:?CONTAINER_REGISTRY_USER manquant (propriétaire du PAT)}" + echo "$CONTAINER_REGISTRY_TOKEN" | docker login "$API_HOST" -u "$CONTAINER_REGISTRY_USER" --password-stdin + echo "REGISTRY_IMAGE=${API_HOST}/${{ github.repository_owner }}/kasier" >> "$GITHUB_ENV" + + - name: "Build + push (registre Gitea : vX.Y.Z)" + run: | + VERSION="$(cat VERSION)" + docker build \ + --build-arg VERSION="${VERSION}" \ + --build-arg BUILD_DATE="$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ + -t "$REGISTRY_IMAGE:v${VERSION}" \ + ./backend + docker push "$REGISTRY_IMAGE:v${VERSION}" + docker run --rm "$REGISTRY_IMAGE:v${VERSION}" --version + echo "TAG=v${VERSION}" >> "$GITHUB_ENV" + + - name: Push Docker Hub (tag + latest) + env: + DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }} + DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} + run: | + : "${DOCKERHUB_USER:?DOCKERHUB_USER manquant}" + : "${DOCKERHUB_TOKEN:?DOCKERHUB_TOKEN manquant}" + IMAGE="$DOCKERHUB_IMAGE" + echo "$DOCKERHUB_TOKEN" | docker login -u "$DOCKERHUB_USER" --password-stdin docker.io + docker tag "$REGISTRY_IMAGE:$TAG" "$IMAGE:$TAG" + docker tag "$REGISTRY_IMAGE:$TAG" "$IMAGE:latest" + docker push "$IMAGE:$TAG" + docker push "$IMAGE:latest" \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 7df6305..0000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,196 +0,0 @@ -# Pipeline GitLab pour Kazier — CI + Release. -# -# Prérequis runner : -# - Un runner avec executor Docker pour les jobs d'images (postgres service, -# docker:dind). Les jobs Android utilisent $ANDROID_IMAGE (défaut -# cimg/android) ; remplacez par l'image installée sur vos workers. -# -# Variables CI/CD à définir (Settings > CI/CD > Variables) : -# - RELEASE_KEYSTORE_B64 base64 du keystore release Android (jamais en clair) -# - SIGNING_STORE_PASSWORD SIGNING_KEY_ALIAS SIGNING_KEY_PASSWORD -# - GITLAB_API_TOKEN token (scope api, write_repository) pour créer la GitLab Release -# - DOCKERHUB_USER DOCKERHUB_TOKEN PAT Docker Hub (push public) -# -# Publication : à chaque tag vX.Y.Z → GitLab Release (APK attaché, latest + -# historique) + image $CI_REGISTRY + image Docker Hub (docker.io/thirdshop/kasier). - -stages: - - lint - - test - - build - - docker - - release - -variables: - GO_IMAGE: "golang:1.26-alpine" - POSTGRES_IMAGE: "postgres:17-alpine" - ANDROID_IMAGE: "cimg/android:2024.01" - GRADLE_USER_HOME: "$CI_PROJECT_DIR/.gradle-home" - CGO_ENABLED: "0" - DOCKERHUB_IMAGE: "docker.io/thirdshop/kasier" - GLAB_VERSION: "1.118.0" - -default: - interruptible: true - retry: - max: 1 - -# ---------------------------------------------------------------- lint ---- -lint-backend: - stage: lint - image: $GO_IMAGE - script: - - go mod download - - go vet ./... - - go install honnef.co/go/tools/cmd/staticcheck@latest && staticcheck ./... - -lint-mobile: - stage: lint - image: $ANDROID_IMAGE - cache: - key: gradle-cache - paths: - - .gradle-home/caches - - .gradle-home/wrapper - script: - - cd mobile-kotlin && ./gradlew :app:lint -q - -# ---------------------------------------------------------------- test ---- -test-backend: - stage: test - image: $GO_IMAGE - services: - - name: $POSTGRES_IMAGE - alias: postgres - variables: - POSTGRES_DB: kazier_test - POSTGRES_USER: kazier - POSTGRES_PASSWORD: kazier - TEST_DATABASE_URL: postgres://kazier:kazier@postgres:5432/kazier_test?sslmode=disable - script: - - mkdir -p .go-cache && export GOPATH="$CI_PROJECT_DIR/.go-cache" - - go mod download - - go test ./... - cache: - key: go-cache - paths: - - .go-cache - -test-mobile: - stage: test - image: $ANDROID_IMAGE - cache: - key: gradle-cache - paths: - - .gradle-home/caches - - .gradle-home/wrapper - script: - - cd mobile-kotlin && ./gradlew :app:testDebugUnitTest -q - -# ---------------------------------------------------------------- build ---- -build-backend: - stage: build - image: $GO_IMAGE - script: - - export VERSION=$(cat VERSION) - - mkdir -p backend/bin - - cd backend && CGO_ENABLED=0 GOOS=linux go build -trimpath -ldflags "-s -w -X main.version=$VERSION" -o bin/kazier-server cmd/server/main.go - - ./bin/kazier-server --version - artifacts: - paths: - - backend/bin/kazier-server - expire_in: 1 week - -# --------------------------------------------------------------- docker ---- -docker: - stage: docker - image: docker:27 - services: - - name: docker:27-dind - alias: docker - variables: - DOCKER_HOST: tcp://docker:2375 - DOCKER_TLS_CERTDIR: "" - IMAGE_TAG: "$CI_COMMIT_TAG" - script: - - export IMAGE_TAG="${IMAGE_TAG:-$CI_COMMIT_REF_SLUG}" - - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY" - - docker build - --build-arg VERSION="$(cat VERSION)" - --build-arg BUILD_DATE="$(date -u +%Y-%m-%dT%H:%M:%SZ)" - -t "$CI_REGISTRY_IMAGE:$IMAGE_TAG" - ./backend - - docker push "$CI_REGISTRY_IMAGE:$IMAGE_TAG" - - docker run --rm "$CI_REGISTRY_IMAGE:$IMAGE_TAG" --version - needs: ["build-backend"] - rules: - - if: $CI_COMMIT_TAG - - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - -# -------------------------------------------------------------- release ---- -release-apk: - stage: release - image: $ANDROID_IMAGE - cache: - key: gradle-cache - paths: - - .gradle-home/caches - - .gradle-home/wrapper - script: - - export VERSION=$(cat VERSION) - - cd mobile-kotlin - - | - if [ -n "${RELEASE_KEYSTORE_B64:-}" ]; then - echo "$RELEASE_KEYSTORE_B64" | base64 -d > app/release.keystore - cat > app/signing.properties <&2 - exit 1 - fi - - ./gradlew :app:assembleRelease -q - - cd "$CI_PROJECT_DIR" - - | - # glab : création de la GitLab Release + upload de l'APK en asset. - curl -sSLf \ - "https://gitlab.com/gitlab-org/cli/-/releases/v${GLAB_VERSION}/downloads/glab_${GLAB_VERSION}_linux_amd64.tar.gz" \ - | tar xz --strip-components=1 -C /usr/local/bin bin/glab - - glab --version - - export GITLAB_TOKEN="$GITLAB_API_TOKEN" - - glab release create "v$VERSION" - --name "Kazier v$VERSION" - --notes-file CHANGELOG.md - "mobile-kotlin/app/build/outputs/apk/release/app-release.apk" - needs: ["docker"] - rules: - - if: $CI_COMMIT_TAG - -release-docker: - stage: release - image: docker:27 - services: - - name: docker:27-dind - alias: docker - variables: - DOCKER_HOST: tcp://docker:2375 - DOCKER_TLS_CERTDIR: "" - script: - - export VERSION=$(cat VERSION) - - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY" - - docker pull "$CI_REGISTRY_IMAGE:$CI_COMMIT_TAG" - - | - : "${DOCKERHUB_USER:?DOCKERHUB_USER manquant}" - : "${DOCKERHUB_TOKEN:?DOCKERHUB_TOKEN manquant}" - echo "$DOCKERHUB_TOKEN" | docker login -u "$DOCKERHUB_USER" --password-stdin docker.io - IMAGE="$DOCKERHUB_IMAGE" - docker tag "$CI_REGISTRY_IMAGE:$CI_COMMIT_TAG" "$IMAGE:$CI_COMMIT_TAG" - docker tag "$CI_REGISTRY_IMAGE:$CI_COMMIT_TAG" "$IMAGE:latest" - docker push "$IMAGE:$CI_COMMIT_TAG" - docker push "$IMAGE:latest" - needs: ["docker"] - rules: - - if: $CI_COMMIT_TAG \ No newline at end of file diff --git a/backend/Dockerfile b/backend/Dockerfile index 2a6fc9b..607685c 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -34,7 +34,7 @@ LABEL org.opencontainers.image.title="kazier-server" \ org.opencontainers.image.description="Kazier backend API (Go/Gin + PostgreSQL) — local-first document vault" \ org.opencontainers.image.version="${VERSION}" \ org.opencontainers.image.licenses="AGPL-3.0-only" \ - org.opencontainers.image.source="https://gitlab.thirdshop.fr/thirdshop/kasier" \ + org.opencontainers.image.source="https://gitea.thirdshop.fr/thirdshop/kasier" \ org.opencontainers.image.url="https://thirdshop.fr/en/applications/kazier/" \ org.opencontainers.image.created="${BUILD_DATE}" \ org.opencontainers.image.revision=""