Skip to content

Commit

Permalink
doc: how to develop tsuru plugins
Browse files Browse the repository at this point in the history
  • Loading branch information
tcarreira committed Oct 21, 2023
1 parent 65a7921 commit c171859
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 0 deletions.
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,15 @@

tsuru is a command line for application developers on
[tsuru](https://github.com/tsuru/tsuru).

## Tsuru plugins

Tsuru plugins are the standard way to extend tsuru-client functionality transparently.
Installing and using a plugin is done with:
```
tsuru plugin install <plugin-name> <plugin-url>
tsuru <plugin-name> <any_sub_commands_or_flags...>
```

For developing a custom plugin, read about [Developing Tsuru Plugins](./pkg/cmd/plugin.md).

80 changes: 80 additions & 0 deletions pkg/cmd/plugin.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# Developing Tsuru Plugins

Tsuru plugins are the standard way to extend tsuru-client functionality transparently.

A tsuru-client plugin is any runnable file, located inside `~/.tsuru/plugins` directory.
It works by finding the runnable file (with or without extension) with that plugin name.

A simple working example:
```bash
cat > ~/.tsuru/plugins/myplugin.sh <<"EOF"
#!/bin/sh
echo "Hello from tsuru plugin ${TSURU_PLUGIN_NAME}!"
echo " called with args: $@"
EOF

chmod +x ~/.tsuru/plugins/myplugin.sh

tsuru myplugin subcommands -flags

##### printed:
# Hello from tsuru plugin myplugin!
# called with args: subcommands -flags
```

You may find available tsuru plugins on github, by searching for the topic [`tsuru-plugin`](https://github.com/topics/tsuru-plugin).
(If you are developing a plugin, please tag your github repo).

## Distributing a tsuru plugin

The best way to distribute a tsuru plugin is making it compatible with `tsuru plugin install`.
There are different approaches for distributing the plugin,
depending on the language used for building it.

### script-like single file
If the plugin is bundled as a **script-like single file** (eg: shell script, python, ruby, etc...)
you may make it available for download on a public URL.
The name of the file is irrelevant on this case.

### bundle of multiple files
If the plugin is bundled as **multiple files**, you should compact them inside a `.tar.gz` or `.zip` file,
and make it available for download on a public URL.
In this case, the file entrypoint must has the same name as the plugin (file extension is optional).
The CLI will call the binary at `~/.tsuru/plugins/myplugin/myplugin[.ext]`.

### compiled binary
If the plugin is bundled as a **compiled binary**, you should create a `manifest.json` file
(as defined on issue [#172](https://github.com/tsuru/tsuru-client/issues/172))
which tells where to download the appropriate binary:
```json
{
"SchemaVersion": "1.0",
"Metadata": {
"Name": "<pluginName>",
"Version": "<pluginVersion>"
},
"UrlPerPlatform": {
"<os>/<arch>": "<os_arch_url>",
...
}
}
```

Each supported os/arch (check the latest release), should be compacted as `.tar.gz` or `.zip` file.
All files (`manifest.json` and all compacted binaries) must available for download on public URLs.

An example of such a plugin, hosted on github, is the
[`rpaasv2` plugin](https://github.com/tsuru/rpaas-operator/issues/124),
installed using this [manifest.json](https://github.com/tsuru/rpaas-operator/releases/latest/download/manifest.json).

## Available ENV variables

When a plugin is called, the main tsuru-client passes some additional environment variables:

| env | description |
| ----------------- | ------------------------------------------------------ |
| TSURU_TARGET | tsuru server url (eg: https://tsuru.io) |
| TSURU_TOKEN | tsuru authentication token |
| TSURU_VERBOSITY | 0: default, 1: log requests, 2: log responses |
| TSURU_FORMAT | output format (json, table, etc...) as in [printer.OutputFormat](../printer/printer.go) |
| TSURU_PLUGIN_NAME | name called from the main tsuru-client |

0 comments on commit c171859

Please sign in to comment.