Skip to content

Release

Release #60

Workflow file for this run

name: Release
on:
push:
tags:
- 'v[0-9]+*'
workflow_dispatch:
env:
GH_TOKEN: ${{ github.token }}
LHAPDF_V: '6.4.0'
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 cargo-c
cd pineappl_capi
cargo cinstall --verbose --destdir=prefix --library-type=cdylib --prefix=/ --target=${{ matrix.target }}
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:
os: [macos-latest, macos-14]
include:
- os: macos-latest
target: x86_64-apple-darwin
- os: macos-14
target: aarch64-apple-darwin
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- name: Compile binary
run: |
# install LHAPDF
curl "https://lhapdf.hepforge.org/downloads/?f=LHAPDF-${{ env.LHAPDF_V }}.tar.gz" | tar xzf -
cd LHAPDF-${{ env.LHAPDF_V }}
./configure --disable-dynamic --enable-static
make -j V=1
make install
cd ..
# install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-host=${{ matrix.target }}
# build the CLI
cargo build --release --features=evolve,fktable,static --bin pineappl --target=${{ matrix.target }}
# package the CLI
cp target/release/pineappl prefix/bin/
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
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 --verbose --destdir=prefix --library-type=cdylib --prefix=/ --target=${{ matrix.target }}
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 build --release --all-features --bin pineappl
mkdir -p prefix/bin
cp target/release/pineappl prefix/bin/
cd prefix
tar czf ../pineappl_cli-${{ matrix.target }}.tar.gz .
- 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
# 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-eol-linux:
runs-on: ubuntu-latest
strategy:
matrix:
target: [x86_64]
steps:
- uses: actions/checkout@v4
- name: Patch Cargo.toml
run: |
# - older maturin versions don't support metadata inheritance - overwrite it explicitly
# - use '@' separator since 'repository' contains slashes
# - downgrade both `numpy` and `pyo3` to the last version that support Python 3.6
sed -i \
-e "s@categories.workspace = true@$(grep '^categories' Cargo.toml)@" \
-e "s@edition.workspace = true@$(grep '^edition' Cargo.toml)@" \
-e "s@keywords.workspace = true@$(grep '^keywords' Cargo.toml)@" \
-e "s@license.workspace = true@$(grep '^license' Cargo.toml)@" \
-e "s@repository.workspace = true@$(grep '^repository' Cargo.toml)@" \
-e "s@rust-version.workspace = true@$(grep '^rust-version' Cargo.toml)@" \
-e "s@version.workspace = true@$(grep '^version' Cargo.toml)@" \
-e "s@^numpy = .*@numpy = \"0.14.1\"@" \
-e "s@^pyo3 = .*@pyo3 = { features = [\"extension-module\"], version = \"0.14.5\" }@" \
pineappl_py/Cargo.toml
# the previous command is very fragile, so print the file contents to check it
cat pineappl_py/Cargo.toml
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.target }}
args: --release -i python3.6 --out dist --no-sdist --manifest-path pineappl_py/Cargo.toml
sccache: 'true'
manylinux: auto
# this is the latest version to support Python 3.6
maturin-version: 0.12.20
- name: Upload wheels
uses: actions/upload-artifact@v4
with:
name: ${{ github.job }}-${{ matrix.target }}
path: dist
wheels-macos:
runs-on: macos-latest
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:
name: Release
runs-on: ubuntu-latest
if: "startsWith(github.ref, 'refs/tags/')"
needs: [wheels-eol-linux, 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 *