name: Forgejo Build Pipeline on: push: branches: - main schedule: - cron: '0 0 * * *' # Runs daily at midnight UTC workflow_dispatch: # Allow manual triggers permissions: contents: write # Required for creating releases jobs: check-release: runs-on: ubuntu-latest outputs: new_tag: ${{ steps.get_latest_tag.outputs.tag }} should_build: ${{ steps.check_existing.outputs.should_build }} steps: - name: Get Latest Forgejo Tag id: get_latest_tag run: | LATEST_TAG=$(curl -s 'https://codeberg.org/api/v1/repos/forgejo/forgejo/releases?limit=1' | jq -r '.[0].tag_name') echo "tag=$LATEST_TAG" >> $GITHUB_OUTPUT echo "Latest Forgejo tag: $LATEST_TAG" - name: Check Existing Release id: check_existing uses: actions/github-script@v7 with: script: | try { const tag = '${{ steps.get_latest_tag.outputs.tag }}'; const release = await github.rest.repos.getReleaseByTag({ owner: context.repo.owner, repo: context.repo.repo, tag: tag + '-forgejo' }); core.setOutput('should_build', 'false'); } catch (error) { core.setOutput('should_build', 'true'); } build: needs: check-release if: needs.check-release.outputs.should_build == 'true' strategy: matrix: os: [ubuntu-latest, macos-latest] runs-on: ${{ matrix.os }} timeout-minutes: 120 # 2-hour timeout steps: - name: Checkout Repository uses: actions/checkout@v4 - name: Setup Go uses: actions/setup-go@v5 with: go-version: '1.24.3' cache: true - name: Setup node.js uses: actions/setup-node@v3 with: node-version: '20' cache: 'npm' - name: Checkout Forgejo Source run: | git clone https://codeberg.org/forgejo/forgejo.git forgejo-source cd forgejo-source git checkout ${{ needs.check-release.outputs.new_tag }} - name: Build Forgejo working-directory: forgejo-source run: | make clean cp -v ../net_mirror.go modules/graceful/net_mirror.go cp -v ../net_mirror_dialer.go modules/graceful/net_mirror_dialer.go cp -v ../net_mirror_unix.go modules/graceful/net_mirror_unix.go cp -v ../net_mirror_windows.go modules/graceful/net_mirror_windows.go cat ../go.mod >> go.mod make build env: TAGS: bindata sqlite sqlite_unlock_notify netgo osusergo GOFLAGS: -ldflags="-extldflags=-static" CO_ENABLED: 0 - name: Prepare Artifact shell: bash run: | cd forgejo-source ARTIFACT_NAME="forgejo-${{ runner.os }}" ls -lah if [ "${{ runner.os }}" = "Windows" ]; then mv -v gitea.exe "${ARTIFACT_NAME}.exe" else mv -v gitea "${ARTIFACT_NAME}" fi - name: Upload Build Artifact uses: actions/upload-artifact@v4 with: name: forgejo-${{ runner.os }} path: | forgejo-source/forgejo-${{ runner.os }}* retention-days: 1 release: needs: [check-release, build] runs-on: ubuntu-latest steps: - name: Download All Artifacts uses: actions/download-artifact@v4 - name: Create Release uses: softprops/action-gh-release@v2 with: tag_name: ${{ needs.check-release.outputs.new_tag }}-forgejo name: "Forgejo ${{ needs.check-release.outputs.new_tag }}" body: "Automated build of Forgejo ${{ needs.check-release.outputs.new_tag }}" files: | forgejo-Linux/* forgejo-Windows/* forgejo-macOS/* draft: false prerelease: false