name: Release on: workflow_run: workflows: ["CI"] branches: - master types: - completed jobs: release: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v3 with: fetch-depth: 0 - name: Get previous commit SHA id: get_previous_commit run: | LATEST_TAG=$(git describe --tags --abbrev=0) if [[ -z "$LATEST_TAG" ]]; then echo "No tag found. Failing..." exit 1 fi echo "latest_tag=${LATEST_TAG#v}" >> "$GITHUB_ENV" # Remove 'v' prefix from the tag - name: Check if version changed and is greater than the previous id: version_check run: | # Compare the current version with the version from the previous commit PREVIOUS_NPM_VERSION=${{ env.latest_tag }} CURRENT_NPM_VERSION=$(jq -r '.version' package.json) CURRENT_CARGO_VERSION=$(awk -F '"' '/^version/ {print $2}' Cargo.toml) if [[ "$CURRENT_NPM_VERSION" != "$CURRENT_CARGO_VERSION" ]]; then # Cargo.toml and package.json versions must match echo "Mismatch: NPM version ($CURRENT_NPM_VERSION) and Cargo.toml version ($CURRENT_CARGO_VERSION)" echo "version_changed=false" >> "$GITHUB_ENV" else if [[ "$PREVIOUS_NPM_VERSION" == "$CURRENT_NPM_VERSION" ]]; then echo "version_changed=" >> "$GITHUB_ENV" else IFS='.' read -ra PREVIOUS_VERSION_PARTS <<< "$PREVIOUS_NPM_VERSION" IFS='.' read -ra CURRENT_VERSION_PARTS <<< "$CURRENT_NPM_VERSION" VERSION_CHANGED=false for i in "${!PREVIOUS_VERSION_PARTS[@]}"; do if [[ ${CURRENT_VERSION_PARTS[i]} -gt ${PREVIOUS_VERSION_PARTS[i]} ]]; then VERSION_CHANGED=true break elif [[ ${CURRENT_VERSION_PARTS[i]} -lt ${PREVIOUS_VERSION_PARTS[i]} ]]; then break fi done echo "version_changed=$VERSION_CHANGED" >> "$GITHUB_ENV" echo "current_version=${CURRENT_NPM_VERSION}" >> "$GITHUB_ENV" fi fi - name: Display result run: | echo "Version bump detected: ${{ env.version_changed }}" - name: Fail if version is lower if: env.version_changed == 'false' run: exit 1 - name: Setup Node if: env.version_changed == 'true' uses: actions/setup-node@v3 with: node-version: 18 registry-url: "https://registry.npmjs.org" - name: Publish to NPM if: env.version_changed == 'true' env: NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} run: npm publish - name: Setup Rust if: env.version_changed == 'true' uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: stable override: true - name: Publish to Crates.io if: env.version_changed == 'true' uses: katyo/publish-crates@v2 with: registry-token: ${{ secrets.CARGO_REGISTRY_TOKEN }} - name: Tag versions if: env.version_changed == 'true' run: | git checkout master git config user.name github-actions[bot] git config user.email github-actions[bot]@users.noreply.github.com git tag -d "v${{ env.current_version }}" || true git push origin --delete "v${{ env.current_version }}" || true git tag -a "v${{ env.current_version }}" -m "Version ${{ env.current_version }}" git push origin "v${{ env.current_version }}"