{"id":33237018,"url":"https://github.com/40ants/ci","last_synced_at":"2026-01-16T20:20:25.943Z","repository":{"id":40947617,"uuid":"342921235","full_name":"40ants/ci","owner":"40ants","description":"Highly opionated Github Actions workflow builder for Common Lisp projects.","archived":false,"fork":false,"pushed_at":"2025-02-25T13:20:39.000Z","size":414,"stargazers_count":17,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-12-19T07:58:51.148Z","etag":null,"topics":["ci","common-lisp","github-actions"],"latest_commit_sha":null,"homepage":"https://40ants.com/ci/","language":"Common Lisp","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/40ants.png","metadata":{"files":{"readme":"README.md","changelog":"ChangeLog.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-02-27T17:52:15.000Z","updated_at":"2025-12-18T17:59:18.000Z","dependencies_parsed_at":"2023-12-01T20:23:21.433Z","dependency_job_id":"76191ddf-69e8-4ddb-9a0a-eeef42f4a7b0","html_url":"https://github.com/40ants/ci","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/40ants/ci","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/40ants%2Fci","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/40ants%2Fci/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/40ants%2Fci/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/40ants%2Fci/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/40ants","download_url":"https://codeload.github.com/40ants/ci/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/40ants%2Fci/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28482267,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ci","common-lisp","github-actions"],"created_at":"2025-11-16T19:00:28.311Z","updated_at":"2026-01-16T20:20:25.936Z","avatar_url":"https://github.com/40ants.png","language":"Common Lisp","readme":"\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-40README-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n# 40Ants-CI - Github Workflow Generator\n\n[![](https://github-actions.40ants.com/40ants/ci/matrix.svg)][de0b]\n\n![](http://quickdocs.org/badge/ci.svg)\n\nThis is a small utility, which can generate GitHub workflows for Common Lisp\nprojects.\n\nIt generates workflow for running tests and building docs. These workflows\nuse [40ants/run-tests][8469] and [40ants/build-docs][b882]\nactions and [`SBLint`][2f94] to check code for compilation errors.\n\n\u003ca id=\"40-ants-ci-asdf-system-details\"\u003e\u003c/a\u003e\n\n## 40ANTS-CI ASDF System Details\n\n* Description: A tool simplify continuous deployment for Common Lisp projects.\n* Licence: `BSD`\n* Author: Alexander Artemenko\n* Homepage: [https://40ants.com/ci/][3f72]\n* Source control: [GIT][e681]\n* Depends on: [alexandria][8236], [serapeum][c41d], [str][ef7f], [yason][aba2]\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-40REASONS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n## Reasons to Use\n\n* This system hides all entrails related to caching.\n* Includes a few ready to use job types.\n* Custom job types can be defined and distributed as separate `ASDF` systems.\n* You don't have to write `YAML` anymore!\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-40QUICKSTART-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n## Quickstart\n\nThis system allows you to define workflows in the lisp code. The best way is to make these\ndefinitions a part of your `ASDF` system. This way `40ants-ci` ([`1`][900b] [`2`][b171]) will be able to\nautomatically understand for which system it builds a workflow.\n\nEach workflow consists of jobs and each job is a number of steps.\n\nThere are three predefine types of jobs and you can create your own. Predefined jobs\nallows to reuse steps in multiple `CL` libraries.\n\nIn next examples, I'll presume you are writing code in a file which is the part\nof the package inferred `ASDF` system `EXAMPLE/CI`. A file should have the following header:\n\n```lisp\n(defpackage #:example/ci\n  (:use #:cl)\n  (:import-from #:40ants-ci/workflow\n                #:defworkflow)\n  (:import-from #:40ants-ci/jobs/linter)\n  (:import-from #:40ants-ci/jobs/run-tests)\n  (:import-from #:40ants-ci/jobs/docs))\n```\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-40JOB-TYPES-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### Job Types\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-40AUTOTAG-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Autotag\n\nThis job is automates git tag placement on the commit where you have changed the ChangeLog.md.\n\nThis can be a useful to automate package deployment and releases. You update the changelog,\na job pushes a new git tag and the next action triggers on this tag and build a release.\n\nOr you if you publish your library at Quicklisp distribution, then you can change\nit's source type to the `latest-github-tag` to provide more stable releases to your\nusers. This way you commits into master will be ignored until you change the changelog and\ngit tag will be pushed. Here is an [example][1cec] how to setup this kind of quicklisp project source.\n\n```lisp\n(defworkflow release\n  :on-push-to \"master\"\n  :jobs ((40ants-ci/jobs/autotag:autotag)))\n```\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FAUTOTAG-3AAUTOTAG-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](9bde) `40ants-ci/jobs/autotag:autotag` \u0026key (filename \\*default-filename\\*) (regex \\*default-regex\\*) (tag-prefix \\*default-tag-prefix\\*) (token-pattern \\*default-token-pattern\\*) env\n\nCreates a job which will run autotagger to create a new git tag for release.\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FAUTOTAG-3AAUTOTAG-20CLASS-29\"\u003e\u003c/a\u003e\n\n##### [class](a449) `40ants-ci/jobs/autotag:autotag` (job)\n\nThis type of the job created a git tag when finds a new tag in specified file.\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-40LINTER-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Linter\n\nThe simplest job type is linter. It loads a\n\n```lisp\n(defworkflow linter\n  :on-pull-request t\n  :jobs ((40ants-ci/jobs/linter:linter)))\n```\nWhen you'll hit `C-c C-c` on this definition,\nit will generate `.github/workflows/linter.yml` with following content:\n\n```json\n{\n  \"name\": \"LINTER\",\n  \"on\": {\n    \"pull_request\": null\n  },\n  \"jobs\": {\n    \"linter\": {\n      \"runs-on\": \"ubuntu-latest\",\n      \"env\": {\n        \"OS\": \"ubuntu-latest\",\n        \"QUICKLISP_DIST\": \"quicklisp\",\n        \"LISP\": \"sbcl-bin\"\n      },\n      \"steps\": [\n        {\n          \"name\": \"Checkout Code\",\n          \"uses\": \"actions/checkout@v4\"\n        },\n        {\n          \"name\": \"Setup Common Lisp Environment\",\n          \"uses\": \"40ants/setup-lisp@v4\",\n          \"with\": {\n            \"asdf-system\": \"example\"\n          }\n        },\n        {\n          \"name\": \"Install SBLint\",\n          \"run\": \"qlot exec ros install cxxxr/sblint\",\n          \"shell\": \"bash\"\n        },\n        {\n          \"name\": \"Run Linter\",\n          \"run\": \"qlot exec sblint example.asd\",\n          \"shell\": \"bash\"\n        }\n      ]\n    }\n  }\n}\n```\nHere you can see, a few steps in the job:\n\n1. Checkout the code.\n2. Install Roswell \u0026 Qlot using [40ants/setup-lisp][8de1] action.\n3. Install [`SBLint`][2f94].\n4. Run linter for `example.asd`.\n\nAnother interesting thing is that this workflow automatically uses `ubuntu-latest` `OS`,\n`Quicklisp` and `sbcl-bin` Lisp implementation. Later I'll show you how to redefine these settings.\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FLINTER-3ALINTER-20CLASS-29\"\u003e\u003c/a\u003e\n\n##### [class](d7f2) `40ants-ci/jobs/linter:linter` (lisp-job)\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-40CRITIC-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Critic\n\nThis job is similar to linter, but instead of `SBL`int it runs\n[Lisp Critic][2100].\n\nLisp Critic is a program which advices how to make you Common Lisp code more\nidiomatic, readable and performant. Also, sometimes it might catch logical\nerrors in the code.\n\nHere is how you can add this job type in your workflow:\n\n```lisp\n(defworkflow ci\n  :on-pull-request t\n  :jobs ((40ants-ci/jobs/critic:critic)))\n```\nAlso, you might combine this job together with others, for example,\nwith linter:\n\n```lisp\n(defworkflow ci\n  :on-pull-request t\n  :jobs ((40ants-ci/jobs/linter:linter)\n         (40ants-ci/jobs/critic:critic)))\n```\nand they will be executed in parallel. See docs on [`40ants-ci/jobs/critic:critic`][484a] function\nto learn about supported arguments.\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-40RUN-TESTS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Running Tests\n\nAnother interesting job type is `40ants-ci/jobs/run-tests:run-tests` ([`1`][e35d] [`2`][6cb7]).\n\nWhen using this job type, make sure, your system\nruns tests on `(ASDF:TEST-SYSTEM :system-name)` call\nand signals error if something went wrong.\n\n```lisp\n\n(defworkflow ci\n  :on-push-to \"master\"\n  :by-cron \"0 10 * * 1\"\n  :on-pull-request t\n  :jobs ((40ants-ci/jobs/run-tests:run-tests\n          :coverage t)))\n```\nHere I've added a few options to the workflow:\n\n* `by-cron` - sets a schedule.\n* `on-push-to` - defines a branch or branches to track.\n\nIt will generate `.github/workflows/ci.yml` with following content:\n\n```json\n{\n  \"name\": \"CI\",\n  \"on\": {\n    \"push\": {\n      \"branches\": [\n        \"master\"\n      ]\n    },\n    \"pull_request\": null,\n    \"schedule\": [\n      {\n        \"cron\": \"0 10 * * 1\"\n      }\n    ]\n  },\n  \"jobs\": {\n\n    \"run-tests\": {\n      \"runs-on\": \"ubuntu-latest\",\n      \"env\": {\n        \"OS\": \"ubuntu-latest\",\n        \"QUICKLISP_DIST\": \"quicklisp\",\n        \"LISP\": \"sbcl-bin\"\n      },\n      \"steps\": [\n        {\n          \"name\": \"Checkout Code\",\n          \"uses\": \"actions/checkout@v4\"\n        },\n        {\n          \"name\": \"Setup Common Lisp Environment\",\n          \"uses\": \"40ants/setup-lisp@v4\",\n          \"with\": {\n            \"asdf-system\": \"example\"\n          }\n        },\n        {\n          \"name\": \"Run Tests\",\n          \"uses\": \"40ants/run-tests@v2\",\n          \"with\": {\n            \"asdf-system\": \"example\",\n            \"coveralls-token\": \"${{ secrets.github_token }}\"\n          }\n        }\n      ]\n    }\n  }\n}\n```\nThe result is similar to the workflow generated for Linter,\nbut uses [40ants/setup-lisp][59d7] action\nat the final step.\n\nAlso, I've passed an option `:coverage t` to the job. Thus coverage\nreport will be uploaded to [Coveralls.io][b60c] automatically.\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-40MATRIX-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### Defining a test Matrix\n\nLisp has many implementations and can be used on multiple platforms. Thus\nit is a good idea to test our software on many combinations of `OS` and lisp\nimplementations. Workflow generator makes this very easy.\n\nHere is an example of workflow definition with three dimentional matrix.\nIt not only tests a library under different lisps and `OS`, but also checks\nif it works with the latest Quicklisp and Ultralisp distributions:\n\n```lisp\n(defworkflow ci\n  :on-pull-request t\n  :jobs ((run-tests\n          :os (\"ubuntu-latest\"\n               \"macos-latest\")\n          :quicklisp (\"quicklisp\"\n                      \"ultralisp\")\n          :lisp (\"sbcl-bin\"\n                 \"ccl-bin\"\n                 \"allegro\"\n                 \"clisp\"\n                 \"cmucl\")\n          :exclude (;; Seems allegro is does not support 64bit OSX.\n                    ;; Unable to install it using Roswell:\n                    ;; alisp is not executable. Missing 32bit glibc?\n                    (:os \"macos-latest\" :lisp \"allegro\")))))\n```\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-40MULTIPLE-JOBS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### Multiple jobs\n\nBesides a build matrix, you might specify a multiple jobs of the same type,\nbut with different parameters:\n\n```lisp\n(defworkflow ci\n  :on-push-to \"master\"\n  :on-pull-request t\n  :jobs ((run-tests\n          :lisp \"sbcl-bin\")\n         (run-tests\n          :lisp \"ccl-bin\")\n         (run-tests\n          :lisp \"allegro\")))\n```\nThis will generate a workflow with three jobs: \"run-tests\", \"run-tests-2\" and \"run-tests-3\".\n\nMeaningful names might be specified as well:\n\n```lisp\n(defworkflow ci\n  :on-push-to \"master\"\n  :on-pull-request t\n  :jobs ((run-tests\n          :name \"test-on-sbcl\"\n          :lisp \"sbcl-bin\")\n         (run-tests\n          :name \"test-on-ccl\"\n          :lisp \"ccl-bin\")\n         (run-tests\n          :name \"test-on-allegro\"\n          :lisp \"allegro\")))\n```\nHere is how these jobs will look like in the GitHub interface:\n\n![](https://user-images.githubusercontent.com/24827/151619261-2d49e2a6-bc5c-42db-aec5-674d9229a1b0.png)\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-40BUILD-DOCS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Building Docs\n\nThird predefined job type is `40ants-ci/jobs/docs:build-docs` ([`1`][13b8] [`2`][1ddb]).\nIt uses [40ants/build-docs][613f]\naction and will work only if your `ASDF` system uses a documentation builder supported by\n[40ants/docs-builder][f2be].\n\nTo build docs on every push to master, just use this code:\n\n```lisp\n\n(defworkflow docs\n  :on-push-to \"master\"\n  :jobs ((40ants-ci/jobs/docs:build-docs)))\n```\nIt will generate `.github/workflows/docs.yml` with following content:\n\n```json\n\n{\n  \"name\": \"DOCS\",\n  \"on\": {\n    \"push\": {\n      \"branches\": [\n        \"master\"\n      ]\n    }\n  },\n  \"jobs\": {\n    \"build-docs\": {\n      \"runs-on\": \"ubuntu-latest\",\n      \"env\": {\n        \"OS\": \"ubuntu-latest\",\n        \"QUICKLISP_DIST\": \"quicklisp\",\n        \"LISP\": \"sbcl-bin\"\n      },\n      \"steps\": [\n        {\n          \"name\": \"Checkout Code\",\n          \"uses\": \"actions/checkout@v4\"\n        },\n        {\n          \"name\": \"Setup Common Lisp Environment\",\n          \"uses\": \"40ants/setup-lisp@v4\",\n          \"with\": {\n            \"asdf-system\": \"example\",\n            \"qlfile-template\": \"\"\n          }\n        },\n        {\n          \"name\": \"Build Docs\",\n          \"uses\": \"40ants/build-docs@v1\",\n          \"with\": {\n            \"asdf-system\": \"example\"\n          }\n        }\n      ]\n    }\n  }\n}\n```\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-40CACHING-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### Caching\n\nTo significantly speed up our tests, we can cache installed Roswell,\nQlot and Common Lisp fasl files.\n\nTo accomplish this task, you don't need to dig into GitHub's docs anymore!\nJust add one line `:cache t` to your workflow definition:\n\n```lisp\n(defworkflow docs\n  :on-push-to \"master\"\n  :cache t\n  :jobs ((40ants-ci/jobs/docs:build-docs)))\n```\nHere is the diff of the generated workflow file. It shows steps, added automatically:\n\n```diff\nmodified   .github/workflows/docs.yml\n@@ -20,13 +20,40 @@\n           \"name\": \"Checkout Code\",\n           \"uses\": \"actions/checkout@v4\"\n         },\n+        {\n+          \"name\": \"Grant All Perms to Make Cache Restoring Possible\",\n+          \"run\": \"sudo mkdir -p /usr/local/etc/roswell\\n                 sudo chown \\\"${USER}\\\" /usr/local/etc/roswell\\n                 # Here the ros binary will be restored:\\n                 sudo chown \\\"${USER}\\\" /usr/local/bin\",\n+          \"shell\": \"bash\"\n+        },\n+        {\n+          \"name\": \"Get Current Month\",\n+          \"id\": \"current-month\",\n+          \"run\": \"echo \\\"::set-output name=value::$(date -u \\\"+%Y-%m\\\")\\\"\",\n+          \"shell\": \"bash\"\n+        },\n+        {\n+          \"name\": \"Cache Roswell Setup\",\n+          \"id\": \"cache\",\n+          \"uses\": \"actions/cache@v3\",\n+          \"with\": {\n+            \"path\": \"qlfile\\n                           qlfile.lock\\n                           /usr/local/bin/ros\\n                           ~/.cache/common-lisp/\\n                           ~/.roswell\\n                           /usr/local/etc/roswell\\n                           .qlot\",\n+            \"key\": \"${{ steps.current-month.outputs.value }}-${{ env.cache-name }}-ubuntu-latest-quicklisp-sbcl-bin-${{ hashFiles('qlfile.lock') }}\"\n+          }\n+        },\n+        {\n+          \"name\": \"Restore Path To Cached Files\",\n+          \"run\": \"echo $HOME/.roswell/bin \u003e\u003e $GITHUB_PATH\\n                 echo .qlot/bin \u003e\u003e $GITHUB_PATH\",\n+          \"shell\": \"bash\",\n+          \"if\": \"steps.cache.outputs.cache-hit == 'true'\"\n+        },\n         {\n           \"name\": \"Setup Common Lisp Environment\",\n           \"uses\": \"40ants/setup-lisp@v4\",\n           \"with\": {\n             \"asdf-system\": \"40ants-ci\",\n             \"qlfile-template\": \"\"\n-          }\n+          },\n+          \"if\": \"steps.cache.outputs.cache-hit != 'true'\"\n         },\n         {\n```\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-40ENV-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### Adding env variables\n\nYou can specify additional environment variables on any level of the GitHub workflow: for workflow itself, for a job or for a step.\n\nTo specify env for workflow or a job, just add an `ENV` argument with alist or plist value like this:\n\n```lisp\n(defworkflow release\n  :on-push-to \"master\"\n  :env (:github-token \"${{ secrets.autotag_token }}\")\n  :jobs ((40ants-ci/jobs/autotag:autotag)))\n```\nor as alist:\n\n```lisp\n(defworkflow release\n  :on-push-to \"master\"\n  :env ((\"github_token\" . \"${{ secrets.autotag_token }}\"))\n  :jobs ((40ants-ci/jobs/autotag:autotag)))\n```\nor for the job itself:\n\n```lisp\n(defworkflow release\n  :on-push-to \"master\"\n  :jobs ((40ants-ci/jobs/autotag:autotag\n           :env (:github-token \"${{ secrets.autotag_token }}\"))))\n```\nthe same way it can be specified on a custom step:\n\n```lisp\n(40ants-ci/steps/sh:sh \"Custom env-var example\"\n                       \"echo $CUSTOM_VAR\"\n                       :env (:custom-var \"Hello world!\"))\n```\nNote - environment variable names are always transformed to uppercase and dashes are replaced with underscores.\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-40RUNNING-CUSTOM-STEPS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### Running custom steps\n\nSometimes you might need to install custom system packages or do something before the job will finish. To accomplish\nthese task you can provide custom steps using `BEFORE-STEPS` argument or `AFTER-STEPS` argument.\n\nHere is an example where we are installing system package libunaq1-dev before running the testsuite:\n\n```lisp\n(defparameter *required-steps*\n  (list (sh \"Install libunac\"\n            \"sudo apt-get install -y libunac1-dev\")))\n\n(defworkflow ci\n  :on-pull-request t\n  :cache t\n  :jobs ((run-tests\n          :steps-before *required-steps*\n          :asdf-system \"my-asdf-system\")))\n```\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-40DETAILS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n## Details\n\n`TODO`: I have to write a few chapters with details on additional job's parameters\nand a way how to create new job types.\n\nBut for now, I want to show a small example, how to define a workflow with a\njob which takes care about lisp installation and then calls a custom step:\n\n```lisp\n(defworkflow ci\n  :on-push-to \"master\"\n  :by-cron \"0 10 * * 1\"\n  :on-pull-request t\n  :cache t\n  :jobs ((40ants-ci/jobs/lisp-job:lisp-job :name \"check-ros-config\"\n                                           :lisp \"ccl-bin\"\n                                           :steps ((40ants-ci/steps/sh:sh \"Show Roswell Config\"\n                                                                          \"ros config\")))))\n```\nHere we are using the class [`40ants-ci/jobs/lisp-job:lisp-job`][2f4c] which is base for most classes in this `ASDF` system\nand pass a custom `40ants-ci/steps/sh:sh` ([`1`][4d70] [`2`][0f59]) step to it. This step will be called after the repostory checkout and `CCL-BIN` lisp installation.\nso, thus when this step will run `ros config` command, it will output something like that:\n\n```\nasdf.version=3.3.5.3\nccl-bin.version=1.12.2\nsetup.time=3918000017\nsbcl-bin.version=2.4.1\ndefault.lisp=ccl-bin\n\nPossible subcommands:\nset\nshow\n```\nPay attention to the `NAME` argument of [`40ants-ci/jobs/lisp-job:lisp-job`][2f4c] class. If you omit it, then default \"lisp-job\" name will be used.\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-40API-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n## API\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-CI\n\n\u003ca id=\"x-28-23A-28-289-29-20BASE-CHAR-20-2E-20-2240ANTS-CI-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](ce4f) `40ants-ci`\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-3FFunctions-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Functions\n\n\u003ca id=\"x-2840ANTS-CI-3AGENERATE-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](6f89) `40ants-ci:generate` system \u0026key path\n\nGenerates GitHub workflow for given `ASDF` system.\n\nThis function searches workflow definitions in all packages\nof the given `ASDF` system.\n\nIf `PATH` argument is not given, workflow files will be written\nto .github/workflow/ relarive to the `SYSTEM`.\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FGITHUB-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-CI/GITHUB\n\n\u003ca id=\"x-28-23A-28-2816-29-20BASE-CHAR-20-2E-20-2240ANTS-CI-2FGITHUB-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](b5b6) `40ants-ci/github`\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FGITHUB-3FGenerics-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Generics\n\n\u003ca id=\"x-2840ANTS-CI-2FGITHUB-3AGENERATE-20GENERIC-FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [generic-function](0b0f) `40ants-ci/github:generate` obj path\n\n\u003ca id=\"x-2840ANTS-CI-2FGITHUB-3APREPARE-DATA-20GENERIC-FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [generic-function](cc9b) `40ants-ci/github:prepare-data` obj\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FGITHUB-3FVariables-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Variables\n\n\u003ca id=\"x-2840ANTS-CI-2FVARS-3A-2ACURRENT-SYSTEM-2A-20-28VARIABLE-29-29\"\u003e\u003c/a\u003e\n\n##### [variable](6ea3) `40ants-ci/vars:*current-system*` -unbound-\n\nWhen workflow is generated for `ASDF` system, this variable will contain a primary `ASDF` system.\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FJOBS-2FAUTOTAG-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-CI/JOBS/AUTOTAG\n\n\u003ca id=\"x-28-23A-28-2822-29-20BASE-CHAR-20-2E-20-2240ANTS-CI-2FJOBS-2FAUTOTAG-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](634b) `40ants-ci/jobs/autotag`\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FJOBS-2FAUTOTAG-3FClasses-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Classes\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FJOBS-2FAUTOTAG-24AUTOTAG-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### AUTOTAG\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FAUTOTAG-3AAUTOTAG-20CLASS-29\"\u003e\u003c/a\u003e\n\n###### [class](a449) `40ants-ci/jobs/autotag:autotag` (job)\n\nThis type of the job created a git tag when finds a new tag in specified file.\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FAUTOTAG-3AFILENAME-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FAUTOTAG-3AAUTOTAG-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](fc02) `40ants-ci/jobs/autotag:filename` (autotag) (:filename = \\*default-filename\\*)\n\nFile where to search for version numbers.\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FAUTOTAG-3AREGEX-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FAUTOTAG-3AAUTOTAG-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](90d5) `40ants-ci/jobs/autotag:regex` (autotag) (:regex = \\*default-regex\\*)\n\nRegexp used to extract version numbers.\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FAUTOTAG-3ATAG-PREFIX-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FAUTOTAG-3AAUTOTAG-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](211b) `40ants-ci/jobs/autotag:tag-prefix` (autotag) (:tag-prefix = \\*default-tag-prefix\\*)\n\nTag prefix.\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FAUTOTAG-3ATOKEN-PATTERN-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FAUTOTAG-3AAUTOTAG-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](66f4) `40ants-ci/jobs/autotag:token-pattern` (autotag) (:token-pattern = \\*default-token-pattern\\*)\n\nAuth token pattern.\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FJOBS-2FAUTOTAG-3FFunctions-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Functions\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FAUTOTAG-3AAUTOTAG-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](9bde) `40ants-ci/jobs/autotag:autotag` \u0026key (filename \\*default-filename\\*) (regex \\*default-regex\\*) (tag-prefix \\*default-tag-prefix\\*) (token-pattern \\*default-token-pattern\\*) env\n\nCreates a job which will run autotagger to create a new git tag for release.\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FJOBS-2FCRITIC-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-CI/JOBS/CRITIC\n\n\u003ca id=\"x-28-23A-28-2821-29-20BASE-CHAR-20-2E-20-2240ANTS-CI-2FJOBS-2FCRITIC-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](bca1) `40ants-ci/jobs/critic`\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FJOBS-2FCRITIC-3FClasses-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Classes\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FJOBS-2FCRITIC-24CRITIC-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### CRITIC\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FCRITIC-3ACRITIC-20CLASS-29\"\u003e\u003c/a\u003e\n\n###### [class](7d77) `40ants-ci/jobs/critic:critic` (lisp-job)\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FCRITIC-3AASDF-SYSTEMS-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FCRITIC-3ACRITIC-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](432e) `40ants-ci/jobs/critic:asdf-systems` (critic) (:asdf-systems)\n\nCritic can validate more than one system, but for the base class we need provide only one.\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FCRITIC-3AIGNORE-CRITIQUES-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FCRITIC-3ACRITIC-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](add0) `40ants-ci/jobs/critic:ignore-critiques` (critic) (:ignore-critiques)\n\nA list strigns with names of critiques to ignore.\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FJOBS-2FCRITIC-3FFunctions-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Functions\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FCRITIC-3ACRITIC-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](7fa5) `40ants-ci/jobs/critic:critic` \u0026key asdf-systems asdf-version ignore-critiques env\n\nCreates a job which will run Lisp Critic for given `ASDF` systems.\n\nIf argument `ASDF-SYSTEMS` is `NIL`, it will use `ASDF` system\nto which current lisp file is belong.\n\nYou may also provide `ASDF-VERSION` argument. It should be\na string. By default, the latest `ASDF` version will be used.\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FJOBS-2FDOCS-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-CI/JOBS/DOCS\n\n\u003ca id=\"x-28-23A-28-2819-29-20BASE-CHAR-20-2E-20-2240ANTS-CI-2FJOBS-2FDOCS-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](9225) `40ants-ci/jobs/docs`\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FJOBS-2FDOCS-3FClasses-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Classes\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FJOBS-2FDOCS-24BUILD-DOCS-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### BUILD-DOCS\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FDOCS-3ABUILD-DOCS-20CLASS-29\"\u003e\u003c/a\u003e\n\n###### [class](b7e9) `40ants-ci/jobs/docs:build-docs` (lisp-job)\n\nBuilds documentation and uploads it to GitHub using [\"40ants/build-docs\" github action][613f].\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FDOCS-3AERROR-ON-WARNINGS-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FDOCS-3ABUILD-DOCS-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](1b33) `40ants-ci/jobs/docs:error-on-warnings` (build-docs) (:error-on-warnings = t)\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FJOBS-2FDOCS-3FFunctions-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Functions\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FDOCS-3ABUILD-DOCS-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](ab61) `40ants-ci/jobs/docs:build-docs` \u0026rest args \u0026key (error-on-warnings t) os permissions exclude env steps steps-before steps-after roswell-version asdf-version qlot-version quicklisp lisp asdf-system qlfile checkout-submodules dynamic-space-size\n\nCreates a job of class [`build-docs`][1ddb].\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FJOBS-2FJOB-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-CI/JOBS/JOB\n\n\u003ca id=\"x-28-23A-28-2818-29-20BASE-CHAR-20-2E-20-2240ANTS-CI-2FJOBS-2FJOB-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](7574) `40ants-ci/jobs/job`\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FJOBS-2FJOB-3FClasses-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Classes\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FJOBS-2FJOB-24JOB-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### JOB\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FJOB-3AJOB-20CLASS-29\"\u003e\u003c/a\u003e\n\n###### [class](6c99) `40ants-ci/jobs/job:job` ()\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FJOB-3AEXCLUDE-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FJOB-3AJOB-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](61ff) `40ants-ci/jobs/job:exclude` (job) (:exclude = nil)\n\nA list of plists denoting matrix combinations to be excluded.\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FJOB-3AEXPLICIT-STEPS-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FJOB-3AJOB-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](00d8) `40ants-ci/jobs/job:explicit-steps` (job) (:steps = nil)\n\nThis slot holds steps given as a `STEPS` argument to a job constructor. Depending on a job class, it might add additional steps around these explicit steps.\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FJOB-3AJOB-ENV-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FJOB-3AJOB-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](174e) `40ants-ci/jobs/job:job-env` (job) (:env = nil)\n\nAn alist of environment variables and their values to be added on job level. Values are evaluated in runtime.\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FJOB-3ANAME-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FJOB-3AJOB-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](cd97) `40ants-ci/jobs/job:name` (job) (:name)\n\nIf this name was not given in constructor, then name will be lowercased name of the job class.\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FJOB-3AOS-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FJOB-3AJOB-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](3e5d) `40ants-ci/jobs/job:os` (job) (:OS = \"ubuntu-latest\")\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FJOB-3APERMISSIONS-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FJOB-3AJOB-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](9a17) `40ants-ci/jobs/job:permissions` (job) (:permissions = nil)\n\nA plist of permissions need for running the job.\n\nThese permissions will be bound to `secrets.GITHUB_TOKEN` variable.\nUse default-initargs to override permissions in subclasses:\n\n```lisp\n(:default-initargs\n :permissions '(:content \"write\"))\n```\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FJOB-3ASTEPS-AFTER-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FJOB-3AJOB-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](b9d6) `40ants-ci/jobs/job:steps-after` (job) (:steps-after = nil)\n\nThis slot holds steps given as a `STEPS-AFTER` argument to a job constructor. These steps will be appended to steps returned by the [`job`][17c5] class.\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FJOB-3ASTEPS-BEFORE-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FJOB-3AJOB-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](db8a) `40ants-ci/jobs/job:steps-before` (job) (:steps-before = nil)\n\nThis slot holds steps given as a `STEPS-BEFORE` argument to a job constructor. These steps will be prepended to steps returned by the [`job`][17c5] class.\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FJOBS-2FJOB-3FGenerics-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Generics\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FJOB-3AMAKE-ENV-20GENERIC-FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [generic-function](b017) `40ants-ci/jobs/job:make-env` job\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FJOB-3AMAKE-MATRIX-20GENERIC-FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [generic-function](6b50) `40ants-ci/jobs/job:make-matrix` job\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FJOB-3AMAKE-PERMISSIONS-20GENERIC-FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [generic-function](3ecb) `40ants-ci/jobs/job:make-permissions` job\n\nShould return an alist with mapping from string to string where keys are scopes and values are permission names. Default method generates this alist from the plist of job's \"permissions\" slot.\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FJOB-3ASTEPS-20GENERIC-FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [generic-function](8fe1) `40ants-ci/jobs/job:steps` job\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FJOB-3AUSE-MATRIX-P-20GENERIC-FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [generic-function](3f8a) `40ants-ci/jobs/job:use-matrix-p` job\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FJOBS-2FLINTER-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-CI/JOBS/LINTER\n\n\u003ca id=\"x-28-23A-28-2821-29-20BASE-CHAR-20-2E-20-2240ANTS-CI-2FJOBS-2FLINTER-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](5b2f) `40ants-ci/jobs/linter`\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FJOBS-2FLINTER-3FClasses-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Classes\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FJOBS-2FLINTER-24LINTER-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### LINTER\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FLINTER-3ALINTER-20CLASS-29\"\u003e\u003c/a\u003e\n\n###### [class](d7f2) `40ants-ci/jobs/linter:linter` (lisp-job)\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FLINTER-3AASDF-SYSTEMS-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FLINTER-3ALINTER-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](8331) `40ants-ci/jobs/linter:asdf-systems` (linter) (:asdf-systems = nil)\n\nLinter can validate more than one system, but for the base class we need provide only one.\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FLINTER-3ACHECK-IMPORTS-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FLINTER-3ALINTER-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](9c44) `40ants-ci/jobs/linter:check-imports` (linter) (:check-imports = nil)\n\nLinter will check for missing or unused imports of package-inferred systems.\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FJOBS-2FLINTER-3FFunctions-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Functions\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FLINTER-3ALINTER-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](366b) `40ants-ci/jobs/linter:linter` \u0026rest args \u0026key asdf-systems check-imports os permissions exclude env steps steps-before steps-after roswell-version asdf-version qlot-version quicklisp lisp qlfile checkout-submodules dynamic-space-size\n\nCreates a job which will run `SBL`int for given `ASDF` systems.\n\nIf no `ASD` files given, it will use all `ASD` files from\nthe current `ASDF` system.\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FJOBS-2FLISP-JOB-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-CI/JOBS/LISP-JOB\n\n\u003ca id=\"x-28-23A-28-2823-29-20BASE-CHAR-20-2E-20-2240ANTS-CI-2FJOBS-2FLISP-JOB-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](3114) `40ants-ci/jobs/lisp-job`\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FJOBS-2FLISP-JOB-3FClasses-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Classes\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FJOBS-2FLISP-JOB-24LISP-JOB-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### LISP-JOB\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FLISP-JOB-3ALISP-JOB-20CLASS-29\"\u003e\u003c/a\u003e\n\n###### [class](b1f2) `40ants-ci/jobs/lisp-job:lisp-job` (job)\n\nThis job checkouts the sources, installs Roswell and Qlot. Also, it caches results between runs.\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FLISP-JOB-3AASDF-SYSTEM-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FLISP-JOB-3ALISP-JOB-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](0a70) `40ants-ci/jobs/lisp-job:asdf-system` (lisp-job) (:asdf-system = nil)\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FLISP-JOB-3AASDF-VERSION-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FLISP-JOB-3ALISP-JOB-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](0f71) `40ants-ci/jobs/lisp-job:asdf-version` (lisp-job) (:asdf-version = nil)\n\n`ASDF` version to use when setting up Lisp environment. If `NIL`, then the latest will be used.\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FLISP-JOB-3ACHECKOUT-SUBMODULES-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FLISP-JOB-3ALISP-JOB-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](d88c) `40ants-ci/jobs/lisp-job:checkout-submodules` (lisp-job) (:checkout-submodules = nil)\n\nIf this flag is true, then we will command actions/checkout action to checkout submodules.\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FLISP-JOB-3ADYNAMIC-SPACE-SIZE-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FLISP-JOB-3ALISP-JOB-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](743d) `40ants-ci/jobs/lisp-job:dynamic-space-size` (lisp-job) (:dynamic-space-size = nil)\n\nDynamic space size for `SBCL`.\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FLISP-JOB-3ALISP-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FLISP-JOB-3ALISP-JOB-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](3315) `40ants-ci/jobs/lisp-job:lisp` (lisp-job) (:LISP = \"sbcl-bin\")\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FLISP-JOB-3AQLFILE-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FLISP-JOB-3ALISP-JOB-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](ebec) `40ants-ci/jobs/lisp-job:qlfile` (lisp-job) (:qlfile = nil)\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FLISP-JOB-3AQLOT-VERSION-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FLISP-JOB-3ALISP-JOB-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](52dc) `40ants-ci/jobs/lisp-job:qlot-version` (lisp-job) (:qlot-version = nil)\n\nQlot version to use when setting up Lisp environment. If `NIL`, then will be used version, pinned in `setup-lisp` github action.\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FLISP-JOB-3AQUICKLISP-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FLISP-JOB-3ALISP-JOB-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](de61) `40ants-ci/jobs/lisp-job:quicklisp` (lisp-job) (:QUICKLISP = \"quicklisp\")\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FLISP-JOB-3AROSWELL-VERSION-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FLISP-JOB-3ALISP-JOB-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](fd6f) `40ants-ci/jobs/lisp-job:roswell-version` (lisp-job) (:roswell-version = nil)\n\nRoswell version to use when setting up Lisp environment. If `NIL`, then will be used version, pinned in `setup-lisp` github action.\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FJOBS-2FRUN-TESTS-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-CI/JOBS/RUN-TESTS\n\n\u003ca id=\"x-28-23A-28-2824-29-20BASE-CHAR-20-2E-20-2240ANTS-CI-2FJOBS-2FRUN-TESTS-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](3424) `40ants-ci/jobs/run-tests`\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FJOBS-2FRUN-TESTS-3FClasses-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Classes\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FJOBS-2FRUN-TESTS-24RUN-TESTS-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### RUN-TESTS\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FRUN-TESTS-3ARUN-TESTS-20CLASS-29\"\u003e\u003c/a\u003e\n\n###### [class](bacc) `40ants-ci/jobs/run-tests:run-tests` (lisp-job)\n\nThis job test runs tests for a given `ASDF` system.\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FRUN-TESTS-3ACOVERAGE-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FRUN-TESTS-3ARUN-TESTS-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](ff89) `40ants-ci/jobs/run-tests:coverage` (run-tests) (:coverage = nil)\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FRUN-TESTS-3ACUSTOM-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FJOBS-2FRUN-TESTS-3ARUN-TESTS-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](ebf5) `40ants-ci/jobs/run-tests:custom` (run-tests) (:custom = nil)\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FJOBS-2FRUN-TESTS-3FFunctions-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Functions\n\n\u003ca id=\"x-2840ANTS-CI-2FJOBS-2FRUN-TESTS-3ARUN-TESTS-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](7f85) `40ants-ci/jobs/run-tests:run-tests` \u0026rest rest \u0026key coverage custom os permissions steps steps-before steps-after env roswell-version asdf-version qlot-version lisp exclude qlfile quicklisp asdf-system checkout-submodules dynamic-space-size\n\nCreates a job step of class [`run-tests`][6cb7].\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FSTEPS-2FACTION-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-CI/STEPS/ACTION\n\n\u003ca id=\"x-28-23A-28-2822-29-20BASE-CHAR-20-2E-20-2240ANTS-CI-2FSTEPS-2FACTION-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](a457) `40ants-ci/steps/action`\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FSTEPS-2FACTION-3FClasses-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Classes\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FSTEPS-2FACTION-24ACTION-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### ACTION\n\n\u003ca id=\"x-2840ANTS-CI-2FSTEPS-2FACTION-3AACTION-20CLASS-29\"\u003e\u003c/a\u003e\n\n###### [class](3516) `40ants-ci/steps/action:action` (step)\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-CI-2FSTEPS-2FACTION-3AACTION-ARGS-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FSTEPS-2FACTION-3AACTION-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](3c04) `40ants-ci/steps/action:action-args` (action) (:args)\n\nA plist to be passed as \"with\" dictionary to the action.\n\n\u003ca id=\"x-2840ANTS-CI-2FSTEPS-2FACTION-3AUSES-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FSTEPS-2FACTION-3AACTION-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](f8ab) `40ants-ci/steps/action:uses` (action) (:uses)\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FSTEPS-2FACTION-3FFunctions-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Functions\n\n\u003ca id=\"x-2840ANTS-CI-2FSTEPS-2FACTION-3AACTION-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](a671) `40ants-ci/steps/action:action` name uses \u0026rest args \u0026key id if env \u0026allow-other-keys\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FSTEPS-2FSH-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-CI/STEPS/SH\n\n\u003ca id=\"x-28-23A-28-2818-29-20BASE-CHAR-20-2E-20-2240ANTS-CI-2FSTEPS-2FSH-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](8657) `40ants-ci/steps/sh`\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FSTEPS-2FSH-3FClasses-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Classes\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FSTEPS-2FSH-24SH-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### SH\n\n\u003ca id=\"x-2840ANTS-CI-2FSTEPS-2FSH-3ASH-20CLASS-29\"\u003e\u003c/a\u003e\n\n###### [class](01f9) `40ants-ci/steps/sh:sh` (step)\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-CI-2FSTEPS-2FSH-3ACOMMAND-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FSTEPS-2FSH-3ASH-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](6a36) `40ants-ci/steps/sh:command` (sh) (:command)\n\n\u003ca id=\"x-2840ANTS-CI-2FSTEPS-2FSH-3ASHELL-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FSTEPS-2FSH-3ASH-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](73c7) `40ants-ci/steps/sh:shell` (sh) (:shell = \\*default-shell\\*)\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FSTEPS-2FSH-3FFunctions-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Functions\n\n\u003ca id=\"x-2840ANTS-CI-2FSTEPS-2FSH-3ASH-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](3b5c) `40ants-ci/steps/sh:sh` name command \u0026key id if (shell \\*default-shell\\*) env\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FSTEPS-2FSH-3FMacros-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Macros\n\n\u003ca id=\"x-2840ANTS-CI-2FSTEPS-2FSH-3ASECTIONS-20-2840ANTS-DOC-2FLOCATIVES-3AMACRO-29-29\"\u003e\u003c/a\u003e\n\n##### [macro](9ce9) `40ants-ci/steps/sh:sections` \u0026body body\n\nReturns a string with a bash script where some parts are grouped.\n\nIn this example we have 3 sections:\n\n```lisp\n(sections\n      (\"Help Argument\"\n       \"qlot exec cl-info --help\")\n      (\"Version Argument\"\n       \"qlot exec cl-info --version\")\n      (\"Lisp Systems Info\"\n       \"qlot exec cl-info\"\n       \"qlot exec cl-info cl-info defmain\"))\n```\nIt will be compiled into:\n\n```bash\necho ::group::Help Argument\nqlot exec cl-info --help\necho ::endgroup::\necho ::group::Version Argument\nqlot exec cl-info --version\necho ::endgroup::\necho ::group::Lisp Systems Info\nqlot exec cl-info\nqlot exec cl-info cl-info defmain\necho ::endgroup::\n```\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FSTEPS-2FSTEP-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-CI/STEPS/STEP\n\n\u003ca id=\"x-28-23A-28-2820-29-20BASE-CHAR-20-2E-20-2240ANTS-CI-2FSTEPS-2FSTEP-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](7383) `40ants-ci/steps/step`\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FSTEPS-2FSTEP-3FClasses-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Classes\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FSTEPS-2FSTEP-24STEP-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### STEP\n\n\u003ca id=\"x-2840ANTS-CI-2FSTEPS-2FSTEP-3ASTEP-20CLASS-29\"\u003e\u003c/a\u003e\n\n###### [class](07c0) `40ants-ci/steps/step:step` ()\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-CI-2FSTEPS-2FSTEP-3AENV-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FSTEPS-2FSTEP-3ASTEP-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](693b) `40ants-ci/steps/step:env` (step) (:env = nil)\n\nAn alist of environment variables.\n\n\u003ca id=\"x-2840ANTS-CI-2FSTEPS-2FSTEP-3ASTEP-ID-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FSTEPS-2FSTEP-3ASTEP-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](bbe6) `40ants-ci/steps/step:step-id` (step) (:id = nil)\n\n\u003ca id=\"x-2840ANTS-CI-2FSTEPS-2FSTEP-3ASTEP-IF-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FSTEPS-2FSTEP-3ASTEP-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](3207) `40ants-ci/steps/step:step-if` (step) (:if = nil)\n\n\u003ca id=\"x-2840ANTS-CI-2FSTEPS-2FSTEP-3ASTEP-NAME-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FSTEPS-2FSTEP-3ASTEP-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](9c1f) `40ants-ci/steps/step:step-name` (step) (:name = nil)\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FUTILS-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-CI/UTILS\n\n\u003ca id=\"x-28-23A-28-2815-29-20BASE-CHAR-20-2E-20-2240ANTS-CI-2FUTILS-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](73f9) `40ants-ci/utils`\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FUTILS-3FGenerics-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Generics\n\n\u003ca id=\"x-2840ANTS-CI-2FUTILS-3ASYSTEM-PACKAGES-20GENERIC-FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [generic-function](f910) `40ants-ci/utils:system-packages` system\n\nReturns a list of packages created by `ASDF` system.\n\nDefault implementation returns a package having the same name as a system\nand all packages matched to package-inferred subsystems:\n\n```\nCL-USER\u003e (docs-builder/utils:system-packages :docs-builder)\n(#\u003cPACKAGE \"DOCS-BUILDER\"\u003e\n #\u003cPACKAGE \"DOCS-BUILDER/UTILS\"\u003e\n #\u003cPACKAGE \"DOCS-BUILDER/GUESSER\"\u003e\n #\u003cPACKAGE \"DOCS-BUILDER/BUILDERS/GENEVA/GUESSER\"\u003e\n #\u003cPACKAGE \"DOCS-BUILDER/BUILDER\"\u003e\n #\u003cPACKAGE \"DOCS-BUILDER/BUILDERS/MGL-PAX/GUESSER\"\u003e\n #\u003cPACKAGE \"DOCS-BUILDER/DOCS\"\u003e\n #\u003cPACKAGE \"DOCS-BUILDER/BUILDERS/MGL-PAX/BUILDER\"\u003e)\n```\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FUTILS-3FFunctions-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Functions\n\n\u003ca id=\"x-2840ANTS-CI-2FUTILS-3AALISTP-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](ada0) `40ants-ci/utils:alistp` list\n\nTest wheather `LIST` argument is a properly formed alist.\n\nIn this library, alist has always a string as a key.\nBecause we need them to have this form to serialize\nto `JSON` propertly.\n\n(alistp '((\"cron\" . \"0 10 * * 1\"))) -\u003e T\n(alistp '(((\"cron\" . \"0 10 * * 1\")))) -\u003e `NIL`\n\n\u003ca id=\"x-2840ANTS-CI-2FUTILS-3ACURRENT-SYSTEM-NAME-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](9956) `40ants-ci/utils:current-system-name`\n\n\u003ca id=\"x-2840ANTS-CI-2FUTILS-3ADEDENT-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](2560) `40ants-ci/utils:dedent` text\n\nRemoves common leading whitespace from each string.\n\nA few examples:\n\n```\n(dedent \"Hello\n          World\n          and all Lispers!\")\n\n\"Hello\nWorld\nand all Lispers!\"\n```\n```\n(dedent \"\n    Hello\n    World\n    and all Lispers!\")\n\n\"Hello\nWorld\nand all Lispers!\"\n```\n```\n(dedent \"This is a code:\n\n              (symbol-name :hello-world)\n\n          it will output HELLO-WORLD.\")\n\n\"This is a code:\n\n    (symbol-name :hello-world)\n\nit will output HELLO-WORLD.\"\n```\n\u003ca id=\"x-2840ANTS-CI-2FUTILS-3AENSURE-LIST-OF-PLISTS-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](bb81) `40ants-ci/utils:ensure-list-of-plists` data\n\n\u003ca id=\"x-2840ANTS-CI-2FUTILS-3AENSURE-PRIMARY-SYSTEM-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](102f) `40ants-ci/utils:ensure-primary-system` system\n\n\u003ca id=\"x-2840ANTS-CI-2FUTILS-3AMAKE-GITHUB-WORKFLOWS-PATH-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](8324) `40ants-ci/utils:make-github-workflows-path` system\n\n\u003ca id=\"x-2840ANTS-CI-2FUTILS-3APLIST-TO-ALIST-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](f1d3) `40ants-ci/utils:plist-to-alist` plist \u0026key (string-keys t) (lowercase t)\n\nMake an alist from a plist `PLIST`.\n\nBy default, transforms keys to lowercased strings\n\n\u003ca id=\"x-2840ANTS-CI-2FUTILS-3APLISTP-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](3a17) `40ants-ci/utils:plistp` list\n\nTest wheather `LIST` is a properly formed plist.\n\n\u003ca id=\"x-2840ANTS-CI-2FUTILS-3ASINGLE-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](2598) `40ants-ci/utils:single` list\n\nTest wheather `LIST` contains exactly 1 element.\n\n\u003ca id=\"x-2840ANTS-CI-2FUTILS-3ATO-JSON-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](a94a) `40ants-ci/utils:to-json` data\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FVARS-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-CI/VARS\n\n\u003ca id=\"x-28-23A-28-2814-29-20BASE-CHAR-20-2E-20-2240ANTS-CI-2FVARS-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](e959) `40ants-ci/vars`\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FVARS-3FVariables-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Variables\n\n\u003ca id=\"x-2840ANTS-CI-2FVARS-3A-2ACURRENT-SYSTEM-2A-20-28VARIABLE-29-29\"\u003e\u003c/a\u003e\n\n##### [variable](6ea3) `40ants-ci/vars:*current-system*` -unbound-\n\nWhen workflow is generated for `ASDF` system, this variable will contain a primary `ASDF` system.\n\n\u003ca id=\"x-2840ANTS-CI-2FVARS-3A-2AUSE-CACHE-2A-20-28VARIABLE-29-29\"\u003e\u003c/a\u003e\n\n##### [variable](2c71) `40ants-ci/vars:*use-cache*` nil\n\nWorkflow will set this variable when preparing the data or `YAML` generation.\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FWORKFLOW-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-CI/WORKFLOW\n\n\u003ca id=\"x-28-23A-28-2818-29-20BASE-CHAR-20-2E-20-2240ANTS-CI-2FWORKFLOW-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](d34b) `40ants-ci/workflow`\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FWORKFLOW-3FClasses-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Classes\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-4040ANTS-CI-2FWORKFLOW-24WORKFLOW-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### WORKFLOW\n\n\u003ca id=\"x-2840ANTS-CI-2FWORKFLOW-3AWORKFLOW-20CLASS-29\"\u003e\u003c/a\u003e\n\n###### [class](e71a) `40ants-ci/workflow:workflow` ()\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-CI-2FWORKFLOW-3ABY-CRON-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FWORKFLOW-3AWORKFLOW-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](c940) `40ants-ci/workflow:by-cron` (workflow) (:by-cron = \"0 10 \\* \\* 1\")\n\n\u003ca id=\"x-2840ANTS-CI-2FWORKFLOW-3ACACHE-P-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FWORKFLOW-3AWORKFLOW-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](c78a) `40ants-ci/workflow:cache-p` (workflow) (:cache = t)\n\n\u003ca id=\"x-2840ANTS-CI-2FWORKFLOW-3AJOBS-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FWORKFLOW-3AWORKFLOW-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](99bf) `40ants-ci/workflow:jobs` (workflow) (:jobs = nil)\n\n\u003ca id=\"x-2840ANTS-CI-2FWORKFLOW-3ANAME-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FWORKFLOW-3AWORKFLOW-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](c215) `40ants-ci/workflow:name` (workflow) (:name)\n\n\u003ca id=\"x-2840ANTS-CI-2FWORKFLOW-3AON-PULL-REQUEST-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FWORKFLOW-3AWORKFLOW-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](2d6d) `40ants-ci/workflow:on-pull-request` (workflow) (:on-pull-request = t)\n\n\u003ca id=\"x-2840ANTS-CI-2FWORKFLOW-3AON-PUSH-TO-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FWORKFLOW-3AWORKFLOW-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](84ae) `40ants-ci/workflow:on-push-to` (workflow) (:ON-PUSH-TO = \"master\")\n\n\u003ca id=\"x-2840ANTS-CI-2FWORKFLOW-3AWORKFLOW-ENV-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-CI-2FWORKFLOW-3AWORKFLOW-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](4a15) `40ants-ci/workflow:workflow-env` (workflow) (:env = nil)\n\nAn alist of environment variables and their values to be added on workflow level. Values are evaluated in runtime.\n\n\u003ca id=\"x-2840ANTS-CI-DOCS-2FINDEX-3A-3A-7C-4040ANTS-CI-2FWORKFLOW-3FMacros-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Macros\n\n\u003ca id=\"x-2840ANTS-CI-2FWORKFLOW-3ADEFWORKFLOW-20-2840ANTS-DOC-2FLOCATIVES-3AMACRO-29-29\"\u003e\u003c/a\u003e\n\n##### [macro](4459) `40ants-ci/workflow:defworkflow` name \u0026key on-push-to by-cron on-pull-request cache env jobs\n\n\n[2100]: https://40ants.com/40ants-critic\n[b882]: https://40ants.com/build-doc\n[613f]: https://40ants.com/build-docs/\n[3f72]: https://40ants.com/ci/\n[900b]: https://40ants.com/ci/#x-28-23A-28-289-29-20BASE-CHAR-20-2E-20-2240ANTS-CI-22-29-20PACKAGE-29\n[b171]: https://40ants.com/ci/#x-28-23A-28-289-29-20BASE-CHAR-20-2E-20-2240ants-ci-22-29-20ASDF-2FSYSTEM-3ASYSTEM-29\n[484a]: https://40ants.com/ci/#x-2840ANTS-CI-2FJOBS-2FCRITIC-3ACRITIC-20FUNCTION-29\n[1ddb]: https://40ants.com/ci/#x-2840ANTS-CI-2FJOBS-2FDOCS-3ABUILD-DOCS-20CLASS-29\n[13b8]: https://40ants.com/ci/#x-2840ANTS-CI-2FJOBS-2FDOCS-3ABUILD-DOCS-20FUNCTION-29\n[17c5]: https://40ants.com/ci/#x-2840ANTS-CI-2FJOBS-2FJOB-3AJOB-20CLASS-29\n[2f4c]: https://40ants.com/ci/#x-2840ANTS-CI-2FJOBS-2FLISP-JOB-3ALISP-JOB-20CLASS-29\n[6cb7]: https://40ants.com/ci/#x-2840ANTS-CI-2FJOBS-2FRUN-TESTS-3ARUN-TESTS-20CLASS-29\n[e35d]: https://40ants.com/ci/#x-2840ANTS-CI-2FJOBS-2FRUN-TESTS-3ARUN-TESTS-20FUNCTION-29\n[0f59]: https://40ants.com/ci/#x-2840ANTS-CI-2FSTEPS-2FSH-3ASH-20CLASS-29\n[4d70]: https://40ants.com/ci/#x-2840ANTS-CI-2FSTEPS-2FSH-3ASH-20FUNCTION-29\n[f2be]: https://40ants.com/docs-builder/\n[8469]: https://40ants.com/run-tests\n[59d7]: https://40ants.com/run-tests/\n[8de1]: https://40ants.com/setup-lisp/\n[b60c]: https://coveralls.io/\n[e681]: https://github.com/40ants/ci\n[de0b]: https://github.com/40ants/ci/actions\n[ce4f]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/core.lisp#L1\n[6f89]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/core.lisp#L9\n[b5b6]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/github.lisp#L1\n[0b0f]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/github.lisp#L16\n[cc9b]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/github.lisp#L36\n[634b]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/autotag.lisp#L1\n[a449]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/autotag.lisp#L23\n[fc02]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/autotag.lisp#L24\n[90d5]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/autotag.lisp#L29\n[211b]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/autotag.lisp#L34\n[66f4]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/autotag.lisp#L39\n[9bde]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/autotag.lisp#L49\n[bca1]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/critic.lisp#L1\n[7d77]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/critic.lisp#L14\n[432e]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/critic.lisp#L16\n[add0]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/critic.lisp#L19\n[7fa5]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/critic.lisp#L24\n[9225]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/docs.lisp#L1\n[b7e9]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/docs.lisp#L15\n[1b33]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/docs.lisp#L16\n[ab61]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/docs.lisp#L22\n[7574]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/job.lisp#L1\n[8fe1]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/job.lisp#L100\n[3f8a]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/job.lisp#L117\n[6b50]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/job.lisp#L122\n[b017]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/job.lisp#L133\n[3ecb]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/job.lisp#L162\n[6c99]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/job.lisp#L31\n[cd97]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/job.lisp#L32\n[3e5d]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/job.lisp#L35\n[61ff]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/job.lisp#L38\n[174e]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/job.lisp#L42\n[00d8]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/job.lisp#L47\n[db8a]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/job.lisp#L51\n[b9d6]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/job.lisp#L55\n[9a17]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/job.lisp#L59\n[5b2f]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/linter.lisp#L1\n[d7f2]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/linter.lisp#L16\n[8331]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/linter.lisp#L17\n[9c44]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/linter.lisp#L22\n[366b]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/linter.lisp#L35\n[3114]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/lisp-job.lisp#L1\n[b1f2]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/lisp-job.lisp#L30\n[de61]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/lisp-job.lisp#L31\n[3315]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/lisp-job.lisp#L34\n[ebec]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/lisp-job.lisp#L37\n[0a70]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/lisp-job.lisp#L40\n[0f71]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/lisp-job.lisp#L44\n[fd6f]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/lisp-job.lisp#L49\n[743d]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/lisp-job.lisp#L54\n[52dc]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/lisp-job.lisp#L59\n[d88c]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/lisp-job.lisp#L64\n[3424]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/run-tests.lisp#L1\n[bacc]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/run-tests.lisp#L19\n[ff89]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/run-tests.lisp#L20\n[ebf5]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/run-tests.lisp#L23\n[7f85]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/jobs/run-tests.lisp#L29\n[a457]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/steps/action.lisp#L1\n[3516]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/steps/action.lisp#L13\n[f8ab]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/steps/action.lisp#L14\n[3c04]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/steps/action.lisp#L16\n[a671]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/steps/action.lisp#L22\n[8657]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/steps/sh.lisp#L1\n[01f9]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/steps/sh.lisp#L17\n[6a36]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/steps/sh.lisp#L18\n[73c7]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/steps/sh.lisp#L20\n[3b5c]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/steps/sh.lisp#L26\n[9ce9]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/steps/sh.lisp#L42\n[7383]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/steps/step.lisp#L1\n[07c0]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/steps/step.lisp#L19\n[bbe6]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/steps/step.lisp#L20\n[9c1f]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/steps/step.lisp#L23\n[693b]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/steps/step.lisp#L26\n[3207]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/steps/step.lisp#L31\n[73f9]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/utils.lisp#L1\n[2598]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/utils.lisp#L154\n[3a17]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/utils.lisp#L159\n[ada0]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/utils.lisp#L169\n[bb81]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/utils.lisp#L185\n[f1d3]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/utils.lisp#L197\n[8324]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/utils.lisp#L215\n[a94a]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/utils.lisp#L232\n[102f]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/utils.lisp#L25\n[f910]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/utils.lisp#L31\n[9956]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/utils.lisp#L70\n[2560]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/utils.lisp#L85\n[e959]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/vars.lisp#L1\n[2c71]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/vars.lisp#L14\n[6ea3]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/vars.lisp#L9\n[d34b]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/workflow.lisp#L1\n[4459]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/workflow.lisp#L137\n[e71a]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/workflow.lisp#L32\n[c215]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/workflow.lisp#L33\n[84ae]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/workflow.lisp#L35\n[2d6d]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/workflow.lisp#L38\n[c940]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/workflow.lisp#L41\n[c78a]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/workflow.lisp#L44\n[4a15]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/workflow.lisp#L47\n[99bf]: https://github.com/40ants/ci/blob/9f7233f440f18654d67383fde0db9996df5af70a/src/workflow.lisp#L52\n[2f94]: https://github.com/cxxxr/sblint\n[1cec]: https://github.com/quicklisp/quicklisp-projects/blob/ee133271c81caf5d8bbf8cef3054544ff47b64c6/projects/alexa/source.txt\n[8236]: https://quickdocs.org/alexandria\n[c41d]: https://quickdocs.org/serapeum\n[ef7f]: https://quickdocs.org/str\n[aba2]: https://quickdocs.org/yason\n\n* * *\n###### [generated by [40ANTS-DOC](https://40ants.com/doc/)]\n","funding_links":[],"categories":["Interfaces to other package managers"],"sub_categories":["Isomorphic web frameworks"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F40ants%2Fci","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F40ants%2Fci","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F40ants%2Fci/lists"}