Build MSI #309
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: Build MSI | |
on: | |
workflow_dispatch: | |
inputs: | |
incoming_ref: | |
description: > | |
The ref from Cantera/cantera to be built. Can be a tag, commit hash, | |
or branch name. | |
required: true | |
default: "main" | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.ref }} | |
cancel-in-progress: true | |
env: | |
MW_HEADERS_DIR: ${{ github.workspace }}/mw_headers | |
ACTION_URL: "https://github.com/Cantera/cantera-windows-binaries/actions/runs/${{ github.run_id }}" | |
INCOMING_REF: ${{ github.event.inputs.incoming_ref }} | |
jobs: | |
post-pending-status: | |
name: Post a pending workflow status to Cantera/cantera | |
runs-on: ubuntu-20.04 | |
env: | |
GITHUB_TOKEN: ${{ secrets.CANTERA_REPO_STATUS }} | |
outputs: | |
incoming-sha: ${{ steps.get-incoming-sha.outputs.incoming-sha }} | |
tag-ref: ${{ steps.munge-incoming-ref.outputs.tag-ref }} | |
steps: | |
- name: Munge the incoming ref | |
id: munge-incoming-ref | |
run: | | |
import os | |
import re | |
from pathlib import Path | |
INCOMING_REF = "${{ github.event.inputs.incoming_ref }}" | |
if INCOMING_REF.startswith("refs/"): | |
INCOMING_REF = INCOMING_REF.replace("refs/", "") | |
elif re.match(r"^v\d\.\d\.\d.*$", INCOMING_REF) is not None: | |
INCOMING_REF = f"tags/{INCOMING_REF}" | |
else: | |
INCOMING_REF = f"heads/{INCOMING_REF}" | |
TAG_REF = "false" | |
if INCOMING_REF.startswith("tags"): | |
TAG_REF = "true" | |
Path(os.environ["GITHUB_ENV"]).write_text( | |
f"INCOMING_REF={INCOMING_REF}\n" | |
f"TAG_REF={TAG_REF}" | |
) | |
with open(os.environ["GITHUB_OUTPUT"], "a") as gh_out: | |
gh_out.write(f"tag-ref={TAG_REF}\n") | |
shell: python | |
- name: Get the SHA associated with the incoming ref | |
id: get-incoming-sha | |
run: | | |
INCOMING_SHA=$(gh api repos/cantera/cantera/git/matching-refs/${INCOMING_REF} \ | |
-H "Accept: application/vnd.github.v3+json" --jq ".[0].object.sha") | |
echo "INCOMING_SHA=${INCOMING_SHA}" >> $GITHUB_ENV | |
echo "incoming-sha=${INCOMING_SHA}" >> $GITHUB_OUTPUT | |
- name: Post the status to the upstream commit | |
id: set-the-status | |
if: env.TAG_REF == 'false' | |
run: | | |
gh api repos/cantera/cantera/statuses/${INCOMING_SHA} \ | |
-H "Accept: application/vnd.github.v3+json" \ | |
--field state='pending' \ | |
--field target_url=$ACTION_URL \ | |
--field context='Windows MSI Package Build' \ | |
--field description="Pending build" \ | |
--silent | |
build-msi: | |
outputs: | |
job-status: ${{ job.status }} | |
needs: | |
- "post-pending-status" | |
env: | |
BOOST_ROOT: ${{github.workspace}}/3rdparty/boost | |
BOOST_URL: https://boostorg.jfrog.io/artifactory/main/release/1.75.0/source/boost_1_75_0.7z | |
name: Build Matlab Package for Windows | |
runs-on: windows-latest | |
steps: | |
- name: Checkout this repository | |
uses: actions/checkout@v3 | |
- name: Checkout the Cantera repository | |
uses: actions/checkout@v3 | |
with: | |
submodules: recursive | |
repository: Cantera/cantera | |
path: cantera | |
ref: ${{ github.event.inputs.incoming_ref }} | |
- name: Restore Boost cache | |
uses: actions/cache@v3 | |
id: cache-boost | |
with: | |
path: ${{ env.BOOST_ROOT }} | |
key: boost | |
- name: Install Boost Headers | |
if: steps.cache-boost.outputs.cache-hit != 'true' | |
run: | | |
BOOST_ROOT=$(echo $BOOST_ROOT | sed 's/\\/\//g') | |
mkdir -p $BOOST_ROOT | |
curl --progress-bar --location --output $BOOST_ROOT/download.7z $BOOST_URL | |
7z -o$BOOST_ROOT x $BOOST_ROOT/download.7z -y -bd boost_1_75_0/boost | |
mv $BOOST_ROOT/boost_1_75_0/boost $BOOST_ROOT/boost | |
rm $BOOST_ROOT/download.7z | |
shell: bash | |
# The known_hosts key is generated with `ssh-keygen -F cantera.org` from a | |
# machine that has previously logged in to cantera.org and trusts | |
# that it logged in to the right machine | |
- name: Set up SSH key and host for deploy | |
uses: shimataro/ssh-key-action@v2 | |
with: | |
key: ${{ secrets.CTDEPLOY_SSH_KEY }} | |
known_hosts: ${{ secrets.CTDEPLOY_KNOWN_HOSTS }} | |
# If the version of rsync is changed, the directories below have to be updated | |
- name: Install rsync on Windows | |
run: choco install rsync --version 6.2.4 | |
# This seems like overkill, but rsync on Windows requires a POSIX-style path | |
- name: Munge the MW_HEADERS_DIR for Windows rsync | |
run: | | |
import os | |
from pathlib import Path, PurePosixPath | |
mw_headers_dir = Path(os.environ["MW_HEADERS_DIR"]).resolve() | |
mw_headers_dir = PurePosixPath( | |
"/cygdrive", | |
mw_headers_dir.drive[0], | |
PurePosixPath(*mw_headers_dir.parts[1:]) | |
) | |
with Path(os.environ["GITHUB_ENV"]).open(mode="a") as gh_env: | |
gh_env.write(f"CYG_MW_HEADERS_DIR={mw_headers_dir}") | |
shell: python | |
# When I tried this a few times, it only worked when I used powershell and had the | |
# SSH options all in the single line with single quotes. Note that there is a | |
# separate SSH binary pre-installed on the Windows runners that comes before this | |
# one on the PATH, but it is linked with the wrong Cygwin DLL, so it will not work. | |
- name: Get the MATLAB headers | |
run: | | |
rsync -azvP -e ` | |
'C:\ProgramData\chocolatey\lib\rsync\tools\cwrsync_6.2.4_x64_free\bin\ssh.exe -i C:\Users\runneradmin\.ssh\id_rsa -o UserKnownHostsFile=C:\Users\runneradmin\.ssh\known_hosts' ` | |
[email protected]:. $Env:CYG_MW_HEADERS_DIR | |
shell: powershell | |
- name: Setup Python | |
uses: actions/setup-python@v4 | |
with: | |
python-version: "3.9" | |
- name: Install Python dependencies | |
run: | | |
python -m pip install -U pip setuptools | |
python -m pip install scons pypiwin32 numpy ruamel.yaml cython | |
- name: Build Cantera | |
run: build.bat | |
shell: cmd | |
- name: Upload the MSI artifact | |
uses: actions/upload-artifact@v3 | |
with: | |
path: 'cantera/*.msi' | |
send_status_to_cantera: | |
name: Send jobs status to Cantera/cantera | |
runs-on: ubuntu-20.04 | |
needs: | |
- "post-pending-status" | |
- "build-msi" | |
if: always() | |
steps: | |
- name: Get the overall job description | |
run: | | |
INCOMING_SHA=${{ needs.post-pending-status.outputs.incoming-sha }} | |
OVERALL_STATUS=${{ needs.build-msi.outputs.job-status }} | |
if [ "$OVERALL_STATUS" == "success" ]; then | |
DESCRIPTION="succeeded" | |
elif [ "$OVERALL_STATUS" == "failure" ]; then | |
DESCRIPTION="failed" | |
else | |
DESCRIPTION="$OVERALL_STATUS" | |
fi | |
echo "INCOMING_SHA=${INCOMING_SHA}" >> $GITHUB_ENV | |
echo "OVERALL_STATUS=${OVERALL_STATUS}" >> $GITHUB_ENV | |
echo "DESCRIPTION=${DESCRIPTION}" >> $GITHUB_ENV | |
- name: Post the status | |
if: needs.post-pending-status.outputs.tag-ref == 'false' | |
run: | | |
gh api repos/cantera/cantera/statuses/${INCOMING_SHA} \ | |
-H "Accept: application/vnd.github.v3+json" \ | |
--field state="${OVERALL_STATUS}" \ | |
--field target_url=$ACTION_URL \ | |
--field context='Windows MSI Package Build' \ | |
--field description="Building MSI ${DESCRIPTION}." \ | |
--silent | |
env: | |
GITHUB_TOKEN: ${{ secrets.CANTERA_REPO_STATUS }} |