Release #114
Workflow file for this run
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: Release | |
on: | |
push: | |
tags: | |
- 'v[0-9]+*' | |
workflow_dispatch: | |
env: | |
GH_TOKEN: ${{ github.token }} | |
jobs: | |
# create a release on github | |
create-release: | |
runs-on: ubuntu-latest | |
if: "startsWith(github.ref, 'refs/tags/')" | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Create new release | |
run: | | |
# remove leading 'v' in tag name | |
gh release create -d v${GITHUB_REF_NAME#v} | |
capi-macos: | |
runs-on: macos-latest | |
strategy: | |
matrix: | |
target: [x86_64-apple-darwin, aarch64-apple-darwin] | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Compile library | |
run: | | |
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --target=${{ matrix.target }} | |
cargo install --locked cargo-c | |
cd pineappl_capi | |
cargo cinstall --destdir=prefix --library-type=cdylib --locked --prefix=/ --target=${{ matrix.target }} --verbose | |
cd prefix | |
tar czf ../../pineappl_capi-${{ matrix.target }}.tar.gz . | |
- name: Upload artifact | |
# as long as we need v3 in `capi-linux` we also must use it here | |
uses: actions/upload-artifact@v3 | |
with: | |
name: pineappl_capi-${{ matrix.target }} | |
path: pineappl_capi-${{ matrix.target }}.tar.gz | |
cli-macos: | |
strategy: | |
matrix: | |
include: | |
- os: macos-13 | |
target: x86_64-apple-darwin | |
- os: macos-14 | |
# we cannot cross-compile, because we need also all dependencies for the specified target | |
target: aarch64-apple-darwin | |
runs-on: ${{ matrix.os }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Compile binary | |
run: | | |
brew tap davidchall/hep | |
# install LHAPDF | |
brew install lhapdf | |
# install APPLgrid's dependencies; disable ROOT because its static libraries are missing | |
brew install --only-dependencies --without-hoppet --without-lhapdf --without-root applgrid | |
# install zlib, which is a dependency of APPLgrid but somehow missing | |
brew install zlib | |
# APPLgrid wants to be linked against zlib, and we need to find its static library via pkg-config | |
export PKG_CONFIG_PATH=$(find $(brew --cellar) -name '*.pc' -exec dirname {} + | sort -u | tr '\n' ':') | |
# manually compile APPLgrid, because we need the file `appl_igrid.h` and the files it includes, which are possibly generated | |
export HOMEBREW_TEMP="$(pwd)"/tmp | |
mkdir -p ${HOMEBREW_TEMP} | |
brew install --build-from-source --keep-tmp --without-hoppet --without-lhapdf --without-root applgrid | |
export APPL_IGRID_DIR=$(find ${HOMEBREW_TEMP} -name appl_igrid.h -exec dirname {} +) | |
# do not link against `gfortran` | |
sed 's/-lgfortran//g' $(command -v applgrid-config) > applgrid-config.new | |
mv applgrid-config.new $(command -v applgrid-config) | |
chmod +x $(command -v applgrid-config) | |
# install fastNLO | |
brew install --without-fastjet fastnlo | |
# install Rust | |
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-host=${{ matrix.target }} | |
# build the CLI | |
cargo install --all-features --locked --path pineappl_cli --root=prefix --target=${{ matrix.target }} | |
# build manpages | |
mkdir -p prefix/share/man/man1 | |
cargo xtask install-manpages prefix/share/man/man1 | |
cd prefix | |
tar czf ../pineappl_cli-${{ matrix.target }}.tar.gz . | |
- name: Upload artifact | |
# as long as we need v3 in `cli-linux` we also must use it here | |
uses: actions/upload-artifact@v3 | |
with: | |
name: pineappl_cli-${{ matrix.target }} | |
path: pineappl_cli-${{ matrix.target }}.tar.gz | |
cli-wheel-macos: | |
strategy: | |
matrix: | |
include: | |
- os: macos-13 | |
target: x86_64 | |
- os: macos-14 | |
# we cannot cross-compile, because we need also all dependencies for the specified target | |
target: aarch64 | |
runs-on: ${{ matrix.os }} | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-python@v5 | |
with: | |
# WARNING: be careful with the ordering - the last version is the | |
# default one. Apparently maturin doesn't find all Python versions | |
# when one chooses a PyPy version instead of CPython as default | |
python-version: | | |
pypy3.8 | |
pypy3.9 | |
pypy3.10 | |
3.8 | |
3.9 | |
3.11 | |
3.12 | |
3.10 | |
- name: Install dependencies | |
run: | | |
brew tap davidchall/hep | |
# install LHAPDF | |
brew install lhapdf | |
# install APPLgrid's dependencies; disable ROOT because its static libraries are missing | |
brew install --only-dependencies --without-hoppet --without-lhapdf --without-root applgrid | |
# install zlib, which is a dependency of APPLgrid but somehow missing | |
brew install zlib | |
# APPLgrid wants to be linked against zlib, and we need to find its static library via pkg-config | |
echo "PKG_CONFIG_PATH=$(find $(brew --cellar) -name '*.pc' -exec dirname {} + | sort -u | tr '\n' ':')" >> ${GITHUB_ENV} | |
# manually compile APPLgrid, because we need the file `appl_igrid.h` and the files it includes, which are possibly generated | |
export HOMEBREW_TEMP="$(pwd)"/tmp | |
mkdir -p ${HOMEBREW_TEMP} | |
brew install --build-from-source --keep-tmp --without-hoppet --without-lhapdf --without-root applgrid | |
echo "APPL_IGRID_DIR=$(find ${HOMEBREW_TEMP} -name appl_igrid.h -exec dirname {} +)" >> ${GITHUB_ENV} | |
# do not link against `gfortran` | |
sed 's/-lgfortran//g' $(command -v applgrid-config) > applgrid-config.new | |
mv applgrid-config.new $(command -v applgrid-config) | |
chmod +x $(command -v applgrid-config) | |
# install fastNLO | |
brew install --without-fastjet fastnlo | |
- name: Build wheels | |
uses: PyO3/maturin-action@v1 | |
with: | |
target: ${{ matrix.target }} | |
args: --release --out dist --find-interpreter --manifest-path pineappl_cli/Cargo.toml | |
sccache: "true" | |
- name: Upload wheels | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ github.job }}-${{ matrix.target }} | |
path: dist | |
capi-linux: | |
runs-on: ubuntu-latest | |
container: ghcr.io/nnpdf/pineappl-ci:latest | |
strategy: | |
matrix: | |
target: [x86_64-unknown-linux-gnu] | |
steps: | |
# checkout@v4 uses a newer version of Node that's incompatible with our container's GLIBC | |
- uses: actions/checkout@v3 | |
- name: Compile library | |
run: | | |
cd pineappl_capi | |
cargo cinstall --destdir=prefix --library-type=cdylib --locked --prefix=/ --target=${{ matrix.target }} --verbose | |
cd prefix | |
tar czf ../../pineappl_capi-${{ matrix.target }}.tar.gz . | |
# print the glibc version requirement | |
objdump -T lib/libpineappl_capi.so | grep GLIBC | sed 's/.*GLIBC_\([.0-9]*\).*/\1/g' | sort -Vu | tail -1 | |
- name: Upload artifact | |
# upload-artifact@v4 uses a newer version of Node that's incompatible with our container's GLIBC | |
uses: actions/upload-artifact@v3 | |
with: | |
name: pineappl_capi-${{ matrix.target }} | |
path: pineappl_capi-${{ matrix.target }}.tar.gz | |
cli-linux: | |
runs-on: ubuntu-latest | |
container: ghcr.io/nnpdf/pineappl-ci:latest | |
strategy: | |
matrix: | |
target: [x86_64-unknown-linux-gnu] | |
steps: | |
# checkout@v4 uses a newer version of Node that's incompatible with our container's GLIBC | |
- uses: actions/checkout@v3 | |
- name: Compile binary | |
run: | | |
cargo install --all-features --locked --path pineappl_cli --root=prefix --target=${{ matrix.target }} -vv | |
# build manpages | |
mkdir -p prefix/share/man/man1 | |
cargo xtask install-manpages prefix/share/man/man1 | |
cd prefix | |
tar czf ../pineappl_cli-${{ matrix.target }}.tar.gz . | |
# print the dynamically linked libraries | |
ldd bin/pineappl | |
- name: Upload artifact | |
# upload-artifact@v4 uses a newer version of Node that's incompatible with our container's GLIBC | |
uses: actions/upload-artifact@v3 | |
with: | |
name: pineappl_cli-${{ matrix.target }} | |
path: pineappl_cli-${{ matrix.target }}.tar.gz | |
cli-wheel-linux: | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
target: [x86_64] | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Build wheels | |
uses: PyO3/maturin-action@v1 | |
with: | |
target: ${{ matrix.target }} | |
container: ghcr.io/nnpdf/pineappl-ci:latest | |
# `--find-interpreter` is needed to generate wheels for *all* Python versions | |
args: --release --out dist --find-interpreter --manifest-path pineappl_cli/Cargo.toml | |
sccache: "true" | |
manylinux: auto | |
- name: Upload wheels | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ github.job }}-${{ matrix.target }} | |
path: dist | |
# publish a release on github and upload pre-built CAPI | |
publish-release: | |
needs: [capi-macos, cli-macos, capi-linux, cli-linux] | |
runs-on: ubuntu-latest | |
if: "startsWith(github.ref, 'refs/tags/')" | |
steps: | |
- uses: actions/checkout@v4 | |
# version must match the one used in `actions/upload-artifact` | |
- uses: actions/download-artifact@v3 | |
with: | |
path: artifacts | |
- name: Create new release | |
run: | | |
# remove leading 'v' in tag name | |
version=${GITHUB_REF_NAME#v} | |
prerelease=$(echo ${version} | perl -pe 's/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/\4/') | |
if [[ ${prerelease} == "" ]]; then | |
# extract the previous version number | |
old_version=$(sed -n 's/^## \[\(.*\)\] - .*/\1/p' CHANGELOG.md | tail +2 | head -n 1) | |
# extract news for the current version from the changelog file, dismissing | |
# empty lines at the start and the end | |
news=$(sed -n "/\\[${version}\\]/, /\\[${old_version}\\]/{ /\\[${old_version}\\]/! p }" \ | |
CHANGELOG.md | sed -e :a -e '/./,$!d;/^\n*$/{$d;N;};/\n$/ba') | |
gh release edit v${version} -n "${news}" | |
else | |
gh release edit v${version} -n "" --prerelease | |
fi | |
find artifacts -name 'pineappl*' -type f -exec gh release upload v${version} {} + | |
gh release edit v${version} --draft=false | |
publish-crates: | |
runs-on: ubuntu-latest | |
if: "startsWith(github.ref, 'refs/tags/')" | |
container: ghcr.io/nnpdf/pineappl-ci:latest | |
steps: | |
# checkout@v4 uses a newer version of Node that's incompatible with our container's GLIBC | |
- uses: actions/checkout@v3 | |
- name: Publish all crates | |
env: | |
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} | |
run: | | |
# this must be at least Rust 1.66 to support waiting for dependencies to on crates.io: | |
# https://github.com/rust-lang/cargo/blob/master/CHANGELOG.md#cargo-166-2022-12-15 | |
rustup default stable | |
cd pineappl | |
cargo publish | |
cd ../pineappl_applgrid | |
cargo publish | |
cd ../pineappl_fastnlo | |
cargo publish | |
cd ../pineappl_capi | |
cargo publish | |
cd ../pineappl_cli | |
cargo publish | |
wheels-linux: | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
target: [x86_64] | |
steps: | |
- uses: actions/checkout@v4 | |
# for Linux the wheels are built in a container, so we don't need the `setup-python` action | |
- name: Build wheels | |
uses: PyO3/maturin-action@v1 | |
with: | |
target: ${{ matrix.target }} | |
# `--find-interpreter` is needed to generate wheels for *all* Python versions | |
args: --release --out dist --find-interpreter --manifest-path pineappl_py/Cargo.toml | |
sccache: 'true' | |
manylinux: auto | |
- name: Upload wheels | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ github.job }}-${{ matrix.target }} | |
path: dist | |
wheels-macos: | |
runs-on: macos-13 | |
strategy: | |
matrix: | |
target: [aarch64, x86_64] | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-python@v5 | |
with: | |
# WARNING: be careful with the ordering - the last version is the default one. Apparently | |
# maturin doesn't find all Python versions when one chooses a PyPy version instead of | |
# CPython as default | |
python-version: | | |
pypy3.7 | |
pypy3.8 | |
pypy3.9 | |
pypy3.10 | |
3.7 | |
3.8 | |
3.9 | |
3.11 | |
3.12 | |
3.10 | |
- name: Build wheels | |
uses: PyO3/maturin-action@v1 | |
with: | |
target: ${{ matrix.target }} | |
args: --release --out dist --find-interpreter --manifest-path pineappl_py/Cargo.toml | |
sccache: 'true' | |
- name: Upload wheels | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ github.job }}-${{ matrix.target }} | |
path: dist | |
wheels-sdist: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Build sdist | |
uses: PyO3/maturin-action@v1 | |
with: | |
command: sdist | |
args: --out dist --manifest-path pineappl_py/Cargo.toml | |
- name: Upload sdist | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ github.job }} | |
path: dist | |
wheels-windows: | |
runs-on: windows-latest | |
strategy: | |
matrix: | |
target: [x64] | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-python@v5 | |
with: | |
# WARNING: be careful with the ordering - the last version is the default one. Apparently | |
# maturin doesn't find all Python versions when one chooses a PyPy version instead of | |
# CPython as default | |
python-version: | | |
pypy3.7 | |
pypy3.8 | |
pypy3.9 | |
pypy3.10 | |
3.7 | |
3.8 | |
3.9 | |
3.11 | |
3.12 | |
3.10 | |
architecture: ${{ matrix.target }} | |
- name: Build wheels | |
uses: PyO3/maturin-action@v1 | |
with: | |
target: ${{ matrix.target }} | |
args: --release --out dist --find-interpreter --manifest-path pineappl_py/Cargo.toml | |
sccache: 'true' | |
- name: Upload wheels | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ github.job }}-${{ matrix.target }} | |
path: dist | |
release-wheels: | |
runs-on: ubuntu-latest | |
if: "startsWith(github.ref, 'refs/tags/')" | |
needs: [wheels-linux, wheels-macos, wheels-sdist, wheels-windows] | |
steps: | |
- uses: actions/download-artifact@v4 | |
with: | |
pattern: wheels-* | |
merge-multiple: true | |
- name: Publish to PyPI | |
uses: PyO3/maturin-action@v1 | |
env: | |
MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} | |
with: | |
command: upload | |
args: --skip-existing * |