155 lines
5.5 KiB
Markdown
155 lines
5.5 KiB
Markdown
# Cuddle
|
|
|
|
Cuddle aims to reduce the complexity of building code projects. It allows either
|
|
individuals or organisations to share scripts and workflows, as well as keep a
|
|
dynamic inventory of their code.
|
|
|
|
At its most basic allows enforcing a schema for projects, further it allows the
|
|
sharing of scripts, pipelines, templates, and much more.
|
|
|
|
```bash
|
|
cuddle init
|
|
```
|
|
|
|
Cuddle is meant to be used in the degree that it makes sense for you, it can be
|
|
adopted quickly to improve code sharing, and be fully bought into to provide a
|
|
full suite of project level solutions to offload requirements of developers.
|
|
Start small with scripts and plans, and gradually adopt features from there as
|
|
you need them.
|
|
|
|
## Usage
|
|
|
|
Cuddle is primarily a cli based tool, but ships with optional server components.
|
|
Server components helps enhance the features of cuddle, such that variables can
|
|
be enforced at runtime, actions be downloaded instead of built and much more. It
|
|
all works on a gradual adoption process, so as an operator you can gradually add
|
|
features as you mature and need them.
|
|
|
|
A cuddle workflow is split up into:
|
|
|
|
- Projects: A project is what most users interface with, you can think of it as
|
|
the cockpit of a car. You can use all the bells and whistles, but somebody
|
|
else has built up all the user journeys you're interacting with.
|
|
- Plans: A plan is the engine room of the car, it ties together components,
|
|
features and requirements for use in the cockpit. The plan usually faciliates
|
|
most of the infrastructure an application stands to outsource. Such as scripts
|
|
to run, build, test an application, build its templates for deployment, run
|
|
pipelines, common actions. Plans specialize in building preciely what the
|
|
projects needs, as such your organisation or yourself, should only have a
|
|
handful of them at most. To further reduce duplication of work between plans,
|
|
components can be used to abstract common features required by plans, such as
|
|
templating, individual components for templates.
|
|
- Components: Components are a slice of features not useful in of itself, but
|
|
used by plans to further their behavior, a sample component may be a template
|
|
part, which includes a list of allowed ip addresses for internal
|
|
communication, it may be how to build an ingress, ship a docker container to a
|
|
registry, basically small individual components useful for a larger whole.
|
|
- Actions: are code units that can take a variety of forms, golang, rust, bash,
|
|
what have you. All of them are accessed by `cuddle do`, individual components
|
|
can take the form of actions, if desired
|
|
- Global: Is a set of actions and features that are available anywhere a user
|
|
might need them. For example it can be a solution to easily log into
|
|
production environments, release code to production, get the menu from the
|
|
canteen, etc.
|
|
- Personal: Is a config an org can decide the users and develoeprs fill out, it
|
|
can help other tooling better enhance the experience. For example it may be
|
|
useful to always have the developers email available, if for example we want
|
|
to trigger an automatic login for them.
|
|
|
|
### Init
|
|
|
|
`cuddle init` will bootstrap a project either from scratch, or just adding
|
|
required `cuddle.toml` parts.
|
|
|
|
A `cuddle.toml` is required to access project level `cuddle` commands. Such as
|
|
`cuddle do`, `cuddle get`, `cuddle validate`, etc.
|
|
|
|
`cuddle.toml` looks something like this:
|
|
|
|
```toml
|
|
[project]
|
|
name = "some-cuddle-project"
|
|
owner = "kjuulh"
|
|
```
|
|
|
|
What is generated out of the box is a _bare_ project. A bare project doesn't
|
|
share any features, or enforce any requirements on its schema from its plan. It
|
|
is most useful for projects that doesn't fit any mold, or for individual users
|
|
simply testing out the framework.
|
|
|
|
### Actions
|
|
|
|
`cuddle actions` are project level scripts that can take a variety of forms.
|
|
Actions are invoked via. `cuddle do` when inside of a project, most projects
|
|
won't build actions themselves, instead they will depend on what their plan
|
|
provides for them.
|
|
|
|
Actions can be bootstrapped via. `cuddle init actions`, an action is slice of a
|
|
cli. Cuddle provides a convenient way of building them, such that they are easy
|
|
to build, maintain and operate. Most actions are written in either golang or
|
|
rust, but bash and lua is also available.
|
|
|
|
```toml
|
|
[project]
|
|
# ...
|
|
|
|
[project.actions.run]
|
|
type = "bash"
|
|
command = """
|
|
cargo run -p some-cuddle-project -- $@
|
|
"""
|
|
```
|
|
|
|
This action can be invoked via.
|
|
|
|
```bash
|
|
cuddle do run
|
|
```
|
|
|
|
Scripts are also based on convention, so if a rust action is used:
|
|
|
|
```bash
|
|
cuddle init action rust
|
|
```
|
|
|
|
Nothing will be added to the `cuddle.toml` instead you'll receive a
|
|
`actions/rust/` project where you can fill out the clis according to the
|
|
template given.
|
|
|
|
### Plans
|
|
|
|
Plans are a crucial component for code sharing, enforcement of values, metrics
|
|
and so on. Plans provide a predefined journey for how to work with a specific
|
|
type of application. I.e. what does our organisation think a Rust application
|
|
look like?
|
|
|
|
Plans are maintained via. the `plan` section of the `cuddle.toml` file
|
|
|
|
```toml
|
|
[plan]
|
|
git = "https://github.com/kjuulh/some-cuddle-plan.git"
|
|
branch = "main"
|
|
|
|
# Alternatively
|
|
plan = "https://github.com/kjuulh/some-cuddle-plan.git" # if you want the default
|
|
|
|
[project]
|
|
# ...
|
|
```
|
|
|
|
A plan itself will be maintained via. a `cuddle.plan.toml` file.
|
|
|
|
```bash
|
|
cuddle init plan
|
|
```
|
|
|
|
```toml
|
|
[plan]
|
|
name = "some-cuddle-plan"
|
|
|
|
[plan.components]
|
|
canteen = {git = "https://github.com/kjuulh/canteen"}
|
|
ingress = {git = "https://github.com/kjuulh/cuddle-ingress"}
|
|
ip-allowlist = {git = "https://github.com/kjuulh/ip-allowlist"}
|
|
```
|