Skip to content

llvm-build-bump-pr

llvm-build-bump-pr #29

name: llvm-build-bump-pr
on:
workflow_dispatch:
inputs:
force-run:
description: Force run
required: false
default: false
type: boolean
schedule:
- cron: '0 1 * * 1'
env:
GH_TOKEN: ${{ secrets.GH_PAT }}
LLVM_REPO: llvm/llvm-project
LLVM_REPO_SHORT: llvm-project
CLANG_FORMAT_GIT: cfg
CLANG_FORMAT_NODE: cfn
jobs:
# Check if my package is up-to-date
stage1:
runs-on: ubuntu-latest
steps:
- name: Set up checkout
uses: actions/checkout@v4
- name: Fetch LLVM current release tag name from local
run: |
LLVM_CURRENT_RELEASE_TAG_NAME=$(cat .clang-format-version)
echo "LLVM_CURRENT_RELEASE_TAG_NAME=$LLVM_CURRENT_RELEASE_TAG_NAME" >> $GITHUB_ENV
echo "LLVM_CURRENT_RELEASE_TAG_NAME: $LLVM_CURRENT_RELEASE_TAG_NAME"
- name: Fetch LLVM latest release tag name from ${{ env.LLVM_REPO }}
run: |
LLVM_LATEST_RELEASE=$(gh api \
-H "Accept: application/vnd.github+json" \
-H "X-GitHub-Api-Version: 2022-11-28" \
/repos/${{ env.LLVM_REPO }}/releases/latest)
LLVM_LATEST_RELEASE_TAG_NAME=$(echo "$LLVM_LATEST_RELEASE" | jq -r .tag_name)
echo "LLVM_LATEST_RELEASE_TAG_NAME=$LLVM_LATEST_RELEASE_TAG_NAME" >> $GITHUB_ENV
echo "LLVM_LATEST_RELEASE_TAG_NAME: $LLVM_LATEST_RELEASE_TAG_NAME"
- name: Debug outputs
run: |
echo "LLVM_CURRENT_RELEASE_TAG_NAME: ${{ env.LLVM_CURRENT_RELEASE_TAG_NAME }}"
echo "LLVM_LATEST_RELEASE_TAG_NAME: ${{ env.LLVM_LATEST_RELEASE_TAG_NAME }}"
echo "IS_LATEST: ${{ env.LLVM_CURRENT_RELEASE_TAG_NAME == env.LLVM_LATEST_RELEASE_TAG_NAME }}"
outputs:
LLVM_CURRENT_RELEASE_TAG_NAME: ${{ env.LLVM_CURRENT_RELEASE_TAG_NAME }}
LLVM_LATEST_RELEASE_TAG_NAME: ${{ env.LLVM_LATEST_RELEASE_TAG_NAME }}
IS_LATEST: ${{ env.LLVM_CURRENT_RELEASE_TAG_NAME == env.LLVM_LATEST_RELEASE_TAG_NAME }}
# Linux-x64
stage2-build-linux-x64:
runs-on: ubuntu-22.04
needs: stage1
if: ${{ needs.stage1.outputs.IS_LATEST == 'false' || inputs.force-run }}
steps:
- name: Set up node
uses: actions/setup-node@v4
- name: Set up os platform and os arch environment variables
run: |
OS_PLATFORM=$(node -p "require('os').platform()")
echo "OS_PLATFORM=$OS_PLATFORM" >> $GITHUB_ENV
echo "OS_PLATFORM: $OS_PLATFORM"
OS_ARCH=$(node -p "require('os').arch()")
echo "OS_ARCH=$OS_ARCH" >> $GITHUB_ENV
echo "OS_ARCH: $OS_ARCH"
- name: Set up dependencies
run: |
sudo apt update -y
sudo apt install -y ninja-build
pip install pyinstaller
- name: Set up checkout
uses: actions/checkout@v4
with:
repository: ${{ env.LLVM_REPO }}
ref: ${{ needs.stage1.outputs.LLVM_LATEST_RELEASE_TAG_NAME }}
- name: Debug ls
run: ls -al
# packages:clang-format-git
- name: Build git-clang-format
run: pyinstaller --onefile --strip --optimize=2 clang/tools/clang-format/git-clang-format
- name: Debug git-clang-format help
run: dist/git-clang-format --help
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ env.CLANG_FORMAT_GIT }}-${{ env.OS_PLATFORM }}-${{ env.OS_ARCH }}
path: dist/git-clang-format
# packages:clang-format-git-python
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: git-clang-format
path: clang/tools/clang-format/git-clang-format
# packages:clang-format-node
- name: Build cmake
run: |
cmake -S llvm -B build -G Ninja \
-DLLVM_ENABLE_PROJECTS="clang" \
-DCMAKE_BUILD_TYPE=MinSizeRel
- name: Build clang-format
run: ninja -C build clang-format
- name: Debug clang-format version
run: build/bin/clang-format --version
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ env.CLANG_FORMAT_NODE }}-${{ env.OS_PLATFORM }}-${{ env.OS_ARCH }}
path: build/bin/clang-format
# Linux-qemu(cross-platform)
stage2-build-linux-qemu:
strategy:
matrix:
docker:
- platform: arm/v7
ubuntu-image: arm32v7
node-name: arm
- platform: arm64/v8
ubuntu-image: arm64v8
node-name: arm64
- platform: ppc64le
ubuntu-image: ppc64le
node-name: ppc64
- platform: s390x
ubuntu-image: s390x
node-name: s390x
runs-on: ubuntu-22.04
needs: stage1
if: ${{ needs.stage1.outputs.IS_LATEST == 'false' || inputs.force-run }}
steps:
- name: Debug matrix
run: echo ${{ matrix.docker.platform }} ${{ matrix.docker.ubuntu-image }} ${{ matrix.docker.node-name }}
- name: Set up QEMU
run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
# Use the oldest ubuntu image version possible for backward compatibility.
- name: Docker run
run: |
docker run --name ${{ matrix.docker.node-name }} --platform linux/${{ matrix.docker.platform }} ${{ matrix.docker.ubuntu-image }}/ubuntu:22.04 /bin/bash -c "
echo ---Set up environment variables--- &&
export DEBIAN_FRONTEND=noninteractive &&
echo ---Debug uname -m--- &&
uname -m &&
echo ---Debug pwd--- &&
pwd &&
echo ---Set up dependencies--- &&
apt update -y &&
apt install -y git python3 python3-pip g++ cmake ninja-build &&
pip install pyinstaller &&
echo ---Set up checkout--- &&
git clone --depth 1 --branch ${{ needs.stage1.outputs.LLVM_LATEST_RELEASE_TAG_NAME }} https://github.com/${{ env.LLVM_REPO }}.git &&
cd ${{ env.LLVM_REPO_SHORT }} &&
echo ---Debug ls--- &&
ls -al &&
echo ----------packages:clang-format-git---------- &&
echo ---Build git-clang-format--- &&
pyinstaller --onefile --strip --optimize=2 clang/tools/clang-format/git-clang-format &&
echo ---Debug git-clang-format help--- &&
dist/git-clang-format --help &&
echo ----------packages:clang-format-node---------- &&
echo ---Build cmake--- &&
cmake -S llvm -B build -G Ninja \
-DLLVM_ENABLE_PROJECTS="clang" \
-DCMAKE_BUILD_TYPE=MinSizeRel &&
echo ---Build clang-format--- &&
ninja -C build clang-format &&
echo ---Debug clang-format version--- &&
build/bin/clang-format --version &&
echo ---Debug uname -m--- &&
uname -m
"
- name: Copy git-clang-format from Docker container
run: docker cp ${{ matrix.docker.node-name }}:/${{ env.LLVM_REPO_SHORT }}/dist ./${{ env.CLANG_FORMAT_GIT }}-linux-${{ matrix.docker.node-name }}
- name: Debug copied git-clang-format folder
run: ls ./${{ env.CLANG_FORMAT_GIT }}-linux-${{ matrix.docker.node-name }}
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ env.CLANG_FORMAT_GIT }}-linux-${{ matrix.docker.node-name }}
path: ./${{ env.CLANG_FORMAT_GIT }}-linux-${{ matrix.docker.node-name }}/git-clang-format
- name: Copy clang-format from Docker container
run: docker cp ${{ matrix.docker.node-name }}:/${{ env.LLVM_REPO_SHORT }}/build/bin ./${{ env.CLANG_FORMAT_NODE }}-linux-${{ matrix.docker.node-name }}
- name: Debug copied clang-format folder
run: ls ./${{ env.CLANG_FORMAT_NODE }}-linux-${{ matrix.docker.node-name }}
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ env.CLANG_FORMAT_NODE }}-linux-${{ matrix.docker.node-name }}
path: ./${{ env.CLANG_FORMAT_NODE }}-linux-${{ matrix.docker.node-name }}/clang-format
# MacOS
stage2-build-darwin:
strategy:
matrix:
type:
- macos-14 # arm64 (macos-latest: arm64)
- macos-12 # x64 (macos-13: x64)
# Use the oldest version possible for backward compatibility.
runs-on: ${{ matrix.type }}
needs: stage1
if: ${{ needs.stage1.outputs.IS_LATEST == 'false' || inputs.force-run }}
steps:
- name: Set up node
uses: actions/setup-node@v4
- name: Set up os platform and os arch environment variables
run: |
OS_PLATFORM=$(node -p "require('os').platform()")
echo "OS_PLATFORM=$OS_PLATFORM" >> $GITHUB_ENV
echo "OS_PLATFORM: $OS_PLATFORM"
OS_ARCH=$(node -p "require('os').arch()")
echo "OS_ARCH=$OS_ARCH" >> $GITHUB_ENV
echo "OS_ARCH: $OS_ARCH"
- name: Set up dependencies
run: |
brew update
brew install ninja
pip install pyinstaller
- name: Set up checkout
uses: actions/checkout@v4
with:
repository: ${{ env.LLVM_REPO }}
ref: ${{ needs.stage1.outputs.LLVM_LATEST_RELEASE_TAG_NAME }}
- name: Debug ls
run: ls -al
# packages:clang-format-git
- name: Build git-clang-format
run: pyinstaller --onefile --strip --optimize=2 clang/tools/clang-format/git-clang-format
- name: Debug git-clang-format help
run: dist/git-clang-format --help
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ env.CLANG_FORMAT_GIT }}-${{ env.OS_PLATFORM }}-${{ env.OS_ARCH }}
path: dist/git-clang-format
# packages:clang-format-node
- name: Build cmake
run: |
cmake -S llvm -B build -G Ninja \
-DLLVM_ENABLE_PROJECTS="clang" \
-DCMAKE_BUILD_TYPE=MinSizeRel
- name: Build clang-format
run: ninja -C build clang-format
- name: Debug clang-format version
run: build/bin/clang-format --version
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ env.CLANG_FORMAT_NODE }}-${{ env.OS_PLATFORM }}-${{ env.OS_ARCH }}
path: build/bin/clang-format
# Windows
stage2-build-win32:
# Use the oldest version possible for backward compatibility.
runs-on: windows-2022
needs: stage1
if: ${{ needs.stage1.outputs.IS_LATEST == 'false' || inputs.force-run }}
steps:
- name: Set up node
uses: actions/setup-node@v4
- name: Set up os platform and os arch environment variables
run: |
$OS_PLATFORM = node -p "require('os').platform()"
echo "OS_PLATFORM=$OS_PLATFORM" >> $env:GITHUB_ENV
echo "OS_PLATFORM: $OS_PLATFORM"
$OS_ARCH = node -p "require('os').arch()"
echo "OS_ARCH=$OS_ARCH" >> $env:GITHUB_ENV
echo "OS_ARCH: $OS_ARCH"
- name: Set up dependencies
run: |
choco install -y ninja
pip install pyinstaller
- name: Set up checkout
uses: actions/checkout@v4
with:
repository: ${{ env.LLVM_REPO }}
ref: ${{ needs.stage1.outputs.LLVM_LATEST_RELEASE_TAG_NAME }}
# packages:clang-format-git
- name: Build git-clang-format
run: pyinstaller --onefile --strip --optimize=2 clang\tools\clang-format\git-clang-format
- name: Debug git-clang-format help
run: dist\git-clang-format.exe --help
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ env.CLANG_FORMAT_GIT }}-${{ env.OS_PLATFORM }}-${{ env.OS_ARCH }}
path: dist\git-clang-format.exe
# packages:clang-format-node
- name: Build cmake
run: cmake -S llvm -B build -G Ninja -DLLVM_ENABLE_PROJECTS="clang" -DCMAKE_BUILD_TYPE=MinSizeRel
- name: Build clang-format
run: ninja -C build clang-format
- name: Debug clang-format version
run: build\bin\clang-format --version
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ env.CLANG_FORMAT_NODE }}-${{ env.OS_PLATFORM }}-${{ env.OS_ARCH }}
path: build\bin\clang-format.exe
# Create PR using build artifacts and bump version
stage3:
runs-on: ubuntu-latest
needs:
- stage1
- stage2-build-linux-x64
- stage2-build-linux-qemu
- stage2-build-darwin
- stage2-build-win32
steps:
- name: Set up checkout
uses: actions/checkout@v4
- name: Download artifacts for clang-format-git
uses: actions/download-artifact@v4
with:
path: packages/clang-format-git/src/bin
pattern: cfg-*
- name: Download artifacts for clang-format-git-python
uses: actions/download-artifact@v4
with:
path: packages/clang-format-git-python
name: git-clang-format
- name: Move git-clang-format
run: mv packages/clang-format-git-python/git-clang-format/git-clang-format -t packages/clang-format-git-python/src
- name: Download artifacts for clang-format-node
uses: actions/download-artifact@v4
with:
path: packages/clang-format-node/src/bin
pattern: cfn-*
- name: Debug structure of downloaded files
run: |
ls -R packages/clang-format-git/src
ls -R packages/clang-format-git-python/src
ls -R packages/clang-format-node/src/bin
- name: Bump version
run: echo ${{ needs.stage1.outputs.LLVM_LATEST_RELEASE_TAG_NAME }} > .clang-format-version
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7
with:
token: ${{ secrets.GH_PAT }}
commit-message: 'build(deps): bump LLVM from ${{ needs.stage1.outputs.LLVM_CURRENT_RELEASE_TAG_NAME }} to ${{ needs.stage1.outputs.LLVM_LATEST_RELEASE_TAG_NAME }}'
branch: 'bump-llvm-from-${{ needs.stage1.outputs.LLVM_CURRENT_RELEASE_TAG_NAME }}-to-${{ needs.stage1.outputs.LLVM_LATEST_RELEASE_TAG_NAME }}'
base: 'main'
title: 'build(deps): bump LLVM from ${{ needs.stage1.outputs.LLVM_CURRENT_RELEASE_TAG_NAME }} to ${{ needs.stage1.outputs.LLVM_LATEST_RELEASE_TAG_NAME }}'
body: |
This PR bumps the LLVM version from `${{ needs.stage1.outputs.LLVM_CURRENT_RELEASE_TAG_NAME }}` to `${{ needs.stage1.outputs.LLVM_LATEST_RELEASE_TAG_NAME }}` using LLVM binary that was built automatically. :tada:
See [Actions](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for more details.
labels: dependencies