Sync Sync

yaml
type: "io.kestra.plugin.git.Sync"

Synchronizes the code for namespace files and flows based on the current state in Git.

Files located in gitDirectory will be synced with namespace files under namespaceFilesDirectory folder. Any file not present in the gitDirectory but present in namespaceFilesDirectory will be deleted from namespace files to ensure that Git remains a single source of truth for your workflow and application code. If you don't want some files from Git to be synced, you can add them to a .kestraignore file at the root of your gitDirectory folder — that file works the same way as .gitignore.

If there is a _flows folder under the gitDirectory folder, any file within it will be parsed and imported as a flow under the namespace declared in the task. It's important to keep in mind that all flows must be located within the same directory without any nested directories. If you want to deploy all flows to kestra from Git using the Git Sync pattern, you have to place all your flows in the _flows directory. Adding namespace folders will result in an error and that's expected. Flows are not equivalent to Namespace Files — while Namespace Files can be stored in arbitrarily nested folders stored in Internal Storage, Flows are just metadata. Flows are sent to Kestra's API and stored in the database backend. This is why they follow a different deployment pattern and cannot be stored in nested folders in Git.

Another important aspect is that the namespace defined in the flow code might get overwritten (!) if the namespace defined within Git doesn't match the namespace or a child namespace defined in the Git Sync task. All Git deployments, both the Git Sync and Kestra's CI/CD integrations, operate on a namespace level to ensure namespace-level governance of permissions, secrets, and to allow separation of resources. If you leverage multiple namespaces in a monorepo, you can create multiple flows, each using the Git Sync task to sync specific Git directories to the desired namespaces.

Examples

Synchronizes namespace files and flows based on the current state in a Git repository. This flow can run either on a schedule (using the Schedule trigger) or anytime you push a change to a given Git branch (using the Webhook trigger).

yaml
id: sync_from_git
namespace: prod

tasks:
  - id: git
    type: io.kestra.plugin.git.Sync
    url: https://github.com/kestra-io/scripts
    branch: main
    username: git_username
    password: "{{ secret('GITHUB_ACCESS_TOKEN') }}"
    gitDirectory: your_git_dir # optional, otherwise all files
    namespaceFilesDirectory: your_namespace_files_location # optional, otherwise the namespace root directory
    dryRun: true  # if true, print the output of what files will be added/modified or deleted without overwriting the files yet

triggers:
  - id: every_minute
    type: io.kestra.core.models.triggers.types.Schedule
    cron: "*/1 * * * *"

Properties

url

  • Type: string
  • Dynamic: ✔️
  • Required: ✔️

The URI to clone from.

branch

  • Type: string
  • Dynamic: ✔️
  • Required:

The initial Git branch.

cloneSubmodules

  • Type: boolean
  • Dynamic:
  • Required:

Whether to clone submodules.

dryRun

  • Type: boolean
  • Dynamic:
  • Required:

If true, the task will only display modifications without syncing any files yet. If false (default), all namespace files and flows will be overwritten based on the state in Git.

gitDirectory

  • Type: string
  • Dynamic: ✔️
  • Required:

Git directory to sync code from. If not specified, all files from a Git repository will be synchronized.

namespaceFilesDirectory

  • Type: string
  • Dynamic: ✔️
  • Required:

Namespace files directory to which files from Git should be synced. It defaults to the root directory of the namespace.

passphrase

  • Type: string
  • Dynamic: ✔️
  • Required:

The passphrase for the privateKey.

password

  • Type: string
  • Dynamic: ✔️
  • Required:

The password or personal access token.

privateKey

  • Type: string
  • Dynamic: ✔️
  • Required:

PEM-format private key content that is paired with a public key registered on Git.

To generate an ECDSA PEM format key from OpenSSH, use the following command: ssh-keygen -t ecdsa -b 256 -m PEM. You can then set this property with your private key content and put your public key on Git.

username

  • Type: string
  • Dynamic: ✔️
  • Required:

The username or organization.