nandi/nimstaticpublic Fork 0
main
Commits
Clone
git clone https://git.rickub.com/nandi/nimstatic.git
git clone ssh://git@rickub.com/nandi/nimstatic.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

success

Release #7

push · v0.1.5 · 76ecf2d6ran in 35s · 306 lines of output
queued <1s ran 35s total 35s
1 jobs
0 failed
35s duration
tests
1 artifacts
release
successrelease
successSet up job
cloning nandi/nimstatic @ 76ecf2d620117b0f8d5ad17e21921e68614a56fdaction actions/cache@v4: node20 (_actions/actions/cache/v4)action actions/upload-artifact@v4: node20 (_actions/actions/upload-artifact/v4)
successactions/checkout@v4 1s
(checkout already performed by the runner — delivered as the read-only work disk)
successResolve the tag 2s
Run
set -euo pipefail
# Every variable here is read with a default: this runner does not
# set GITHUB_REF_TYPE, and under `set -u` one missing name is a dead
# job three steps before anything interesting happens.
REF="${GITHUB_REF:-}"
if [ -n "${INPUT_TAG:-}" ]; then
  TAG="$INPUT_TAG"
else
  case "$REF" in
    refs/tags/*) TAG="${REF#refs/tags/}" ;;
    *)
      # A dispatch: no tag in the ref, so ask the API for the newest.
      TAG=$(curl -sSfL -H "Authorization: Bearer $GITHUB_TOKEN" \
              "$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/tags" \
            | python3 -c "import json,sys; ts=[t['name'] for t in json.load(sys.stdin) if t['name'].startswith('v')]; print(ts[0] if ts else '')")
      ;;
  esac
fi
case "$TAG" in
  v*) ;;
  *) echo "refusing to release '$TAG': not a v* tag" >&2; exit 1 ;;
esac
# The runner hands a tag build the right tree already; a dispatch
# gets whatever branch it ran on, so move only when we can.
if [ -d .git ]; then
  git checkout --detach "$TAG" 2>/dev/null || echo "note: building the checked-out tree, not $TAG"
fi
echo "releasing $TAG"
echo "TAG=$TAG" >> "$GITHUB_ENV"
ciguest: network up (172.30.0.2/30 via 172.30.0.1)ciguest: starting dockerd (overlay2, data-root on scratch)ciguest: dockerd is readyciguest: loaded baked image postgres_16-alpine.tar.gz: Loaded image: postgres:16-alpineciguest: 1 baked image archive(s) loaded (no per-job registry pull needed)ciguest: logged into registry registry.rickub.com as rickubreleasing v0.1.5
successInstall Nim and zig 3s
Run
set -euo pipefail
mkdir -p "$HOME/toolchains"
curl -sSfL "https://nim-lang.org/download/nim-${NIM_VERSION}-linux_x64.tar.xz" \
  | tar -xJ -C "$HOME/toolchains"
curl -sSfL "https://ziglang.org/download/${ZIG_VERSION}/zig-x86_64-linux-${ZIG_VERSION}.tar.xz" \
  | tar -xJ -C "$HOME/toolchains"
echo "$HOME/toolchains/nim-${NIM_VERSION}/bin" >> "$GITHUB_PATH"
echo "$HOME/toolchains/zig-x86_64-linux-${ZIG_VERSION}" >> "$GITHUB_PATH"
successVersions <1s
Run
nim --version | head -1
zig version
Nim Compiler Version 2.2.4 [Linux: amd64]0.15.1
successactions/cache@v4 <1s
Cache service version: v2Resolved Keys:["nimstatic-alpine-Linux-v3.21"]Checking zstd --quiet --version(node:566) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.(Use `node --trace-deprecation ...` to show where the warning was created)1.5.4zstd version: 1.5.4[Request] GetCacheEntryDownloadURL http://172.30.255.1:8888/twirp/github.actions.results.api.v1.CacheService/GetCacheEntryDownloadURL[Response] - 200Headers: { "content-length": "13", "content-security-policy": "default-src 'self'; img-src 'self' data:; style-src 'self'; script-src 'self'; base-uri 'none'; frame-ancestors 'none'; object-src 'none'; form-action 'self' https://payment.stancer.com", "content-type": "application/json", "date": "Sun, 20 Sep 2026 01:06:44 GMT", "permissions-policy": "accelerometer=(), autoplay=(), camera=(), display-capture=(), encrypted-media=(), fullscreen=(self), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), midi=(), payment=(), usb=()", "referrer-policy": "strict-origin-when-cross-origin", "strict-transport-security": "max-age=31536000; includeSubDomains", "x-content-type-options": "nosniff", "x-request-id": "8fcac1b1-911f-4bce-9981-a34700415991"}Body: { "ok": false}Cache not found for version 31e0b0750dc79fae80ee8c7b40914e543463c5fab35daa390e41b3c7472d6d84 of keys: nimstatic-alpine-Linux-v3.21Cache not found for input keys: nimstatic-alpine-Linux-v3.21
successTest 2s
Run
nim c -d:ssl --hints:off -r tests/test_nimstatic.nim
[Suite] index parsing [OK] records and fields [OK] provides are indexed [OK] version constraints are stripped [OK] conflicts are recognized[Suite] resolution [OK] dependencies come before dependents [OK] a package is visited once [OK] --no-deps stops at the request [OK] an unsatisfiable request names its requester [OK] merge lets a later repo shadow an earlier one[Suite] sysroot manifest [OK] record then read back [OK] re-recording replaces rather than duplicates [OK] static libs are found and sorted[Suite] flags [OK] plain sysroot [OK] openssl archives switch on the static-TLS workarounds [OK] cc flags and pkg-config env [OK] an override with no archive in the sysroot is dropped [OK] libssl links before libcrypto [OK] nimcfg carries the compiler and the flags [OK] zigcc script targets the right triple[Suite] remote [OK] urls are built from mirror, branch, repo and arch[Suite] detection [OK] sonames reduce to library names [OK] link libraries come off the link command, once each [OK] dynlib candidates are found in generated C [OK] inspect maps libraries to packages and flags the rest [OK] --map overrides the built-in table
successBootstrap nimstatic on the host 3s
Run
nim c -d:release -d:ssl --hints:off -o:nimstatic-host src/nimstatic.nim
successBuild the static binary with itself 13s
Run
set -euo pipefail
VERSION="${TAG#v}"
NAME="nimstatic-${VERSION}-x86_64-linux"
./nimstatic-host src/nimstatic.nim -o "$NAME" -- -d:ssl --passL:-s
# Neither file(1) nor ldd is on the runner image, and `ldd … | grep`
# fails silently when ldd is missing — the pipe eats the error and
# grep just finds nothing. Read the ELF program headers instead: a
# PT_INTERP entry (type 3) is what makes a binary dynamic.
python3 -c "import struct,sys;d=open(sys.argv[1],'rb').read();assert d[:4]==b'\x7fELF';off=struct.unpack_from('<Q',d,0x20)[0];esz=struct.unpack_from('<H',d,0x36)[0];n=struct.unpack_from('<H',d,0x38)[0];t=[struct.unpack_from('<I',d,off+i*esz)[0] for i in range(n)];sys.exit('dynamic: has PT_INTERP' if 3 in t else 0)" "$NAME"
./"$NAME" --help > /dev/null
xz -9e -k "$NAME"
sha256sum "$NAME" "$NAME.xz" > SHA256SUMS
cat SHA256SUMS
echo "NAME=$NAME" >> "$GITHUB_ENV"
probing nimstatic.nim … ssl dlopen openssl-libs-static crypto dlopen openssl-libs-staticfetching index: main/x86_64fetching index: community/x86_64downloading openssl-libs-static 3.3.7-r1 (12734 KiB)building …Hint: used config file '/tmp/home/toolchains/nim-2.2.4/config/nim.cfg' [Conf]Hint: used config file '/tmp/home/toolchains/nim-2.2.4/config/config.nims' [Conf]Hint: used config file '/workspace/nimstatic/config.nims' [Conf]..........................................................................................................................................................................CC: ../../../tmp/home/toolchains/nim-2.2.4/lib/system/exceptions.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/std/private/digitsutils.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/std/assertions.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/system/dollars.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/std/syncio.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/system.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/parseutils.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/math.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/algorithm.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/unicode.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/strutils.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/pathnorm.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/std/oserrors.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/posix/posix.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/std/private/oscommon.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/std/private/ospaths2.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/std/private/ossymlinks.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/times.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/std/private/osfiles.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/std/private/osdirs.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/std/envvars.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/std/private/osappdirs.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/std/cmdline.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/os.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/hashes.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/strtabs.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/streams.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/std/monotimes.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/osproc.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/collections/tables.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/lexbase.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/parsejson.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/json.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/collections/sets.nimCC: nimstatic/detect.nimCC: nimstatic/index.nimCC: nimstatic/sysroot.nimCC: nimstatic/flags.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/nativesockets.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/wrappers/openssl.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/ssl_certs.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/net.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/base64.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/uri.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/random.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/httpcore.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/asyncfutures.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/asyncdispatch.nimCC: ../../../tmp/home/toolchains/nim-2.2.4/lib/pure/httpclient.nimCC: nimstatic/repo.nimCC: nimstatic/build.nimCC: nimstatic.nimHint: [Link]Hint: mm: orc; threads: on; opt: speed; options: -d:release93065 lines; 10.576s; 176.488MiB peakmem; proj: /workspace/nimstatic/src/nimstatic.nim; out: /workspace/nimstatic/nimstatic-0.1.5-x86_64-linux [SuccessX]wrote nimstatic-0.1.5-x86_64-linux (4989 KiB, static)6d8c385e3901b4546399de250a5b627993e5504fe43dee901ad7f1bb2e833252 nimstatic-0.1.5-x86_64-linux7b6855a7641bd164a1517063554dc6f23dc270b273d8c1697fa18f3975861647 nimstatic-0.1.5-x86_64-linux.xz
successAttach the binaries to the release 3s
Run
set -euo pipefail
api() { curl -sSfL -H "Authorization: Bearer $GITHUB_TOKEN" \
             -H "Accept: application/vnd.github+json" "$@"; }
field() { python3 -c "import json,sys; print(json.load(sys.stdin).get(sys.argv[1],''))" "$1"; }

if ! api "$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/releases/tags/$TAG" > release.json; then
  api -X POST "$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/releases" \
      -d "{\"tag_name\":\"$TAG\",\"name\":\"nimstatic $TAG\"}" > release.json
fi

# Prefer the upload_url the API advertises; fall back to the
# id-based path when this forge does not send one.
upload_url=$(field upload_url < release.json | cut -d'{' -f1)
if [ -z "$upload_url" ]; then
  release_id=$(field id < release.json)
  [ -n "$release_id" ] || { echo "no release id in:"; cat release.json; exit 1; }
  upload_url="$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/releases/$release_id/assets"
fi
echo "uploading to $upload_url"

for asset in "$NAME" "$NAME.xz" SHA256SUMS; do
  # Replace an asset of the same name, so a re-run is idempotent.
  existing=$(python3 -c "import json,sys; print(next((a['url'] for a in (json.load(open('release.json')).get('assets') or []) if a['name']==sys.argv[1]),''))" "$asset")
  if [ -n "$existing" ]; then
    api -X DELETE "$existing" > /dev/null
  fi
  api -X POST "$upload_url?name=$asset" \
      -H "Content-Type: application/octet-stream" \
      --data-binary "@$asset" > /dev/null
  echo "uploaded $asset"
done
curl: (22) The requested URL returned error: 404uploading to http://172.30.255.1:8888/gh/uploads/repos/nandi/nimstatic/releases/94626f76-9b8c-455f-80c2-79955b6bbd2b/assetsuploaded nimstatic-0.1.5-x86_64-linuxuploaded nimstatic-0.1.5-x86_64-linux.xzuploaded SHA256SUMS
successactions/upload-artifact@v4 5s
followSymbolicLinks 'true'implicitDescendants 'true'omitBrokenSymbolicLinks 'true'excludeHiddenFiles 'true'(node:2839) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.(Use `node --trace-deprecation ...` to show where the warning was created)followSymbolicLinks 'true'implicitDescendants 'true'matchDirectories 'true'omitBrokenSymbolicLinks 'true'excludeHiddenFiles 'true'Search path '/workspace/nimstatic'File:/workspace/nimstatic/SHA256SUMS was found using the provided searchPathFile:/workspace/nimstatic/nimstatic-0.1.5-x86_64-linux was found using the provided searchPathFile:/workspace/nimstatic/nimstatic-0.1.5-x86_64-linux.xz was found using the provided searchPathWith the provided path, there will be 3 files uploadedRoot artifact directory is /workspace/nimstaticArtifact name is valid!Root directory input is valid!Workflow Run Backend ID: 0f68a2d3-6d1f-4264-a1f0-feb791fc4aacWorkflow Job Run Backend ID: dd49cc45-2232-4fd4-a769-e40f5c863b08[Request] CreateArtifact http://172.30.255.1:8888/twirp/github.actions.results.api.v1.ArtifactService/CreateArtifact[Response] - 200Headers: { "content-length": "325", "content-security-policy": "default-src 'self'; img-src 'self' data:; style-src 'self'; script-src 'self'; base-uri 'none'; frame-ancestors 'none'; object-src 'none'; form-action 'self' https://payment.stancer.com", "content-type": "application/json", "date": "Sun, 20 Sep 2026 01:07:05 GMT", "permissions-policy": "accelerometer=(), autoplay=(), camera=(), display-capture=(), encrypted-media=(), fullscreen=(self), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), midi=(), payment=(), usb=()", "referrer-policy": "strict-origin-when-cross-origin", "strict-transport-security": "max-age=31536000; includeSubDomains", "x-content-type-options": "nosniff", "x-request-id": "05337e55-dbb0-478e-b234-bf0c92cdbff6"}Body: { "ok": true, "signedUploadUrl": "http://172.30.255.1:8888/twirp/_blob/upload?sig=eyJvcCI6InVwIiwia2V5IjoiY2ktYXJ0aWZhY3RzLzZlZDNlYWUzLWQ3NGQtNGZlYi05ZjkyLTczZDcwZTBmN2I3Yi8wZjY4YTJkMy02ZDFmLTQyNjQtYTFmMC1mZWI3OTFmYzRhYWMvbmltc3RhdGljLXg4Nl82NC1saW51eC56aXAiLCJleHAiOjE3ODk4NzAwMjV9.s9noJpJS8PtdR6NzMELXUwc7lmEVgEHCMmteLz6cvNA"}Creating Artifact archive with compressionLevel: 6Zip write high watermark value 8388608Zip read high watermark value 8388608Uploading artifact zip to blob storage with maxConcurrency: 5, bufferSize: 8388608Beginning upload of artifact content to blob storageZip stream for upload has ended.Zip stream for upload has finished.(node:2839) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.Uploaded bytes 3897150Finished uploading artifact content to blob storage!SHA256 digest of uploaded artifact zip is 02a546dec0be474bea4e2fcd8cffd784fcb2ab1e8d4975923045df5a93acf55bFinalizing artifact upload[Request] FinalizeArtifact http://172.30.255.1:8888/twirp/github.actions.results.api.v1.ArtifactService/FinalizeArtifact[Response] - 200Headers: { "content-length": "32", "content-security-policy": "default-src 'self'; img-src 'self' data:; style-src 'self'; script-src 'self'; base-uri 'none'; frame-ancestors 'none'; object-src 'none'; form-action 'self' https://payment.stancer.com", "content-type": "application/json", "date": "Sun, 20 Sep 2026 01:07:10 GMT", "permissions-policy": "accelerometer=(), autoplay=(), camera=(), display-capture=(), encrypted-media=(), fullscreen=(self), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), midi=(), payment=(), usb=()", "referrer-policy": "strict-origin-when-cross-origin", "strict-transport-security": "max-age=31536000; includeSubDomains", "x-content-type-options": "nosniff", "x-request-id": "2db9ffbf-1de1-458e-8819-e6f9bcca2868"}Body: { "artifactId": "1727", "ok": true}Artifact nimstatic-x86_64-linux.zip successfully finalized. Artifact ID 1727Artifact nimstatic-x86_64-linux has been successfully uploaded! Final size is 3897150 bytes. Artifact ID is 1727Artifact download URL: https://rickub.com/nandi/nimstatic/actions/runs/7/artifacts/1727
Post actions/cache@v4
Cache service version: v2Checking zstd --quiet --version(node:2852) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.(Use `node --trace-deprecation ...` to show where the warning was created)1.5.4zstd version: 1.5.4implicitDescendants 'false'followSymbolicLinks 'true'implicitDescendants 'false'omitBrokenSymbolicLinks 'true'Search path '/tmp/home/.cache/nimstatic'Matched: ../../tmp/home/.cache/nimstaticCache Paths:["../../tmp/home/.cache/nimstatic"]Archive Path: /tmp/c05189b6-c6d7-4c10-93e9-73a68078ecaa/cache.tzst[command]/usr/bin/tar --posix -cf cache.tzst --exclude cache.tzst -P -C /workspace/nimstatic --files-from manifest.txt --use-compress-program zstdmtFile Size: 17909497Reserving Cache[Request] CreateCacheEntry http://172.30.255.1:8888/twirp/github.actions.results.api.v1.CacheService/CreateCacheEntry[Response] - 200Headers: { "content-length": "632", "content-security-policy": "default-src 'self'; img-src 'self' data:; style-src 'self'; script-src 'self'; base-uri 'none'; frame-ancestors 'none'; object-src 'none'; form-action 'self' https://payment.stancer.com", "content-type": "application/json", "date": "Sun, 20 Sep 2026 01:07:10 GMT", "permissions-policy": "accelerometer=(), autoplay=(), camera=(), display-capture=(), encrypted-media=(), fullscreen=(self), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), midi=(), payment=(), usb=()", "referrer-policy": "strict-origin-when-cross-origin", "strict-transport-security": "max-age=31536000; includeSubDomains", "x-content-type-options": "nosniff", "x-request-id": "b916f2f1-9e82-4635-b9e8-4c550b98a3e0"}Body: { "ok": true, "signedUploadUrl": "http://172.30.255.1:8888/twirp/_blob/upload?sig=***", "signed_upload_url": "http://172.30.255.1:8888/twirp/_blob/upload?sig=***"}Attempting to upload cache located at: /tmp/c05189b6-c6d7-4c10-93e9-73a68078ecaa/cache.tzstUse Azure SDK: trueUpload concurrency: 8Upload chunk size: 67108864BlobClient: upload:twirp:_blob(node:2852) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.Sent 15007744 of 17909497 (83.8%), 14.3 MBs/secSent 17909497 of 17909497 (100.0%), 8.5 MBs/sec[Request] FinalizeCacheEntryUpload http://172.30.255.1:8888/twirp/github.actions.results.api.v1.CacheService/FinalizeCacheEntryUpload[Response] - 200Headers: { "content-length": "47", "content-security-policy": "default-src 'self'; img-src 'self' data:; style-src 'self'; script-src 'self'; base-uri 'none'; frame-ancestors 'none'; object-src 'none'; form-action 'self' https://payment.stancer.com", "content-type": "application/json", "date": "Sun, 20 Sep 2026 01:07:13 GMT", "permissions-policy": "accelerometer=(), autoplay=(), camera=(), display-capture=(), encrypted-media=(), fullscreen=(self), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), midi=(), payment=(), usb=()", "referrer-policy": "strict-origin-when-cross-origin", "strict-transport-security": "max-age=31536000; includeSubDomains", "x-content-type-options": "nosniff", "x-request-id": "c100de92-e1bd-4ccb-921b-1ea235219fe8"}Body: { "entryId": "2227", "entry_id": "2227", "ok": true}FinalizeCacheEntryUploadResponse: trueCache saved with key: nimstatic-alpine-Linux-v3.21

No test reports for this run.

Tell a job where its test runner writes its report and this tab fills in: how many tests passed, failed and were skipped, a bar of the result at a glance, then every failure first — with the assertion that failed and the output around it — over a per-suite list of cases and their durations. No scrolling a log for the word FAIL.

It is one reports: key on the job — a job key, not a step, so the report is collected whatever the job concluded. JUnit XML and go test -json are both understood, and most runners already emit one of them. reports: is a rickub extension and works only in .rickub/workflows/; in .github/workflows/ it is a parse error on purpose, because those files are also meant to run on github.com.