Build Test #342
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 Test | |
# Builds and tests stormpy with different versions of Storm | |
# also deploys images to Dockerhub | |
on: | |
push: | |
branches: | |
- master | |
schedule: | |
# run weekly | |
- cron: '0 10 * * 3' | |
# needed to trigger the workflow manually | |
workflow_dispatch: | |
pull_request: | |
env: | |
GIT_URL: "${{ github.server_url }}/${{ github.repository }}.git" | |
BRANCH: "${{ github.ref }}" | |
# GitHub runners currently have two cores | |
NR_JOBS: "2" | |
jobs: | |
indepthTests: | |
name: Indepth Tests (${{ matrix.debugOrRelease}}, ${{ matrix.setupArgs.name }}) | |
runs-on: ubuntu-latest | |
env: | |
RELEASE_IMG: "storm:ci-release" | |
DEBUG_IMG: "storm:ci-debug" | |
strategy: | |
matrix: | |
debugOrRelease: ["debug", "release"] | |
setupArgs: | |
- {name: "all libraries", disableFlags: "", optionalLibs: "[numpy,plot]"} | |
- {name: "no libraries", disableFlags: "--disable-dft --disable-gspn --disable-pars --disable-pomdp", optionalLibs: ""} | |
steps: | |
- name: Setup environment variables | |
# this is strangely the best way to implement environment variables based on the value of another | |
# GITHUB_ENV is a magic variable pointing to a file; if a line with format {NAME}={VALUE} | |
# then the env variable with name NAME will be created/updated with VALUE | |
run: | | |
([[ ${{ matrix.debugOrRelease }} == "debug" ]] && echo "BUILD_TYPE=Debug" || echo "BUILD_TYPE=Release") >> $GITHUB_ENV | |
([[ ${{ matrix.debugOrRelease }} == "debug" ]] && echo "IMG=${DEBUG_IMG}" || echo "IMG=${RELEASE_IMG}") >> $GITHUB_ENV | |
([[ ${{ matrix.debugOrRelease }} == "debug" ]] && echo "DEBUG_SWITCH=--debug" || true) >> $GITHUB_ENV | |
# Restrict tests to directory 'tests' (excluding examples and documentation) if not all libraries are present | |
([[ "${{ matrix.setupArgs.disableFlags }}" != "" ]] && echo "TEST_OPT=--addopts tests" || true) >> $GITHUB_ENV | |
- name: Git clone | |
uses: actions/checkout@v3 | |
- name: Build stormpy from Dockerfile | |
run: docker build -t movesrwth/stormpy:ci-${{ matrix.debugOrRelease }} . --build-arg STORM_BASE=movesrwth/${IMG} --build-arg build_type=${BUILD_TYPE} --build-arg setup_args="${DEBUG_SWITCH} ${{ matrix.setupArgs.disableFlags }}" --build-arg setup_args_pycarl=${DEBUG_SWITCH} --build-arg no_threads=${NR_JOBS} | |
- name: Run Docker | |
run: docker run -d -it --name ci movesrwth/stormpy:ci-${{ matrix.debugOrRelease }} | |
- name: Build optional stormpy libraries | |
run: docker exec ci bash -c "cd /opt/stormpy; pip3 install -e '.${{ matrix.setupArgs.optionalLibs }}'" | |
- name: Run tests | |
run: docker exec ci bash -c "cd /opt/stormpy; python setup.py test $TEST_OPT" | |
stableTest: | |
name: Test on stable | |
runs-on: ubuntu-latest | |
env: | |
RELEASE_IMG: "storm:stable" | |
DEBUG_IMG: "storm:stable-debug" | |
strategy: | |
matrix: | |
debugOrRelease: ["debug", "release"] | |
# Allow failures of stable versions as new features might have been added | |
steps: | |
- name: Setup environment variables | |
# this is strangely the best way to implement environment variables based on the value of another | |
# GITHUB_ENV is a magic variable pointing to a file; if a line with format {NAME}={VALUE} | |
# then the env variable with name NAME will be created/updated with VALUE | |
run: | | |
([[ ${{ matrix.debugOrRelease }} == "debug" ]] && echo "BUILD_TYPE=Debug" || echo "BUILD_TYPE=Release") >> $GITHUB_ENV | |
([[ ${{ matrix.debugOrRelease }} == "debug" ]] && echo "IMG=${DEBUG_IMG}" || echo "IMG=${RELEASE_IMG}") >> $GITHUB_ENV | |
([[ ${{ matrix.debugOrRelease }} == "debug" ]] && echo "DEBUG_SWITCH=--debug" || true) >> $GITHUB_ENV | |
- name: Git clone | |
uses: actions/checkout@v3 | |
- name: Replace Dockerfile | |
run: cp .github/workflows/Dockerfile.stable Dockerfile | |
- name: Build dependencies | |
run: docker build -t movesrwth/stormpy:ci-${{ matrix.debugOrRelease }} . --build-arg STORM_BASE=movesrwth/${IMG} --build-arg build_type=${BUILD_TYPE} --build-arg setup_args_pycarl=${DEBUG_SWITCH} --build-arg no_threads=${NR_JOBS} | |
- name: Run Docker | |
run: docker run -d -it --name ci movesrwth/stormpy:ci-${{ matrix.debugOrRelease }} | |
- name: Build stormpy | |
# Build stormpy explicitly to catch exit code | |
id: build_stormpy | |
shell: bash {0} // Deactivate fast-fail to handle exit code for incompatibility | |
run: | | |
docker exec ci bash -c "cd /opt/stormpy; python setup.py build_ext ${DEBUG_SWITCH} -j ${NR_JOBS} develop" | |
status=$? | |
if [ $status -eq 42 ]; then | |
# Warn about incompatibility but do not handle as failure | |
echo "::warning file=setup.py,line=82::Stormpy is incompatible with stable version of Storm" | |
# Deactivate tests | |
echo "run_tests=false" >> $GITHUB_OUTPUT | |
else | |
echo "run_tests=true" >> $GITHUB_OUTPUT | |
exit $status | |
fi | |
- name: Run tests | |
if: steps.build_stormpy.outputs.run_tests == 'true' | |
run: docker exec ci bash -c "cd /opt/stormpy; python setup.py test" | |
deploy: | |
name: Test and Deploy on latest | |
runs-on: ubuntu-latest | |
env: | |
RELEASE_IMG: "storm:ci-release" | |
DEBUG_IMG: "storm:ci-debug" | |
strategy: | |
matrix: | |
debugOrRelease: ["debug", "release"] | |
steps: | |
- name: Setup environment variables | |
# this is strangely the best way to implement environment variables based on the value of another | |
# GITHUB_ENV is a magic variable pointing to a file; if a line with format {NAME}={VALUE} | |
# then the env variable with name NAME will be created/updated with VALUE | |
run: | | |
([[ ${{ matrix.debugOrRelease }} == "debug" ]] && echo "CMAKE_ARGS=${CMAKE_DEBUG}" || echo "CMAKE_ARGS=${CMAKE_RELEASE}") >> $GITHUB_ENV | |
([[ ${{ matrix.debugOrRelease }} == "debug" ]] && echo "IMG=${DEBUG_IMG}" || echo "IMG=${RELEASE_IMG}") >> $GITHUB_ENV | |
([[ ${{ matrix.debugOrRelease }} == "debug" ]] && echo "DEBUG_SWITCH=--debug" || true) >> $GITHUB_ENV | |
- name: Git clone | |
uses: actions/checkout@v3 | |
- name: Build stormpy from Dockerfile | |
run: docker build -t movesrwth/stormpy:ci-${{ matrix.debugOrRelease }} . --build-arg STORM_BASE=movesrwth/${IMG} --build-arg build_type=${BUILD_TYPE} --build-arg setup_args=${DEBUG_SWITCH} --build-arg setup_args_pycarl=${DEBUG_SWITCH} --build-arg no_threads=${NR_JOBS} | |
- name: Run Docker | |
run: docker run -d -it --name ci movesrwth/stormpy:ci-${{ matrix.debugOrRelease }} | |
- name: Run tests | |
run: docker exec ci bash -c "cd /opt/stormpy; python setup.py test" | |
- name: Login into docker | |
# Only login if using master on original repo (and not for pull requests or forks) | |
if: github.repository_owner == 'moves-rwth' && github.ref == 'refs/heads/master' | |
run: echo "${{ secrets.STORM_CI_DOCKER_PASSWORD }}" | docker login -u "${{ secrets.STORM_CI_DOCKER_USERNAME }}" --password-stdin | |
- name: Deploy stormpy | |
# Only deploy if using master on original repo (and not for pull requests or forks) | |
if: github.repository_owner == 'moves-rwth' && github.ref == 'refs/heads/master' | |
run: | | |
docker commit ci movesrwth/stormpy:ci-${{ matrix.debugOrRelease }} | |
docker push movesrwth/stormpy:ci-${{ matrix.debugOrRelease }} | |
- name: Install documentation dependencies | |
if: matrix.debugOrRelease == 'release' | |
run: | | |
docker exec ci apt-get install -qq -y pandoc | |
docker exec ci bash -c "cd /opt/stormpy; pip install -e '.[doc,numpy]'" | |
- name: Build documentation | |
if: matrix.debugOrRelease == 'release' | |
run: | | |
docker exec ci bash -c "cd /opt/stormpy/doc; make html" | |
docker exec ci rm -r /opt/stormpy/doc/build/html/_sources | |
docker cp ci:/opt/stormpy/doc/build/html . | |
- name: Deploy documentation | |
# Only deploy for release version and using master on original repo (and not for pull requests or forks) | |
if: matrix.debugOrRelease == 'release' && github.repository_owner == 'moves-rwth' && github.ref == 'refs/heads/master' | |
uses: peaceiris/actions-gh-pages@v3 | |
with: | |
personal_token: ${{ secrets.GITHUB_TOKEN }} | |
publish_dir: ./html | |
notify: | |
name: Email notification | |
runs-on: ubuntu-latest | |
needs: [indepthTests,stableTest, deploy] | |
# Only run in main repo and even if previous step failed | |
if: github.repository_owner == 'moves-rwth' && always() | |
steps: | |
- uses: technote-space/workflow-conclusion-action@v2 | |
- uses: dawidd6/action-send-mail@v2 | |
with: | |
server_address: ${{ secrets.STORM_CI_MAIL_SERVER }} | |
server_port: 587 | |
username: ${{ secrets.STORM_CI_MAIL_USERNAME }} | |
password: ${{ secrets.STORM_CI_MAIL_PASSWORD }} | |
subject: "[You broke it] CI run failed for ${{ github.repository }}" | |
body: | |
"CI job of ${{ github.repository }} has failed for commit ${{ github.sha }}.\n\ | |
The error type is: ${{ env.WORKFLOW_CONCLUSION }}.\n\n\ | |
For more information, see https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" | |
to: ${{ secrets.STORM_CI_MAIL_RECIPIENTS }} | |
from: Github Actions <[email protected]> | |
if: env.WORKFLOW_CONCLUSION != 'success' # notify only if failure |