Publish Packages #120
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: 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_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 Perl-IPC-cmd | |
run : | | |
yum install perl-IPC-Cmd -y | |
- 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: 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 | |
echo "OM_WHEEL=$( ls wheelhouse | head -1 )" >> $GITHUB_ENV | |
- name: Display OM Wheel Name | |
run: | | |
echo ${{ env.OM_WHEEL }} | |
- name: Upload Origen Metal Python Package Artifact | |
uses: actions/upload-artifact@v1 | |
with: | |
name: om_wheels | |
# path: python/origen_metal/wheelhouse/* | |
path: python/origen_metal/wheelhouse/${{ env.OM_WHEEL }} | |
- 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 | |
echo "origen_wheel=$( ls wheelhouse | head -1 )" >> $GITHUB_OUTPUT | |
- name: Upload Origen Python Package Artifact | |
uses: actions/upload-artifact@v1 | |
with: | |
name: origen_wheels | |
# path: python/origen/wheelhouse/* | |
path: python/origen/wheelhouse/${{ steps.vars.outputs.origen_wheel }} | |
- 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_manylinux, 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_manylinux, 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_manylinux, 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.8.10 | |
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.8.10 | |
with: | |
packages-dir: origen_wheels | |
password: ${{ secrets.PYPI_ORIGEN_API_TOKEN }} | |
verify-metadata: false | |
verbose: true | |
publish_github_release: | |
needs: [build_manylinux, 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_manylinux, 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!" |