How Repositories work

As explained in the User Documentation repositories contain apps, services and commands that can be used inside projects.

To use an entity from a repository, simply reference it in your project file via $ref:

project:
  name: demo
  src: .
  app:
    $ref: /app/demo
    services:
      hello_world:
        command: 'this will override the comnmand for hello_world in app/demo.yml'

Riptide will look trough all cloned repositories that are defined in the system configuration under repos. It will start with the first repository and search for a file named app/demo.yml.

If it finds this file it will merge the contents of your project file on top of app/demo.yml. It will then do the same for all other repositories defined under repos, so you can configure multiple repositories that override each other and build a hierarchy of repositories using this technique.

You can view the merged result by calling riptide config-dump.

Entities defined in the repository can also reference other entities, even using relative paths.

Repositories are cloned and updated whenever riptide update is run.

Complex example

This is a complex example using two repositories and multiple references. By looking at this example it should become clear, how repositories work.

This is the base project file for our example:

project:
  name: demo
  src: .
  app:
    $ref: /app/demo
    services:
      hello_world:
        command: 'this will override the comnmand for hello_world in app/demo.yml'
      additional_service:
        $ref: /service/demo
        image: 'this will override the image in service/demo.yml'

And this is the content of our system configuration’s repos setting:

repos:
  - https://repos.example/repo1.git
  - https://repos.example/repo2.git

repo1.git contains the following files:

# <repo1.git>/app/demo
app:
  services:
    hello_world:
      image: alpine
      command: 'echo hello world'
# <repo1.git>/service/demo
service:
  image: ubuntu
  command: demo

repo2.git contains the following files:

# <repo2.git>/app/demo
app:
  services:
    hello_world:
      image: debian

The end result is the following project file:

project:
  name: demo
  src: .
  app:
    services:
      hello_world:
        image: debian
        command: 'this will override the comnmand for hello_world in app/demo.yml'
      additional_service:
        image: 'this will override the image in service/demo.yml'
        command: demo

Removing values

During the merging process it is possible to remove values entirely using the special keyword $renove.

Example (remove a service from a loaded app):

project:
  name: demo
  src: .
  app:
    $ref: /app/demo
    services:
      hello_world: $remove

Details about how documents are processed

More information about the properties of Riptide’s configuration language, can be found in the section Overview / Hierarchy.

The configuration language is based on the Python library Configcrunch.

If you want additional information about the behaviour of Configcrunch, please have a look at the Configcrunch documentation.