diff --git a/.github/workflows/patch-release.yaml b/.github/workflows/patch-release.yaml new file mode 100644 index 0000000000..3cc96f74a3 --- /dev/null +++ b/.github/workflows/patch-release.yaml @@ -0,0 +1,88 @@ +name: Automated release + +on: + workflow_dispatch: + schedule: + # First day of every month + - cron: '0 0 1 * *' + +jobs: + setup: + runs-on: ubuntu-latest + outputs: + latest_branch: ${{steps.latest_branch.outputs.latest_branch}} + branches_json: ${{steps.release_branches.outputs.branches_json}} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Get latest llvm_release branch + id: latest_branch + run: | + git branch -r \ + | grep 'llvm_release_' \ + | sed -E 's/.*\/llvm_release_([0-9]+)/\1/' \ + | sort -n -r \ + | head -1 \ + | xargs printf "latest_branch=llvm_release_%s" \ + >> $GITHUB_OUTPUT + - name: Get branch list + id: release_branches + run: | + git branch -r \ + | grep "origin/llvm_release_" \ + | sed -E 's/\ *origin\/([^\ ]*)/\"\1\"/' \ + | paste -sd',' \ + | xargs -0 -d"\n" printf 'branches_json={"branch":[%s]}' \ + >> $GITHUB_OUTPUT + release: + runs-on: ubuntu-latest + needs: setup + strategy: + matrix: ${{fromJson(needs.setup.outputs.branches_json)}} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{ matrix.branch }} + fetch-depth: 0 + - name: Get commits info + id: versions + run: | + export LATEST_VERSION=\ + "$(git describe --tags --abbrev=0 --match 'v*')" + export LLVM_VERSION=$(echo $LATEST_VERSION \ + | sed -E 's/(v[0-9]+\.[0-9]+)\.([0-9]+).*/\1/') + export PATCH=$(echo $LATEST_VERSION \ + | sed -E 's/(v[0-9]+\.[0-9]+)\.([0-9]+).*/\2/') + + echo "llvm_version=$LLVM_VERSION" >> $GITHUB_OUTPUT + echo "patch=$PATCH" >> $GITHUB_OUTPUT + echo "latest_version=${LATEST_VERSION}" >> $GITHUB_OUTPUT + echo "release_version=${LLVM_VERSION}.$((${PATCH}+1))" \ + >> $GITHUB_OUTPUT + + git rev-list ${LATEST_VERSION}..HEAD --count \ + | xargs printf "commits_since_last_release=%d\n" >> $GITHUB_OUTPUT + git rev-parse HEAD | xargs printf "last_commit=%s\n" >> $GITHUB_OUTPUT + - name: Release + uses: softprops/action-gh-release@v2 + if: ${{ steps.versions.outputs.commits_since_last_release != 0 }} + with: + # Setting tag to have format: + # %latest llvm version%.%latest patch + 1% + tag_name: ${{ steps.versions.outputs.release_version }} + # We have to set this so tag is set on the branch we are releasing + target_commitish: ${{ steps.versions.outputs.last_commit }} + # We don't want to mark patch releases latest unless it is latest + # major version + make_latest: >- + ${{ needs.setup.outputs.latest_branch == matrix.branch }} + name: > + SPIR-V LLVM translator based on LLVM + ${{ steps.versions.outputs.llvm_version }} + body: "Full Changelog: ${{ github.server_url }}/\ + ${{ github.repository }}/compare/\ + ${{ steps.versions.outputs.latest_version }}...\ + ${{ steps.versions.outputs.release_version }}" diff --git a/README.md b/README.md index 0a06f53cf5..1d6e28414f 100644 --- a/README.md +++ b/README.md @@ -256,3 +256,9 @@ LLVM/Clang release and there are no objections from the maintainer(s). There is no guarantee that older release branches are proactively kept up to date with main, but you can request specific commits on older release branches by creating a pull request or raising an issue on GitHub. + +## Releasing strategy + +As mentioned earlier there are branches `llvm_release_*` that get backported +changes. Those changes if exists are released automatically by github CI on +monthly basis in a format `..`.