From 43a7669d269f984a1eac1b75f927ac7dc6487cce Mon Sep 17 00:00:00 2001 From: JasterV <49537445+JasterV@users.noreply.github.com> Date: Fri, 6 Mar 2026 23:01:23 +0100 Subject: [PATCH] [rust-magic-release] Publish first version --- .../publish-rust-magic-release-image.yml | 21 ++++++ rust/magic-release.Dockerfile | 8 +++ rust/magic-release.sh | 71 +++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 .woodpecker/publish-rust-magic-release-image.yml create mode 100644 rust/magic-release.Dockerfile create mode 100755 rust/magic-release.sh diff --git a/.woodpecker/publish-rust-magic-release-image.yml b/.woodpecker/publish-rust-magic-release-image.yml new file mode 100644 index 0000000..526a538 --- /dev/null +++ b/.woodpecker/publish-rust-magic-release-image.yml @@ -0,0 +1,21 @@ +when: + event: [push, manual] + branch: main + path: + [ + "rust/magic-release.Dockerfile", + "rust/magic-release.sh", + ".woodpecker/publish-rust-magic-release-image.yml", + ] + +steps: + publish: + image: plugins/kaniko + settings: + repo: jasterv/rust-magic-release + tags: 1.93,latest + username: + from_secret: DOCKERHUB_USERNAME + password: + from_secret: DOCKERHUB_PASSWORD + dockerfile: rust/magic-release.Dockerfile diff --git a/rust/magic-release.Dockerfile b/rust/magic-release.Dockerfile new file mode 100644 index 0000000..865da47 --- /dev/null +++ b/rust/magic-release.Dockerfile @@ -0,0 +1,8 @@ +FROM jasterv/rust-ci:latest + +COPY rust/magic-release.sh /usr/local/bin/magic-release + +RUN chmod +x /usr/local/bin/magic-release + +# Entrypoint is required for Woodpecker plugins +ENTRYPOINT ["/usr/local/bin/magic-release"] diff --git a/rust/magic-release.sh b/rust/magic-release.sh new file mode 100755 index 0000000..25919f9 --- /dev/null +++ b/rust/magic-release.sh @@ -0,0 +1,71 @@ +#!/bin/sh +set -e + +# --- 1. Configuration --- +TOKEN="${PLUGIN_TOKEN}" +CRATES_TOKEN="${PLUGIN_CRATES_IO_TOKEN}" +REPO_FULL_NAME="${CI_REPO}" +API_URL="https://codeberg.org/api/v1/repos/${REPO_FULL_NAME}" + +# --- 2. Get Workspace Packages in Topological Order --- +# Requires 'jq' to be installed in the environment +PACKAGES=$(cargo metadata --format-version 1 --no-deps | jq -r '.packages | .[] | "\(.name) \(.version) \(.manifest_path)"') + +echo "Starting independent release process..." + +# --- 3. Process each package --- +echo "$PACKAGES" | while read -r PKG_NAME PKG_VERSION MANIFEST_PATH; do + + TAG_NAME="${PKG_NAME}-v${PKG_VERSION}" + echo "--- Checking $PKG_NAME ($PKG_VERSION) ---" + + # A. Check if this version is already on crates.io + status_code=$(curl -s -o /dev/null -w "%{http_code}" "https://crates.io/api/v1/crates/${PKG_NAME}/${PKG_VERSION}") + + if [ "$status_code" = "200" ]; then + echo " - $PKG_NAME v$PKG_VERSION is already published. Skipping." + continue + fi + + echo " - New version detected. Proceeding with release..." + + # B. Create Git Tag if it doesn't exist + if git rev-parse "$TAG_NAME" >/dev/null 2>&1; then + echo " - Tag $TAG_NAME already exists locally/remotely." + else + echo " - Tagging $TAG_NAME..." + git tag "$TAG_NAME" + # Use the token for authenticated push + git push "https://$TOKEN@codeberg.org/${REPO_FULL_NAME}.git" "$TAG_NAME" + fi + + # C. Create Codeberg Release + # We check if the release exists via API first to avoid 409 errors + RELEASE_CHECK=$(curl -s -H "Authorization: token $TOKEN" "$API_URL/releases/tags/$TAG_NAME") + if echo "$RELEASE_CHECK" | grep -q "\"id\":"; then + echo " - Codeberg release for $TAG_NAME already exists." + else + echo " - Creating Codeberg release for $TAG_NAME..." + RELEASE_PAYLOAD=$(cat < /dev/null + fi + + # D. Publish to Crates.io + echo " - Publishing $PKG_NAME to crates.io..." + # --allow-dirty handles cases where the CI environment modified files (like lockfiles) + cargo publish --token "$CRATES_TOKEN" -p "$PKG_NAME" --allow-dirty +done + +echo "--- All independent releases processed ---"