Git Mirrors
Direktiv supports configuring a namespace to use a git repository as the source of its contents and configuration.
Setting Up A Git Mirror
The following arguments can be supplied when creating a mirror as a namespace:
namespace
url
ref
- Auth:
- None
- Git access token:
access_token
- SSH
private_key
public_key
passphrase
The following arguments are considered sensitive, and will never be returned via the API, except in a redacted form: access_token
, private_key
, passphrase
.
Authentication & Authorization
None
If a repository is public some providers will allow clients to access it without any form of authentication. SSH requires authentication, that's why the only way to use a zero-auth configuration is with git over HTTP. When using a zero-auth configuration very few fields are needed to set up a mirror. The following is an example:
namespace: apps-svc
url: https://github.com/direktiv/apps-svc.git
ref: main
Access Token
Github allows users to create personal access tokens (link). These can be used as a form of authentication. These can only be used with git over HTTP.
namespace: apps-svc
url: https://github.com/direktiv/apps-svc.git
ref: main
access_token: my-access-token...
SSH
If the two previous approaches aren't sufficient for your needs, the reliable way of reaching a repository under any and all circumstances is with git over SSH. For this to work, you will need to provide both a public and a private key, and optionally a passphrase used to decrypt the private key, if it is password protected. You will also need to configure the remote server to recognize your SSH key.
namespace: apps-svc
url: https://github.com/direktiv/apps-svc.git
ref: main
public_key: my-public-key...
private_key: my-private-key...
passphrase: my-passphrase...
Activities
All Direktiv mirror operations are encapsulated within an "activity". This serves as a way of organizing the logic and logs of an operation in a convenient way. Cloning a remote repository can take time, and it's possible that the operation will fail or produce unexpected results. Check the list of recent activities and their logs to learn more about any issues you encounter.
Modifying the Configuration of a Local Mirror
For various reasons you may need to update the settings of a mirror. Whether it's to change which branch or commit it's referencing, or to update your credentials. All of this is supported. For convenience, Direktiv will only apply changes to settings you ask it to, anything else will remain unchanged. This means for example that you can swap from branch v1.0.x
to v1.1.x
without resupplying your SSH keys if you want to.
Direktiv Projects
When a filetree is intended for mirroring by Direktiv, we call it a Direktiv Project. What follows is an explanation of the rules for Direktiv Projects.
File-System
When performing a sync, Direktiv will produce a copy of every directory and file from the git project into your Direktiv file-system, with some exceptions and caveats. Other kinds of file-system objects such as symlinks are skipped.
-
Files and directories will only be copied if their names are valid within Direktiv. At this time, valid names must conform to the following regex pattern:
(([a-zA-Z][a-zA-Z0-9_\-\.]*[a-zA-Z0-9])|([a-zA-Z]))
. Also, names beginning with.
(hidden files) are also excluded. This helps to reduce pollution in your file-tree by avoiding common unhelpful git project contents such as.gitignore
and.git/
. -
If a
/.direktivignore
file exists, Direktiv will use this file in exactly the same way.gitignore
files are used bygit
to more precisely control what is and isn't copied. -
If a file ending with the
.yaml
or.yml
extension is unambiguously identified as a Direktiv resource definition (by including a top level fielddirektiv_api
), it will not be copied. Instead, such a file will be processed and its definitions added to the namespace. More on this later. -
If a file ending with the
.yaml
or.yml
extension is ambiguous, Direktiv will attempt to parse it as a workflow. If it succeeds without error, it will be added to the file-system as a Direktiv Workflow. Otherwise, it will be added to the file-system as a generic yaml file.
Deprecated: the correct way to add a workflow is to unambiguously define one. This ambiguousness step is only included short-term to maintain backwards compatibility.
The above steps only determine whether a file will be evaluated as a potential Direktiv resource definition or copied into the file-tree. Exclusion for any of the above reasons won't break direct references to such files in Direktiv resource definitions. This means, for example, that you can define a filter (more on this later) that references a Javascript file, while still excluding the javascript file from appearing in the file-tree using .direktivignore
.
Workflows
As mentioned in the File-System section above, workflows will be loaded from any .yaml
or .yml
file that parses without error. This processing of ambiguous files may in rare circumstances lead to Direktiv creating workflows from yaml files that had nothing to do with Direktiv. This behaviour is therefore deprecated. The correct way to define a workflow is to include the direktiv_api
field, set to workflow/v1
. For example, a file /hello.yaml
containing the following contents defines a simple helloworld workflow of the same name and location in the file-tree:
direktiv_api: workflow/v1
states:
- id: hello
type: noop
transform: 'jq({ msg: "Hello, world!" })'
When workflows are unambiguously defined this way, they do not need to parse successfully as valid workflows to be copied into the file-system.
Namespace Services
Namespace services can be defined within a Direktiv Project so they are automatically created during mirroring. This is done using appropriate Direktiv resource definition files. For example, a /services.yaml
file containing the following contents defines a simple http requester service named requester
. The services
field is an array, meaning that these files may define one or more services each. The user may divide or combine their service definitions amongst as many files as they like.
direktiv_api: services/v1
services:
- name: requester
image: direktiv/request:v4
NamespaceServicesDefinition
Parameter | Description | Type | Required |
---|---|---|---|
direktiv_api |
Set it to 'services/v1'. | string | yes |
services |
[]NamespaceServiceDefinition | yes |
NamespaceServiceDefinition
Parameter | Description | Type | Required |
---|---|---|---|
name |
The name for this service, which should be unique amonst all services within the namespace / project. | string | yes |
image |
The image to use for this service. | string | yes |
Namespace Variables
If a file is named like var.*
then it is treated as a namespace variable. For example, var.style.css
will become a namespace variable called style.css
.
Workflow Variables
If a file is named such that it is prefixed with the full name of another file that was evaluated to be a workflow (followed by a .
), then the file is treated as a workflow variable attached to that workflow. For example, if you have a workflow /hello.yaml
, and another file called /hello.yaml.page.html
, then the /hello.yaml
workflow will gain a workflow variable called page.html
.
Unsyncables
Container Registries
Configuring container registries requires a password, which is sensitive information that should not be committed to a git project. We therefore do not support any way to sync these at the moment.
Secrets
Sensitive information should not be committed to git projects. We therefore do not support any way to sync these at the moment.
As a small help to users, when workflows are created referencing secrets that haven't been defined, uninitialized secrets are created. These don't contain any helpful information, but they populate the list of secrets within the namespace for easy adjustment.
Errors
The syncing process adopts a fault-tolerant approach to errors. This means that as often as possible, detected errors should be logged as such, but not prevent the greater sync operation from succeeding. Users are strongly encouraged to check the logs of their sync operation to confirm that there were no unexpected problems with their git repository.