name: Release on: push: tags: - 'v*' jobs: ci: runs-on: docker container: image: oven/bun:1 steps: - name: Checkout uses: actions/checkout@v4 - name: Install dependencies run: bun install --frozen-lockfile --ignore-scripts - name: Lint run: bun run lint - name: Test run: bun test - name: Build run: bun run build release: needs: ci runs-on: dind steps: - name: Clone repository run: | apk add --no-cache git curl jq docker-cli docker-cli-buildx git clone https://${{ secrets.GITEA_TOKEN }}@gitea.jeanlucmakiola.de/${{ gitea.repository }}.git repo cd repo git checkout ${{ gitea.ref_name }} - name: Resolve version from tag working-directory: repo run: | VERSION="${{ gitea.ref_name }}" PREV_TAG=$(git tag -l 'v*' --sort=-v:refname | grep -vxF "$VERSION" | head -n1) if [ -z "$PREV_TAG" ]; then PREV_TAG="v0.0.0" fi echo "VERSION=$VERSION" >> "$GITHUB_ENV" echo "PREV_TAG=$PREV_TAG" >> "$GITHUB_ENV" echo "Releasing $VERSION (previous: $PREV_TAG)" - name: Generate changelog working-directory: repo run: | if [ "$PREV_TAG" = "v0.0.0" ]; then CHANGELOG=$(git log --pretty=format:"- %s" HEAD) else CHANGELOG=$(git log --pretty=format:"- %s" "${PREV_TAG}..HEAD") fi echo "CHANGELOG<> "$GITHUB_ENV" echo "$CHANGELOG" >> "$GITHUB_ENV" echo "CHANGELOG_EOF" >> "$GITHUB_ENV" - name: Build and push Docker image working-directory: repo run: | REGISTRY="gitea.jeanlucmakiola.de" IMAGE="${REGISTRY}/${{ gitea.repository_owner }}/gearbox" echo "${{ secrets.REGISTRY_TOKEN }}" | docker login "$REGISTRY" -u "${{ gitea.repository_owner }}" --password-stdin docker buildx build \ --cache-from type=registry,ref=${IMAGE}:buildcache \ --cache-to type=registry,ref=${IMAGE}:buildcache \ -t "${IMAGE}:${VERSION}" -t "${IMAGE}:latest" \ --push . - name: Create Gitea release run: | API_URL="${GITHUB_SERVER_URL}/api/v1/repos/${{ gitea.repository }}/releases" curl -s -X POST "$API_URL" \ -H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \ -H "Content-Type: application/json" \ -d "$(jq -n \ --arg tag "$VERSION" \ --arg name "$VERSION" \ --arg body "$CHANGELOG" \ '{tag_name: $tag, name: $name, body: $body, draft: false, prerelease: false}')"