deployer/docs/basics.md

246 lines
5.5 KiB
Markdown
Raw Normal View History

2021-10-09 19:12:15 +02:00
# Basics
Deployer has two main concepts: [**hosts**](hosts.md) and [**tasks**](tasks.md).
A **recipe** is a file containing definitions for **hosts** and **tasks**.
Deployer CLI requires two arguments to run: a **task** to run and a **host**
or group of **hosts**.
```
$ dep deploy deployer.org
--- ------ ------------
| | |
| | `--- The host
| `------------- The task
`------------------ The CLI
```
Then Deployer takes the given task, performs some preparation (described later),
and executes the task on all specified hosts.
2021-10-25 08:31:53 +02:00
:::info
2021-10-09 19:12:15 +02:00
The `dep` CLI looks for `deploy.php` or `deploy.yaml` file in current directory.
2021-11-03 13:42:44 +01:00
2021-10-09 19:12:15 +02:00
Or recipe can be specified explicitly via `-f` or `--file` option.
```bash
$ dep --file=deploy.php deploy deployer.org
```
:::
Let's write a recipe.
```php
<?php
// We are going to use functions declared primarily in Deployer namespace,
// to simplify recipe we will use Deployer namespace too. Alternativly,
// you can import individual functions via "use function".
namespace Deployer;
host('deployer.org');
2021-11-03 13:42:44 +01:00
task('my_task', function () {
2021-10-09 19:12:15 +02:00
run('whoami');
});
```
2021-11-03 13:42:44 +01:00
Let's try to run our task on deployer.org.
2021-10-09 19:12:15 +02:00
```
2021-11-03 13:42:44 +01:00
$ dep my_task
task my_task
$
2021-10-09 19:12:15 +02:00
```
2021-11-03 14:35:24 +01:00
:::tip
2021-10-09 19:12:15 +02:00
If no host provided, Deployer will show an interactive prompt for selecting hosts.
If your recipe contains only one host, Deployer will automatically choose it.
2021-11-03 14:35:24 +01:00
To select all hosts specify `all`.
2021-10-09 19:12:15 +02:00
:::
2021-11-03 13:42:44 +01:00
But there is our `whoami` command? By default, Deployer runs with normal verbosity
level and shows only names of executed tasks. Let's increase verbosity to verbose, and
rerun our task.
:::note The dep CLI options
Add `-v` option to increase verbosity. Read more about [CLI usage](cli.md).
:::
```
$ dep my_task -v
task my_task
[deployer.org] run whoami
[deployer.org] deployer
$
```
Now let's add second host:
```php
host('deployer.org');
host('medv.io');
```
2021-11-03 14:35:24 +01:00
:::info Connection options
2021-11-03 13:42:44 +01:00
How Deployer knows hot to connect to a host? It uses same `~/.ssh/config` file as
the `ssh` command. Or you can specify [connection options](hosts.md) in recipe.
:::
Let's run `my_task` task on both hosts:
```
2021-11-03 15:49:39 +01:00
$ dep my_task -v all
2021-11-03 13:42:44 +01:00
task my_task
[deployer.org] run whoami
[medv.io] run whoami
[medv.io] anton
[deployer.org] deployer
```
Deployer runs a task in parallel on each host. This is why output mixed. We can
limit it to run only one host.
```
2021-11-03 15:49:39 +01:00
$ dep my_task -v all --limit 1
2021-11-03 13:42:44 +01:00
task my_task
[deployer.org] run whoami
[deployer.org] deployer
[medv.io] run whoami
[medv.io] deployer
```
Limit level also possible to [specified per task](tasks.md).
Each host has a configuration: a list of key-value pairs. Let's define our first
configuration option for both our hosts:
```php
host('deployer.org')
->set('my_config', 'foo');
host('medv.io')
->set('my_config', 'bar');
```
In the task we can get current executing host with [currentHost](api.md#currenthost) function:
```php
task('my_task', function () {
$myConfig = currentHost()->get('my_config');
writeln("my_config: " . $myConfig);
});
```
Or with [get](api.md#get) function:
```diff
task('my_task', function () {
2021-11-03 15:03:27 +01:00
- $myConfig = currentHost()->get('my_config');
+ $myConfig = get('my_config');
2021-11-03 13:42:44 +01:00
writeln("my_config: " . $myConfig);
});
```
Or via [parse](api.md#parse) function which replaces brackets `{{ ... }}` and value
with of config option.
:::tip
All functions (writeln, run, runLocally, cd, upload, etc) call **parse** function
internally. So you don't need to call **parse** function by your self.
:::
```diff
task('my_task', function () {
2021-11-03 15:03:27 +01:00
- $myConfig = get('my_config');
- writeln("my_config: " . $myConfig);
+ writeln("my_config: {{my_config}}");
2021-11-03 13:42:44 +01:00
});
```
Let's try to run our task:
```
2021-11-03 15:49:39 +01:00
$ dep my_task all
2021-11-03 13:42:44 +01:00
task my_task
[deployer.org] my_config: foo
[medv.io] my_config: bar
```
Awesome! Each host configuration inherits global configuration. Let's refactor
our recipe to define one global config option:
```php
set('my_config', 'global');
host('deployer.org');
host('medv.io');
```
2021-11-03 15:03:27 +01:00
The config option `my_config` will be equal to `global` on both hosts.
2021-11-03 14:35:24 +01:00
Also, config option value can be specified as a callback, such callback
executed on first access and returned result saved in host configuration.
2021-11-03 15:52:38 +01:00
```php
2021-11-03 14:35:24 +01:00
set('whoami', function () {
return run('whoami');
});
task('my_task', function () {
writeln('Who am I? {{whoami}}');
});
```
Let's try to run it:
```
2021-11-03 15:49:39 +01:00
$ dep my_task all
2021-11-03 14:35:24 +01:00
task my_task
[deployer.org] Who am I? deployer
[medv.io] Who am I? anton
```
This was we can create dynamic configuration which uses current host information.
Only first call triggers callback execution. All consequential use saved value.
Here is an example:
2021-11-03 15:52:38 +01:00
```php
2021-11-03 14:35:24 +01:00
set('current_date', function () {
return run('date');
});
task('my_task', function () {
writeln('What time is it? {{current_date}}');
run('sleep 5');
writeln('What time is it? {{current_date}}');
});
```
If we run my_task we will see what `date` is called only once on `{{current_date}}`
access.
```
2021-11-03 15:49:39 +01:00
$ dep my_task deployer.org -v
2021-11-03 14:35:24 +01:00
task my_task
[deployer.org] run date
[deployer.org] Wed 03 Nov 2021 01:16:53 PM UTC
[deployer.org] What time is it? Wed 03 Nov 2021 01:16:53 PM UTC
[deployer.org] run sleep 5
[deployer.org] What time is it? Wed 03 Nov 2021 01:16:53 PM UTC
```
2021-11-03 15:00:01 +01:00
We can override config option via CLI option `-o` like this:
```
2021-11-03 15:49:39 +01:00
$ dep my_task deployer.org -v -o current_date="I don't know"
2021-11-03 15:00:01 +01:00
task my_task
[deployer.org] What time is it? I don't know
[deployer.org] run sleep 5
[deployer.org] What time is it? I don't know
```
2021-11-03 15:54:01 +01:00
With overridden config option `current_date` there is no need to call the callback.
So there is no 'run date'.