diff --git a/.gitea/CODEOWNERS b/.gitea/CODEOWNERS new file mode 100644 index 0000000..e286c1e --- /dev/null +++ b/.gitea/CODEOWNERS @@ -0,0 +1 @@ +* @luke diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml new file mode 100644 index 0000000..f5cfd82 --- /dev/null +++ b/.gitea/workflows/ci.yml @@ -0,0 +1,22 @@ +name: CI +on: + pull_request: + types: + - opened + - edited + - synchronize + - reopened + +jobs: + validate_pr_title: + uses: https://git.tainton.uk/actions/gha-workflows/.gitea/workflows/conventional-commit.yml@main + with: + commit_message: ${{ gitea.event.pull_request.title }} + + ci: + uses: https://git.tainton.uk/actions/gha-workflows/.gitea/workflows/ci-python-poetry.yml@main + with: + python-version: 3.13 + secrets: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml new file mode 100644 index 0000000..c3832af --- /dev/null +++ b/.gitea/workflows/release.yml @@ -0,0 +1,169 @@ +name: Release +on: + workflow_dispatch: + schedule: + - cron: "0 9 * * 0" + +jobs: + test: + name: Test + uses: https://git.tainton.uk/actions/gha-workflows/.gitea/workflows/ci-python-poetry.yml@main + with: + python-version: 3.13 + secrets: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} + + create_release: + name: Create Release + needs: test + uses: https://git.tainton.uk/actions/gha-workflows/.gitea/workflows/create-release.yml@main + secrets: + ACTIONS_TOKEN: ${{ secrets.ACTIONS_TOKEN }} + + print_release: + name: Print Release + runs-on: ubuntu-latest + needs: create_release + outputs: + releaseid: ${{ steps.getid.outputs.releaseid }} + steps: + - run: echo "Created release ${{ needs.create_release.outputs.release_name }}." + - name: Get Release ID + id: getid + run: | + rid=$(curl -s -X 'GET' \ + -H 'accept: application/json' + '${{ gitea.server_url }}/api/v1/repos/${{ gitea.repository }}/releases/latest' | jq -r '.[].id') + echo "releaseid=$rid" >> "$GITEA_OUTPUT" + + build_whl: + name: Build Wheel File + needs: [create_release, print_release] + runs-on: ubuntu-latest + steps: + - name: Check out repository code + uses: actions/checkout@v4.2.2 + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.13" + - name: Setup Poetry + uses: abatilo/actions-poetry@v4 + - name: Update pyproject.toml + run: + ./tools/update_pyproject.sh ${{ needs.create_release.outputs.release_name }} + - name: Install dependencies + run: poetry install + - name: Build wheel file + run: poetry build + - name: Upload Artifact + uses: actions/upload-artifact@v4 + with: + name: whl + path: dist/ + - name: Upload Release Asset + run: | + for file in dist/*.whl; do + curl -s -X POST \ + -H "Authorization: token ${{ secrets.ACTIONS_TOKEN }}" \ + -H "Content-Type: multipart/form-data" \ + -F "attachment=@${{ gitea.workspace }}/$file" \ + "${{ gitea.server_url }}/api/v1/repos/${{ gitea.repository }}/releases/${{ needs.print_release.outputs.releaseid }}" + done + + publish_pypi: + name: Publish to PyPI + needs: build_whl + runs-on: ubuntu-latest + steps: + - name: Create dist folder + run: mkdir -p dist + - uses: actions/download-artifact@v4 + with: + name: whl + path: dist + - name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + # user: ${{ vars.PYPI_USERNAME }} + user: __token__ + password: ${{ secrets.PYPI_API_TOKEN }} + + create_docker: + name: Publish Docker Images + runs-on: ubuntu-latest + needs: create_release + steps: + - name: Update Docker configuration + continue-on-error: true + run: | + mkdir -p /etc/default + mkdir -p /etc/docker + touch -a /etc/default/docker + touch -a /etc/docker/daemon.json + echo "DOCKER_OPTS=\"--insecure-registry ${{ vars.PACKAGES_REGISTRY_URL }}\"" >> /etc/default/docker + echo "{\"insecure-registries\": [\"${{ vars.PACKAGES_REGISTRY_URL }}\"]}" > /etc/docker/daemon.json + + - name: Get repo name + id: split + run: echo "repo=${REPO##*/}" >> "$GITEA_OUTPUT" + env: + REPO: ${{ gitea.repository }} + + - name: Check out repository + uses: actions/checkout@v4.2.2 + with: + fetch-depth: 0 + ref: ${{ needs.create_release.outputs.release_name }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Gitea Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ vars.PACKAGES_REGISTRY_URL }} + username: ${{ vars.ACTIONS_USERNAME }} + password: ${{ secrets.ACTIONS_TOKEN }} + + - name: Log in to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ vars.GHCR_USERNAME }} + password: ${{ secrets.GHCR_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5 + with: + tags: type=semver,pattern=v{{version}},value=${{ needs.create_release.outputs.release_name }} + images: | + ghcr.io/${{ vars.GHCR_USERNAME }}/${{ steps.split.outputs.repo }} + ${{ vars.PACKAGES_REGISTRY_URL }}/${{ gitea.repository }} + + - name: Print metadata + run: | + printf "Annotations:\n${{ steps.meta.outputs.annotations }}" + echo "" + printf "Labels:\n${{ steps.meta.outputs.labels }}" + echo "" + printf "Tags:\n${{ steps.meta.outputs.tags }}" + + - name: Build images + uses: docker/build-push-action@v6 + with: + context: . + push: false + load: true + annotations: ${{ steps.meta.outputs.annotations }} + labels: ${{ steps.meta.outputs.labels }} + tags: ${{ steps.meta.outputs.tags }} + + - name: Push images + run: | + strtags="${{ steps.meta.outputs.tags }}" + readarray -t lines <<<"$strtags" + for element in "${lines[@]}"; do docker push "$element"; done + unset strtags lines diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..007f866 --- /dev/null +++ b/renovate.json @@ -0,0 +1,20 @@ +{ + "assignAutomerge": true, + "assigneesFromCodeOwners": true, + "dependencyDashboardAutoclose": true, + "extends": ["config:recommended"], + "ignorePaths": ["**/.archive/**"], + "labels": ["type/dependencies"], + "platformCommit": "enabled", + "rebaseWhen": "behind-base-branch", + "rollbackPrs": true, + "vulnerabilityAlerts": { + "commitMessagePrefix": "[SECURITY] ", + "enabled": true, + "labels": ["security"], + "prCreation": "immediate" + }, + "lockFileMaintenance": { + "enabled": true + } +}