From 9b74bc393ffefe71c4f66fe35bf1698f4dfb349d Mon Sep 17 00:00:00 2001
From: Matthias Volk <matthias.volk@cs.rwth-aachen.de>
Date: Thu, 23 May 2019 14:42:59 +0200
Subject: [PATCH] Travis: updated scripts and incorporated doxygen deployment

---
 .travis.yml                                 | 261 ++++++++++----------
 travis/build.sh                             |   9 +-
 travis/build_helper.sh                      |  59 +++--
 travis/{deploy_carl.sh => deploy_docker.sh} |  13 +-
 travis/deploy_storm.sh                      |  47 ----
 travis/generate_travis.py                   | 151 +++++------
 travis/mtime_cache/globs.txt                |   3 +
 travis/{install_linux.sh => skip_test.sh}   |   5 -
 8 files changed, 249 insertions(+), 299 deletions(-)
 rename travis/{deploy_carl.sh => deploy_docker.sh} (73%)
 delete mode 100755 travis/deploy_storm.sh
 rename travis/{install_linux.sh => skip_test.sh} (60%)

diff --git a/.travis.yml b/.travis.yml
index d38637977..c0282b855 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -6,7 +6,6 @@ branches:
   - master
   - stable
 sudo: required
-dist: trusty
 language: cpp
 
 git:
@@ -39,46 +38,48 @@ jobs:
     ###
     # Stage: Build Carl
     ###
-
     # ubuntu-19.04 - DefaultDebugTravis
     - stage: Build Carl
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultDebugTravis LINUX=ubuntu-19.04 COMPILER=gcc
-      install:
-        - travis/install_linux.sh
+      env: CONFIG=DefaultDebugTravis TASK=TestDocker LINUX=ubuntu-19.04 COMPILER=gcc
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
         - travis/build_carl.sh
-      after_success:
-        - travis/deploy_carl.sh
+      before_cache:
+        - docker cp carl:/opt/carl/. .
+      deploy:
+        - provider: script
+          skip_cleanup: true
+          script: bash travis/deploy_docker.sh carl
     # ubuntu-19.04 - DefaultReleaseTravis
     - stage: Build Carl
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultReleaseTravis LINUX=ubuntu-19.04 COMPILER=gcc
-      install:
-        - travis/install_linux.sh
+      env: CONFIG=DefaultReleaseTravis TASK=TestDockerDoxygen LINUX=ubuntu-19.04 COMPILER=gcc
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
         - travis/build_carl.sh
-      after_success:
-        - travis/deploy_carl.sh
+      before_cache:
+        - docker cp carl:/opt/carl/. .
+      deploy:
+        - provider: script
+          skip_cleanup: true
+          script: bash travis/deploy_docker.sh carl
 
     ###
     # Stage: Build (1st run)
     ###
-
     # ubuntu-18.04 - DefaultDebug
     - stage: Build (1st run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultDebug LINUX=ubuntu-18.04 COMPILER=gcc
+      env: CONFIG=DefaultDebug TASK=Test LINUX=ubuntu-18.04 COMPILER=gcc
       install:
         - rm -rf build
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -91,10 +92,10 @@ jobs:
     - stage: Build (1st run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultRelease LINUX=ubuntu-18.04 COMPILER=gcc
+      env: CONFIG=DefaultRelease TASK=Test LINUX=ubuntu-18.04 COMPILER=gcc
       install:
         - rm -rf build
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -107,10 +108,10 @@ jobs:
     - stage: Build (1st run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultDebug LINUX=debian-9 COMPILER=gcc
+      env: CONFIG=DefaultDebug TASK=Test LINUX=debian-9 COMPILER=gcc
       install:
         - rm -rf build
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -123,10 +124,10 @@ jobs:
     - stage: Build (1st run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultRelease LINUX=debian-9 COMPILER=gcc
+      env: CONFIG=DefaultRelease TASK=Test LINUX=debian-9 COMPILER=gcc
       install:
         - rm -rf build
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -139,10 +140,10 @@ jobs:
     - stage: Build (1st run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultDebug LINUX=ubuntu-18.10 COMPILER=gcc
+      env: CONFIG=DefaultDebug TASK=Test LINUX=ubuntu-18.10 COMPILER=gcc
       install:
         - rm -rf build
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -155,10 +156,10 @@ jobs:
     - stage: Build (1st run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultRelease LINUX=ubuntu-18.10 COMPILER=gcc
+      env: CONFIG=DefaultRelease TASK=Test LINUX=ubuntu-18.10 COMPILER=gcc
       install:
         - rm -rf build
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -171,10 +172,10 @@ jobs:
     - stage: Build (1st run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultDebugTravis LINUX=ubuntu-19.04 COMPILER=gcc
+      env: CONFIG=DefaultDebugTravis TASK=TestDocker LINUX=ubuntu-19.04 COMPILER=gcc
       install:
         - rm -rf build
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -187,10 +188,10 @@ jobs:
     - stage: Build (1st run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultReleaseTravis LINUX=ubuntu-19.04 COMPILER=gcc
+      env: CONFIG=DefaultReleaseTravis TASK=TestDockerDoxygen LINUX=ubuntu-19.04 COMPILER=gcc
       install:
         - rm -rf build
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -203,14 +204,13 @@ jobs:
     ###
     # Stage: Build (2nd run)
     ###
-
     # ubuntu-18.04 - DefaultDebug
     - stage: Build (2nd run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultDebug LINUX=ubuntu-18.04 COMPILER=gcc
+      env: CONFIG=DefaultDebug TASK=Test LINUX=ubuntu-18.04 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -223,9 +223,9 @@ jobs:
     - stage: Build (2nd run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultRelease LINUX=ubuntu-18.04 COMPILER=gcc
+      env: CONFIG=DefaultRelease TASK=Test LINUX=ubuntu-18.04 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -238,9 +238,9 @@ jobs:
     - stage: Build (2nd run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultDebug LINUX=debian-9 COMPILER=gcc
+      env: CONFIG=DefaultDebug TASK=Test LINUX=debian-9 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -253,9 +253,9 @@ jobs:
     - stage: Build (2nd run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultRelease LINUX=debian-9 COMPILER=gcc
+      env: CONFIG=DefaultRelease TASK=Test LINUX=debian-9 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -268,9 +268,9 @@ jobs:
     - stage: Build (2nd run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultDebug LINUX=ubuntu-18.10 COMPILER=gcc
+      env: CONFIG=DefaultDebug TASK=Test LINUX=ubuntu-18.10 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -283,9 +283,9 @@ jobs:
     - stage: Build (2nd run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultRelease LINUX=ubuntu-18.10 COMPILER=gcc
+      env: CONFIG=DefaultRelease TASK=Test LINUX=ubuntu-18.10 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -298,9 +298,9 @@ jobs:
     - stage: Build (2nd run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultDebugTravis LINUX=ubuntu-19.04 COMPILER=gcc
+      env: CONFIG=DefaultDebugTravis TASK=TestDocker LINUX=ubuntu-19.04 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -313,9 +313,9 @@ jobs:
     - stage: Build (2nd run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultReleaseTravis LINUX=ubuntu-19.04 COMPILER=gcc
+      env: CONFIG=DefaultReleaseTravis TASK=TestDockerDoxygen LINUX=ubuntu-19.04 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -328,14 +328,13 @@ jobs:
     ###
     # Stage: Build (3rd run)
     ###
-
     # ubuntu-18.04 - DefaultDebug
     - stage: Build (3rd run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultDebug LINUX=ubuntu-18.04 COMPILER=gcc
+      env: CONFIG=DefaultDebug TASK=Test LINUX=ubuntu-18.04 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -348,9 +347,9 @@ jobs:
     - stage: Build (3rd run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultRelease LINUX=ubuntu-18.04 COMPILER=gcc
+      env: CONFIG=DefaultRelease TASK=Test LINUX=ubuntu-18.04 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -363,9 +362,9 @@ jobs:
     - stage: Build (3rd run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultDebug LINUX=debian-9 COMPILER=gcc
+      env: CONFIG=DefaultDebug TASK=Test LINUX=debian-9 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -378,9 +377,9 @@ jobs:
     - stage: Build (3rd run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultRelease LINUX=debian-9 COMPILER=gcc
+      env: CONFIG=DefaultRelease TASK=Test LINUX=debian-9 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -393,9 +392,9 @@ jobs:
     - stage: Build (3rd run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultDebug LINUX=ubuntu-18.10 COMPILER=gcc
+      env: CONFIG=DefaultDebug TASK=Test LINUX=ubuntu-18.10 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -408,9 +407,9 @@ jobs:
     - stage: Build (3rd run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultRelease LINUX=ubuntu-18.10 COMPILER=gcc
+      env: CONFIG=DefaultRelease TASK=Test LINUX=ubuntu-18.10 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -423,9 +422,9 @@ jobs:
     - stage: Build (3rd run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultDebugTravis LINUX=ubuntu-19.04 COMPILER=gcc
+      env: CONFIG=DefaultDebugTravis TASK=TestDocker LINUX=ubuntu-19.04 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -438,9 +437,9 @@ jobs:
     - stage: Build (3rd run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultReleaseTravis LINUX=ubuntu-19.04 COMPILER=gcc
+      env: CONFIG=DefaultReleaseTravis TASK=TestDockerDoxygen LINUX=ubuntu-19.04 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -453,14 +452,13 @@ jobs:
     ###
     # Stage: Build (4th run)
     ###
-
     # ubuntu-18.04 - DefaultDebug
     - stage: Build (4th run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultDebug LINUX=ubuntu-18.04 COMPILER=gcc
+      env: CONFIG=DefaultDebug TASK=Test LINUX=ubuntu-18.04 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -473,9 +471,9 @@ jobs:
     - stage: Build (4th run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultRelease LINUX=ubuntu-18.04 COMPILER=gcc
+      env: CONFIG=DefaultRelease TASK=Test LINUX=ubuntu-18.04 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -488,9 +486,9 @@ jobs:
     - stage: Build (4th run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultDebug LINUX=debian-9 COMPILER=gcc
+      env: CONFIG=DefaultDebug TASK=Test LINUX=debian-9 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -503,9 +501,9 @@ jobs:
     - stage: Build (4th run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultRelease LINUX=debian-9 COMPILER=gcc
+      env: CONFIG=DefaultRelease TASK=Test LINUX=debian-9 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -518,9 +516,9 @@ jobs:
     - stage: Build (4th run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultDebug LINUX=ubuntu-18.10 COMPILER=gcc
+      env: CONFIG=DefaultDebug TASK=Test LINUX=ubuntu-18.10 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -533,9 +531,9 @@ jobs:
     - stage: Build (4th run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultRelease LINUX=ubuntu-18.10 COMPILER=gcc
+      env: CONFIG=DefaultRelease TASK=Test LINUX=ubuntu-18.10 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -548,9 +546,9 @@ jobs:
     - stage: Build (4th run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultDebugTravis LINUX=ubuntu-19.04 COMPILER=gcc
+      env: CONFIG=DefaultDebugTravis TASK=TestDocker LINUX=ubuntu-19.04 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -563,9 +561,9 @@ jobs:
     - stage: Build (4th run)
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultReleaseTravis LINUX=ubuntu-19.04 COMPILER=gcc
+      env: CONFIG=DefaultReleaseTravis TASK=TestDockerDoxygen LINUX=ubuntu-19.04 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
@@ -576,147 +574,142 @@ jobs:
         - find build -iname '*err*.log' -type f -print -exec cat {} \;
 
     ###
-    # Stage: Test all
+    # Stage: Tasks
     ###
-
     # ubuntu-18.04 - DefaultDebug
-    - stage: Test all
+    - stage: Tasks
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultDebug LINUX=ubuntu-18.04 COMPILER=gcc
+      env: CONFIG=DefaultDebug TASK=Test LINUX=ubuntu-18.04 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
-        - travis/build.sh TestAll
+        - travis/build.sh Tasks
       before_cache:
         - docker cp storm:/opt/storm/. .
       after_failure:
         - find build -iname '*err*.log' -type f -print -exec cat {} \;
     # ubuntu-18.04 - DefaultRelease
-    - stage: Test all
+    - stage: Tasks
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultRelease LINUX=ubuntu-18.04 COMPILER=gcc
+      env: CONFIG=DefaultRelease TASK=Test LINUX=ubuntu-18.04 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
-        - travis/build.sh TestAll
+        - travis/build.sh Tasks
       before_cache:
         - docker cp storm:/opt/storm/. .
       after_failure:
         - find build -iname '*err*.log' -type f -print -exec cat {} \;
     # debian-9 - DefaultDebug
-    - stage: Test all
+    - stage: Tasks
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultDebug LINUX=debian-9 COMPILER=gcc
+      env: CONFIG=DefaultDebug TASK=Test LINUX=debian-9 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
-        - travis/build.sh TestAll
+        - travis/build.sh Tasks
       before_cache:
         - docker cp storm:/opt/storm/. .
       after_failure:
         - find build -iname '*err*.log' -type f -print -exec cat {} \;
     # debian-9 - DefaultRelease
-    - stage: Test all
+    - stage: Tasks
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultRelease LINUX=debian-9 COMPILER=gcc
+      env: CONFIG=DefaultRelease TASK=Test LINUX=debian-9 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
-        - travis/build.sh TestAll
+        - travis/build.sh Tasks
       before_cache:
         - docker cp storm:/opt/storm/. .
       after_failure:
         - find build -iname '*err*.log' -type f -print -exec cat {} \;
     # ubuntu-18.10 - DefaultDebug
-    - stage: Test all
+    - stage: Tasks
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultDebug LINUX=ubuntu-18.10 COMPILER=gcc
+      env: CONFIG=DefaultDebug TASK=Test LINUX=ubuntu-18.10 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
-        - travis/build.sh TestAll
+        - travis/build.sh Tasks
       before_cache:
         - docker cp storm:/opt/storm/. .
       after_failure:
         - find build -iname '*err*.log' -type f -print -exec cat {} \;
     # ubuntu-18.10 - DefaultRelease
-    - stage: Test all
+    - stage: Tasks
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultRelease LINUX=ubuntu-18.10 COMPILER=gcc
+      env: CONFIG=DefaultRelease TASK=Test LINUX=ubuntu-18.10 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
-        - travis/build.sh TestAll
+        - travis/build.sh Tasks
       before_cache:
         - docker cp storm:/opt/storm/. .
       after_failure:
         - find build -iname '*err*.log' -type f -print -exec cat {} \;
     # ubuntu-19.04 - DefaultDebugTravis
-    - stage: Test all
+    - stage: Tasks
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultDebugTravis LINUX=ubuntu-19.04 COMPILER=gcc
+      env: CONFIG=DefaultDebugTravis TASK=TestDocker LINUX=ubuntu-19.04 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
-        - travis/build.sh TestAll
+        - travis/build.sh Tasks
       before_cache:
         - docker cp storm:/opt/storm/. .
       after_failure:
         - find build -iname '*err*.log' -type f -print -exec cat {} \;
-      after_success:
-        - travis/deploy_storm.sh
+      deploy:
+        - provider: script
+          skip_cleanup: true
+          script: bash travis/deploy_docker.sh storm
     # ubuntu-19.04 - DefaultReleaseTravis
-    - stage: Test all
+    - stage: Tasks
       os: linux
       compiler: gcc
-      env: CONFIG=DefaultReleaseTravis LINUX=ubuntu-19.04 COMPILER=gcc
+      env: CONFIG=DefaultReleaseTravis TASK=TestDockerDoxygen LINUX=ubuntu-19.04 COMPILER=gcc
       install:
-        - travis/install_linux.sh
+        - travis/skip_test.sh
       before_script:
         - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode
       script:
-        - travis/build.sh TestAll
+        - travis/build.sh Tasks
       before_cache:
         - docker cp storm:/opt/storm/. .
       after_failure:
         - find build -iname '*err*.log' -type f -print -exec cat {} \;
-      after_success:
-        - travis/deploy_storm.sh
-  allow_failures:
-    - stage: Build (1st run)
-      os: linux
-      env: CONFIG=DefaultReleaseTravis LINUX=ubuntu-19.04 COMPILER=gcc
-    - stage: Build (2nd run)
-      os: linux
-      env: CONFIG=DefaultReleaseTravis LINUX=ubuntu-19.04 COMPILER=gcc
-    - stage: Build (3rd run)
-      os: linux
-      env: CONFIG=DefaultReleaseTravis LINUX=ubuntu-19.04 COMPILER=gcc
-    - stage: Build (4th run)
-      os: linux
-      env: CONFIG=DefaultReleaseTravis LINUX=ubuntu-19.04 COMPILER=gcc
-    - stage: Test all
-      os: linux
-      env: CONFIG=DefaultReleaseTravis LINUX=ubuntu-19.04 COMPILER=gcc
+      deploy:
+        - provider: script
+          skip_cleanup: true
+          script: bash travis/deploy_docker.sh storm
+        - provider: pages
+          skip_cleanup: true
+          github_token: $GITHUB_TOKEN
+          local_dir: build/doc/html/
+          repo: moves-rwth/storm-doc
+          target_branch: master
+          on:
+            branch: master
 
diff --git a/travis/build.sh b/travis/build.sh
index 2873a6ec7..6e3094549 100755
--- a/travis/build.sh
+++ b/travis/build.sh
@@ -37,6 +37,11 @@ linux)
         docker run -d -it --name storm --privileged movesrwth/storm-basesystem:$LINUX
         ;;
     esac
+    # Install doxygen if necessary
+    if [[ "$TASK" == *Doxygen* ]]
+    then
+        docker exec storm apt-get install -qq -y doxygen
+    fi
     # Copy local content into container
     docker exec storm mkdir /opt/storm
     docker cp . storm:/opt/storm
@@ -45,6 +50,7 @@ linux)
     # Execute main process
     docker exec storm bash -c "
         export CONFIG=$CONFIG;
+        export TASK=$TASK;
         export COMPILER=$COMPILER;
         export N_JOBS=$N_JOBS;
         export STLARG=;
@@ -57,7 +63,8 @@ linux)
 osx)
     # Mac OSX
     STLARG="-stdlib=libc++"
-    export CONFIG=$CONFIG
+    export CONFIG
+    export TASK
     export COMPILER
     export N_JOBS
     export STLARG
diff --git a/travis/build_helper.sh b/travis/build_helper.sh
index f44b2feb2..662b66640 100755
--- a/travis/build_helper.sh
+++ b/travis/build_helper.sh
@@ -53,27 +53,44 @@ run() {
     fi
     ;;
 
-  TestAll)
-    # Test all
-    travis_fold start test_all
-    cd build
-    ctest test --output-on-failure
-    travis_fold end test_all
-
-    # Check correctness of build types
-    echo "Checking correctness of build types"
-    case "$CONFIG" in
-    DefaultDebug*)
-        ./bin/storm --version | grep "with flags .* -g" || (echo "Error: Missing flag '-g' for debug build." && return 1)
-        ;;
-    DefaultRelease*)
-        ./bin/storm --version | grep "with flags .* -O3" || (echo "Error: Missing flag '-O3' for release build." && return 1)
-        ./bin/storm --version | grep "with flags .* -DNDEBUG" || (echo "Error: Missing flag '-DNDEBUG' for release build." && return 1)
-        ;;
-    *)
-        echo "Unrecognized value of CONFIG: $CONFIG"; exit 1
-        ;;
-    esac
+  Tasks)
+    # Perform tasks
+    if [[ "$TASK" == *Test* ]]
+    then
+        # Test all
+        travis_fold start test_all
+        cd build
+        ctest test --output-on-failure
+        travis_fold end test_all
+
+        # Check correctness of build types
+        echo "Checking correctness of build types"
+        case "$CONFIG" in
+        DefaultDebug*)
+            ./bin/storm --version | grep "with flags .* -g" || (echo "Error: Missing flag '-g' for debug build." && return 1)
+            ;;
+        DefaultRelease*)
+            ./bin/storm --version | grep "with flags .* -O3" || (echo "Error: Missing flag '-O3' for release build." && return 1)
+            ./bin/storm --version | grep "with flags .* -DNDEBUG" || (echo "Error: Missing flag '-DNDEBUG' for release build." && return 1)
+            ;;
+        *)
+            echo "Unrecognized value of CONFIG: $CONFIG"
+            exit 1
+        esac
+        cd ..
+    fi
+
+    if [[ "$TASK" == *Doxygen* ]]
+    then
+        # Generate doxygen doc
+        travis_fold start make_doc
+        cd build
+        make -j$N_JOBS doc
+        # Disable jekyll as otherwise files with starting underscore are not published
+        echo "" > doc/html/.nojekyll
+        cd ..
+        travis_fold end make_doc
+    fi
     ;;
 
   *)
diff --git a/travis/deploy_carl.sh b/travis/deploy_docker.sh
similarity index 73%
rename from travis/deploy_carl.sh
rename to travis/deploy_docker.sh
index 787e7fcec..c0fe17823 100755
--- a/travis/deploy_carl.sh
+++ b/travis/deploy_docker.sh
@@ -15,18 +15,20 @@ if [ "${TRAVIS_PULL_REQUEST}" != "false" ]; then
     exit 0;
 fi
 
+echo "Deploying $1 to Dockerhub"
+
 case $OS in
 linux)
     echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
     # Deploy as debug/release
     case "$CONFIG" in
     *DebugTravis)
-        docker commit carl movesrwth/carl:travis-debug
-        docker push movesrwth/carl:travis-debug
+        docker commit $1 movesrwth/$1:travis-debug
+        docker push movesrwth/$1:travis-debug
         ;;
     *ReleaseTravis)
-        docker commit carl movesrwth/carl:travis
-        docker push movesrwth/carl:travis
+        docker commit $1 movesrwth/$1:travis
+        docker push movesrwth/$1:travis
         ;;
     *)
         echo "Unrecognized value of CONFIG: $CONFIG"; exit 1
@@ -35,7 +37,7 @@ linux)
     ;;
 
 osx)
-    echo "Building carl on Mac OSX not used."
+    echo "Docker deployment on Mac OSX not used."
     exit 1
     ;;
 
@@ -44,4 +46,3 @@ osx)
     echo "Unsupported OS: $OS"
     exit 1
 esac
-
diff --git a/travis/deploy_storm.sh b/travis/deploy_storm.sh
deleted file mode 100755
index e1c41a3cd..000000000
--- a/travis/deploy_storm.sh
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/bin/bash -x
-
-set -e
-
-OS=$TRAVIS_OS_NAME
-
-# Do not deploy if credentials are not given
-if [ "${TRAVIS_SECURE_ENV_VARS}" == "false" ]; then
-    echo "WARNING: Not deploying as no credentials are given."
-    exit 0;
-fi
-
-# Do not deploy for pull requests
-if [ "${TRAVIS_PULL_REQUEST}" != "false" ]; then
-    exit 0;
-fi
-
-case $OS in
-linux)
-    echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
-    # Deploy as debug/release
-    case "$CONFIG" in
-    *DebugTravis)
-        docker commit storm movesrwth/storm:travis-debug
-        docker push movesrwth/storm:travis-debug
-        ;;
-    *ReleaseTravis)
-        docker commit storm movesrwth/storm:travis
-        docker push movesrwth/storm:travis
-        ;;
-    *)
-        echo "Unrecognized value of CONFIG: $CONFIG"; exit 1
-        ;;
-    esac
-    ;;
-
-osx)
-    echo "Building Storm on Mac OSX not used."
-    exit 1
-    ;;
-
-*)
-    # Unknown OS
-    echo "Unsupported OS: $OS"
-    exit 1
-esac
-
diff --git a/travis/generate_travis.py b/travis/generate_travis.py
index 3ca733d24..4493a3686 100644
--- a/travis/generate_travis.py
+++ b/travis/generate_travis.py
@@ -1,38 +1,37 @@
 # Generate .travis.yml automatically
 
 # Configuration for Linux
-configs_linux = [
-    # OS, compiler, build type
-    ("ubuntu-18.04", "gcc", "DefaultDebug"),
-    ("ubuntu-18.04", "gcc", "DefaultRelease"),
-    ("debian-9", "gcc", "DefaultDebug"),
-    ("debian-9", "gcc", "DefaultRelease"),
-    ("ubuntu-18.10", "gcc", "DefaultDebug"),
-    ("ubuntu-18.10", "gcc", "DefaultRelease"),
-    ("ubuntu-19.04", "gcc", "DefaultDebugTravis"),
-    ("ubuntu-19.04", "gcc", "DefaultReleaseTravis"),
-]
-
-# Configurations for Mac
-configs_mac = [
-    # OS, compiler, build type
-#    ("osx", "clang", "DefaultDebug"),
-#    ("osx", "clang", "DefaultRelease"),
+configs = [
+    # OS, OS version, compiler, build type, task
+    ("ubuntu", "18.04", "gcc", "DefaultDebug", "Test"),
+    ("ubuntu", "18.04", "gcc", "DefaultRelease", "Test"),
+    ("debian", "9", "gcc", "DefaultDebug", "Test"),
+    ("debian", "9", "gcc", "DefaultRelease", "Test"),
+    ("ubuntu", "18.10", "gcc", "DefaultDebug", "Test"),
+    ("ubuntu", "18.10", "gcc", "DefaultRelease", "Test"),
+    ("ubuntu", "19.04", "gcc", "DefaultDebugTravis", "TestDocker"),
+    ("ubuntu", "19.04", "gcc", "DefaultReleaseTravis", "TestDockerDoxygen"),
+#    ("osx", "xcode9.3", "clang", "DefaultDebug", "Test"),
+#    ("osx", "xcode9.3", "clang", "DefaultRelease", "Test"),
 ]
 
 # Stages in travis
-stages = [
+build_stages = [
     ("Build (1st run)", "Build1"),
     ("Build (2nd run)", "Build2"),
     ("Build (3rd run)", "Build3"),
     ("Build (4th run)", "BuildLast"),
-    ("Test all", "TestAll"),
+    ("Tasks", "Tasks"),
 ]
 
+def get_env_string(os, os_version, compiler, build_type, task):
+    if os == "osx":
+        return "CONFIG={} TASK={} COMPILER={} STL=libc++\n".format(build_type, task, compiler)
+    else:
+        return "CONFIG={} TASK={} LINUX={} COMPILER={}\n".format(build_type, task, "{}-{}".format(os, os_version), compiler)
 
-if __name__ == "__main__":
-    allow_failures = []
 
+if __name__ == "__main__":
     s = ""
     # Initial config
     s += "#\n"
@@ -43,7 +42,6 @@ if __name__ == "__main__":
     s += "  - master\n"
     s += "  - stable\n"
     s += "sudo: required\n"
-    s += "dist: trusty\n"
     s += "language: cpp\n"
     s += "\n"
     s += "git:\n"
@@ -79,97 +77,80 @@ if __name__ == "__main__":
     s += "    ###\n"
     s += "    # Stage: Build Carl\n"
     s += "    ###\n"
-    s += "\n"
-    for config in configs_linux:
-        linux = config[0]
-        compiler = config[1]
-        build_type = config[2]
+    for config in configs:
+        os, os_version, compiler, build_type, task = config
+        os_type = "osx" if os == "osx" else "linux"
         if "Travis" in build_type:
-            s += "    # {} - {}\n".format(linux, build_type)
+            s += "    # {}-{} - {}\n".format(os, os_version, build_type)
             buildConfig = ""
             buildConfig += "    - stage: Build Carl\n"
-            buildConfig += "      os: linux\n"
+            buildConfig += "      os: {}\n".format(os_type)
             buildConfig += "      compiler: {}\n".format(compiler)
-            buildConfig += "      env: CONFIG={} LINUX={} COMPILER={}\n".format(build_type, linux, compiler)
-            buildConfig += "      install:\n"
-            buildConfig += "        - travis/install_linux.sh\n"
+            buildConfig += "      env: {}".format(get_env_string(os, os_version, compiler, build_type, task))
             buildConfig += "      before_script:\n"
             buildConfig += '        - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode\n'
             buildConfig += "      script:\n"
             buildConfig += "        - travis/build_carl.sh\n"
+            buildConfig += "      before_cache:\n"
+            buildConfig += "        - docker cp carl:/opt/carl/. .\n"
             # Upload to DockerHub
-            buildConfig += "      after_success:\n"
-            buildConfig += "        - travis/deploy_carl.sh\n"
+            buildConfig += "      deploy:\n"
+            buildConfig += "        - provider: script\n"
+            buildConfig += "          skip_cleanup: true\n"
+            buildConfig += "          script: bash travis/deploy_docker.sh carl\n"
             s += buildConfig
 
-    # Generate all configurations
-    for stage in stages:
+    # Generate all build configurations
+    for stage in build_stages:
         s += "\n"
         s += "    ###\n"
         s += "    # Stage: {}\n".format(stage[0])
         s += "    ###\n"
-        s += "\n"
-        # Mac OS X
-        for config in configs_mac:
-            osx = config[0]
-            compiler = config[1]
-            build_type = config[2]
-            s += "    # {} - {}\n".format(osx, build_type)
+        for config in configs:
+            os, os_version, compiler, build_type, task = config
+            os_type = "osx" if os == "osx" else "linux"
+            s += "    # {}-{} - {}\n".format(os, os_version, build_type)
             buildConfig = ""
             buildConfig += "    - stage: {}\n".format(stage[0])
-            buildConfig += "      os: osx\n"
-            buildConfig += "      osx_image: xcode9.1\n"
+            buildConfig += "      os: {}\n".format(os_type)
+            if os_type == "osx":
+                buildConfig += "      osx_image: {}\n".format(os_version)
             buildConfig += "      compiler: {}\n".format(compiler)
-            buildConfig += "      env: CONFIG={} COMPILER={} STL=libc++\n".format(build_type, compiler)
+            buildConfig += "      env: {}".format(get_env_string(os, os_version, compiler, build_type, task))
             buildConfig += "      install:\n"
             if stage[1] == "Build1":
                 buildConfig += "        - rm -rf build\n"
-            buildConfig += "        - travis/install_osx.sh\n"
+            buildConfig += "        - travis/skip_test.sh\n"
+            if os_type == "osx":
+                buildConfig += "        - travis/install_osx.sh\n"
             buildConfig += "      before_script:\n"
             buildConfig += '        - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode\n'
             buildConfig += "      script:\n"
             buildConfig += "        - travis/build.sh {}\n".format(stage[1])
+            if os_type == "linux":
+                buildConfig += "      before_cache:\n"
+                buildConfig += "        - docker cp storm:/opt/storm/. .\n"
             buildConfig += "      after_failure:\n"
             buildConfig += "        - find build -iname '*err*.log' -type f -print -exec cat {} \;\n"
-            s += buildConfig
 
-        # Linux via Docker
-        for config in configs_linux:
-            allow_fail = ""
-            linux = config[0]
-            compiler = config[1]
-            build_type = config[2]
-            s += "    # {} - {}\n".format(linux, build_type)
-            buildConfig = ""
-            buildConfig += "    - stage: {}\n".format(stage[0])
-            allow_fail += "    - stage: {}\n".format(stage[0])
-            buildConfig += "      os: linux\n"
-            allow_fail += "      os: linux\n"
-            buildConfig += "      compiler: {}\n".format(compiler)
-            buildConfig += "      env: CONFIG={} LINUX={} COMPILER={}\n".format(build_type, linux, compiler)
-            allow_fail += "      env: CONFIG={} LINUX={} COMPILER={}\n".format(build_type, linux, compiler)
-            buildConfig += "      install:\n"
-            if stage[1] == "Build1":
-                buildConfig += "        - rm -rf build\n"
-            buildConfig += "        - travis/install_linux.sh\n"
-            buildConfig += "      before_script:\n"
-            buildConfig += '        - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" # Workaround for nonblocking mode\n'
-            buildConfig += "      script:\n"
-            buildConfig += "        - travis/build.sh {}\n".format(stage[1])
-            buildConfig += "      before_cache:\n"
-            buildConfig += "        - docker cp storm:/opt/storm/. .\n"
-            buildConfig += "      after_failure:\n"
-            buildConfig += "        - find build -iname '*err*.log' -type f -print -exec cat {} \;\n"
-            # Upload to DockerHub
-            if stage[1] == "TestAll" and "Travis" in build_type:
-                buildConfig += "      after_success:\n"
-                buildConfig += "        - travis/deploy_storm.sh\n"
+            # Deployment
+            if stage[1] == "Tasks":
+                if "Docker" in task or "Doxygen" in task:
+                    buildConfig += "      deploy:\n"
+                if "Docker" in task:
+                    buildConfig += "        - provider: script\n"
+                    buildConfig += "          skip_cleanup: true\n"
+                    buildConfig += "          script: bash travis/deploy_docker.sh storm\n"
+                if "Doxygen" in task:
+                    buildConfig += "        - provider: pages\n"
+                    buildConfig += "          skip_cleanup: true\n"
+                    buildConfig += "          github_token: $GITHUB_TOKEN\n"
+                    buildConfig += "          local_dir: build/doc/html/\n"
+                    buildConfig += "          repo: moves-rwth/storm-doc\n"
+                    buildConfig += "          target_branch: master\n"
+                    buildConfig += "          on:\n"
+                    buildConfig += "            branch: master\n"
+
             s += buildConfig
-            if "Travis" in build_type and "Release" in build_type:
-                allow_failures.append(allow_fail)
 
-    if len(allow_failures) > 0:
-        s += "  allow_failures:\n"
-        for fail in allow_failures:
-            s += fail
     print(s)
diff --git a/travis/mtime_cache/globs.txt b/travis/mtime_cache/globs.txt
index a09cba27a..07312cb3d 100644
--- a/travis/mtime_cache/globs.txt
+++ b/travis/mtime_cache/globs.txt
@@ -1,5 +1,8 @@
 src/**/*.{%{cpp}}
+src/**/*.{in}
 src/**/CMakeLists.txt
 CMakeLists.txt
+*.{in}
 resources/3rdparty/**/*.{%{cpp}}
 resources/3rdparty/eigen-3.3-beta1/StormEigen/**/*
+resources/3rdparty/eigen-3.3-beta1/unsupported/**/*
diff --git a/travis/install_linux.sh b/travis/skip_test.sh
similarity index 60%
rename from travis/install_linux.sh
rename to travis/skip_test.sh
index 62a7d75f6..416850102 100755
--- a/travis/install_linux.sh
+++ b/travis/skip_test.sh
@@ -1,11 +1,6 @@
 #!/bin/bash
-
-set -e
-
 # Skip this run?
 if [ -f build/skip.txt ]
 then
   exit 0
 fi
-
-#sudo apt-get install -qq -y docker