diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 2234085..5ed9c3f 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -4,8 +4,6 @@ on: push: branches: - main - tags: - - 'v*' pull_request: jobs: @@ -23,129 +21,3 @@ jobs: - name: Build client run: cargo build -p client - - release: - if: ${{ github.event_name == 'push' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/')) }} - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Install Rust - uses: dtolnay/rust-toolchain@stable - - - name: Install packaging tools - run: | - cargo install cargo-deb --locked - cargo install cargo-rpm --locked - - - name: Build release binaries - run: cargo build --release -p relay -p client - - - name: Resolve version - id: version - run: | - if [[ "${GITHUB_REF}" == refs/tags/* ]]; then - VERSION="${GITHUB_REF#refs/tags/}" - IS_PRERELEASE=false - else - VERSION="main-${GITHUB_SHA:0:7}" - IS_PRERELEASE=true - fi - echo "version=${VERSION}" >> "$GITHUB_OUTPUT" - echo "is_prerelease=${IS_PRERELEASE}" >> "$GITHUB_OUTPUT" - - - name: Package tarball - run: | - mkdir -p dist - cp target/release/relay dist/ - cp target/release/client dist/ - tar -czf "dist/play-dvv-${{ steps.version.outputs.version }}-linux-x86_64.tar.gz" -C dist relay client - - - name: Build deb packages - run: | - cargo deb -p relay --no-build - cargo deb -p client --no-build - mkdir -p dist - cp target/debian/*.deb dist/ - - - name: Build rpm packages - run: | - cargo rpm build -p relay --release - cargo rpm build -p client --release - mkdir -p dist - find target/release/rpmbuild/RPMS -name "*.rpm" -exec cp {} dist/ \; - - - name: Publish generic packages - if: ${{ secrets.GITEA_TOKEN != '' }} - env: - GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} - run: | - OWNER="${GITHUB_REPOSITORY%/*}" - REPO="${GITHUB_REPOSITORY#*/}" - VERSION="${{ steps.version.outputs.version }}" - for file in dist/*; do - name=$(basename "$file") - curl -sSf -X PUT \ - -H "Authorization: token ${GITEA_TOKEN}" \ - --upload-file "$file" \ - "${GITHUB_SERVER_URL}/api/packages/${OWNER}/generic/${REPO}/${VERSION}/${name}" - done - - - name: Build and push OCI images - if: ${{ secrets.GITEA_TOKEN != '' && secrets.GITEA_USERNAME != '' }} - env: - GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} - GITEA_USERNAME: ${{ secrets.GITEA_USERNAME }} - run: | - VERSION="${{ steps.version.outputs.version }}" - echo "${GITEA_TOKEN}" | docker login git.dvv.one -u "${GITEA_USERNAME}" --password-stdin - - cat > Dockerfile.relay <<'DOCKER' - FROM debian:bookworm-slim - COPY target/release/relay /usr/local/bin/relay - EXPOSE 7000 7001 25565 - ENTRYPOINT ["/usr/local/bin/relay"] -DOCKER - - cat > Dockerfile.client <<'DOCKER' - FROM debian:bookworm-slim - COPY target/release/client /usr/local/bin/client - ENTRYPOINT ["/usr/local/bin/client"] -DOCKER - - docker build -f Dockerfile.relay -t git.dvv.one/${GITHUB_REPOSITORY,,}/relay:${VERSION} . - docker build -f Dockerfile.client -t git.dvv.one/${GITHUB_REPOSITORY,,}/client:${VERSION} . - - if [[ "${GITHUB_REF}" == "refs/heads/main" ]]; then - docker tag git.dvv.one/${GITHUB_REPOSITORY,,}/relay:${VERSION} git.dvv.one/${GITHUB_REPOSITORY,,}/relay:main - docker tag git.dvv.one/${GITHUB_REPOSITORY,,}/client:${VERSION} git.dvv.one/${GITHUB_REPOSITORY,,}/client:main - fi - - docker push git.dvv.one/${GITHUB_REPOSITORY,,}/relay:${VERSION} - docker push git.dvv.one/${GITHUB_REPOSITORY,,}/client:${VERSION} - if [[ "${GITHUB_REF}" == "refs/heads/main" ]]; then - docker push git.dvv.one/${GITHUB_REPOSITORY,,}/relay:main - docker push git.dvv.one/${GITHUB_REPOSITORY,,}/client:main - fi - - - name: Publish Cargo packages - if: ${{ startsWith(github.ref, 'refs/tags/') && secrets.GITEA_TOKEN != '' }} - env: - CARGO_REGISTRIES_GITEA_INDEX: sparse+https://git.dvv.one/api/packages/${{ github.repository_owner }}/cargo/ - CARGO_REGISTRIES_GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} - run: | - cargo publish -p relay --registry gitea - cargo publish -p client --registry gitea - - - name: Create release - if: ${{ secrets.GITEA_TOKEN != '' }} - uses: gitea.com/actions/release-action@v1 - with: - token: ${{ secrets.GITEA_TOKEN }} - tag_name: ${{ steps.version.outputs.version }} - name: ${{ steps.version.outputs.version }} - prerelease: ${{ steps.version.outputs.is_prerelease }} - body: | - Automated release for ${{ steps.version.outputs.version }}. - files: dist/* diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml new file mode 100644 index 0000000..f136b5e --- /dev/null +++ b/.gitea/workflows/release.yml @@ -0,0 +1,208 @@ +name: release + +on: + push: + branches: + - main + tags: + - 'v*' + +jobs: + release: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + + - name: Install packaging tools + run: | + cargo install cargo-deb --locked + cargo install cargo-rpm --locked + + - name: Build release binaries + run: cargo build --release -p relay -p client + + - name: Resolve version + id: version + run: | + if [[ "${GITHUB_REF}" == refs/tags/* ]]; then + VERSION="${GITHUB_REF#refs/tags/}" + IS_PRERELEASE=false + else + VERSION="main-${GITHUB_SHA:0:7}" + IS_PRERELEASE=true + fi + echo "version=${VERSION}" >> "$GITHUB_OUTPUT" + echo "is_prerelease=${IS_PRERELEASE}" >> "$GITHUB_OUTPUT" + + - name: Package tarball + run: | + mkdir -p dist + cp target/release/relay dist/ + cp target/release/client dist/ + tar -czf "dist/play-dvv-${{ steps.version.outputs.version }}-linux-x86_64.tar.gz" -C dist relay client + + - name: Build deb packages + run: | + cargo deb -p relay --no-build + cargo deb -p client --no-build + mkdir -p dist + cp target/debian/*.deb dist/ + + - name: Build rpm packages + run: | + cargo rpm build -p relay --release + cargo rpm build -p client --release + mkdir -p dist + find target/release/rpmbuild/RPMS -name "*.rpm" -exec cp {} dist/ \; + + - name: Publish generic packages + env: + GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + run: | + if [[ -z "${GITEA_TOKEN}" ]]; then + echo "GITEA_TOKEN missing; skipping generic packages" + exit 0 + fi + OWNER="${GITHUB_REPOSITORY%/*}" + REPO="${GITHUB_REPOSITORY#*/}" + VERSION="${{ steps.version.outputs.version }}" + for file in dist/*; do + name=$(basename "$file") + curl -sSf -X PUT \ + -H "Authorization: token ${GITEA_TOKEN}" \ + --upload-file "$file" \ + "${GITHUB_SERVER_URL}/api/packages/${OWNER}/generic/${REPO}/${VERSION}/${name}" + done + + - name: Build and push OCI images + env: + GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + GITEA_USERNAME: ${{ secrets.GITEA_USERNAME }} + run: | + if [[ -z "${GITEA_TOKEN}" || -z "${GITEA_USERNAME}" ]]; then + echo "GITEA_TOKEN or GITEA_USERNAME missing; skipping OCI" + exit 0 + fi + VERSION="${{ steps.version.outputs.version }}" + echo "${GITEA_TOKEN}" | docker login git.dvv.one -u "${GITEA_USERNAME}" --password-stdin + + cat > Dockerfile.relay <<'DOCKER' + FROM debian:bookworm-slim + COPY target/release/relay /usr/local/bin/relay + EXPOSE 7000 7001 25565 + ENTRYPOINT ["/usr/local/bin/relay"] +DOCKER + + cat > Dockerfile.client <<'DOCKER' + FROM debian:bookworm-slim + COPY target/release/client /usr/local/bin/client + ENTRYPOINT ["/usr/local/bin/client"] +DOCKER + + docker build -f Dockerfile.relay -t git.dvv.one/${GITHUB_REPOSITORY,,}/relay:${VERSION} . + docker build -f Dockerfile.client -t git.dvv.one/${GITHUB_REPOSITORY,,}/client:${VERSION} . + + if [[ "${GITHUB_REF}" == "refs/heads/main" ]]; then + docker tag git.dvv.one/${GITHUB_REPOSITORY,,}/relay:${VERSION} git.dvv.one/${GITHUB_REPOSITORY,,}/relay:main + docker tag git.dvv.one/${GITHUB_REPOSITORY,,}/client:${VERSION} git.dvv.one/${GITHUB_REPOSITORY,,}/client:main + fi + + docker push git.dvv.one/${GITHUB_REPOSITORY,,}/relay:${VERSION} + docker push git.dvv.one/${GITHUB_REPOSITORY,,}/client:${VERSION} + if [[ "${GITHUB_REF}" == "refs/heads/main" ]]; then + docker push git.dvv.one/${GITHUB_REPOSITORY,,}/relay:main + docker push git.dvv.one/${GITHUB_REPOSITORY,,}/client:main + fi + + - name: Publish Cargo packages + env: + GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + CARGO_REGISTRIES_GITEA_INDEX: sparse+https://git.dvv.one/api/packages/${{ github.repository_owner }}/cargo/ + CARGO_REGISTRIES_GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + run: | + if [[ "${GITHUB_REF}" != refs/tags/* ]]; then + echo "Not a tag; skipping cargo publish" + exit 0 + fi + if [[ -z "${GITEA_TOKEN}" ]]; then + echo "GITEA_TOKEN missing; skipping cargo publish" + exit 0 + fi + TAG="${GITHUB_REF#refs/tags/}" + RELAY_VER=$(cargo metadata --format-version 1 | python - <<'PY' +import json,sys +meta=json.load(sys.stdin) +for pkg in meta['packages']: + if pkg['name']=='relay': + print(pkg['version']) + break +PY +) + CLIENT_VER=$(cargo metadata --format-version 1 | python - <<'PY' +import json,sys +meta=json.load(sys.stdin) +for pkg in meta['packages']: + if pkg['name']=='client': + print(pkg['version']) + break +PY +) + if [[ "v${RELAY_VER}" != "${TAG}" ]]; then + echo "Tag ${TAG} does not match relay version v${RELAY_VER}; skipping relay publish" + else + cargo publish -p relay --registry gitea + fi + if [[ "v${CLIENT_VER}" != "${TAG}" ]]; then + echo "Tag ${TAG} does not match client version v${CLIENT_VER}; skipping client publish" + else + cargo publish -p client --registry gitea + fi + + - name: Create release + env: + GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + run: | + if [[ -z "${GITEA_TOKEN}" ]]; then + echo "GITEA_TOKEN missing; skipping release" + exit 0 + fi + OWNER="${GITHUB_REPOSITORY%/*}" + REPO="${GITHUB_REPOSITORY#*/}" + VERSION="${{ steps.version.outputs.version }}" + PRERELEASE="${{ steps.version.outputs.is_prerelease }}" + BODY="Automated release for ${VERSION}." + + payload=$(python - <