| 1 | #!/usr/bin/env bash
 | 
| 2 | #
 | 
| 3 | # Run continuous build tasks.
 | 
| 4 | #
 | 
| 5 | # Usage:
 | 
| 6 | #   soil/worker.sh <function name>
 | 
| 7 | 
 | 
| 8 | set -o nounset
 | 
| 9 | set -o pipefail
 | 
| 10 | set -o errexit
 | 
| 11 | 
 | 
| 12 | REPO_ROOT=$(cd "$(dirname $0)/.."; pwd)  # tsv-lib.sh uses this
 | 
| 13 | readonly REPO_ROOT
 | 
| 14 | 
 | 
| 15 | source soil/common.sh
 | 
| 16 | source test/tsv-lib.sh
 | 
| 17 | 
 | 
| 18 | py-all-and-ninja() {
 | 
| 19 |   ### baseline for most tasks
 | 
| 20 | 
 | 
| 21 |   build/py.sh all
 | 
| 22 |   ./NINJA-config.sh
 | 
| 23 | }
 | 
| 24 | 
 | 
| 25 | ninja-config() {
 | 
| 26 |   ./NINJA-config.sh
 | 
| 27 | }
 | 
| 28 | 
 | 
| 29 | dummy-tasks() {
 | 
| 30 |   ### Print tasks that execute quickly
 | 
| 31 | 
 | 
| 32 |   # (task_name, script, action, result_html)
 | 
| 33 |   cat <<EOF
 | 
| 34 | os-info          soil/diagnose.sh os-info    -
 | 
| 35 | dump-env         soil/diagnose.sh dump-env   -
 | 
| 36 | EOF
 | 
| 37 | }
 | 
| 38 | 
 | 
| 39 | raw-vm-tasks() {
 | 
| 40 |   # The perf tool depends on a specific version of a kernel, so run it outside
 | 
| 41 |   # a container.
 | 
| 42 | 
 | 
| 43 |   # (task_name, script, action, result_html)
 | 
| 44 |   cat <<EOF
 | 
| 45 | os-info          soil/diagnose.sh os-info                     -
 | 
| 46 | dump-env         soil/diagnose.sh dump-env                    -
 | 
| 47 | perf-install     benchmarks/perf.sh soil-install              -
 | 
| 48 | wait-for-tarball soil/wait.sh for-cpp-tarball                 -
 | 
| 49 | test-install-tar devtools/release-native.sh test-install-tar  -
 | 
| 50 | perf-profiles    benchmarks/perf.sh soil-run                  _tmp/perf/index.html
 | 
| 51 | EOF
 | 
| 52 | }
 | 
| 53 | 
 | 
| 54 | # Oh there is a large list of pre-installed software
 | 
| 55 | # https://github.com/actions/runner-images#available-images
 | 
| 56 | # https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2004-Readme.md
 | 
| 57 | # https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2204-Readme.md
 | 
| 58 | #
 | 
| 59 | # 1. System deps for building wedges - ninja, cmake, libreadline-dev, etc.
 | 
| 60 | # 2. fetch wedges - re2c, cmark, python2, python3, MyPy, pyflakes
 | 
| 61 | #    - Python 3.10 desired for "pea"
 | 
| 62 | # 3. build them
 | 
| 63 | # 4. build Oils with them
 | 
| 64 | 
 | 
| 65 | dev-setup-for() {
 | 
| 66 |   local distro=$1
 | 
| 67 |   # (task_name, script, action, result_html)
 | 
| 68 | 
 | 
| 69 |   cat <<EOF
 | 
| 70 | os-info          soil/diagnose.sh os-info           -
 | 
| 71 | dump-env         soil/diagnose.sh dump-env          -
 | 
| 72 | wedge-deps       build/deps.sh wedge-deps-$distro   -
 | 
| 73 | fetch            build/deps.sh fetch                -
 | 
| 74 | install-wedges   build/deps.sh install-wedges-soil  _build/wedge/logs/index.html
 | 
| 75 | py-all-and-ninja soil/worker.sh py-all-and-ninja    -
 | 
| 76 | smoke-test       build/dev-setup-test.sh smoke-test -
 | 
| 77 | wedge-report     build/deps.sh wedge-report         -
 | 
| 78 | EOF
 | 
| 79 | }
 | 
| 80 | 
 | 
| 81 | spec-bin-for() {
 | 
| 82 |   local distro=$1
 | 
| 83 |   cat <<EOF
 | 
| 84 | os-info          soil/diagnose.sh os-info             -
 | 
| 85 | dump-env         soil/diagnose.sh dump-env            -
 | 
| 86 | wedge-deps       build/deps.sh wedge-deps-$distro     -
 | 
| 87 | fetch            build/deps.sh fetch                  -
 | 
| 88 | spec-bin         build/deps.sh install-spec-bin-fast  _build/wedge/logs/index.html
 | 
| 89 | EOF
 | 
| 90 | }
 | 
| 91 | 
 | 
| 92 | dev-setup-debian-tasks() {
 | 
| 93 |   # (task_name, script, action, result_html)
 | 
| 94 | 
 | 
| 95 |   dev-setup-for debian
 | 
| 96 | }
 | 
| 97 | 
 | 
| 98 | dev-setup-fedora-tasks() {
 | 
| 99 |   # (task_name, script, action, result_html)
 | 
| 100 | 
 | 
| 101 |   dev-setup-for fedora
 | 
| 102 | }
 | 
| 103 | 
 | 
| 104 | dev-setup-alpine-tasks() {
 | 
| 105 |   # (task_name, script, action, result_html)
 | 
| 106 | 
 | 
| 107 |   dev-setup-for alpine
 | 
| 108 | }
 | 
| 109 | 
 | 
| 110 | pea-tasks() {
 | 
| 111 |   ### Print tasks for the 'pea' build
 | 
| 112 | 
 | 
| 113 |   # We need a later version of Python 3 / MyPy both to type check and
 | 
| 114 |   # to parse
 | 
| 115 | 
 | 
| 116 |   # Run py-source so we can type check generated code
 | 
| 117 |   # We need to type check more than we translate
 | 
| 118 | 
 | 
| 119 |   # (task_name, script, action, result_html)
 | 
| 120 |   cat <<EOF
 | 
| 121 | os-info          soil/diagnose.sh os-info    -
 | 
| 122 | dump-env         soil/diagnose.sh dump-env   -
 | 
| 123 | py-source        build/py.sh py-source       -
 | 
| 124 | check-types      pea/TEST.sh check-types     -
 | 
| 125 | run-tests        pea/TEST.sh run-tests       -
 | 
| 126 | parse-all        pea/TEST.sh parse-all       -
 | 
| 127 | EOF
 | 
| 128 | }
 | 
| 129 | 
 | 
| 130 | dev-minimal-tasks() {
 | 
| 131 |   ### Print tasks for the 'dev-minimal' build
 | 
| 132 | 
 | 
| 133 |   # repo overview is suggested by README.md
 | 
| 134 | 
 | 
| 135 |   # (task_name, script, action, result_html)
 | 
| 136 |   cat <<EOF
 | 
| 137 | os-info             soil/diagnose.sh os-info                     -
 | 
| 138 | dump-env            soil/diagnose.sh dump-env                    -
 | 
| 139 | build-minimal       build/py.sh minimal                          -
 | 
| 140 | repo-overview       metrics/source-code.sh overview              -
 | 
| 141 | lint                test/lint.sh soil-run                        -
 | 
| 142 | asdl-types          asdl/TEST.sh check-types                     -
 | 
| 143 | oil-types           devtools/types.sh soil-run                   -
 | 
| 144 | unit                test/unit.sh minimal                         _test/py-unit/
 | 
| 145 | lossless            test/lossless.sh soil-run                    -
 | 
| 146 | parse-errors        test/parse-errors.sh soil-run-py             -
 | 
| 147 | runtime-errors      test/runtime-errors.sh soil-run-py           -
 | 
| 148 | ysh-parse-errors    test/ysh-parse-errors.sh soil-run-py         -
 | 
| 149 | ysh-runtime-errors  test/ysh-runtime-errors.sh soil-run-py       -
 | 
| 150 | ysh-every-string    test/ysh-every-string.sh soil-run-py         -
 | 
| 151 | ysh-large           ysh/run.sh soil-run                          -
 | 
| 152 | j8-errors           data_lang/j8-errors.sh soil-run-py           -
 | 
| 153 | link-busybox-ash    test/spec-bin.sh link-busybox-ash            -
 | 
| 154 | osh-minimal         test/spec-py.sh osh-minimal                  _tmp/spec/osh-minimal/index.html
 | 
| 155 | headless            client/run.sh soil-run-py                    -
 | 
| 156 | stdlib-test         stdlib/TEST.sh soil-run                      -
 | 
| 157 | EOF
 | 
| 158 | }
 | 
| 159 | 
 | 
| 160 | interactive-tasks() {
 | 
| 161 |   ### Print tasks for the 'interactive' build
 | 
| 162 | 
 | 
| 163 |   # TODO: also run interactive suite with osh-cpp
 | 
| 164 | 
 | 
| 165 | # TODO: Why does the needs-terminal suite hang in Docker?  It doesn't hang in an interactive Docker session.
 | 
| 166 | #
 | 
| 167 | # needs-terminal   test/spec-py.sh needs-terminal-all  _tmp/spec/needs-terminal-py/index.html
 | 
| 168 | #
 | 
| 169 | # https://oilshell.zulipchat.com/#narrow/stream/121539-oil-dev/topic/Spec.20Tests.20for.20Interactive.20Parsing
 | 
| 170 | 
 | 
| 171 |   cat <<EOF
 | 
| 172 | os-info          soil/diagnose.sh os-info            -
 | 
| 173 | dump-env         soil/diagnose.sh dump-env           -
 | 
| 174 | py-all-and-ninja soil/worker.sh py-all-and-ninja     -
 | 
| 175 | interactive-osh  test/spec-py.sh interactive-osh     _tmp/spec/interactive-osh/index.html
 | 
| 176 | nohup            test/nohup.sh soil-run              -
 | 
| 177 | process-table    test/process-table.sh soil-run      _tmp/process-table/index.html
 | 
| 178 | stateful         test/stateful.sh soil-run           _tmp/spec/stateful/index.html
 | 
| 179 | EOF
 | 
| 180 | 
 | 
| 181 | }
 | 
| 182 | 
 | 
| 183 | wild-tasks() {
 | 
| 184 |   ### Print tasks for the 'wild' build
 | 
| 185 | 
 | 
| 186 |   # (task_name, script, action, result_html)
 | 
| 187 |   cat <<EOF
 | 
| 188 | os-info          soil/diagnose.sh os-info              -
 | 
| 189 | dump-env         soil/diagnose.sh dump-env             -
 | 
| 190 | wait-for-tarball soil/wait.sh for-cpp-tarball          -
 | 
| 191 | test-tar         devtools/release-native.sh test-tar   -
 | 
| 192 | linecount        metrics/tarball.sh linecount-oils-cpp -
 | 
| 193 | wild             test/wild.sh soil-run                 _tmp/wild-www/index.html
 | 
| 194 | EOF
 | 
| 195 | }
 | 
| 196 | 
 | 
| 197 | benchmarks-tasks() {
 | 
| 198 |   # (task_name, script, action, result_html)
 | 
| 199 | 
 | 
| 200 |   cat <<EOF
 | 
| 201 | os-info          soil/diagnose.sh os-info              -
 | 
| 202 | dump-env         soil/diagnose.sh dump-env             -
 | 
| 203 | py-all-and-ninja soil/worker.sh py-all-and-ninja       -
 | 
| 204 | dev-shell-test   build/dev-shell-test.sh soil-run      -
 | 
| 205 | id-test          benchmarks/id-test.sh soil-run        -
 | 
| 206 | osh-parser       benchmarks/osh-parser.sh soil-run     _tmp/osh-parser/index.html
 | 
| 207 | osh-runtime      benchmarks/osh-runtime.sh soil-run    _tmp/osh-runtime/index.html
 | 
| 208 | vm-baseline      benchmarks/vm-baseline.sh soil-run    _tmp/vm-baseline/index.html
 | 
| 209 | compute          benchmarks/compute.sh soil-run        _tmp/compute/index.html
 | 
| 210 | gc               benchmarks/gc.sh soil-run             _tmp/gc/index.html
 | 
| 211 | mycpp-benchmarks benchmarks/mycpp.sh soil-run          _tmp/mycpp-examples/-wwz-index
 | 
| 212 | EOF
 | 
| 213 | }
 | 
| 214 | 
 | 
| 215 | bloaty-tasks() {
 | 
| 216 |   cat <<EOF
 | 
| 217 | os-info          soil/diagnose.sh os-info              -
 | 
| 218 | dump-env         soil/diagnose.sh dump-env             -
 | 
| 219 | wait-for-tarball soil/wait.sh for-cpp-tarball          -
 | 
| 220 | test-tar         devtools/release-native.sh test-tar   -
 | 
| 221 | native-code      metrics/native-code.sh oils-for-unix  _tmp/metrics/oils-for-unix/
 | 
| 222 | EOF
 | 
| 223 | }
 | 
| 224 | 
 | 
| 225 | benchmarks2-tasks() {
 | 
| 226 |   # Note: id-test doesn't run in 'other-tests' because 'gawk' isn't in that image
 | 
| 227 |   cat <<EOF
 | 
| 228 | os-info          soil/diagnose.sh os-info              -
 | 
| 229 | dump-env         soil/diagnose.sh dump-env             -
 | 
| 230 | wait-for-tarball soil/wait.sh for-cpp-tarball          -
 | 
| 231 | test-tar         devtools/release-native.sh test-tar   -
 | 
| 232 | uftrace          benchmarks/uftrace.sh soil-run        _tmp/uftrace/index.html
 | 
| 233 | gc-cachegrind    benchmarks/gc-cachegrind.sh soil-run  _tmp/gc-cachegrind/index.html
 | 
| 234 | EOF
 | 
| 235 | }
 | 
| 236 | 
 | 
| 237 | cpp-spec-tasks() {
 | 
| 238 |   # (task_name, script, action, result_html)
 | 
| 239 | 
 | 
| 240 |   cat <<EOF
 | 
| 241 | os-info          soil/diagnose.sh os-info              -
 | 
| 242 | dump-env         soil/diagnose.sh dump-env             -
 | 
| 243 | py-all-and-ninja soil/worker.sh py-all-and-ninja       -
 | 
| 244 | oils-cpp-smoke   build/native.sh soil-run              -
 | 
| 245 | osh-all          test/spec-cpp.sh osh-all              _tmp/spec/osh-cpp/compare.html
 | 
| 246 | ysh-all          test/spec-cpp.sh ysh-all              _tmp/spec/ysh-cpp/compare.html
 | 
| 247 | ysh-py           test/spec-py.sh ysh-all-serial        _tmp/spec/ysh-py/index.html
 | 
| 248 | EOF
 | 
| 249 | }
 | 
| 250 | 
 | 
| 251 | cpp-tarball-tasks() {
 | 
| 252 | 
 | 
| 253 |   # Note: build-times task requires _build/oils.sh
 | 
| 254 |   # It's a bit redundant with test-tar
 | 
| 255 | 
 | 
| 256 |   cat <<EOF
 | 
| 257 | os-info          soil/diagnose.sh os-info    -
 | 
| 258 | dump-env         soil/diagnose.sh dump-env   -
 | 
| 259 | py-all-and-ninja soil/worker.sh py-all-and-ninja       -
 | 
| 260 | oils-cpp-smoke   build/native.sh soil-run              -
 | 
| 261 | make-tar         devtools/release-native.sh make-tar   _release/oils-for-unix.tar
 | 
| 262 | xshar-hello      devtools/xshar.sh soil-run-hello      _release/hello-xshar.xshar
 | 
| 263 | xshar-test-oils  devtools/xshar.sh soil-run-test-oils  _release/test-oils.xshar
 | 
| 264 | build-times      build/native.sh measure-build-times   -
 | 
| 265 | EOF
 | 
| 266 | 
 | 
| 267 | # build-times is a good enough test
 | 
| 268 | # test-tar         devtools/release-native.sh test-tar   -
 | 
| 269 | #
 | 
| 270 | # Note: tarball is deployed outside the container
 | 
| 271 | 
 | 
| 272 | }
 | 
| 273 | 
 | 
| 274 | cpp-small-tasks() {
 | 
| 275 | 
 | 
| 276 |   # yaks could be moved to pea/ image once it has python2-dev
 | 
| 277 |   cat <<EOF
 | 
| 278 | os-info          soil/diagnose.sh os-info    -
 | 
| 279 | dump-env         soil/diagnose.sh dump-env   -
 | 
| 280 | py-all-and-ninja soil/worker.sh py-all-and-ninja       -
 | 
| 281 | py-unit          test/unit.sh all                      _test/py-unit/
 | 
| 282 | yaks             yaks/TEST.sh soil-run                 -
 | 
| 283 | oils-cpp-smoke   build/native.sh soil-run              -
 | 
| 284 | cpp-unit         test/cpp-unit.sh soil-run             _test/-wwz-index
 | 
| 285 | headless         client/run.sh soil-run-cpp            -
 | 
| 286 | asan             test/asan.sh soil-run                 -
 | 
| 287 | ltrace           test/ltrace.sh soil-run               -
 | 
| 288 | micro-syntax     doctools/micro-syntax.sh soil-run     -
 | 
| 289 | src-tree         doctools/src-tree.sh soil-run         _tmp/src-tree-www/index.html
 | 
| 290 | line-counts      metrics/source-code.sh write-reports  _tmp/metrics/line-counts/-wwz-index
 | 
| 291 | preprocessed     metrics/source-code.sh preprocessed   _tmp/metrics/preprocessed/-wwz-index
 | 
| 292 | mycpp-examples   mycpp/TEST.sh soil-run                _test/-wwz-index
 | 
| 293 | parse-errors     test/parse-errors.sh soil-run-cpp     -
 | 
| 294 | runtime-errors   test/runtime-errors.sh soil-run-cpp   -
 | 
| 295 | ysh-parse-errors test/ysh-parse-errors.sh soil-run-cpp -
 | 
| 296 | ysh-runtime-errors test/ysh-runtime-errors.sh soil-run-cpp -
 | 
| 297 | ysh-every-string test/ysh-every-string.sh soil-run-cpp -
 | 
| 298 | ysh-large        ysh/run.sh soil-run-cpp               -
 | 
| 299 | j8-errors        data_lang/j8-errors.sh soil-run-cpp   -
 | 
| 300 | houston-fp       demo/houston-fp/run.sh soil-run       -
 | 
| 301 | souffle-smoke-test       test/souffle-smoke.sh soil-run       -
 | 
| 302 | EOF
 | 
| 303 | }
 | 
| 304 | 
 | 
| 305 | cpp-coverage-tasks() {
 | 
| 306 |   # dep notes: hnode_asdl.h required by expr_asdl.h in mycpp/examples
 | 
| 307 | 
 | 
| 308 |   cat <<EOF
 | 
| 309 | os-info                 soil/diagnose.sh os-info    -
 | 
| 310 | dump-env                soil/diagnose.sh dump-env   -
 | 
| 311 | py-all-and-ninja        soil/worker.sh py-all-and-ninja                 -
 | 
| 312 | extract-clang           deps/from-binary.sh extract-clang-in-container  -
 | 
| 313 | mycpp-unit-coverage     mycpp/TEST.sh unit-test-coverage                _test/clang-coverage/mycpp/html/index.html
 | 
| 314 | mycpp-examples-coverage mycpp/TEST.sh examples-coverage                 _test/clang-coverage/mycpp/examples/html/index.html
 | 
| 315 | cpp-coverage            cpp/TEST.sh coverage                            _test/clang-coverage/cpp/html/index.html
 | 
| 316 | unified-coverage        test/coverage.sh unified-report                 _test/clang-coverage/unified/html/index.html
 | 
| 317 | compare-gcc-clang       metrics/native-code.sh compare-gcc-clang        _tmp/metrics/compare-gcc-clang.txt
 | 
| 318 | EOF
 | 
| 319 | }
 | 
| 320 | 
 | 
| 321 | ovm-tarball-tasks() {
 | 
| 322 |   ### Print tasks for the 'ovm-tarball' build
 | 
| 323 | 
 | 
| 324 |   # notes:
 | 
| 325 |   # - py-all needed to crawl dependencies to make tarball.
 | 
| 326 | 
 | 
| 327 |   # (task_name, script, action, result_html)
 | 
| 328 |   cat <<EOF
 | 
| 329 | os-info           soil/diagnose.sh os-info    -
 | 
| 330 | dump-env          soil/diagnose.sh dump-env   -
 | 
| 331 | py-all            build/py.sh all                        -
 | 
| 332 | syscall-by-code   test/syscall.sh by-code                _tmp/syscall/by-code.txt
 | 
| 333 | syscall-by-input  test/syscall.sh by-input               _tmp/syscall/by-input.txt
 | 
| 334 | osh-spec          test/spec-py.sh osh-all-serial         _tmp/spec/osh-py/index.html
 | 
| 335 | gold              test/gold.sh soil-run                  -
 | 
| 336 | osh-usage         test/osh-usage.sh soil-run             -
 | 
| 337 | tools-deps        test/tools-deps.sh soil-run            -
 | 
| 338 | make-tarball      devtools/release.sh py-tarball         _release/oil.tar
 | 
| 339 | ysh-ovm-tarball   test/spec-py.sh ysh-ovm-tarball        _tmp/spec/ysh-py/index.html
 | 
| 340 | docs              build/doc.sh soil-run                  _release/VERSION/index.html
 | 
| 341 | doc-metrics       echo no-op                             _release/VERSION/doc/metrics.txt
 | 
| 342 | EOF
 | 
| 343 | 
 | 
| 344 | # doc-metrics is a no-op, just for the link.  Because soil-run just runs the
 | 
| 345 | # release, which creates metrics.
 | 
| 346 | }
 | 
| 347 | 
 | 
| 348 | # Reuse ovm-tarball container
 | 
| 349 | app-tests-tasks() {
 | 
| 350 | 
 | 
| 351 |   cat <<EOF
 | 
| 352 | os-info           soil/diagnose.sh os-info             -
 | 
| 353 | dump-env          soil/diagnose.sh dump-env            -
 | 
| 354 | py-all            build/py.sh all                      -
 | 
| 355 | ble-clone         test/ble.sh clone                    -
 | 
| 356 | ble-build         test/ble.sh build                    -
 | 
| 357 | ble-bash-suite    test/ble.sh bash-suite               -
 | 
| 358 | ble-test-osh-py   test/ble.sh run-tests-osh-py         -
 | 
| 359 | wait-for-tarball  soil/wait.sh for-cpp-tarball         -
 | 
| 360 | test-tar          devtools/release-native.sh test-tar  -
 | 
| 361 | ble-test-osh-cpp  test/ble.sh run-tests-osh-cpp        -
 | 
| 362 | EOF
 | 
| 363 | 
 | 
| 364 | # This doesn't work
 | 
| 365 | # ble-test-osh-bash test/ble.sh run-tests-osh-bash       -
 | 
| 366 | }
 | 
| 367 | 
 | 
| 368 | # TODO: Most of these should be Ninja tasks.
 | 
| 369 | # Other tests:
 | 
| 370 | # find-test, xargs-test, pgen2-test, web/table/csv2html-test.sh
 | 
| 371 | # Probably should start using a shell test framework too.
 | 
| 372 | other-tests-tasks() {
 | 
| 373 |   cat <<EOF
 | 
| 374 | os-info                soil/diagnose.sh os-info    -
 | 
| 375 | dump-env               soil/diagnose.sh dump-env   -
 | 
| 376 | build-minimal          build/py.sh minimal                        -
 | 
| 377 | configure-test         ./configure-test.sh soil_run               -
 | 
| 378 | time-test              benchmarks/time-test.sh soil-run           -
 | 
| 379 | tsv-lib-test           test/tsv-lib-test.sh soil-run              -
 | 
| 380 | ysh-ify                test/ysh-ify.sh soil-run                   -
 | 
| 381 | R-test                 devtools/R-test.sh soil-run                -
 | 
| 382 | xargs-test             test/other.sh xargs-test                   -
 | 
| 383 | csv2html-test          test/other.sh csv2html-test                -
 | 
| 384 | oil-python-symbols     metrics/source-code.sh oil-python-symbols  -
 | 
| 385 | opyc                   test/opyc.sh soil-run                      -
 | 
| 386 | opy-count-lines        opy/soil.sh count-lines                    -
 | 
| 387 | test-gold              opy/soil.sh test-gold                      -
 | 
| 388 | build-oil-repo         opy/soil.sh build-oil-repo                 -
 | 
| 389 | regtest-compile        opy/soil.sh regtest-compile                -
 | 
| 390 | EOF
 | 
| 391 | }
 | 
| 392 | 
 | 
| 393 | tests-todo() {
 | 
| 394 |   ### More tests to add
 | 
| 395 |   find . -name '_*' -a -prune -o -name '*-test.sh' -a -print
 | 
| 396 | 
 | 
| 397 |   # pgen2/pgen2-test.sh seems mostly broken
 | 
| 398 | }
 | 
| 399 | 
 | 
| 400 | # Redefinition for quicker cloud debugging
 | 
| 401 | maybe-merge-tasks() {
 | 
| 402 |   cat <<EOF
 | 
| 403 | os-info          soil/diagnose.sh os-info    -
 | 
| 404 | dump-env         soil/diagnose.sh dump-env   -
 | 
| 405 | maybe-merge      soil/maybe-merge.sh soil-run     -
 | 
| 406 | EOF
 | 
| 407 | }
 | 
| 408 | 
 | 
| 409 | run-tasks() {
 | 
| 410 |   ### Run the tasks on stdin and write _tmp/soil/INDEX.tsv.
 | 
| 411 |   local job_name=$1
 | 
| 412 |   local out_dir=$2  # should already exist
 | 
| 413 |   local tty=$3
 | 
| 414 | 
 | 
| 415 |   mkdir -p $out_dir/logs
 | 
| 416 | 
 | 
| 417 |   # So we can run benchmarks/time_.py.  
 | 
| 418 |   # 2023-02-28: Images like soil-wild based off the new soil-common no longer
 | 
| 419 |   # have 'cc'.  Instead they use a wedge.
 | 
| 420 |   if command -v cc > /dev/null; then
 | 
| 421 |     build/py.sh time-helper
 | 
| 422 |   else
 | 
| 423 |     echo 'test time-tsv3'
 | 
| 424 |     time-tsv3 -o /tmp/echo.tsv --append -- echo hi
 | 
| 425 | 
 | 
| 426 |     echo '/tmp/echo.tsv:'
 | 
| 427 |     cat /tmp/echo.tsv
 | 
| 428 |   fi
 | 
| 429 | 
 | 
| 430 |   # For the later deploy step to pick up
 | 
| 431 |   date +%s > $out_dir/task-run-start-time.txt
 | 
| 432 | 
 | 
| 433 |   # This data can go on the dashboard index
 | 
| 434 |   local tsv=$out_dir/INDEX.tsv
 | 
| 435 |   rm -f $tsv
 | 
| 436 | 
 | 
| 437 |   local status
 | 
| 438 |   local max_status=0
 | 
| 439 | 
 | 
| 440 |   while read task_name script action result_html; do
 | 
| 441 |     log "--- task: $task_name ---"
 | 
| 442 | 
 | 
| 443 |     local log_path=$out_dir/logs/$task_name.txt 
 | 
| 444 | 
 | 
| 445 |     # 15 minutes per task
 | 
| 446 |     # One of the longest tasks is test/spec-cpp, which takes around 420 seconds
 | 
| 447 |     # TODO: should have a configurable timeout
 | 
| 448 |     local -a timeout=(timeout 900)
 | 
| 449 |     local stdin_tty=''
 | 
| 450 | 
 | 
| 451 |     case $script in
 | 
| 452 |       test/process-table.sh)
 | 
| 453 |         # Workaround for weird interaction, see
 | 
| 454 |         # $ test/process-table.sh timeout-issue
 | 
| 455 |         timeout=()
 | 
| 456 |         ;;
 | 
| 457 |       test/nohup.sh)
 | 
| 458 |         # Only run test/nohup.sh with TTY.  For some reason build/py.sh all hangs
 | 
| 459 |         # with $tty?
 | 
| 460 |         stdin_tty=$tty
 | 
| 461 |         ;;
 | 
| 462 |     esac
 | 
| 463 | 
 | 
| 464 |     local -a argv=(
 | 
| 465 |       time-tsv3 -o $tsv --append
 | 
| 466 |         --field $task_name --field $script --field $action
 | 
| 467 |         --field $result_html -- 
 | 
| 468 |         "${timeout[@]}" "$script" "$action"
 | 
| 469 |     )
 | 
| 470 | 
 | 
| 471 |     # Run task and save status
 | 
| 472 |     set +o errexit
 | 
| 473 |     if test -n "$stdin_tty"; then
 | 
| 474 |       # explicitly connect TTY, e.g. for soil/interactive
 | 
| 475 |       "${argv[@]}" > $log_path 2>&1 < $stdin_tty
 | 
| 476 |     else
 | 
| 477 |       "${argv[@]}" > $log_path 2>&1
 | 
| 478 |     fi
 | 
| 479 |     status=$?
 | 
| 480 |     set -o errexit
 | 
| 481 | 
 | 
| 482 |     if test "$status" -gt "$max_status"; then
 | 
| 483 |       max_status=$status
 | 
| 484 |     fi
 | 
| 485 | 
 | 
| 486 |     # Show the last line
 | 
| 487 |     echo
 | 
| 488 |     tsv-row status elapsed task script action result_html
 | 
| 489 |     tail -n 1 $tsv
 | 
| 490 |     echo
 | 
| 491 |     log "status=$status max_status=$max_status"
 | 
| 492 |   done
 | 
| 493 | 
 | 
| 494 |   log '--- done ---'
 | 
| 495 |   ls -l $out_dir
 | 
| 496 |   wc -l $out_dir/logs/*
 | 
| 497 | 
 | 
| 498 |   # This suppressed the deployment of logs, which we don't want.  So all our
 | 
| 499 |   # Travis builds succeed?  But then we can't use their failure notifications
 | 
| 500 |   # (which might be OK).
 | 
| 501 |   if false; then
 | 
| 502 |     # exit with the maximum exit code.
 | 
| 503 |     awk '
 | 
| 504 |     BEGIN { max = 0 }
 | 
| 505 |           { if ($1 > max) { max = $1 } }
 | 
| 506 |     END   { exit(max) }
 | 
| 507 |     ' $tsv
 | 
| 508 |   fi
 | 
| 509 | 
 | 
| 510 |   # To fail later.  Important: this dir persists across jobs; it's NOT removed
 | 
| 511 |   # by 'host-shim.sh job-reset'.
 | 
| 512 |   mkdir -p _soil-jobs
 | 
| 513 | 
 | 
| 514 |   # Hack: Assign job_id and write it to the status file.  Other jobs can poll
 | 
| 515 |   # for completion of this job and access its resources.
 | 
| 516 | 
 | 
| 517 |   local job_id
 | 
| 518 |   job_id="$(date +%Y-%m-%d__%H-%M-%S)"
 | 
| 519 | 
 | 
| 520 |   # e.g. _soil-jobs/dummy.status.txt
 | 
| 521 |   echo "$max_status $job_id" > _soil-jobs/$job_name.status.txt
 | 
| 522 | }
 | 
| 523 | 
 | 
| 524 | save-metadata() {
 | 
| 525 |   ### Write metadata files to be saved as JSON
 | 
| 526 | 
 | 
| 527 |   # NOTE: host-shim.sh also writes image-pull-time.txt
 | 
| 528 | 
 | 
| 529 |   local job_name=$1
 | 
| 530 |   local meta_dir=$2
 | 
| 531 | 
 | 
| 532 |   echo "$job_name" > $meta_dir/job-name.txt
 | 
| 533 | 
 | 
| 534 |   # command to show current branch
 | 
| 535 |   # This does NOT work in detached HEAD!  Travis puts the branch in an env
 | 
| 536 |   # variable, but sr.ht doesn't.
 | 
| 537 |   # git rev-parse --abbrev-ref HEAD > $meta_dir/git-branch.txt
 | 
| 538 | 
 | 
| 539 |   git log -n 1 --pretty='format:%H' > $meta_dir/commit-hash.txt
 | 
| 540 | 
 | 
| 541 |   # ISO 8601 format
 | 
| 542 |   # Note: this can get confused with rebases.  Two different commits can have
 | 
| 543 |   # the same date.
 | 
| 544 |   git log -n 1 --pretty='format:%aI' > $meta_dir/commit-date.txt
 | 
| 545 | 
 | 
| 546 |   git log -n 1 --pretty='format:%s' > $meta_dir/commit-line.txt  # "subject"
 | 
| 547 | }
 | 
| 548 | 
 | 
| 549 | disable-git-errors() {
 | 
| 550 | 
 | 
| 551 |   # 2023-02: The build started failing because of the permissions we set in
 | 
| 552 |   # soil/host-shim.sh mount-perms.
 | 
| 553 |   #
 | 
| 554 |   # The issue is that the guest needs to be able to write to the Docker mount
 | 
| 555 |   # of the repo.  I think it may have been related to podman vs. Docker.
 | 
| 556 |   # Should check if mount-perms is necessary in both places.
 | 
| 557 |   #
 | 
| 558 |   # git fails unless we have this workaround.
 | 
| 559 | 
 | 
| 560 |   # https://stackoverflow.com/questions/72978485/git-submodule-update-failed-with-fatal-detected-dubious-ownership-in-repositor
 | 
| 561 | 
 | 
| 562 |   # https://github.blog/2022-04-12-git-security-vulnerability-announced/
 | 
| 563 | 
 | 
| 564 |   #git config --global --add safe.directory '*'
 | 
| 565 | 
 | 
| 566 |   git config --global --add safe.directory /home/uke/oil
 | 
| 567 | }
 | 
| 568 | 
 | 
| 569 | job-main() {
 | 
| 570 |   local job_name=$1
 | 
| 571 | 
 | 
| 572 |   local out_dir=_tmp/soil
 | 
| 573 | 
 | 
| 574 |   # Report for debugging
 | 
| 575 |   export EXTRA_MYCPP_ARGS='--stack-roots-warn 16'
 | 
| 576 | 
 | 
| 577 |   log-context 'job-main'
 | 
| 578 |   mkdir -v -p $out_dir
 | 
| 579 |   ls -l -d $out_dir
 | 
| 580 | 
 | 
| 581 |   disable-git-errors
 | 
| 582 | 
 | 
| 583 |   save-metadata $job_name $out_dir
 | 
| 584 | 
 | 
| 585 |   local captured
 | 
| 586 | 
 | 
| 587 |   set +o errexit
 | 
| 588 |   captured=$(tty)
 | 
| 589 |   status=$?
 | 
| 590 |   set -o errexit
 | 
| 591 | 
 | 
| 592 |   if test $status -eq 0; then
 | 
| 593 |     echo "TTY = $captured"
 | 
| 594 |     local tty=$captured
 | 
| 595 |   else
 | 
| 596 |     echo "captured = $captured"
 | 
| 597 |     local tty=''  # clear the output
 | 
| 598 |   fi
 | 
| 599 |   echo
 | 
| 600 | 
 | 
| 601 |   ${job_name}-tasks | run-tasks $job_name $out_dir "$tty"
 | 
| 602 | }
 | 
| 603 | 
 | 
| 604 | JOB-dummy() { job-main 'dummy'; }
 | 
| 605 | JOB-raw-vm() { job-main 'raw-vm'; }
 | 
| 606 | JOB-dev-setup-debian() { job-main 'dev-setup-debian'; }
 | 
| 607 | JOB-dev-setup-fedora() { job-main 'dev-setup-fedora'; }
 | 
| 608 | JOB-dev-setup-alpine() { job-main 'dev-setup-alpine'; }
 | 
| 609 | 
 | 
| 610 | JOB-dev-minimal() { job-main 'dev-minimal'; }
 | 
| 611 | JOB-interactive() { job-main 'interactive'; }
 | 
| 612 | 
 | 
| 613 | JOB-other-tests() { job-main 'other-tests'; }
 | 
| 614 | 
 | 
| 615 | JOB-pea() { job-main 'pea'; }
 | 
| 616 | 
 | 
| 617 | JOB-ovm-tarball() { job-main 'ovm-tarball'; }
 | 
| 618 | JOB-app-tests() { job-main 'app-tests'; }
 | 
| 619 | 
 | 
| 620 | JOB-cpp-coverage() { job-main 'cpp-coverage'; }
 | 
| 621 | JOB-cpp-small() { job-main 'cpp-small'; }
 | 
| 622 | JOB-cpp-tarball() { job-main 'cpp-tarball'; }
 | 
| 623 | JOB-cpp-spec() { job-main 'cpp-spec'; }
 | 
| 624 | 
 | 
| 625 | JOB-bloaty() { job-main 'bloaty'; }
 | 
| 626 | JOB-benchmarks() { job-main 'benchmarks'; }
 | 
| 627 | JOB-benchmarks2() { job-main 'benchmarks2'; }
 | 
| 628 | 
 | 
| 629 | JOB-wild() { job-main 'wild'; }
 | 
| 630 | 
 | 
| 631 | JOB-maybe-merge() { job-main 'maybe-merge'; }
 | 
| 632 | 
 | 
| 633 | list-jobs() {
 | 
| 634 |   # dev-setup-fedora for Fedora, disable
 | 
| 635 |   compgen -A function | grep -- '^JOB-' | sed 's/^JOB-//g' | egrep -v 'maybe-merge|dev-setup-fedora|dev-setup-alpine'
 | 
| 636 | }
 | 
| 637 | 
 | 
| 638 | "$@"
 |