Skip to content

Commit

Permalink
Merge branch 'unstable' into stable
Browse files Browse the repository at this point in the history
  • Loading branch information
markcda committed Jan 13, 2025
2 parents 36b262e + 3ffe258 commit 2c88cc8
Show file tree
Hide file tree
Showing 33 changed files with 2,487 additions and 1,756 deletions.
23 changes: 23 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,28 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.0.0] - 2025-01-13

### Added

- `FromEnvFile` variable type.
- `FromHCVaultKv2` variable type (HashiCorp Vault KV2 support).
- Chunk-by-chunk file comparison on `copy_all` function calls (to discard file timestamps rewrite on equal content).
- Requirements for Actions (satisfy path, one of paths or even `Check` to run given Action).
- `TODO.md`.

### Changed

- Moved all TUI-related code in `tui` module.
- Moved output of build folder's path at the top of Pipeline.
- Made `cache_files` project config field a hashset in Deployer's internals (for reducing duplicates).
- `Cargo.toml` default features and Deployer's project config.

### Fixed

- `AutoVersionExtractFromRule` trimming.
- `README.md` and `DOCS.ru.md`.

## [0.3.4] - 2025-01-10

### Changed
Expand Down Expand Up @@ -219,6 +241,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Build support.
- TUI.

[1.0.0]: https://github.com/impulse-sw/deployer/compare/0.3.4...1.0.0
[0.3.4]: https://github.com/impulse-sw/deployer/compare/0.3.3...0.3.4
[0.3.3]: https://github.com/impulse-sw/deployer/compare/0.3.2...0.3.3
[0.3.2]: https://github.com/impulse-sw/deployer/compare/0.3.1...0.3.2
Expand Down
9 changes: 6 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "deployer"
version = "0.3.4"
version = "1.0.0"
edition = "2024"

[dependencies]
Expand All @@ -10,19 +10,22 @@ clap = { version = "4.5", features = ["derive"] }
colored = "2"
ctrlc = "3.4"
dirs = "5.0"
env-file-reader = "0.3"
fs_extra = "1.2"
inquire = { git = "https://github.com/markcda/inquire.git", branch = "feat/reorder-values", features = ["reorder"] }
mimalloc = "0.1.43"
regex = "1.11"
safe-path = "0.1"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
smart-patcher = { git = "https://github.com/impulse-sw/smart-patcher", tag = "0.1.3", default-features = false }
smart-patcher = { git = "https://github.com/impulse-sw/smart-patcher", tag = "0.2.0", default-features = false }
strip-ansi-escapes = "0.2"
tokio = { version = "1.0", features = ["rt-multi-thread"] }
uuid = { version = "1.11", features = ["v4", "fast-rng"] }
vaultrs = "0.7"

[features]
default = ["i18n-ru", "python", "lua", "rhai"]
default = ["python", "lua", "rhai"]
tests = []
i18n-ru = []
python = ["smart-patcher/python"]
Expand Down
124 changes: 120 additions & 4 deletions DOCS.ru.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,12 +47,52 @@
}
]
}
}
},
"requirements": [
{
"ExistsAny": [
"/usr/bin/upx",
"~/.local/bin/upx"
]
}
]
}
```

В составе Реестров каждое Действие и каждый Пайплайн являются значениями в словаре с ключом `info` (например, `"[email protected]": { ... }`). Таким образом их можно быстро редактировать, выводить на экран содержимое, добавлять в Пайплайны и проекты.

Для каждого Действия в составе Пайплайна можно назначить список требований `requirements`. Они будут проверяться перед каждым запуском Пайплайнов, и если хотя бы одно требование не будет удовлетворено, Пайплайн не будет выполнен. Требование можно задать тремя способами:

```json,ignore
[
{
// если один из этих путей будет найден, требование будет считаться удовлетворённым
"ExistsAny": [
"path-1",
"path-2"
]
},
{
// если данный путь существует, требование считается удовлетворённым
"Exists": "path"
},
{
// если данная проверка будет пройдена, требование будет считаться удовлетворённым (подробности см. ниже - Действие `Check`)
"CheckSuccess": {
"command": {
"bash_c": "/usr/bin/python -V",
"ignore_fails": true,
"show_success_output": false,
"show_bash_c": false,
"only_when_fresh": false
},
"success_when_found": "Python 3.",
"success_when_not_found": null
}
}
]
```

Существует 3 категории основных Действий и 7 дополнительных видов Действий:

1. Действия сборки (`PreBuild`, `Build`, `PostBuild` и `Test`)
Expand All @@ -63,7 +103,7 @@
6. Действие принудительной синхронизации готовых артефактов `ForceArtifactsEnplace`
7. Действие с кастомной командой `Custom`
8. Действие проверки вывода кастомной команды `Check`
9. Действие добавления контента из хранилища Деплойера `UseFromStorage`
9. Действия добавления контента в хранилище Деплойера `AddToStorage` и использования этого контента `UseFromStorage`
10. Действие применения патча `Patch`

Основополагающим является концепт кастомной команды - команды для оболочки терминала. Действия `Custom`, `Observe` и три основные категории Действий содержат внутри одну или больше кастомных команд.
Expand Down Expand Up @@ -121,7 +161,7 @@
}
```

`replacements` содержит список замен плейсхолдеров в команде на указанные артефакты или переменные. Следует заметить, что одна и та же команда может выполняться несколько раз для разных наборов переменных, даже если указана в Действии один раз:
`replacements` содержит список замен плейсхолдеров в команде на указанные артефакты или [переменные](#other-entities). Следует заметить, что одна и та же команда может выполняться несколько раз для разных наборов переменных, даже если указана в Действии один раз:

```json
{
Expand Down Expand Up @@ -301,7 +341,7 @@
}
```

#### 1.5. Действие добавления контента `UseFromStorage` и действие применения патча `Patch`
#### 1.5. Действия добавления контента `AddToStorage`, использования контента `UseFromStorage` и применения патча `Patch`

Часто проекты могут быть достаточно шаблонными, чтобы одни и те же файлы копировались между проектами, но не изменялись и требовались только при сборке или развёртывании. Такие файлы могут быть расположены в специальной папке с сохранением относительных путей и добавлены в хранилище Деплойера:

Expand All @@ -325,6 +365,28 @@ deployer new content

В итоге при выполнении Пайплайна в папку сборки будет добавляться нужный вам контент.

Раз за разом вы начнёте замечать, что некоторые проекты переиспользуются в других проектах как зависимости, и их необходимо где-то публиковать. Для этого как нельзя лучше подходят репозитории пакетов, но если вы не хотите публиковать свой проект, то можете добавлять его в хранилище Деплойера в качестве контента. Более того, добавлять его можно автоматически - при помощи Действия `AddToStorage`:

```json
{
"title": "Add content",
"desc": "",
"info": "[email protected]",
"tags": [],
"action": {
"AddToStorage": {
"short_name": "my-project",
"auto_version_rule": {
"plain_file": "file-with-current-version.txt"
}
}
}
}
```

- `short_name` - строковое обозначение контента, которое будет использовано для размещения в хранилище и каждый раз при использовании
- `auto_version_rule` - способ автоматического определения версии контента (либо `plain_file` - файл, в котором будет указана только версия и больше ничего, либо `cmd_stdout` - команда, которая выведет на экран только версию и больше ничего)

Однако иногда файл нужно каким-то образом редактировать - и не столько даже добавляемый контент из хранилища Деплойера, сколько, например, различные файлы в зависимостях сборки, например, вручную делать форки библиотек Python для добавления нужной функциональности и т.д. и т.п. Причём, как правило, хочется делать это без создания форков и синхронизации изменений с `main`-репозиторием! Одними патчами `git`'а не обойтись.

Для этого Деплойер использует для патчей библиотеку [`smart-patcher`](https://github.com/impulse-sw/smart-patcher). Такие патчи позволяют изменять исходные тексты, сложные документы и даже бинарные файлы, позволяя искать необходимые включения в содержимом на базе отсеивающих правил и даже используя скрипты на таких языках, как Python, Lua и Rhai. Например, в репозитории `smart-patcher` есть пример с патчем для документа Microsoft Word - и много других примеров.
Expand Down Expand Up @@ -593,6 +655,60 @@ deployer new content

Помимо этого, если ваши Пайплайны должны управлять конфликтующими версиями кэша (например, при сборке проекта под разные целевые архитектуры), то вы можете указать эксклюзивную метку сборки в поле `exclusive_exec_tag`. Например, укажите `x86_64` при добавлении Пайплайна сборки для одной архитектуры, а `aarch64` - для другой. Тогда Пайплайны будут собираться в разных папках, и информация о кэше будет сохранена в обоих случаях.

### <a id="other-entities">3. Другие сущности</a>

Одной из самых важных сущностей являются переменные. Они одновременно являются и хранителями ваших секретов, и теми самыми динамическими сущностями, которые могут поменять исход выполнения Пайплайна. Пример простой переменной:

```json
{
"title": "deployer artifact location",
"is_secret": false,
"value": {
"Plain": "target/release/deployer"
}
}
```

- `title` - название переменной (то, как она будет отображаться в TUI)
- `is_secret` - является ли переменная секретом (если является, то команда, которая её содержит, не будет показана на экране)
- `value` - само значение переменной или же информация о том, откуда и как это значение брать

Есть три поддерживаемых сейчас типа переменных:

1. `Plain` - содержимое строки и есть переменная
2. `FromEnvFile` - переменная будет взята из указанного `env`-файла с указанным ключом
3. `FromHCVaultKv2` - переменная будет взята из HashiCorp Vault KV2-хранилища с указанными `mount_path` и `secret_path`

Примеры:

```json
{
"title": "Grafana token",
"is_secret": false,
"value": {
"FromEnvFile": {
"env_file_path": ".env",
"key": "GRAFANA_TOKEN"
}
}
}
```

```json
{
"title": "target/release/deployer",
"is_secret": false,
"value": {
"FromHCVaultKv2": {
"mount_path": "The mount path where your KV2 secrets engine is mounted",
"secret_path": "Path to your secret"
}
}
}
```

Заметьте, что вы должны перед использованием `FromHCVaultKv2`-переменных указать две переменные окружения: `DEPLOYER_VAULT_ADDR` (URL-адрес Vault) и `DEPLOYER_VAULT_TOKEN` (токен Vault).

## Описание утилиты CLI

Деплойер, в первую очередь, - CLI-утилита. По любой команде Деплойера можно посмотреть справку, указав опцию `-h`. Приведём примеры самых распространённых команд:
Expand Down
40 changes: 35 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ Deployer is a relative simple, yet powerful localhost CI/CD instrument. It allow
- have your own actions and pipelines repositories (`Actions Registry` and `Pipelines Registry`) in a single JSON file
- create actions and pipelines from TUI or JSON configuration files
- configure actions for specific project
- satisfy requirements for your system to run pipelines
- check compatibility over actions and projects
- use variables for commands from `env`-files and HashiCorp Vault KV2-storage
- run pipelines with different cache requirements in different build folders
- store common content in Deployer's storage, add and patch additional files for build on the fly
- and share your project build/deploy settings very quickly and without any dependencies.
Expand All @@ -23,8 +25,12 @@ After installation, execute this:
```bash
git clone https://github.com/impulse-sw/deployer.git
cd deployer
cargo install --path . --no-default-features # to install English version
cargo install --path . # to install Russian version
cargo install --path . # to install English version
cargo install --path . --features=i18n-ru # to install Russian version

# if you already have Deployer installed
deployer build en # to install English version
deployer build ru # to install Russian version
```

That's it! Now you have `/home/username/.cargo/bin/deployer` binary. Modify the `PATH` variable, if you need to.
Expand Down Expand Up @@ -75,7 +81,15 @@ The full JSON is:
}
]
}
}
},
"requirements": [
{
"ExistsAny": [
"/usr/bin/upx",
"~/.local/bin/upx"
]
}
]
}
```

Expand Down Expand Up @@ -148,7 +162,15 @@ The full JSON is:
}
]
}
}
},
"requirements": [
{
"ExistsAny": [
"/usr/bin/upx",
"~/.local/bin/upx"
]
}
]
}
]
}
Expand Down Expand Up @@ -274,7 +296,15 @@ Deployer will consider you to specify some things (e.g., targets - for this proj
}
]
}
}
},
"requirements": [
{
"ExistsAny": [
"/usr/bin/upx",
"~/.local/bin/upx"
]
}
]
}
]
}
Expand Down
5 changes: 5 additions & 0 deletions TODO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# `deployer`'s TODO list

- [ ] make `pub(crate)` methods `pub` (for library and server)
- [ ] make `deployer docker-build` command for running build-like actions inside Docker
- [ ] make `remote` module to allow remote pipeline execution
Loading

0 comments on commit 2c88cc8

Please sign in to comment.