Skip to content

Publish Packages

Publish Packages #102

Workflow file for this run

name: Publish Packages
on:
workflow_dispatch:
inputs:
origen_metal_python_package:
description: Publish the Origen Metal python package
default: "false"
type: choice
options:
- true
- false
origen_python_package:
description: Publish the Origen python package
default: "false"
type: choice
options:
- true
- false
# build_for_debug_target:
# description: If 'true', does not use the '--release' switch when building Rust libraries
# required: false
# default: "false"
publish_pypi:
description: Publish built packages to PyPi
required: true
default: "false"
type: choice
options:
- true
- false
publish_pypi_test:
description: Publish To PyPI Test Server
required: true
default: "false"
type: choice
options:
- true
- false
publish_github_release:
description: Publish built packages to Github Release page
required: true
default: "false"
type: choice
options:
- true
- false
prerelease:
description: Indicate that any release is a pre/dev release
required: true
default: "true"
type: choice
options:
- true
- false
# id:
# description: Set the run ID to a known value
# required: false
# type: number
env:
om_ver_file: om_version
origen_ver_file: origen_version
jobs:
precheck:
# Need to make sure that only one publish action is running at a time to avoid releases stepping on each other.
# GA's concurrency only allows for this job replacing previous jobs, but we want the opposite, otherwise we might end up
# with imcomplete or duplicate releases.
runs-on: ubuntu-latest
steps:
- name: Query Concurrency
id: query-concurrency
uses: fkirc/skip-duplicate-actions@v5
with:
concurrent_skipping: 'always'
do_not_skip: '[]'
- name: Check Concurrency
uses: actions/github-script@v7
if: ${{ steps.query-concurrency.outputs.should_skip == 'true' }}
with:
script: |
core.setFailed('Found existing publish workflow: ${{ steps.query-concurrency.outputs.skipped_by.htmlUrl }}')
build_om_linux:
strategy:
fail-fast: false
matrix:
python-version: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
needs: [precheck]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
python-version: 3.9
architecture: x64
- name: Add build system to pyproject.toml
working-directory: python/origen_metal
run: |
echo "[build-system]" >> pyproject.toml
echo "requires = [\"maturin>=1.0,<2.0\"]" >> pyproject.toml
echo "build-backend = \"maturin\"" >> pyproject.toml
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
target: x86_64
manylinux: auto
# This is required to fix an SSL build error
before-script-linux: yum install perl-IPC-Cmd -y
args: --release --strip --out dist --manifest-path rust/pyapi_metal/Cargo.toml --interpreter python${{ matrix.python-version }}
- name: Install Poetry
run: |
pip install poetry==1.3.2
poetry --version
- name: Get OM Python Package Version
working-directory: python/origen_metal
run: poetry version -s > ${{ env.om_ver_file }}
- name: Upload wheels
uses: actions/upload-artifact@v3
with:
name: om_wheels
path: python/origen_metal/dist/*
# SMcG - Couldn't get this to work with the manylinux2014_x86_64 container, I think the approach of running everything
# inside the manylinux container is wrong since many current Github action packages will not run in it.
# I've fixed what I can and it gets far enough to build the wheels, but hit a roadblock since the actions/upload-artifact
# step needs v1 to run in the container but this doesn't support the current Github actions workspace path
#
# I've switched the OM build to use the Maturin action instead and I would recommend that the Origen job does similar
# in the future, it should be possible to include extra files like the origen binary in the wheel with Maturin.
#build_manylinux:
# strategy:
# fail-fast: false
# matrix:
# python-version: ${{ fromJSON(vars.PYTHON_VERSIONS_FOR_RELEASE) }}
# needs: [precheck]
# runs-on: ubuntu-latest
# container:
# image: quay.io/pypa/manylinux2014_x86_64
# options: --user root
# steps:
# - name: Show Env
# run: |
# pwd
# echo "ROOT_DIR=$PWD" >> $GITHUB_ENV
# env
# echo "HOME=/root" >> $GITHUB_ENV
# - uses: actions/checkout@v1
# - name: Install Rust
# run: |
# curl https://sh.rustup.rs -sSf | sh -s -- -y
# echo "$HOME/.cargo/bin" >> $GITHUB_PATH
# - name: Set Rust Version
# run: |
# rustup install ${{ fromJSON(vars.RUST_VERSION) }}
# rustup default ${{ fromJSON(vars.RUST_VERSION) }}
# - name: Check Rust Version
# run: |
# rustc --version
# cargo --version
# - name: Install Newer OpenSSL
# run: |
# curl -O -L https://www.openssl.org/source/openssl-1.1.1w.tar.gz
# ls -al openssl-1.1.1w.tar.gz
# tar zxf openssl-1.1.1w.tar.gz
# cd openssl-1.1.1w
# ./config
# make
# make install
# - name: Save Minor Python Version
# run: |
# IFS='.' read -r -a SPLIT_VER <<< ${{ matrix.python-version }}
# M_VER=${SPLIT_VER[0]}.${SPLIT_VER[1]}
# echo $M_VER
# echo "PY_M_VER=$M_VER" >> $GITHUB_ENV
# - name: Install libffi for Python 3.12+
# if: ${{ fromJSON(env.PY_M_VER) >= 3.12 }}
# run: |
# yum install libffi-devel -y
# ldconfig
# - name: Install Python
# run: |
# ls $ROOT_DIR/openssl-1.1.1w
# curl -O https://www.python.org/ftp/python/${{ matrix.python-version }}/Python-${{ matrix.python-version }}.tgz
# tar zxf Python-${{ matrix.python-version }}.tgz
# cd Python-${{ matrix.python-version }}
# ./configure --with-openssl=$ROOT_DIR/openssl-1.1.1w --prefix=/root/python --enable-optimizations --enable-shared
# make altinstall
# - name: Copy Python Shared Library (Python 3.7)
# if: ${{ matrix.python-version == '3.7.17' }}
# run: |
# echo $PY_M_VER
# cd Python-${{ matrix.python-version }}
# ls
# cp libpython$PY_M_VER\m.so.1.0 /usr/local/lib64/
# - name: Copy Python Shared Library (Python 3.8+ Versions)
# if: ${{ matrix.python-version != '3.7.17' }}
# run: |
# echo $PY_M_VER
# cd Python-${{ matrix.python-version }}
# ls
# cp libpython$PY_M_VER.so.1.0 /usr/local/lib64/
#
# # - name: Update LD_LIBRARY_PATH
# # run: |
# # echo $LD_LIBRARY_PATH
# # echo "LD_LIBRARY_PATH=/Python-${{ matrix.python-version }}:$LD_LIBRARY_PATH" >> $GITHUB_ENV
# - name: Check LD_LIBRARY_PATH
# run: |
# echo $LD_LIBRARY_PATH
# - name: Alias Python and Pip binaries
# run: |
# echo $PY_M_VER
# ls /root/python/bin
# ln -s /root/python/bin/python$PY_M_VER /root/python/bin/python
# ln -s /root/python/bin/pip$PY_M_VER /root/python/bin/pip
# ls /root/python/bin
# - name: Update $PATH
# run: |
# echo /root/python/bin >> $GITHUB_PATH
# # # TODO: For now use pre-installed python version.
# # # In future, will probably want to download latest version
# # - name: Set Python Version (3.7 Path)
# # if: ${{ matrix.python-version == 3.7 }}
# # run: |
# # PYVER=$(echo ${{ matrix.python-version }} | sed -e "s/\.//g")
# # echo $PYVER
# # PATH_TO_PY=/opt/python/cp$PYVER-cp$PYVER\m/bin
# # echo $PATH_TO_PY
# # echo "$PATH_TO_PY" >> $GITHUB_PATH
# # - name: Set Python Version
# # if: ${{ matrix.python-version != 3.7 }}
# # run: |
# # PYVER=$(echo ${{ matrix.python-version }} | sed -e "s/\.//g")
# # echo $PYVER
# # PATH_TO_PY=/opt/python/cp$PYVER-cp$PYVER/bin
# # echo $PATH_TO_PY
# # echo "$PATH_TO_PY" >> $GITHUB_PATH
# - name: Display Python Version
# run: |
# which python
# which pip
# python --version
# pip --version
# - name: Install Poetry
# run: |
# pip install poetry==1.3.2
# poetry --version
# - name: Install Auditwheel
# run: |
# pip install setuptools
# pip install auditwheel
# auditwheel --version
# - name: Install Perl dep for ssl build
# run: |
# yum install perl-IPC-Cmd -y
# - name: Build Origen Metal Python Package
# working-directory: python/origen_metal
# run: poetry build --format wheel
# - name: Display OM Dist Directory
# working-directory: python/origen_metal
# run: ls dist
# - name: Repair OM Wheel
# working-directory: python/origen_metal
# run: |
# auditwheel show dist/*
# auditwheel repair dist/*
# - name: Display OM Wheelhouse Directory
# working-directory: python/origen_metal
# run: ls wheelhouse
# - name: Upload Origen Metal Python Package Artifact
# uses: actions/upload-artifact@v1
# with:
# name: om_wheels
# path: python/origen_metal/wheelhouse/*
# - name: Get OM Python Package Version
# working-directory: python/origen_metal
# run: poetry version -s > ${{ env.om_ver_file }}
# - name: Upload OM Python Package Version
# uses: actions/upload-artifact@v1
# with:
# name: ${{ env.om_ver_file }}
# path: python/origen_metal/${{ env.om_ver_file }}
# - name: Build Origen Python Package
# working-directory: python/origen
# run: poetry build --format wheel
# - name: Display Origen Dist Directory
# working-directory: python/origen
# run: ls dist
# - name: Repair Origen Wheel
# working-directory: python/origen
# run: |
# auditwheel show dist/*
# auditwheel repair dist/*
# - name: Display Origen Wheelhouse Directory
# working-directory: python/origen
# run: ls wheelhouse
# - name: Upload Origen Python Package Artifact
# uses: actions/upload-artifact@v1
# with:
# name: origen_wheels
# path: python/origen/wheelhouse/*
# - name: Get Origen Python Package Version
# working-directory: python/origen
# run: poetry version -s > ${{ env.origen_ver_file }}
#
# - name: Upload Origen Python Package Version
# uses: actions/upload-artifact@v1
# with:
# name: ${{ env.origen_ver_file }}
# path: python/origen/${{ env.origen_ver_file }}
# - name: Upload CLI as a standalone entity
# uses: actions/upload-artifact@v1
# with:
# name: cli
# path: python\origen\origen\__bin__\bin\origen
build_windows:
strategy:
fail-fast: false
matrix:
python-version: ${{ fromJSON(vars.PYTHON_VERSIONS) }}
needs: [precheck]
runs-on: windows-latest
steps:
- uses: actions/checkout@v2
- name: Install Rust
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: ${{ fromJSON(vars.RUST_VERSION) }}
rustflags:
- name: Override Project Rust Version
run: rustup override set ${{ fromJSON(vars.RUST_VERSION) }}
- name: Check Rust Version
run: |
rustc --version
cargo --version
- name: Setup Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Display Python Version
run: python -c "import sys; print(sys.version)"
- name: Install Poetry
run: |
pip install poetry==1.3.2
poetry --version
- name: Build Origen Metal Python Package
working-directory: python/origen_metal
run: poetry build --format wheel
- name: Display Dist Directory
working-directory: python/origen_metal/dist
run: ls
- name: Upload Origen Metal Python Package Artifact
uses: actions/upload-artifact@v3
with:
name: om_wheels
path: python/origen_metal/dist/origen_metal*
- name: Get OM Python Package Version
working-directory: python/origen_metal
run: poetry version -s > ${{ env.om_ver_file }}
- name: Upload OM Python Package Version
uses: actions/upload-artifact@v3
with:
name: ${{ env.om_ver_file }}
path: python/origen_metal/${{ env.om_ver_file }}
# - name: Build Origen CLI
# working-directory: rust/origen/cli
# run: cargo build --bins --release
# - name: Add Origen to PATH (Linux)
# if: matrix.os == 'ubuntu-latest'
# run: echo "${{ github.workspace }}/rust/origen/target/release" >> $GITHUB_PATH
# - name: Add Origen to PATH (Windows)
# if: matrix.os == 'windows-latest'
# run: echo "${{ github.workspace }}/rust/origen/target/release" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
# - name: Display Origen CLI Version
# run: origen -v
# - name: Build PyAPI
# working-directory: rust/pyapi
# run: cargo build --release
# - name: Setup App Env
# working-directory: python
# run: origen env setup
# - name: Display Origen App Version
# working-directory: python
# run: origen -v
- name: Build Origen Python Package
working-directory: python/origen
run: poetry build --format wheel
- name: Display Dist Directory
working-directory: python/origen/dist
run: ls
- name: Upload Origen Python Package Artifact
uses: actions/upload-artifact@v3
with:
name: origen_wheels
path: python/origen/dist/origen*
- name: Get Origen Python Package Version
working-directory: python/origen
run: poetry version -s > ${{ env.origen_ver_file }}
- name: Upload Origen Python Package Version
uses: actions/upload-artifact@v3
with:
name: ${{ env.origen_ver_file }}
path: python/origen/${{ env.origen_ver_file }}
# - name: "Publish To PyPi"
# if: ${{ github.event.inputs.publish_pypi }} == true
# working_directory: python
# run: |
# echo "Publishing to PyPi"
# # poetry publish ...
# - name: "Publish To PyPi Test Server"
# if: ${{ github.event.inputs.publish_pypi_test == 'true' }}
# working-directory: python
# run: |
# echo "Publishing to PyPi Test Server"
# poetry config repositories.pypi-test https://test.pypi.org/legacy/
# poetry config pypi-token.pypi-test ${{ secrets.PYPI_TEST_SERVER_API_TOKEN }}
# poetry publish -r pypi-test
# - name: pypi-publish
# if: ${{ github.event.inputs.publish_pypi_test == 'true' }}
# uses: pypa/gh-action-pypi-publish@v1.4.2
# with:
# packages_dir: python/dist/
# user: __token__
# password: ${{ secrets.PYPI_TEST_SERVER_API_TOKEN }}
# repository_url: https://test.pypi.org/legacy/
# skip_existing: true
# - name: "Publish To Github Releases"
# if: ${{ github.event.inputs.publish_github_release }} == true
# working_directory: python
# run: |
# echo "Publishing to Github Releases"
# # ...
show_wheels:
needs: [build_om_linux, build_windows]
runs-on: ubuntu-latest
steps:
- name: Retrieve OM Wheels
uses: actions/download-artifact@v3
with:
name: om_wheels
path: om_wheels
- name: List OM Wheels
run: ls -al ./om_wheels
- name: Retrieve Origen Wheels
uses: actions/download-artifact@v3
with:
name: origen_wheels
path: origen_wheels
- name: List Origen Wheels
run: ls -al ./origen_wheels
- name: Upload CLI as a standalone entity
uses: actions/upload-artifact@v3
with:
name: cli
path: python\origen\origen\__bin__\bin\origen.exe
publish_to_pypi_test:
needs: [build_om_linux, build_windows]
runs-on: ubuntu-latest
if: ${{ github.event.inputs.publish_pypi_test == 'true' }}
steps:
- name: Retrieve Wheels
uses: actions/download-artifact@v3
with:
name: om_wheels
path: om_wheels
- name: List OM Wheels
run: ls -al ./om_wheels
- name: Push To PyPi Test Server
if: ${{ github.event.inputs.origen_metal_python_package == 'true' }}
uses: pypa/gh-action-pypi-publish@v1.8.10
with:
packages-dir: om_wheels
password: ${{ secrets.PYPI_TEST_SERVER_API_TOKEN_OM }}
repository-url: https://test.pypi.org/legacy/
verify-metadata: false
verbose: true
- name: Retrieve Wheels
uses: actions/download-artifact@v3
with:
name: origen_wheels
path: origen_wheels
- name: List Origen Wheels
run: ls -al ./origen_wheels
- name: Push To PyPi Test Server
if: ${{ github.event.inputs.origen_python_package == 'true' }}
uses: pypa/gh-action-pypi-publish@v1.8.10
with:
packages-dir: origen_wheels
password: ${{ secrets.PYPI_TEST_SERVER_API_TOKEN }}
repository-url: https://test.pypi.org/legacy/
verify-metadata: false
verbose: true
publish_to_pypi:
needs: [build_om_linux, build_windows]
runs-on: ubuntu-latest
if: ${{ github.event.inputs.publish_pypi == 'true' }}
steps:
- name: Retrieve Wheels
uses: actions/download-artifact@v3
with:
name: om_wheels
path: om_wheels
- name: List OM Wheels
run: ls -al ./om_wheels
- name: Push To PyPi Server
if: ${{ github.event.inputs.origen_metal_python_package == 'true' }}
uses: pypa/gh-action-pypi-publish@v1.9.0
with:
packages-dir: om_wheels
password: ${{ secrets.PYPI_OM_API_TOKEN }}
verify-metadata: false
verbose: true
- name: Retrieve Wheels
uses: actions/download-artifact@v3
with:
name: origen_wheels
path: origen_wheels
- name: List Origen Wheels
run: ls -al ./origen_wheels
- name: Push To PyPi Server
if: ${{ github.event.inputs.origen_python_package == 'true' }}
uses: pypa/gh-action-pypi-publish@v1.9.0
with:
packages-dir: origen_wheels
password: ${{ secrets.PYPI_ORIGEN_API_TOKEN }}
verify-metadata: false
verbose: true
publish_github_release:
needs: [build_om_linux, build_windows]
runs-on: ubuntu-latest
if: ${{ github.event.inputs.publish_github_release == 'true' }}
steps:
- uses: actions/checkout@v2
- uses: actions/download-artifact@v3
with:
name: om_wheels
path: origen_metal
- uses: actions/download-artifact@v3
with:
name: origen_wheels
path: origen
- name: Check wheels directories
run: |
ls -al ./origen_metal
ls -al ./origen
- uses: actions/download-artifact@v3
with:
name: cli
path: cli
- name: Show downloaded artifact directories
run: |
ls -al ./origen_metal
ls -al ./origen
ls -al ./cli
- uses: actions/download-artifact@v3
with:
name: ${{ env.om_ver_file }}
- uses: actions/download-artifact@v3
with:
name: ${{ env.origen_ver_file }}
- uses: vimtor/action-zip@v1.1
with:
files: origen_metal
dest: origen_metal.zip
- uses: vimtor/action-zip@v1.1
with:
files: origen
dest: origen.zip
- uses: vimtor/action-zip@v1.1
with:
files: cli
dest: cli.zip
- name: Get OM/Origen Versions
run: |
ls -al
cat ./${{ env.om_ver_file }}
cat ./${{ env.origen_ver_file }}
echo "om_version=$(cat ./${{ env.om_ver_file }})" >> $GITHUB_ENV
echo "origen_version=$(cat ./${{ env.origen_ver_file }})" >> $GITHUB_ENV
- name: Show Versions
run: |
echo ${{ env.om_version }}
echo ${{ env.origen_version }}
- name: Figure Out Tag
run: |
echo "tag=commit-$(git rev-parse --short HEAD)" >> $GITHUB_ENV
- name: Display Tag
run: echo ${{ env.tag }}
- name: Generate Github Release
uses: ncipollo/release-action@v1
with:
artifacts: ./origen_metal.zip, ./origen.zip, cli.zip
artifactErrorsFailBuild: true
prerelease: ${{ github.event.inputs.prerelease == 'true' }}
commit: ${{ github.sha }}
tag: ${{ env.tag }}
cleanup:
needs: [precheck, build_om_linux, build_windows, publish_to_pypi_test, publish_to_pypi, publish_github_release, show_wheels]
runs-on: ubuntu-latest
if: ${{ always() }}
steps:
- run: |
echo "Begin Clean Up..."
echo "No Clean Up Tasks!"