Run build on macos-13 #676
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: build | |
on: | |
push: | |
pull_request: | |
jobs: | |
# Quickly check with flake8 without having to go through the whole build: | |
flake8: | |
name: "Fast flake8" | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
# Check on lowest supported python version to catch syntax errors: | |
- uses: actions/setup-python@v5 | |
with: { python-version: "3.7" } | |
- run: pip install flake8 | |
- run: flake8 | |
build_linux: | |
name: "Build: Linux (x64)" | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
base: | |
- manylinux2014_x86_64 | |
- manylinux2014_aarch64 | |
steps: | |
- uses: actions/checkout@v4 | |
- run: echo "MADX_VERSION=$(cat MADX_VERSION)" >> $GITHUB_ENV | |
- name: Download cached MAD-X build | |
id: madx-build-cache | |
uses: actions/cache@v4 | |
with: | |
path: src/MAD-X/dist | |
key: "\ | |
madx-${{ env.MADX_VERSION }}-\ | |
${{ matrix.base }}-\ | |
patches-${{ hashFiles('.github/patch/*') }}-\ | |
scripts-${{ hashFiles('.github/build/linux/madx*') }}\ | |
" | |
- run: git clone https://github.com/MethodicalAcceleratorDesign/MAD-X | |
src/MAD-X -b $MADX_VERSION --depth 1 | |
if: steps.madx-build-cache.outputs.cache-hit != 'true' | |
- name: Set up QEMU for running arm64 containers | |
if: endsWith(matrix.base, '_aarch64') | |
uses: docker/setup-qemu-action@v3 | |
- name: Prepare docker image | |
run: | | |
docker buildx build .github/build/linux \ | |
--build-arg UID=`id -u` \ | |
--build-arg GID=`id -g` \ | |
--build-arg BASE=${{ matrix.base }} \ | |
-t builder | |
shell: bash | |
- name: Build MAD-X | |
if: steps.madx-build-cache.outputs.cache-hit != 'true' | |
run: | | |
docker run --rm --init \ | |
-w /mnt \ | |
-v `pwd`:/mnt \ | |
builder \ | |
.github/build/linux/madx.sh src/MAD-X build/MAD-X dist/MAD-X | |
shell: bash | |
- name: Build cpymad wheels | |
run: | | |
docker run --rm --init \ | |
-w /mnt \ | |
-v `pwd`:/mnt \ | |
builder \ | |
.github/build/linux/cpymad.sh dist/MAD-X | |
shell: bash | |
- name: Upload cpymad wheels | |
uses: actions/upload-artifact@v4 | |
with: | |
name: dist-linux-${{ matrix.base }} | |
path: | | |
dist/ | |
!dist/MAD-X | |
build_windows: | |
name: "Build: Windows" | |
runs-on: windows-latest | |
defaults: | |
run: | |
shell: msys2 {0} | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: msys2/setup-msys2@v2 | |
with: | |
update: true | |
path-type: inherit | |
install: mingw-w64-ucrt-x86_64-gcc | |
mingw-w64-ucrt-x86_64-gcc-fortran | |
mingw-w64-ucrt-x86_64-cmake | |
- run: echo "MSYSTEM=UCRT64" >> $GITHUB_ENV | |
- run: echo "MADX_VERSION=$(cat MADX_VERSION)" >> $GITHUB_ENV | |
- name: Download cached MAD-X build | |
id: madx-build-cache | |
uses: actions/cache@v4 | |
with: | |
path: src/MAD-X/dist | |
key: "\ | |
madx-${{ env.MADX_VERSION }}-\ | |
windows-\ | |
patches-${{ hashFiles('.github/patch/*') }}-\ | |
scripts-${{ hashFiles('.github/build/windows/madx*') }}\ | |
" | |
- run: git clone https://github.com/MethodicalAcceleratorDesign/MAD-X | |
src/MAD-X -b $MADX_VERSION --depth 1 | |
if: steps.madx-build-cache.outputs.cache-hit != 'true' | |
- name: Apply patches | |
if: steps.madx-build-cache.outputs.cache-hit != 'true' | |
run: patch -d src/MAD-X -p1 <.github/patch/fix-madx-win32.patch | |
- name: Build MAD-X | |
if: steps.madx-build-cache.outputs.cache-hit != 'true' | |
run: .github/build/windows/madx.sh src/MAD-X | |
- uses: actions/setup-python@v5 | |
with: {python-version: "3.6"} | |
- run: .github/build/windows/cpymad.sh src/MAD-X/dist 3.6 | |
- uses: actions/setup-python@v5 | |
with: {python-version: "3.7"} | |
- run: .github/build/windows/cpymad.sh src/MAD-X/dist 3.7 | |
- uses: actions/setup-python@v5 | |
with: {python-version: "3.8"} | |
- run: .github/build/windows/cpymad.sh src/MAD-X/dist 3.8 | |
- uses: actions/setup-python@v5 | |
with: {python-version: "3.9"} | |
- run: .github/build/windows/cpymad.sh src/MAD-X/dist 3.9 | |
- uses: actions/setup-python@v5 | |
with: {python-version: "3.10"} | |
- run: .github/build/windows/cpymad.sh src/MAD-X/dist 3.10 | |
- uses: actions/setup-python@v5 | |
with: {python-version: "3.11"} | |
- run: .github/build/windows/cpymad.sh src/MAD-X/dist 3.11 | |
- uses: actions/setup-python@v5 | |
with: {python-version: "3.12"} | |
- run: .github/build/windows/cpymad.sh src/MAD-X/dist 3.12 | |
- name: Upload cpymad wheels | |
uses: actions/upload-artifact@v4 | |
with: | |
name: dist-windows | |
path: dist | |
build_macos: | |
name: "Build: MacOS" | |
runs-on: macos-13 | |
strategy: | |
matrix: | |
arch: | |
- x86_64 | |
- arm64 | |
steps: | |
- uses: actions/checkout@v4 | |
- run: echo "MADX_VERSION=$(cat MADX_VERSION)" >> $GITHUB_ENV | |
- name: Download cached MAD-X build | |
id: madx-build-cache | |
uses: actions/cache@v4 | |
with: | |
path: src/MAD-X/dist | |
key: "\ | |
madx-${{ env.MADX_VERSION }}-\ | |
macos-${{ matrix.arch }}-\ | |
patches-${{ hashFiles('.github/patch/*') }}-\ | |
scripts-${{ hashFiles('.github/build/macos/madx*') }}\ | |
" | |
- run: git clone https://github.com/MethodicalAcceleratorDesign/MAD-X | |
src/MAD-X -b $MADX_VERSION --depth 1 | |
if: steps.madx-build-cache.outputs.cache-hit != 'true' | |
# Select matching Xcode and SDK, see: https://xcodereleases.com/ | |
- run: | | |
sudo xcode-select -switch /Applications/Xcode_12.5.1.app | |
echo "SDKROOT=$(xcrun --show-sdk-path)" >> $GITHUB_ENV | |
- name: Setup gfortran | |
run: | | |
set -xeo pipefail | |
if [[ ${{ matrix.arch }} == "x86_64" ]]; then | |
FC=gfortran-11 | |
LIBDIR=$(dirname $(find /usr/local/Cellar/gcc@11 -name libgfortran.dylib)) | |
echo "MACOSX_DEPLOYMENT_TARGET=11.0" >> $GITHUB_ENV | |
elif [[ ${{ matrix.arch }} == "arm64" ]]; then | |
# See: https://github.com/MacPython/gfortran-install | |
name=gfortran-darwin-arm64-cross | |
curl -L -O https://github.com/isuruf/gcc/releases/download/gcc-11.3.0-2/${name}.tar.gz | |
sudo tar -f ${name}.tar.gz -C /opt -xzv | |
rm ${name}.tar.gz | |
FC=$(find /opt/${name}/bin -name "*-gfortran") | |
LIBDIR=$(dirname $(find /opt/${name}/lib -name libgfortran.dylib)) | |
# See: https://github.com/pypa/cibuildwheel/discussions/997 | |
echo "ARCHFLAGS=-arch arm64" >> $GITHUB_ENV | |
echo "_PYTHON_HOST_PLATFORM=macosx-11.0-arm64" >> $GITHUB_ENV | |
echo "MACOSX_DEPLOYMENT_TARGET=11.0" >> $GITHUB_ENV | |
fi | |
LDFLAGS="-L$LIBDIR -Wl,-rpath,$LIBDIR" | |
echo "FC=$FC" >> $GITHUB_ENV # for cmake | |
echo "LDFLAGS=$LDFLAGS" >> $GITHUB_ENV # for setuptools | |
echo "LIBDIR=$LIBDIR" >> $GITHUB_ENV # for delocate step | |
- name: Build MAD-X | |
if: steps.madx-build-cache.outputs.cache-hit != 'true' | |
run: .github/build/macos/madx.sh src/MAD-X ${{ matrix.arch }} | |
- uses: actions/setup-python@v5 | |
with: { python-version: "3.6" } | |
- run: .github/build/macos/cpymad.sh src/MAD-X/dist | |
- uses: actions/setup-python@v5 | |
with: { python-version: "3.7" } | |
- run: .github/build/macos/cpymad.sh src/MAD-X/dist | |
- uses: actions/setup-python@v5 | |
with: { python-version: "3.8" } | |
- run: .github/build/macos/cpymad.sh src/MAD-X/dist | |
- uses: actions/setup-python@v5 | |
with: { python-version: "3.9" } | |
- run: .github/build/macos/cpymad.sh src/MAD-X/dist | |
- uses: actions/setup-python@v5 | |
with: { python-version: "3.10" } | |
- run: .github/build/macos/cpymad.sh src/MAD-X/dist | |
- uses: actions/setup-python@v5 | |
with: { python-version: "3.11" } | |
- run: .github/build/macos/cpymad.sh src/MAD-X/dist | |
- uses: actions/setup-python@v5 | |
with: { python-version: "3.12" } | |
- run: .github/build/macos/cpymad.sh src/MAD-X/dist | |
- name: Fixup wheel dependencies | |
run: | | |
pip3 install delocate | |
DYLD_LIBRARY_PATH=$LIBDIR delocate-wheel dist/*.whl | |
DYLD_LIBRARY_PATH=$LIBDIR delocate-listdeps --all dist/*.whl | |
- name: Upload cpymad wheels | |
uses: actions/upload-artifact@v4 | |
with: | |
name: dist-macos-${{ matrix.arch }} | |
path: dist | |
test: | |
name: Tests | |
runs-on: ${{ matrix.os.run }} | |
needs: [build_linux, build_windows, build_macos] | |
strategy: | |
matrix: | |
os: | |
- {run: ubuntu-latest, dist: dist-linux-manylinux2014_x86_64} | |
- {run: windows-latest, dist: dist-windows} | |
- {run: macos-latest, dist: dist-macos-arm64} | |
- {run: macos-13, dist: dist-macos-x86_64} | |
python: | |
- '3.7' | |
- '3.8' | |
- '3.9' | |
- '3.10' | |
- '3.11' | |
- '3.12' | |
- '3.13' | |
exclude: | |
- os: {run: macos-latest} | |
python: '3.7' | |
defaults: | |
run: | |
shell: bash | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ matrix.python }} | |
- name: Download cpymad wheels | |
uses: actions/download-artifact@v4 | |
with: | |
name: ${{ matrix.os.dist }} | |
path: dist | |
- name: Install cpymad from wheel | |
run: | | |
set -ex | |
python -m pip install -U pip || sudo python -m pip install -U pip | |
pip install cpymad -f dist --no-index --no-deps | |
pip install cpymad | |
- run: pip install flake8 twine coverage coveralls pytest | |
- run: twine check dist/* | |
- run: flake8 | |
- run: coverage run --source=cpymad -p -m pytest -v -k "not dframe" | |
- run: pip install pandas | |
- run: coverage run --source=cpymad -p -m pytest -v -k "dframe" | |
- run: coverage combine | |
- run: coveralls | |
if: inputs.COVERALLS_REPO_TOKEN != '' | |
env: | |
COVERALLS_REPO_TOKEN: ${{ inputs.COVERALLS_REPO_TOKEN }} | |
documentation: | |
name: Update documentation | |
needs: build_linux | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-python@v5 | |
with: | |
python-version: '3.9' | |
- uses: actions/download-artifact@v4 | |
with: | |
name: dist-linux-manylinux2014_x86_64 | |
path: dist | |
- run: sudo apt-get install -qy graphviz | |
- run: pip install -U pip | |
- run: pip install cpymad[doc] -f dist | |
- run: make -C doc html | |
- name: Deploy to GitHub Pages | |
if: success() && ( | |
startsWith(github.ref, 'refs/tags/v') || | |
github.ref == 'refs/heads/master') | |
uses: crazy-max/ghaction-github-pages@v4 | |
with: | |
build_dir: doc/_build/html | |
commit_message: Build documentation from ${{ github.ref }}@${{ github.sha }} | |
jekyll: false | |
env: | |
GITHUB_TOKEN: ${{ github.token }} | |
upload_release: | |
name: Upload release | |
needs: test | |
runs-on: ubuntu-latest | |
if: startsWith(github.ref, 'refs/tags/v') | |
steps: | |
- uses: actions/setup-python@v5 | |
with: | |
python-version: '3.x' | |
- name: Fetch built distributions | |
uses: actions/download-artifact@v4 | |
with: | |
path: dist | |
- name: Merge artifacts to single folder | |
run: | | |
mv dist/dist-*/*.whl dist/ | |
mv dist/dist-linux-manylinux2014_x86_64/*.tar.gz dist/ | |
- name: Install twine | |
run: pip install twine | |
- name: Publish PyPI package | |
env: | |
TWINE_USERNAME: __token__ | |
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} | |
run: twine upload dist/*.whl dist/*.tar.gz | |
- name: Create GitHub Release | |
uses: softprops/action-gh-release@v2 | |
if: startsWith(github.ref, 'refs/tags/v') | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |