Build macOS pkg Installer #265
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 macOS pkg Installer | |
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.ref }}-${{ github.event.inputs.incoming_ref }} | |
cancel-in-progress: true | |
env: | |
MW_HEADERS_DIR: ${{ github.workspace }}/mw_headers | |
MACOSX_DEPLOYMENT_TARGET: "10.15" | |
PKG_DIR: ${{ github.workspace }} | |
ACTION_URL: "https://github.com/Cantera/cantera-macos-pkg/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-22.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}" | |
) | |
Path(os.environ["GITHUB_OUTPUT"]).write_text( | |
f"tag-ref={TAG_REF}" | |
) | |
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='macOS Package Build' \ | |
--field description="Pending build" \ | |
--silent | |
build-intel: | |
name: Build Intel-based package | |
runs-on: macos-11 | |
needs: | |
- "post-pending-status" | |
outputs: | |
job-status: ${{ job.status }} | |
steps: | |
- name: Checkout this repository | |
uses: actions/checkout@v3 | |
- name: Checkout Cantera repository | |
uses: actions/checkout@v3 | |
with: | |
submodules: recursive | |
repository: Cantera/cantera | |
path: cantera | |
ref: ${{ github.event.inputs.incoming_ref }} | |
# 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 cloning MATLAB | |
uses: shimataro/ssh-key-action@v2 | |
with: | |
key: ${{ secrets.CTDEPLOY_SSH_KEY }} | |
known_hosts: ${{ secrets.CTDEPLOY_KNOWN_HOSTS }} | |
- name: Get the MATLAB headers | |
run: "rsync -azvP [email protected]:. ${MW_HEADERS_DIR}" | |
- name: Setup Python | |
uses: actions/setup-python@v4 | |
with: | |
python-version: "3.11" | |
- name: Install Python dependencies | |
run: | | |
python -m pip install -U pip setuptools | |
python -m pip install scons | |
- name: Install Brew dependencies | |
run: brew install boost | |
- name: Install Packages | |
run: sudo /usr/sbin/installer -pkg Packages.pkg -target / | |
- name: Build Cantera | |
working-directory: cantera | |
run: | | |
echo "matlab_path='${MW_HEADERS_DIR}'" >> cantera.conf | |
echo "f90_interface='n'" >> cantera.conf | |
echo "system_sundials='n'" >> cantera.conf | |
echo "debug='n'" >> cantera.conf | |
echo "python_package='none'" >> cantera.conf | |
echo "prefix='${PKG_DIR}'" >> cantera.conf | |
echo "layout='compact'" >> cantera.conf | |
echo "logging='debug'" >> cantera.conf | |
python3 `which scons` build -j3 boost_inc_dir="$(brew --prefix)/include" | |
- name: Test Cantera | |
working-directory: cantera | |
run: python3 `which scons` test-general test-thermo test-kinetics test-transport | |
- name: Install Cantera | |
working-directory: cantera | |
run: python3 `which scons` install | |
- name: Package Cantera | |
run: /usr/local/bin/packagesbuild ./cantera-matlab-interface.pkgproj | |
- name: Upload the pkg artifact | |
uses: actions/upload-artifact@v3 | |
with: | |
path: build/*.pkg | |
name: intel | |
send_status_to_cantera: | |
name: Send jobs status to Cantera/cantera | |
runs-on: ubuntu-22.04 | |
needs: | |
- "post-pending-status" | |
- "build-intel" | |
if: always() | |
steps: | |
- name: Collect statuses | |
run: | | |
from collections import Counter | |
import os | |
statuses = { | |
"intel": "${{ needs.build-intel.outputs.job-status }}", | |
} | |
# This is a deliberate comparison to the empty string. | |
if all(v == "success" for v in statuses.values()): | |
overall_status = "success" | |
elif any(v in ("cancelled", "") for v in statuses.values()): | |
overall_status = "error" | |
elif any(v == "failure" for v in statuses.values()): | |
overall_status = "failure" | |
status_counts = Counter(statuses.values()) | |
description = [] | |
if overall_status in ("error", "failure"): | |
if status_counts.get("success") is not None: | |
description.append(f"{status_counts['success']} succeeded") | |
if status_counts.get("cancelled") is not None: | |
description.append(f"{status_counts['cancelled']} cancelled") | |
if status_counts.get("failure") is not None: | |
description.append(f"{status_counts['failure']} failed") | |
if status_counts.get("") is not None: | |
description.append(f"{status_counts['']} skipped") | |
description = ", ".join(description) | |
else: | |
description = "Successfully built macOS packages!" | |
with open(os.environ["GITHUB_ENV"], "a") as gh_env: | |
gh_env.write(f"OVERALL_STATUS={overall_status}\nDESCRIPTION={description}") | |
shell: python | |
- name: Post the status to the upstream commit | |
if: needs.post-pending-status.outputs.tag-ref == 'false' | |
run: | | |
INCOMING_SHA=${{ needs.post-pending-status.outputs.incoming-sha }} | |
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='macOS Package Build' \ | |
--field description="${DESCRIPTION}" \ | |
--silent | |
env: | |
GITHUB_TOKEN: ${{ secrets.CANTERA_REPO_STATUS }} |