CI #481
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: CI | |
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" | |
upload: | |
description: Attempt to upload to Anaconda | |
required: true | |
default: "false" | |
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" | |
ACTION_URL: "https://github.com/Cantera/conda-recipes/actions/runs/${{ github.run_id }}" | |
INCOMING_REF: ${{ github.event.inputs.incoming_ref }} | |
jobs: | |
dump: | |
name: Dump the input parameters for the workflow | |
runs-on: ubuntu-22.04 | |
steps: | |
- name: Dump Event Payload | |
run: jq . "$GITHUB_EVENT_PATH" | |
- name: Echo the incoming_ref | |
run: | | |
echo "${{ github.event.inputs.incoming_ref }}" | |
echo "${{ github.event.inputs.upload }}" | |
post-pending-status: | |
name: Post a pending workflow status to Cantera/cantera | |
runs-on: ubuntu-22.04 | |
if: github.repository == 'Cantera/conda-recipes' | |
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 }}" | |
INCOMING_SHA = "" | |
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}" | |
elif re.match(r"^[a-f0-9]{6,40}", INCOMING_REF) is not None: | |
INCOMING_SHA = 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}\n" | |
f"INCOMING_SHA={INCOMING_SHA}" | |
) | |
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: | | |
if [[ "${INCOMING_SHA}" == "" ]]; then | |
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 | |
fi | |
# This needs to be in this step to be output to other jobs. | |
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='Conda Package Build' \ | |
--field description="Pending build" \ | |
--silent | |
# build-libcantera-and-python: | |
# name: Lib and Python for ${{ matrix.os }} | |
# runs-on: ${{ matrix.os }} | |
# # Run this job even if post-pending-status was skipped | |
# if: always() | |
# needs: | |
# - "post-pending-status" | |
# strategy: | |
# matrix: | |
# os: [windows-2019, ubuntu-20.04, macos-13] | |
# fail-fast: false | |
# outputs: | |
# job-status: ${{ job.status }} | |
# defaults: | |
# run: | |
# shell: bash -l {0} | |
# steps: | |
# - name: Check out this repository | |
# uses: actions/checkout@v4 | |
# - name: Set up macOS SDK | |
# id: setup-macos-sdk | |
# uses: ./.github/actions/setup_macos | |
# with: | |
# macos-sdk-version: ${{ env.MACOSX_DEPLOYMENT_TARGET }} | |
# if: runner.os == 'macOS' | |
# - name: Append to conda build config | |
# if: runner.os == 'macOS' | |
# run: | | |
# echo "" >> ./.ci_support/conda_build_config.yaml | |
# echo "CONDA_BUILD_SYSROOT:" >> ./.ci_support/conda_build_config.yaml | |
# echo "- ${CONDA_BUILD_SYSROOT}" >> ./.ci_support/conda_build_config.yaml | |
# echo "" >> ./.ci_support/conda_build_config.yaml | |
# env: | |
# CONDA_BUILD_SYSROOT: ${{ steps.setup-macos-sdk.outputs.conda-build-sysroot }} | |
# - name: Set Up Conda | |
# uses: conda-incubator/[email protected] | |
# with: | |
# auto-update-conda: true | |
# conda-build-version: '3.25' | |
# activate-environment: '' | |
# auto-activate-base: true | |
# # Released 2023-04-24 | |
# miniconda-version: 'py310_23.3.1-0' | |
# - name: Install Conda dependencies | |
# run: conda install -q conda-verify\<4.0 ripgrep | |
# - name: Build the Python and libcantera recipe | |
# run: conda build --debug ./cantera -m ./.ci_support/conda_build_config.yaml | |
# - name: List package contents | |
# run: | | |
# find '${{ runner.os == 'Windows' && '/c/Miniconda3' || env.CONDA }}/conda-bld' -name \*cantera\*.tar.bz2 | while read -r file; do | |
# echo '*********************************************' | |
# echo Contents of $file: | |
# echo '*********************************************' | |
# tar -tvf $file || true | |
# done | |
# shell: bash | |
# - name: Archive the built packages | |
# uses: actions/upload-artifact@v3 | |
# with: | |
# path: ${{ env.CONDA }}/conda-bld/*/*cantera*.tar.bz2 | |
# name: conda-packages | |
build-matlab: | |
name: Matlab toolbox for ${{ matrix.os }} | |
runs-on: ${{ matrix.os }} | |
# Run this job even if post-pending-status was skipped | |
if: always() | |
needs: | |
- "post-pending-status" | |
strategy: | |
matrix: | |
os: [windows-2019, ubuntu-20.04, macos-13] | |
fail-fast: false | |
outputs: | |
job-status: ${{ job.status }} | |
defaults: | |
run: | |
shell: bash -l {0} | |
steps: | |
- name: Check out this repository | |
uses: actions/checkout@v4 | |
- name: Set up macOS SDK | |
id: setup-macos-sdk | |
uses: ./.github/actions/setup_macos | |
with: | |
macos-sdk-version: ${{ env.MACOSX_DEPLOYMENT_TARGET }} | |
if: runner.os == 'macOS' | |
- name: Append to conda build config | |
if: runner.os == 'macOS' | |
run: | | |
echo "" >> ./.ci_support/conda_build_config.yaml | |
echo "CONDA_BUILD_SYSROOT:" >> ./.ci_support/conda_build_config.yaml | |
echo "- ${CONDA_BUILD_SYSROOT}" >> ./.ci_support/conda_build_config.yaml | |
echo "" >> ./.ci_support/conda_build_config.yaml | |
env: | |
CONDA_BUILD_SYSROOT: ${{ steps.setup-macos-sdk.outputs.conda-build-sysroot }} | |
- name: Set Up Conda | |
uses: conda-incubator/[email protected] | |
with: | |
auto-update-conda: true | |
conda-build-version: '3.25' | |
activate-environment: '' | |
auto-activate-base: true | |
# Released 2023-04-24 | |
miniconda-version: 'py310_23.3.1-0' | |
channels: defaults,cantera | |
- name: Install Conda dependencies | |
run: conda install -q conda-verify\<4.0 ripgrep | |
# 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 }} | |
# If the version of rsync is changed, the directories below have to be updated | |
- name: Install rsync on Windows | |
if: runner.os == '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 | |
if: runner.os == 'Windows' | |
# 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 | |
if: runner.os == 'Windows' | |
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: Get the MATLAB headers | |
if: runner.os != 'Windows' | |
run: "rsync -azvP [email protected]:. ${MW_HEADERS_DIR}" | |
- name: Build the MATLAB recipe | |
run: conda build ./cantera-matlab -m ./.ci_support/conda_build_config.yaml | |
- name: List package contents | |
run: | | |
find '${{ runner.os == 'Windows' && '/c/Miniconda3' || env.CONDA }}/conda-bld' -name \*cantera\*.tar.bz2 | while read -r file; do | |
echo '*********************************************' | |
echo Contents of $file: | |
echo '*********************************************' | |
tar -tvf $file || true | |
done | |
shell: bash | |
- name: Archive the built packages | |
uses: actions/upload-artifact@v3 | |
with: | |
path: ${{ env.CONDA }}/conda-bld/*/*cantera*.tar.bz2 | |
name: conda-packages | |
publish-files-to-anaconda: | |
name: Publish to the Anaconda channel | |
runs-on: ubuntu-20.04 | |
outputs: | |
job-status: ${{ job.status }} | |
needs: | |
# - "build-libcantera-and-python" | |
- "build-matlab" | |
defaults: | |
run: | |
shell: bash -l {0} | |
if: github.repository == 'Cantera/conda-recipes' && github.event.inputs.upload == 'true' | |
steps: | |
- name: Download pre-built packages | |
uses: actions/download-artifact@v3 | |
with: | |
path: dist/ | |
name: conda-packages | |
- name: Set Up Conda | |
uses: conda-incubator/setup-miniconda@v3 | |
with: | |
auto-update-conda: true | |
activate-environment: '' | |
auto-activate-base: true | |
- name: Install Conda dependencies | |
run: conda install -q anaconda-client | |
- name: Upload package to anaconda.org | |
run: | | |
anaconda --token ${{ secrets.ANACONDA_TOKEN }} upload dist/*/*.tar.bz2 | |
send_status_to_cantera: | |
name: Send jobs status to Cantera/cantera | |
runs-on: ubuntu-20.04 | |
needs: | |
- "post-pending-status" | |
# - "build-libcantera-and-python" | |
- "build-matlab" | |
- "publish-files-to-anaconda" | |
if: always() && github.repository == 'Cantera/conda-recipes' | |
steps: | |
- name: Collect statuses | |
run: | | |
from collections import Counter | |
import os | |
statuses = { | |
"python": "${{ needs.build-libcantera-and-python.outputs.job-status }}", | |
"publish": "${{ needs.publish-files-to-anaconda.outputs.job-status }}", | |
} | |
# This is a deliberate comparison to the empty string. | |
if statuses["publish"] == "" and "${{ github.event.inputs.upload }}" == "false": | |
publish = statuses.pop("publish") | |
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 Conda 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='Conda Package Build' \ | |
--field description="${DESCRIPTION}" \ | |
--silent | |
env: | |
GITHUB_TOKEN: ${{ secrets.CANTERA_REPO_STATUS }} |