{"id":40788184,"url":"https://github.com/epics-base/ci-scripts","last_synced_at":"2026-01-21T19:42:45.915Z","repository":{"id":40402696,"uuid":"148286113","full_name":"epics-base/ci-scripts","owner":"epics-base","description":"Continuous Integration Scripts for EPICS Modules","archived":false,"fork":false,"pushed_at":"2025-12-02T13:26:18.000Z","size":425,"stargazers_count":8,"open_issues_count":16,"forks_count":20,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-12-05T02:34:14.066Z","etag":null,"topics":["continuous-integration","epics","epics-controls","epics-modules"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/epics-base.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-09-11T08:33:48.000Z","updated_at":"2025-12-02T13:26:22.000Z","dependencies_parsed_at":"2025-12-03T14:07:37.769Z","dependency_job_id":null,"html_url":"https://github.com/epics-base/ci-scripts","commit_stats":null,"previous_names":[],"tags_count":24,"template":false,"template_full_name":null,"purl":"pkg:github/epics-base/ci-scripts","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/epics-base%2Fci-scripts","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/epics-base%2Fci-scripts/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/epics-base%2Fci-scripts/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/epics-base%2Fci-scripts/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/epics-base","download_url":"https://codeload.github.com/epics-base/ci-scripts/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/epics-base%2Fci-scripts/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28641279,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-21T18:04:35.752Z","status":"ssl_error","status_checked_at":"2026-01-21T18:03:55.054Z","response_time":86,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["continuous-integration","epics","epics-controls","epics-modules"],"created_at":"2026-01-21T19:42:45.258Z","updated_at":"2026-01-21T19:42:45.906Z","avatar_url":"https://github.com/epics-base.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ca target=\"_blank\" href=\"http://semver.org\"\u003e![Version][badge.version]\u003c/a\u003e\n\u003ca target=\"_blank\" href=\"https://travis-ci.org/epics-base/ci-scripts\"\u003e![Travis status][badge.travis]\u003c/a\u003e\n\u003ca target=\"_blank\" href=\"https://ci.appveyor.com/project/epics-base/ci-scripts\"\u003e![AppVeyor status][badge.appveyor]\u003c/a\u003e\n\u003ca target=\"_blank\" href=\"https://github.com/epics-base/ci-scripts/actions\"\u003e![GitHub Actions status][badge.gh-actions]\u003c/a\u003e\n\u003ca target=\"_blank\" href=\"https://gitlab.com/epics-base/ci-scripts/-/pipelines\"\u003e![GitLab CI/CD status][badge.gitlab]\u003c/a\u003e\n\n# Continuous Integration for EPICS Modules\n\nThe scripts inside this repository are intended to provide a common,\neasy-to-use and flexible way to add Continuous Integration to EPICS\nsoftware modules, e.g. Device or Driver Support modules.\n\nBy including this repository as a Git Submodule, you will be able to\nuse the same flexible, powerful CI setup that EPICS Bases uses,\nincluding a way to specify sets of dependent modules\n(with versions) that you want to compile your module against.\n\nBy using the submodule mechanism, your module will always use an\nexplicit commit, i.e. a fixed version of the scripts.\nThis ensures that any further development of the ci-scripts will\nnever break your existing use.\n\n## This Repository\n\nIn addition to the script that runs the builds and tests, this repository\ncontains service specific documentation and example configuration files\n(in the subdirectories), and a small test suite that is used to verify\nfunctionality and features of the ci-scripts module itself\n\nThe example files are your best reference. They are kept up-to-date and\nshow a fully-featured and a minimal setup.\n\nYou are welcome to use the test suite as a secondary reference, but keep in\nmind that in your main module the path to the scripts has one level more\n(e.g., `./abc` here would be `./.ci/abc` in your\nmodule).\nAlso, the test suite does not show the same quality and documentation\nlevels as the example files.\n\n## Features\n\n - Compile against different branches or releases of EPICS Base and\n   additional dependencies (modules like asyn, std, sequencer, etc.).\n\n - Define setup files that declare sets of dependencies with their\n   versions and locations.\n\n - Define hooks for any dependency.\n   Hooks are run on the dependency module before it is compiled, so\n   the module can be patched or further configured.\n\n - Define shared (default) or static builds (for executables and libraries).\n\n - Define optimized (default) or debug builds.\n\n - Run tests (using the EPICS build system, i.e., `make runtests`\n   and friends).\n\n## Supported CI Services\n\nThe listed properties and instructions for the CI services apply to\ntheir free tiers for open source projects, hosted in the cloud on\ntheir infrastructure.\n\nThe companies behind these services also offer \"enterprise\" installations\non customer infrastructure, which will have different performance\nand limitations.\n\n### [Travis-CI](https://travis-ci.org/)\n - Two parallel runners on Linux/Windows (two runners on MacOS)\n - Ubuntu 14/16/18/20, MacOS 10.13/14/15, Windows Server v1809\n - Compile natively on Linux (different versions of gcc, clang)\n - Compile natively on MacOS (clang)\n - Compile natively on Windows (gcc/MinGW, Visual Studio 2017)\n - Cross-compile for Windows 32bit and 64bit using MinGW and WINE\n - Cross-compile for RTEMS 4.9 and 4.10 (pc386, Base \u003e= 3.15)\n - Cross-compile for RTEMS 5 (10 BSPs, Base \u003e= 7.0.5.1)\n - Built dependencies are cached (for faster builds).\n\nSee specific\n**[ci-scripts on Travis-CI README](travis/README.md)**\nfor more details.\n\n### [AppVeyor](https://www.appveyor.com/)\n - One parallel runner (all builds are sequential)\n - Windows Server 2012/2016/2019\n - Compile using gcc/MinGW or different Visual Studio versions: \\\n   2010, 2012, 2013, 2015, 2017, 2019, 2022\n - Compile for Windows 32bit and 64bit\n - No useful caching available.\n\nSee specific\n**[ci-scripts on AppVeyor README](appveyor/README.md)**\nfor more details.\n\n### [GitHub Actions](https://github.com/)\n - 20 parallel runners on Linux/Windows (5 runners on MacOS)\n - Ubuntu 18/20/22, MacOS 11/12, Windows Server 2019/2022\n - Compile natively on Linux (gcc, clang)\n - Compile natively on MacOS (clang)\n - Compile natively on Windows (gcc/MinGW, Visual Studio 2019/2022)\n - Cross-compile for Windows 32bit and 64bit using MinGW and WINE\n - Cross-compile for RTEMS 4.9 and 4.10 (pc386, Base \u003e= 3.15)\n - Cross-compile for RTEMS 5 (10 BSPs, Base \u003e= 7.0.5.1)\n - Caching not supported by ci-scripts yet.\n\nSee specific\n**[ci-scripts on GitHub Actions README](github-actions/README.md)**\nfor more details.\n\n### [GitLab CI/CD](https://gitlab.com/)\n\n - Docker-based runners on Linux (one VM instance per job)\n - Can use any Docker image from Dockerhub (the examples use\n    `ubuntu:bionic`)\n - Compile natively using different compilers (gcc, clang)\n - Cross-compile for Windows 32bit and 64bit using MinGW and WINE\n - Cross-compile for RTEMS 4.9 and 4.10 (pc386, Base \u003e= 3.15)\n - Cross-compile for RTEMS 5 (10 BSPs, Base \u003e= 7.0.5.1)\n - Built dependencies are cached (for faster builds).\n\nSee specific\n**[ci-scripts on GitLab CI/CD README](gitlab/README.md)**\nfor more details.\n\n## How to Use the CI-Scripts\n\n 1. Get an account on a supported CI service provider platform\n    (e.g. [Travis-CI](https://travis-ci.org/),\n    [AppVeyor](https://www.appveyor.com/), ...).\n    GitHub Actions does not require a separate account.\n\n    (More details in the specific README of the subdirectory.)\n\n 2. In your module, add this ci-scripts repository\n    as a Git Submodule (name suggestion: `.ci`).\n    ```bash\n    git submodule add https://github.com/epics-base/ci-scripts .ci\n    ```\n\n 3. Create setup files for different sets of dependencies you\n    want to compile against. (See below.)\n\n    E.g., a setup file `stable.set` specifying\n    ```\n    MODULES=sncseq asyn\n\n    BASE=3.15\n    ASYN=R4-34\n    SNCSEQ=R2-2-8\n    ```\n    will compile against the EPICS Base 3.15 branch, the Sequencer\n    release 2.2.8 and release 4.34 of asyn.\n    (Any settings can be overridden from the specific job line\n    in the service configuration, e.g., `.travis.yml`.)\n\n 4. Create a configuration for the CI service by copying one of\n    the examples provided in the service specific subdirectory\n    and editing it to include the jobs you want the service to run.\n    Use your setup by defining e.g. `SET=stable` in the environment of\n    a job.\n\n 5. Push your changes and check the CI service for your build results.\n\n## Calling the cue.py Script\n\nIndependent from CI service and platform, the runner script is called\nfrom your main configuration as:\n\n`python .ci/cue.py \u003caction\u003e`\n\nwhere `\u003caction\u003e` is one of:\n\n`prepare`\\\nPrepare the build by cloning Base and the configured dependency modules,\nset up the EPICS build system, then\ncompile Base and these modules in the order they appear in the `MODULES`\nsetting.\n\n`build`\\\nBuild your main module.\n\n`test`\\\nRun the tests of your main module.\n\n`test-results`\\\nCollect the results of your tests and print a summary.\n\n`exec`\\\nExecute the remainder of the line using the default command shell.\n\n## Extra arguments to `make`\n\nYou can add additional arguments to the make runs that the `cue.py` script\nstarts. Put your additional arguments into environment variables named\n`EXTRA`, `EXTRA1`, ... `EXTRA5`.\n\nThe variables may contain multiple arguments, separated by whitespace.\nUse regular shell script quoting (single/double quotes, backslash escapes)\nif you need spaces inside an extra argument.\n\nThe YAML syntax needed to set environment variables depends on the CI\nservice and platform. (See the full example configuration file.)\n\n## Setup Files\n\nYour module might depend on EPICS Base and a few other support modules.\n(E.g., a specific driver might need StreamDevice, ASYN and the Sequencer.)\nIn that case, building against every possible combination of released\nversions of those dependencies is not possible:\nBase (39) x StreamDevice (50) x ASYN (40) x Sequencer (52) would produce\nmore than 4 million different combinations, i.e. build jobs.\n\nA more reasonable approach is to create a few setups, each being a\ncombination of dependency releases, that do a few scans of the available\n\"version space\". One for the oldest versions you want to support, one or two\nfor stable versions that many of your users have in production, one for the\nlatest released versions and one for the development branches.\n\nA job uses a setup file if `SET=\u003csetup\u003e` (without the `.set` extension\nof the setup file) is set for the job in the main configuration file.\n\n## Setup File Syntax\n\nSetup files are loaded by the build script. They are found by searching\nthe locations in `SETUP_PATH` (space or colon separated list of directories,\nrelative to your module's root directory).\n\nSetup files can include other setup files by calling `include \u003csetup\u003e`\n(again omitting the `.set` extension of the setup file). The configured\n`SETUP_PATH` is searched for the include.\n\nAny `VAR=value` setting of a variable in a setup file is only executed if\n`VAR` is unset or empty.\nThat way any settings can be overridden by setting them in the job\ndescription inside the main configuration file (e.g., `.travis.yml`).\n\nEmpty lines or lines starting with `#` are ignored.\n\n`MODULES=\u003clist of names\u003e` should list the dependencies (software modules)\nby using their well-known slugs, separated by spaces.\nEPICS Base (slug: `base`) will always be a dependency and will be added and\ncompiled first. The other dependencies are added and compiled in the order\nthey are defined in `MODULES`.\n\nModules needed only for specific jobs (e.g., on specific architectures)\ncan be added from the main configuration file by setting `ADD_MODULES`\nfor the specific job(s).\n\n`REPOOWNER=\u003cname\u003e` sets the default GitHub owner (or organization) for all\ndependency modules. Useful if you want to compile against a complete set\nof dependencies forked into your private GitHub area.\n\nFor any module mentioned as `foo` in the `MODULES` setting (and for `BASE`),\nthe following settings can be configured:\n\n`FOO=\u003cversion\u003e` Set version of the module that should be used. Must either\nbe a *tag* name or a *branch* name. [default: `master`]\n\n`FOO_REPONAME=\u003cname\u003e` Set the name of the remote repository as `\u003cname\u003e.git`.\n[default is the slug in lower case: `foo`]\n\n`FOO_REPOOWNER=\u003cname\u003e` Set the name of the GitHub owner (or organization)\nthat the module repository can be found under.\n\n`FOO_REPOURL=\"\u003curl\u003e\"` Set the complete URL of the remote repository. Useful\nfor dependencies that are not hosted on GitHub.\n\nThe default URL for the repository is pointing to GitHub, under\n`$FOO_REPOOWNER` else `$REPOOWNER` else `epics-modules`,\nusing `$FOO_REPONAME` else `foo` and the extension`.git`.\n\n`FOO_DEPTH=\u003cnumber\u003e` Set the depth of the git clone operation. Use 0 for a\nfull clone. [default: 5]\n\n`FOO_RECURSIVE=YES/NO` Set to `NO` (or `0`) for a flat clone without\nrecursing into submodules. [default is including submodules: `YES`]\n\n`FOO_DIRNAME=\u003cname\u003e` Set the local directory name for the checkout. This will\nbe always be extended by the release or branch name as `\u003cname\u003e-\u003cversion\u003e`.\n[default is the slug in lower case: `foo`]\n\n`FOO_HOOK=\u003chook\u003e` Set the name of a `.patch` file, a `.zip` or `.7z` archive\nor a script that will be applied (using `-p1`), extracted or run after cloning\nthe module, before compiling it.\nWorking directory is the root of the targeted module,\ne.g., `.../.cache/foo-1.2`). [default: no hook]\n\n`FOO_VARNAME=\u003cname\u003e` Set the name that is used for the module when creating\nthe `RELEASE.local` files. [default is the slug in upper case: `FOO`]\n\nThe ci-scripts module contains default settings for widely used modules, so\nthat usually it is sufficient to set `FOO=\u003cversion\u003e`.\nYou can find the list of supported (and tested) modules in `defaults.set`.\nFeel free to suggest more default settings using a Pull Request.\n\n## RTEMS\n\nCross-compiling to RTEMS versions 4.9, 4.10 or 5 is supported\non supported CI services. For configuration see below.\nTests can also be run cross-platform, using `qemu`.\n\nThe RTEMS 5 builds now include most of the BSPs with configuration in Base:\n\n- beatnik\n- gen68360\n- mcp750\n- mvme167\n- mvme2100\n- mvme3100\n- pc686 w/ libbsd\n- qoriq_e500 w/ libbsd\n- uC5282\n- xilinx_zynq_a9_qemu w/ libbsd\n\nBuild configuration [can be found here][ref.rtems5build].\nSet `RSB_BUILD` to select the RTEMS toolchain release name/data from\nhttps://github.com/mdavidsaver/rsb/releases.\n\nRTEMS 5 builds need to be switched to ubuntu version \u003e= 20\n(aka. **os: ubuntu-20.04** with GitHub Actions,\n**dist: focal** with Travis-CI or\n**image: ubuntu:focal** with GitLab CI/CD).\n\n## Cross Compilation\n\nSetting the `CI_CROSS_TARGETS` environment variable enables cross-compiling\nfrom Linux to the provided targets architectures.\nThe value of the environment variable must  contain the EPICS architecture\nand - depending on the target - may contain additional information like\nthe compiler prefix to be used or the version of the target OS.\n\nMultiple cross-targets can be added to the `CI_CROSS_TARGETS` variable\nby separating them with a colon (`:`) character.\n\nFor example, possible values are:\n\n- linux-aarch64\n- linux-arm@arm-linux-gnueabi\n- linux-arm@arm-linux-gnueabihf\n- linux-ppc\n- linux-ppc64\n- win32-x86-mingw\n- windows-x64-mingw\n- RTEMS-pc386-qemu@4.9\n- RTEMS-pc386-qemu@4.10\n- RTEMS-pc686-qemu@5\n\n## Debugging\n\nSetting `VV=1` in your service configuration (e.g., `.travis.yml`) for a\nspecific job will run the job with high verbosity,\nprinting every command as it is being executed and switching the dependency\nbuilds to higher verbosity.\n\nFor debugging on your local machine, you may set `CACHEDIR` to change the \nlocation for the dependency builds. [default is `$HOME/.cache`]\n\nSet `PARALLEL_MAKE` to the number of parallel make jobs that you want your\nbuild to use. [default is the number of CPUs on the runner]\n\nSet `CLEAN_DEPS` to `NO` if you want to leave the object file directories\n(`**/O.*`) in the cached dependencies. [default is to run `make clean`\nafter building a dependency]\n\nService specific options are described in the README files\nin the service specific subdirectories:\n\n- [Travis-CI README](travis/README.md)\n- [AppVeyor README](appveyor/README.md)\n- [GitHub Actions README](github-actions/README.md)\n- [GitLab README](gitlab/README.md)\n\n## References: EPICS Modules Using ci-scripts\n\n[EPICS Base](https://github.com/epics-base/epics-base) and its submodules\n[pvData](https://github.com/epics-base/pvDataCPP),\n[pvAccess](https://github.com/epics-base/pvAccessCPP),\n[pva2pva](https://github.com/epics-base/pva2pva),\n[PVXS](https://github.com/mdavidsaver/pvxs)\n\nEPICS Modules:\n[ASYN](https://github.com/epics-modules/asyn),\n[autosave](https://github.com/epics-modules/autosave),\n[busy](https://github.com/epics-modules/busy),\n[devlib2](https://github.com/epics-modules/devlib2),\n[ecmc](https://github.com/epics-modules/ecmc),\n[gtest](https://github.com/epics-modules/gtest),\n[ip](https://github.com/epics-modules/ip),\n[lua](https://github.com/epics-modules/lua),\n[MCoreUtils](https://github.com/epics-modules/MCoreUtils),\n[modbus](https://github.com/epics-modules/modbus),\n[motor](https://github.com/epics-modules/motor),\n[mrfioc2](https://github.com/epics-modules/mrfioc2),\n[OPCUA](https://github.com/ralphlange/opcua),\n[PCAS](https://github.com/epics-modules/pcas),\n[softGlueZync](https://github.com/epics-modules/softGlueZynq),\n[sscan](https://github.com/epics-modules/sscan),\n[std](https://github.com/epics-modules/std),\n[vac](https://github.com/epics-modules/vac),\n[xxx](https://github.com/epics-modules/xxx)\n\nESS: [EtherCAT MC Motor Driver][ref.ethercatmc]\n\n## Migration Hints\n\nLook for changes in the example configuration files, and check how they\napply to your module.\n\nIf comments in the example have changed, copy them to your configuration\nto always have up-to-date documentation in your file.\n\n### 2.x to 3.x Migration\n\nUpdate the script and test settings in your configuration to call the\nnew script, following the example file.\n\n`python .ci/cue.py \u003caction\u003e`\n\n#### AppVeyor\n\nThe `configuration:` setting options have changed; they are now\n`default`, `static`, `debug` and `static-debug`.\n\nMinGW builds are now using the `CMP: gcc` compiler setting.\n\nAdding arguments to make is supported through the `EXTRA` .. `EXTRA5`\nvariables. Each variable value will be passed as one argument.\n\n#### Travis\n\nThe new `BCFG` (build configuration) variable accepts the same options as\nthe AppVeyor `configuration:` setting. Replace any`STATIC=YES` settings with\n`BCFG=static`.\n\nRemove `bash` in the `homebrew:` section of `addons:`. There are no more\nbash scripts.\n\nMinGW builds (cross-builds using WINE as well as native builds on Windows)\nare now using the `gcc` compiler setting.\nSince `gcc` is the default, you can simply remove `compiler: mingw` lines.\n\nFor Windows, Travis offers native MinGW and Visual Studio 2017 compilers.\nUse `os: windows` and set `compiler:` to `gcc` or `vs2017`\n for those builds.\n\nChocolatey packages to be installed for the Windows jobs are set by adding\nthem to the environment variable `CHOCO`.\n\n## Frequently Asked Questions\n\n##### How can I see what the dependency building jobs are actually doing?\n\nSet `VV=1` in the configuration line of the job you are interested in.\nThis will make all builds (not just for your module) verbose.\n\n##### How do I update my module to use a newer minor release of ci-scripts?\n\nUpdate the submodule in `.ci` first, then change your CI configuration\n(if needed) and commit both to your module. E.g., to update your Travis\nsetup to release 3.3.0 of ci-scripts:\n```bash\ncd .ci\ngit pull origin v3.3.0\ncd -\ngit add .ci\n  # if needed:\n  edit .travis.yml     # and/or other CI service configurations\n  git add .travis.yml\ngit commit -m \"Update ci-scripts submodule to v3.3.0\"\n```\n\nCheck the example configuration files inside ci-scripts (and their\nchanges) to see what might be needed and/or interesting to change\nin your configuration.\n\nDepending on the changes contained in the ci-scripts update, it might\nbe advisable to clear the CI caches after updating ci-scripts. E.g.,\na change in setting up EPICS Base will not be applied if Base is found \nin the cache.\n\n##### How do I add a dependency module only for a specific job?\n\nAdd the additional dependency in the main configuration file by setting\n`ADD_MODULES` for the specific job(s).\n\n##### Why the name _cue_?\n\nThe noun _cue_ is defined as \"_a signal (such as a word, phrase, or bit of\nstage business) to a performer to begin a specific speech or action_\".\n(Merriam-Webster)\n\n## Release Numbering of this Module\n\nThe module tries to apply [Semantic Versioning](https://semver.org/).\n\nMajor release numbers refer to the API, which is more or less defined\nby the full configuration examples in the service specific\nsubdirectories.\nIf one of these files has to be changed for the existing configuration\noptions or important new options are being added, a new major release\nis created.\n\nMinor release numbers refer to additions and enhancements that do not\nrequire the configuration inside an existing user module to be changed.\n(Unless for using a new feature.)\n\nAgain: using the git submodule mechanism to include these scripts means\nthat user modules always work with a fixed, frozen version.\nI.e., developments in the ci-scripts repository will never break an\nexisting application.\nThese release numbering considerations are just a hint to assess the\nrisks when updating the submodule.\n\n## License\n\nThis module is distributed subject to a Software License Agreement found\nin file LICENSE that is included with this distribution.\n\n\u003c!-- Links --\u003e\n[badge.version]: https://img.shields.io/github/v/release/epics-base/ci-scripts?sort=semver\n[badge.travis]: https://travis-ci.org/epics-base/ci-scripts.svg?branch=master\n[badge.appveyor]: https://ci.appveyor.com/api/projects/status/8b578alg974axvux?svg=true\n[badge.gh-actions]: https://github.com/epics-base/ci-scripts/workflows/ci-scripts%20build/test/badge.svg\n[badge.gitlab]: https://gitlab.com/epics-base/ci-scripts/badges/master/pipeline.svg\n\n[reddit.bash]: https://www.reddit.com/r/bash/comments/393oqv/why_is_the_version_of_bash_included_in_os_x_so_old/\n\n[ref.ethercatmc]: https://github.com/EuropeanSpallationSource/m-epics-ethercatmc\n[ref.rtems5build]: https://github.com/mdavidsaver/rsb/blob/3911854462e74838e3e5f33a9e8f936fd0f1d95d/.github/workflows/build-5.yml#L98-L137\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fepics-base%2Fci-scripts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fepics-base%2Fci-scripts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fepics-base%2Fci-scripts/lists"}