Github Actions, your favorite arbitrary code execution platform with a long startup time.
Anyway, within you CI process, usually you will want some non default tools. If you were self hosting the runners (executors), that isn't a problem, just install them on the runner. If you're using the cloud ones though...
The "recommended" way is to have an action install/configure the tool every time. This results in something like:
1jobs:
2 build:
3 steps:
4 - use: toolx/setup
5 - use: tooly/setup
6 - use: toolz/setup
7 - run: toolx ...
8 - run: tooly ...
9 - run: toolz ...
Which is very much meh. You install the tool every time, slowing down the entire process for what? And if you have a lot of repos keeping everything in sync is not fun.
What you could instead is bundle all your tools into a container image...
1jobs:
2 build:
3 container:
4 image: ghcr.io/my/builtools
5 steps:
6 - run: toolx ...
7 - run: tooly ...
8 - run: toolz ...
This does mean everything shares the same tools / versions, but that's also an advantage since updating needs only be done in one place. but you still use a different container for a step if it requires it.