Move timestamp #2
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: Nightly Dependencies Archive | |
on: | |
push: | |
branches-ignore: | |
- main | |
schedule: | |
- cron: '0 3 * * *' | |
workflow_dispatch: | |
inputs: | |
git-ref: | |
description: Git Hash (Optional) | |
required: false | |
defaults: | |
run: | |
shell: bash -l {0} | |
env: | |
PYTHONWARNINGS: ignore::UserWarning | |
PYTHON_CORE_PKGS: wheel | |
PYPI_ONLY: z3-solver | |
PYPY_EXCLUDE: scipy numdifftools seaborn statsmodels | |
CACHE_VER: v221013.1 | |
NEOS_EMAIL: [email protected] | |
SRC_REF: ${{ github.head_ref || github.ref }} | |
jobs: | |
build: | |
name: ${{ matrix.TARGET }}/${{ matrix.python }}${{ matrix.other }} | |
runs-on: ${{ matrix.os }} | |
timeout-minutes: 120 | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [ubuntu-latest] | |
python: ['3.12'] | |
other: [""] | |
category: [""] | |
include: | |
- os: ubuntu-latest | |
python: '3.12' | |
TARGET: linux | |
PYENV: pip | |
- os: macos-13 | |
python: '3.10' | |
TARGET: osx | |
PYENV: pip | |
- os: windows-latest | |
python: 3.9 | |
TARGET: win | |
PYENV: conda | |
PACKAGES: glpk pytest-qt filelock | |
- os: ubuntu-latest | |
python: '3.11' | |
other: /conda | |
skip_doctest: 1 | |
TARGET: linux | |
PYENV: conda | |
PACKAGES: pytest-qt | |
- os: ubuntu-latest | |
python: '3.10' | |
other: /mpi | |
mpi: 3 | |
skip_doctest: 1 | |
TARGET: linux | |
PYENV: conda | |
PACKAGES: openmpi mpi4py | |
- os: ubuntu-latest | |
python: '3.10' | |
other: /cython | |
setup_options: --with-cython | |
skip_doctest: 1 | |
TARGET: linux | |
PYENV: pip | |
PACKAGES: cython | |
- os: windows-latest | |
python: 3.8 | |
other: /pip | |
skip_doctest: 1 | |
TARGET: win | |
PYENV: pip | |
steps: | |
- name: Checkout Pyomo source | |
uses: actions/checkout@v4 | |
- name: Configure job parameters | |
run: | | |
JOB="${{matrix.TARGET}}/${{matrix.python}}${{matrix.other}}" | |
echo "TIMESTAMP=$(date +%F)" >> $GITHUB_ENV | |
echo "GHA_JOBNAME=$JOB" | sed 's|/|_|g' >> $GITHUB_ENV | |
if test -z "${{matrix.other}}"; then | |
echo "GHA_JOBGROUP=${{matrix.TARGET}}" >> $GITHUB_ENV | |
else | |
echo "GHA_JOBGROUP=other" >> $GITHUB_ENV | |
fi | |
# Note: pandas 1.0.3 causes gams 29.1.0 import to fail in python 3.8 | |
EXTRAS=tests | |
if test -z "${{matrix.slim}}"; then | |
EXTRAS="$EXTRAS,docs,optional" | |
fi | |
echo "EXTRAS=$EXTRAS" >> $GITHUB_ENV | |
PYTHON_PACKAGES="${{matrix.PACKAGES}}" | |
echo "PYTHON_PACKAGES=$PYTHON_PACKAGES" \ | |
| tr '\n' ' ' | sed 's/ \+/ /g' >> $GITHUB_ENV | |
#- name: Pip package cache | |
# uses: actions/cache@v4 | |
# if: matrix.PYENV == 'pip' | |
# id: pip-cache | |
# with: | |
# path: cache/pip | |
# key: pip-${{env.CACHE_VER}}.0-${{runner.os}}-${{matrix.python}} | |
#- name: OS package cache | |
# uses: actions/cache@v4 | |
# if: matrix.TARGET != 'osx' | |
# id: os-cache | |
# with: | |
# path: cache/os | |
# key: pkg-${{env.CACHE_VER}}.0-${{runner.os}} | |
- name: TPL package download cache | |
uses: actions/cache@v4 | |
if: ${{ ! matrix.slim }} | |
id: download-cache | |
with: | |
path: cache/download | |
key: download-${{env.CACHE_VER}}.0-${{runner.os}} | |
- name: Configure curl | |
run: | | |
CURLRC="$(cat <<EOF | |
retry = 0 | |
max-time = 30 | |
EOF | |
)" | |
echo "$CURLRC" > ${GITHUB_WORKSPACE}/.curlrc | |
echo "$CURLRC" > ${GITHUB_WORKSPACE}/_curlrc | |
echo "CURL_HOME=$GITHUB_WORKSPACE" >> $GITHUB_ENV | |
- name: Update OSX | |
if: matrix.TARGET == 'osx' | |
run: | | |
mkdir -p ${GITHUB_WORKSPACE}/cache/os | |
export HOMEBREW_CACHE=${GITHUB_WORKSPACE}/cache/os | |
# Be cautious running brew update: it can break | |
# setup-python on OSX | |
# brew update | |
# | |
# Notes: | |
# - install glpk | |
# - pyodbc needs: gcc pkg-config unixodbc freetds | |
for pkg in bash pkg-config unixodbc freetds glpk; do | |
brew list $pkg || brew install $pkg | |
done | |
- name: Update Linux | |
if: matrix.TARGET == 'linux' | |
run: | | |
mkdir -p ${GITHUB_WORKSPACE}/cache/os | |
# Notes: | |
# - install glpk | |
# - ipopt needs: libopenblas-dev gfortran liblapack-dev | |
sudo apt-get -o Dir::Cache=${GITHUB_WORKSPACE}/cache/os \ | |
install libopenblas-dev gfortran liblapack-dev glpk-utils | |
sudo chmod -R 777 ${GITHUB_WORKSPACE}/cache/os | |
- name: Update Windows | |
if: matrix.TARGET == 'win' | |
run: | | |
echo "SETUPTOOLS_USE_DISTUTILS=local" >> $GITHUB_ENV | |
- name: Set up Python ${{ matrix.python }} | |
if: matrix.PYENV == 'pip' | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ matrix.python }} | |
- name: Set up Miniconda Python ${{ matrix.python }} | |
if: matrix.PYENV == 'conda' | |
uses: conda-incubator/setup-miniconda@v3 | |
with: | |
auto-update-conda: false | |
python-version: ${{ matrix.python }} | |
# This is necessary for qt (UI) tests; the package utilized here does not | |
# have support for OSX. | |
- name: Set up UI testing infrastructure | |
if: ${{ matrix.TARGET != 'osx' }} | |
uses: pyvista/setup-headless-display-action@v2 | |
with: | |
qt: true | |
pyvista: false | |
- name: Install Python Packages (pip) | |
if: matrix.PYENV == 'pip' | |
shell: bash # DO NOT REMOVE: see note above | |
run: | | |
python -c 'import sys;print(sys.executable)' | |
python -m pip install --cache-dir cache/pip --upgrade pip | |
python -m pip install --cache-dir cache/pip setuptools | |
PYOMO_DEPENDENCIES=`python setup.py dependencies \ | |
--extras "$EXTRAS" | tail -1` | |
PACKAGES="${PYTHON_CORE_PKGS} ${PYTHON_PACKAGES} ${PYOMO_DEPENDENCIES} " | |
if [[ ${{matrix.python}} == pypy* ]]; then | |
EXCLUDE="$PYPY_EXCLUDE $EXCLUDE" | |
fi | |
EXCLUDE=`echo "$EXCLUDE" | xargs` | |
if test -n "$EXCLUDE"; then | |
for WORD in $EXCLUDE; do | |
PACKAGES=${PACKAGES//$WORD / } | |
done | |
fi | |
python -m pip install --cache-dir cache/pip ${PACKAGES} | |
python -m pip install --cache-dir cache/pip pymysql || \ | |
python -m pip install --cache-dir cache/pip pymysql | |
if test -z "${{matrix.slim}}"; then | |
python -m pip install --cache-dir cache/pip cplex docplex \ | |
|| echo "WARNING: CPLEX Community Edition is not available" | |
python -m pip install --cache-dir cache/pip \ | |
-i https://pypi.gurobi.com gurobipy==10.0.3 \ | |
|| echo "WARNING: Gurobi is not available" | |
python -m pip install --cache-dir cache/pip xpress \ | |
|| echo "WARNING: Xpress Community Edition is not available" | |
if [[ ${{matrix.python}} == pypy* ]]; then | |
echo "skipping wntr for pypy" | |
else | |
python -m pip install wntr \ | |
|| echo "WARNING: WNTR is not available" | |
fi | |
fi | |
python -c 'import sys; print("PYTHON_EXE=%s" \ | |
% (sys.executable,))' >> $GITHUB_ENV | |
echo "" | |
echo "Final pip environment:" | |
python -m pip list | sed 's/^/ /' | |
- name: Install Python packages (conda) | |
if: matrix.PYENV == 'conda' | |
run: | | |
# Set up environment | |
conda config --set always_yes yes | |
conda config --set auto_update_conda false | |
conda config --remove channels defaults | |
conda config --append channels nodefaults | |
conda config --append channels conda-forge | |
# Try to install mamba | |
conda install --update-deps -q -y -n base conda-libmamba-solver \ | |
|| MAMBA_FAILED=1 | |
if test -z "$MAMBA_FAILED"; then | |
echo "*** Activating the mamba environment solver ***" | |
conda config --set solver libmamba | |
fi | |
# Add the rest of the channels | |
conda config --append channels gurobi | |
conda config --append channels ibmdecisionoptimization | |
conda config --append channels fico-xpress | |
# Print environment info | |
echo "*** CONDA environment: ***" | |
conda info | |
conda config --show-sources | |
conda config --show channels | |
conda list --show-channel-urls | |
which python | |
python --version | |
# Note: some pypi packages are not available through conda | |
PYOMO_DEPENDENCIES=`python setup.py dependencies \ | |
--extras "$EXTRAS" | tail -1` | |
PACKAGES="${PYTHON_CORE_PKGS} ${PYTHON_PACKAGES} ${PYOMO_DEPENDENCIES} " | |
if [[ ${{matrix.python}} == pypy* ]]; then | |
EXCLUDE="$PYPY_EXCLUDE $EXCLUDE" | |
fi | |
# HACK: Remove problem packages on conda+Linux | |
if test "${{matrix.TARGET}}" == linux; then | |
EXCLUDE="casadi numdifftools $EXCLUDE" | |
fi | |
EXCLUDE=`echo "$EXCLUDE" | xargs` | |
if test -n "$EXCLUDE"; then | |
for WORD in $EXCLUDE; do | |
PACKAGES=${PACKAGES//$WORD / } | |
done | |
fi | |
for PKG in $PACKAGES; do | |
if [[ " $PYPI_ONLY " == *" $PKG "* ]]; then | |
PYPI_DEPENDENCIES="$PYPI_DEPENDENCIES $PKG" | |
else | |
CONDA_DEPENDENCIES="$CONDA_DEPENDENCIES $PKG" | |
fi | |
done | |
echo "" | |
echo "*** Install Pyomo dependencies ***" | |
# Note: this will fail the build if any installation fails (or | |
# possibly if it outputs messages to stderr) | |
conda install --update-deps -y $CONDA_DEPENDENCIES | |
if test -z "${{matrix.slim}}"; then | |
PYVER=$(echo "py${{matrix.python}}" | sed 's/\.//g') | |
echo "Installing for $PYVER" | |
for PKG in 'cplex>=12.10' docplex 'gurobi=10.0.3' xpress cyipopt pymumps scip; do | |
echo "" | |
echo "*** Install $PKG ***" | |
# conda can literally take an hour to determine that a | |
# package is not available. Perform a quick search to see | |
# if the package is available for this interpreter before | |
# attempting an install. | |
# NOTE: conda search will attempt approximate matches. | |
_PKGLIST=$(conda search -f "$PKG") || echo "Package $PKG not found" | |
echo "$_PKGLIST" | |
_BASE=$(echo "$PKG" | sed 's/[=<>].*//') | |
_BUILDS=$(echo "$_PKGLIST" | grep "^$_BASE " \ | |
| sed -r 's/\s+/ /g' | cut -d\ -f3) || echo "" | |
if test -n "$_BUILDS"; then | |
_ISPY=$(echo "$_BUILDS" | grep "^py") \ | |
|| echo "INFO: No python build detected." | |
_PYOK=$(echo "$_BUILDS" | grep -E "^($PYVER|pyh)") \ | |
|| echo "INFO: No python build matching $PYVER detected." | |
if test -z "$_ISPY" -o -n "$_PYOK"; then | |
echo "" | |
echo "... INSTALLING $PKG" | |
conda install -y "$PKG" || _BUILDS="" | |
fi | |
fi | |
if test -z "$_BUILDS"; then | |
echo "WARNING: $PKG is not available" | |
fi | |
done | |
fi | |
# Re-try Pyomo (optional) dependencies with pip | |
if test -n "$PYPI_DEPENDENCIES"; then | |
python -m pip install --cache-dir cache/pip $PYPI_DEPENDENCIES | |
fi | |
# remember this python interpreter | |
python -c 'import sys; print("PYTHON_EXE=%s" \ | |
% (sys.executable,))' >> $GITHUB_ENV | |
# | |
# conda activate puts itself first in the PATH, which overrides | |
# any paths we add through GITHUB_PATH. We will update .profile | |
# to move the local runner paths back to the front (before conda). | |
for profile in $HOME/.profile $HOME/.bash_profile; do | |
if test ! -e $profile; then | |
continue | |
fi | |
echo '' >> $profile | |
echo 'export PATH=`echo "$PATH" \ | |
| tr ":" "\\n" | grep runner | tr "\n" ":"`:`echo "$PATH" \ | |
| tr ":" "\\n" | grep -v runner | tr "\n" ":"`' >> $profile | |
done | |
echo "" | |
echo "Final conda environment:" | |
conda list | sed 's/^/ /' | |
- name: Setup TPL package directories | |
run: | | |
TPL_DIR="${GITHUB_WORKSPACE}/cache/tpl" | |
mkdir -p "$TPL_DIR" | |
DOWNLOAD_DIR="${GITHUB_WORKSPACE}/cache/download" | |
mkdir -p "$DOWNLOAD_DIR" | |
echo "TPL_DIR=$TPL_DIR" >> $GITHUB_ENV | |
echo "DOWNLOAD_DIR=$DOWNLOAD_DIR" >> $GITHUB_ENV | |
- name: Install Ipopt | |
if: ${{ ! matrix.slim }} | |
run: | | |
IPOPT_DIR=$TPL_DIR/ipopt | |
echo "$IPOPT_DIR" >> $GITHUB_PATH | |
echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$IPOPT_DIR" >> $GITHUB_ENV | |
mkdir -p $IPOPT_DIR | |
IPOPT_TAR=${DOWNLOAD_DIR}/ipopt.tar.gz | |
if test ! -e $IPOPT_TAR; then | |
echo "...downloading Ipopt" | |
if test "${{matrix.TARGET}}" == osx; then | |
echo "IDAES Ipopt not available on OSX" | |
exit 0 | |
fi | |
URL=https://github.com/IDAES/idaes-ext | |
RELEASE=$(curl --max-time 150 --retry 8 \ | |
-L -s -H 'Accept: application/json' ${URL}/releases/latest) | |
VER=$(echo $RELEASE | sed -e 's/.*"tag_name":"\([^"]*\)".*/\1/') | |
URL=${URL}/releases/download/$VER | |
if test "${{matrix.TARGET}}" == linux; then | |
curl --max-time 150 --retry 8 \ | |
-L $URL/idaes-solvers-ubuntu2004-x86_64.tar.gz \ | |
> $IPOPT_TAR | |
else | |
curl --max-time 150 --retry 8 \ | |
-L $URL/idaes-solvers-windows-x86_64.tar.gz \ | |
$URL/idaes-lib-windows-x86_64.tar.gz > $IPOPT_TAR | |
fi | |
fi | |
cd $IPOPT_DIR | |
tar -xzi < $IPOPT_TAR | |
echo "" | |
echo "$IPOPT_DIR" | |
ls -l $IPOPT_DIR | |
- name: Install GAMS | |
if: ${{ ! matrix.slim }} | |
# We install using Powershell because the GAMS installer hangs | |
# when launched from bash on Windows | |
shell: pwsh | |
run: | | |
$GAMS_DIR = "${env:TPL_DIR}/gams" | |
echo "$GAMS_DIR" | ` | |
Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append | |
echo "LD_LIBRARY_PATH=${env:LD_LIBRARY_PATH}:$GAMS_DIR" ` | |
Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append | |
echo "DYLD_LIBRARY_PATH=${env:DYLD_LIBRARY_PATH}:$GAMS_DIR" ` | |
Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append | |
$INSTALLER = "${env:DOWNLOAD_DIR}/gams_install.exe" | |
# We are pinning to 29.1.0 because a license is required for | |
# versions after this in order to run in demo mode. | |
$URL = "https://d37drm4t2jghv5.cloudfront.net/distributions/29.1.0" | |
if ( "${{matrix.TARGET}}" -eq "win" ) { | |
$URL = "$URL/windows/windows_x64_64.exe" | |
} elseif ( "${{matrix.TARGET}}" -eq "osx" ) { | |
$URL = "$URL/macosx/osx_x64_64_sfx.exe" | |
} else { | |
$URL = "$URL/linux/linux_x64_64_sfx.exe" | |
} | |
if (-not (Test-Path "$INSTALLER" -PathType Leaf)) { | |
echo "...downloading GAMS" | |
Invoke-WebRequest -Uri "$URL" -OutFile "$INSTALLER" ` | |
-RetryIntervalSec 30 -MaximumRetryCount 8 -TimeoutSec 150 | |
} | |
echo "...installing GAMS" | |
if ( "${{matrix.TARGET}}" -eq "win" ) { | |
Start-Process -FilePath "$INSTALLER" -ArgumentList ` | |
"/SP- /NORESTART /VERYSILENT /DIR=$GAMS_DIR /NOICONS" ` | |
-Wait | |
} else { | |
chmod 777 $INSTALLER | |
Start-Process -FilePath "$INSTALLER" -ArgumentList ` | |
"-q -d $GAMS_DIR" -Wait | |
mv $GAMS_DIR/*/* $GAMS_DIR/. | |
} | |
echo "" | |
echo "$GAMS_DIR" | |
ls -l $GAMS_DIR | |
- name: Install GAMS Python bindings | |
if: ${{ ! matrix.slim }} | |
run: | | |
GAMS_DIR="${env:TPL_DIR}/gams" | |
py_ver=$($PYTHON_EXE -c 'import sys;v="_%s%s" % sys.version_info[:2] \ | |
;print(v if v != "_27" else "")') | |
if test -e $GAMS_DIR/apifiles/Python/api$py_ver; then | |
echo "Installing GAMS Python bindings" | |
pushd $GAMS_DIR/apifiles/Python/api$py_ver | |
$PYTHON_EXE setup.py install | |
popd | |
fi | |
- name: Install BARON | |
if: ${{ ! matrix.slim }} | |
shell: pwsh | |
run: | | |
$BARON_DIR = "${env:TPL_DIR}/baron" | |
echo "$BARON_DIR" | ` | |
Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append | |
$URL = "https://www.minlp.com/downloads/xecs/baron/current/" | |
if ( "${{matrix.TARGET}}" -eq "win" ) { | |
$INSTALLER = "${env:DOWNLOAD_DIR}/baron_install.exe" | |
$URL += "baron-win64.exe" | |
} elseif ( "${{matrix.TARGET}}" -eq "osx" ) { | |
$INSTALLER = "${env:DOWNLOAD_DIR}/baron_install.zip" | |
$URL += "baron-osx64.zip" | |
} else { | |
$INSTALLER = "${env:DOWNLOAD_DIR}/baron_install.zip" | |
$URL += "baron-lin64.zip" | |
} | |
if (-not (Test-Path "$INSTALLER" -PathType Leaf)) { | |
echo "...downloading BARON ($URL)" | |
Invoke-WebRequest -Uri "$URL" -OutFile "$INSTALLER" ` | |
-RetryIntervalSec 30 -MaximumRetryCount 8 -TimeoutSec 150 | |
} | |
echo "...installing BARON" | |
if ( "${{matrix.TARGET}}" -eq "win" ) { | |
Start-Process -FilePath "$INSTALLER" -ArgumentList ` | |
"/SP- /NORESTART /VERYSILENT /DIR=$BARON_DIR /NOICONS" ` | |
-Wait | |
} else { | |
unzip -q $INSTALLER | |
mv baron-* $BARON_DIR | |
} | |
echo "" | |
echo "$BARON_DIR" | |
ls -l $BARON_DIR | |
- name: Install GJH_ASL_JSON | |
if: ${{ ! matrix.slim && matrix.TARGET != 'win' }} | |
run: | | |
GJH_DIR="$TPL_DIR/gjh" | |
echo "${GJH_DIR}" >> $GITHUB_PATH | |
INSTALL_DIR="${DOWNLOAD_DIR}/gjh" | |
if test ! -e "$INSTALL_DIR/bin"; then | |
mkdir -p "$INSTALL_DIR" | |
INSTALLER="$INSTALL_DIR/gjh_asl_json.zip" | |
URL="https://codeload.github.com/ghackebeil/gjh_asl_json/zip/master" | |
curl --max-time 150 --retry 8 -L $URL > $INSTALLER | |
cd $INSTALL_DIR | |
unzip -q $INSTALLER | |
cd gjh_asl_json-master/Thirdparty | |
./get.ASL | |
cd .. | |
make | |
mv bin "$INSTALL_DIR/bin" | |
fi | |
cp -rp "$INSTALL_DIR/bin" "$GJH_DIR" | |
echo "" | |
echo "$GJH_DIR" | |
ls -l $GJH_DIR | |
- name: Install Pyomo | |
run: | | |
echo "" | |
echo "Clone Pyomo-model-libraries..." | |
URL=https://github.com/Pyomo/pyomo-model-libraries.git | |
git clone -b ${SRC_REF##*/} $URL || git clone -b main $URL | |
echo "" | |
echo "Install Pyomo..." | |
echo "" | |
$PYTHON_EXE setup.py develop ${{matrix.setup_options}} | |
echo "" | |
echo "Set custom PYOMO_CONFIG_DIR" | |
echo "" | |
echo "PYOMO_CONFIG_DIR=${GITHUB_WORKSPACE}/config" >> $GITHUB_ENV | |
# this has to be done after Pyomo is installed because highspy | |
# depends on pyomo's find_library function | |
- name: Install HiGHS | |
if: ${{ ! matrix.slim }} | |
shell: bash | |
run: | | |
$PYTHON_EXE -m pip install --cache-dir cache/pip highspy \ | |
|| echo "WARNING: highspy is not available" | |
- name: Download and install extensions | |
if: ${{ ! matrix.slim }} | |
run: | | |
echo "" | |
echo "Pyomo download-extensions" | |
echo "" | |
pyomo download-extensions || exit 1 | |
echo "" | |
echo "Pyomo build-extensions" | |
echo "" | |
pyomo build-extensions --parallel 2 | |
- name: Report current job environment | |
run: | | |
echo "Environment and Dependency Summary for $TIMESTAMP" >> $GITHUB_STEP_SUMMARY | |
echo "--------------------------------------------------" >> $GITHUB_STEP_SUMMARY | |
echo "" >> $GITHUB_STEP_SUMMARY | |
echo "Current Environment" >> $GITHUB_STEP_SUMMARY | |
env >> $GITHUB_STEP_SUMMARY | |
echo "" >> $GITHUB_STEP_SUMMARY | |
echo "Packages installed via pip" >> $GITHUB_STEP_SUMMARY | |
pip list >> $GITHUB_STEP_SUMMARY | |
echo "" >> $GITHUB_STEP_SUMMARY | |
if "${{ matrix.PYENV }}" == 'conda'; then | |
echo "Packages installed via conda" >> $GITHUB_STEP_SUMMARY | |
conda list >> $GITHUB_STEP_SUMMARY | |
echo "" >> $GITHUB_STEP_SUMMARY | |
fi | |
echo "Pyomo Help Information" >> $GITHUB_STEP_SUMMARY | |
pyomo help --solvers >> $GITHUB_STEP_SUMMARY | |
pyomo help --transformations >> $GITHUB_STEP_SUMMARY | |
pyomo help --writers >> $GITHUB_STEP_SUMMARY | |
echo $GITHUB_STEP_SUMMARY >> archive.txt | |
- name: Record archive artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: "summary-$TIMESTAMP" | |
path: | | |
archive.txt |