Skip to content

adjust --statePollingWait and --retryCount - jfennick/workflow-inference-compiler - main #284

adjust --statePollingWait and --retryCount - jfennick/workflow-inference-compiler - main

adjust --statePollingWait and --retryCount - jfennick/workflow-inference-compiler - main #284

name: Build And Test
on:
workflow_dispatch:
# Have to declare parameters here for those that will be sent through 'workflow-dispatch'
# event in branch_dispatch.yml. Otherwise, there'll be github API errors:
# '"message": "Unexpected inputs provided: ...",'
inputs:
event_type:
description: An arbitrary string used to dispatch steps
required: true
type: string
commit_message:
description: The commit message
required: true
type: string
sender_repo:
description: The repository which initiated the workflow dispatch
required: true
type: string
sender_repo_owner:
description: The account name of the repository initiated the workflow dispatch
required: true
type: string
wic_owner:
description: The account name of the wic repository
required: true
type: string
wic_ref:
description: The branch name within the wic repository
required: true
type: string
mm-workflows_owner:
description: The account name of the mm-workflows repository
required: true
type: string
mm-workflows_ref:
description: The branch name within the mm-workflows repository
required: true
type: string
# See https://github.com/orgs/community/discussions/15690
# For workflow_dispatch, the commit message, repo, and branch name are not displayed by default.
run-name: "${{ inputs.commit_message}} - ${{ inputs.sender_repo }} - ${{ inputs.mm-workflows_ref}}"
env:
BUILD_TYPE: Release
defaults:
run:
shell: bash -l {0} # Invoke bash in login mode, NOT interactive mode.
# This will cause bash to look for the startup file ~/.bash_profile, NOT ~/.bashrc
# This is important since conda init writes to ~/.bashrc
# https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions#jobs
# Rather than use a single job with a linear pipeline of steps, you may be
# tempted to make each step into a separate job and specify the dependencies
# using the `needs` syntax for more parallelism.
# However, data cannot be shared between jobs because each job will be run on a
# different runner. Even on a self-hosted runner, the `needs` syntax does not
# guarantee that the data can be shared!
# Using if: always() allows all steps to run, while still properly reporting failure.
# See https://stackoverflow.com/questions/62045967/github-actions-is-there-a-way-to-continue-on-error-while-still-getting-correct
permissions:
actions: read
contents: read
pull-requests: read
jobs:
build_and_test:
# See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#concurrency
# This will prevent DOS attacks from people blasting the CI with rapid fire commits.
concurrency:
group: ${{ github.workflow }}-${{ matrix.os }}-${{ github.ref }}-${{ inputs.sender_repo }}-${{ inputs.mm-workflows_ref}}
cancel-in-progress: true
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout source code
if: always()
uses: actions/checkout@v3
with:
repository: ${{ inputs.wic_owner }}/workflow-inference-compiler
ref: ${{ inputs.wic_ref }}
submodules: recursive
path: wic
- name: Checkout mm-workflows
if: always()
uses: actions/checkout@v3
with:
repository: ${{ inputs.mm-workflows_owner }}/mm-workflows
ref: ${{ inputs.mm-workflows_ref }}
submodules: recursive
path: mm-workflows
- name: Setup mamba (linux, macos)
if: runner.os != 'Windows'
uses: conda-incubator/setup-miniconda@v2.2.0
with:
miniforge-variant: Mambaforge-pypy3
miniforge-version: latest
environment-file: wic/system_deps.yml
activate-environment: wic
use-mamba: true
channels: conda-forge
python-version: "3.9.*" # pypy is not yet compatible with 3.10 and 3.11
- name: Setup conda (windows)
if: runner.os == 'Windows'
uses: conda-incubator/setup-miniconda@v2.2.0
with:
miniforge-version: latest
environment-file: wic/system_deps_windows.yml
activate-environment: wic
channels: conda-forge
python-version: "3.9.*" # pypy is not yet compatible with 3.10 and 3.11
- name: ShellCheck Script Quality
if: always()
# "SC1017 (error): Literal carriage return. Run script through tr -d '\r' ."
run: shellcheck -e SC1017 $(find wic/ -name "*.sh" -not -path "./biobb/*" -and -not -path "./3/*")
- name: Install Workflow Inference Compiler
if: always()
run: cd wic/ && pip install ".[all]"
- name: Install Molecular Modeling Workflows
if: always()
# Also run mm-workflows command to generate
# mm-workflows/autogenerated/schemas/config_schemas.json
run: cd mm-workflows/ && pip install ".[all]" && mm-workflows
- name: Build Documentation
if: always()
run: cd wic/docs && make html
- name: MyPy Check Type Annotations
if: always()
run: cd wic/ && mypy --no-incremental src/ tests/ api.py auth/
# NOTE: Do not use `mypy .` because then mypy will check both src/ and build/ causing:
# src/wic/__init__.py: error: Duplicate module named "wic" (also at "./build/lib/wic/__init__.py")
# NOTE: We need to use --no-incremental because there is a bug in mypy.
# This bug most often occurs when using ruamel library.
# See https://github.com/python/mypy/issues/12664
- name: PyLint Check Code Quality
if: always()
run: cd wic/ && pylint src/ tests/ api.py auth/
# NOTE: See fail-under threshold in .pylintrc
- name: Helm Lint Check Code Quality
if: always()
run: cd wic/ && helm lint deploy/helm/wic-api
- name: PEP8 Code Formatting
if: always()
id: autopep8
run: cd wic/ && autopep8 --exit-code --recursive --diff --max-line-length 120 examples/ src/ tests/ api.py auth/
- name: Fail if autopep8 made changes
if: steps.autopep8.outputs.exit-code == 2
run: exit 1
# NOTE: Do NOT add coverage to PYPY CI runs https://github.com/tox-dev/tox/issues/2252
- name: PyTest CWL Embedding Independence
if: always()
run: cd wic/ && pytest -k test_cwl_embedding_independence # --cov --cov-config=.coveragerc_serial
# NOTE: This test MUST be run in serial! See is_isomorphic_with_timeout()
timeout-minutes: 5 # backup timeout for windows
- name: PyTest Inline Subworkflows
if: always()
run: cd wic/ && pytest -k test_inline_subworkflows # --cov --cov-config=.coveragerc_serial
# NOTE: This test MUST be run in serial! See is_isomorphic_with_timeout()
timeout-minutes: 5 # backup timeout for windows
- name: PyTest Fuzzy Compile
if: always()
run: cd wic/ && pytest -k test_fuzzy_compile
- name: PyTest Scattering Scaling
if: runner.os != 'Windows' # Cannot run on Windows (natively) yet
run: cd wic/ && pytest -k test_scattering_scaling
# NOTE: The steps below are for repository_dispatch only. For all other steps, please insert above
# this comment.
# Need to store success value in environment variable, rather than using 'success()' in-line inside a run tag.
# Otherwise: "The workflow is not valid. ... Unrecognized function: 'success'."
# https://github.com/actions/runner/issues/834#issuecomment-889484016
- name: The workflow has succeeded
if: success()
run: |
echo 'workflow_success=true' >> "$GITHUB_ENV"
# It is not clear from the documentation, but the 'success()' and 'failure()' functions
# do not consider skipped steps. Specifically, the above 'success()' function will not
# affect the 'failure()' function here.
# https://docs.github.com/en/actions/learn-github-actions/expressions#status-check-function
- name: The workflow has failed
if: failure()
run: |
echo 'workflow_success=false' >> "$GITHUB_ENV"
# See token.md
- name: Generate a token
id: generate_token
uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.APP_PRIVATE_KEY }}
- name: Check actor's identity
env:
APP_TOKEN: ${{ steps.generate_token.outputs.token }}
run: |
if ! curl -H "Accept: application/vnd.github+json" \
-H "X-GitHub-Api-Version: 2022-11-28" \
-H "Authorization: Bearer $APP_TOKEN" \
https://api.github.com/repos/${{ github.repository }}/collaborators \
| jq '.[].login' | grep "${{ inputs.sender_repo_owner }}";
then
echo "Account doesn't have enough permissions!" \
&& false;
fi
- name: Reply CI results to sender
# In case of failure, we still need to return the failure status to the original repository.
# Use 'always()' so this step runs even if there's a failure and use an internal if-statement
# to only run this step only if the repository_dispatch sends the signal.
# https://github.com/actions/runner/issues/834#issuecomment-907096707
# Use inputs.sender_repo to reply the original sender.
if: always()
uses: ./wic/.github/my_actions/reply_sender/ # Must start with ./
with:
github_repository: ${{ github.repository }}
event_type: ${{ inputs.event_type }}
sender_repo: ${{ inputs.sender_repo }}
operating_system: ${{ matrix.os }}
commit_message: ${{ inputs.commit_message }}
mm_workflows_ref: ${{ inputs.mm-workflows_ref }}
workflow_success: ${{ env.workflow_success }}
access_token: ${{ steps.generate_token.outputs.token }}