keysloth 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.keyslothrc.example +14 -0
- data/.rspec +4 -0
- data/.rubocop.yml +98 -0
- data/.yardopts +8 -0
- data/CHANGELOG.md +45 -0
- data/Makefile +193 -0
- data/README.md +448 -0
- data/Rakefile +99 -0
- data/bin/keysloth +16 -0
- data/keysloth.gemspec +51 -0
- data/lib/keysloth/cli.rb +468 -0
- data/lib/keysloth/config.rb +129 -0
- data/lib/keysloth/crypto.rb +304 -0
- data/lib/keysloth/errors.rb +41 -0
- data/lib/keysloth/file_manager.rb +450 -0
- data/lib/keysloth/git_manager.rb +394 -0
- data/lib/keysloth/logger.rb +172 -0
- data/lib/keysloth/version.rb +6 -0
- data/lib/keysloth.rb +275 -0
- data/task/cr.md +59 -0
- data/task/plan.md +169 -0
- data/task/ragged_removing.md +103 -0
- data/task/task.md +43 -0
- data/task/test_plan.md +266 -0
- metadata +174 -0
data/README.md
ADDED
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
# KeySloth
|
|
2
|
+
|
|
3
|
+
Ruby gem для безопасного управления зашифрованными секретами в Git репозиториях.
|
|
4
|
+
|
|
5
|
+
## Описание
|
|
6
|
+
|
|
7
|
+
KeySloth решает проблему безопасного хранения и распространения секретов (сертификаты, ключи, конфигурационные файлы) в команде разработки. Вместо хранения секретов напрямую в репозитории, KeySloth шифрует их с использованием AES-256-GCM и позволяет безопасно синхронизировать между участниками команды и CI/CD системами.
|
|
8
|
+
|
|
9
|
+
### Основные возможности
|
|
10
|
+
|
|
11
|
+
- 🔐 **Надежное шифрование**: AES-256-GCM с защитой целостности данных
|
|
12
|
+
- 🚀 **Простота использования**: Одна команда для получения/отправки секретов
|
|
13
|
+
- 🔄 **Git интеграция**: Работает с любыми Git репозиториями через SSH
|
|
14
|
+
- 🛡️ **Безопасность**: Многоуровневая защита с SSH ключами и шифрованием
|
|
15
|
+
- 📦 **Backup'ы**: Автоматическое создание резервных копий
|
|
16
|
+
- 🎯 **CI/CD готовность**: Поддержка переменных окружения для автоматизации
|
|
17
|
+
|
|
18
|
+
### Поддерживаемые типы файлов
|
|
19
|
+
|
|
20
|
+
- `.cer` - сертификаты
|
|
21
|
+
- `.p12` - PKCS#12 сертификаты
|
|
22
|
+
- `.mobileprovisioning` - профили подготовки iOS
|
|
23
|
+
- `.json` - конфигурационные файлы
|
|
24
|
+
|
|
25
|
+
## Зависимости
|
|
26
|
+
|
|
27
|
+
Для работы KeySloth требуются системные инструменты:
|
|
28
|
+
|
|
29
|
+
- Git CLI (должен быть доступен в PATH)
|
|
30
|
+
- SSH-клиент (обычно OpenSSH), используемый через переменную `GIT_SSH_COMMAND`
|
|
31
|
+
|
|
32
|
+
## Установка
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
gem install keysloth
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Или добавьте в Gemfile:
|
|
39
|
+
|
|
40
|
+
```ruby
|
|
41
|
+
gem 'keysloth'
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Быстрый старт
|
|
45
|
+
|
|
46
|
+
### 1. Получение секретов
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
keysloth pull -r git@github.com:company/secrets.git -p your_password
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 2. Отправка секретов
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
keysloth push -r git@github.com:company/secrets.git -p your_password -m "Update certificates"
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 3. Проверка состояния
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
keysloth status
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Использование
|
|
65
|
+
|
|
66
|
+
### Команды
|
|
67
|
+
|
|
68
|
+
#### pull - Получение секретов
|
|
69
|
+
|
|
70
|
+
Получает зашифрованные секреты из Git репозитория и расшифровывает их локально:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
keysloth pull --repo git@github.com:company/secrets.git \
|
|
74
|
+
--password your_secret_password \
|
|
75
|
+
--branch main \
|
|
76
|
+
--path ./secrets
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Параметры:**
|
|
80
|
+
- `--repo, -r` - URL Git репозитория (обязательно)
|
|
81
|
+
- `--password, -p` - Пароль для расшифровки (обязательно)
|
|
82
|
+
- `--branch, -b` - Ветка репозитория (по умолчанию: main)
|
|
83
|
+
- `--path, -d` - Локальный путь для секретов (по умолчанию: ./secrets)
|
|
84
|
+
|
|
85
|
+
#### push - Отправка секретов
|
|
86
|
+
|
|
87
|
+
Шифрует локальные секреты и отправляет их в Git репозиторий:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
keysloth push --repo git@github.com:company/secrets.git \
|
|
91
|
+
--password your_secret_password \
|
|
92
|
+
--message "Update mobile certificates" \
|
|
93
|
+
--branch main \
|
|
94
|
+
--path ./secrets
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**Параметры:**
|
|
98
|
+
- `--repo, -r` - URL Git репозитория (обязательно)
|
|
99
|
+
- `--password, -p` - Пароль для шифрования (обязательно)
|
|
100
|
+
- `--branch, -b` - Ветка репозитория (по умолчанию: main)
|
|
101
|
+
- `--path, -d` - Локальный путь с секретами (по умолчанию: ./secrets)
|
|
102
|
+
- `--message, -m` - Сообщение коммита (опционально)
|
|
103
|
+
|
|
104
|
+
#### status - Проверка состояния
|
|
105
|
+
|
|
106
|
+
Показывает информацию о локальных секретах и доступных backup'ах:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
keysloth status --path ./secrets
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
#### restore - Восстановление из backup'а
|
|
113
|
+
|
|
114
|
+
Восстанавливает секреты из резервной копии:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
keysloth restore secrets_backup_20231215_143022 --path ./secrets
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Конфигурационный файл
|
|
121
|
+
|
|
122
|
+
KeySloth поддерживает файл конфигурации `.keyslothrc` в формате YAML:
|
|
123
|
+
|
|
124
|
+
```yaml
|
|
125
|
+
# .keyslothrc
|
|
126
|
+
repo_url: "git@github.com:company/secrets.git"
|
|
127
|
+
branch: "main"
|
|
128
|
+
local_path: "./secrets"
|
|
129
|
+
backup_count: 3
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Параметры командной строки имеют приоритет над конфигурационным файлом.
|
|
133
|
+
|
|
134
|
+
### Логирование
|
|
135
|
+
|
|
136
|
+
KeySloth поддерживает три уровня логирования:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
# Подробное логирование (DEBUG)
|
|
140
|
+
keysloth pull -r repo_url -p password --verbose
|
|
141
|
+
|
|
142
|
+
# Тихий режим (только ошибки)
|
|
143
|
+
keysloth pull -r repo_url -p password --quiet
|
|
144
|
+
|
|
145
|
+
# Обычное логирование (INFO) - по умолчанию
|
|
146
|
+
keysloth pull -r repo_url -p password
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Безопасность
|
|
150
|
+
|
|
151
|
+
### Архитектура безопасности
|
|
152
|
+
|
|
153
|
+
KeySloth обеспечивает многоуровневую защиту:
|
|
154
|
+
|
|
155
|
+
1. **SSH аутентификация** - доступ к репозиторию только через SSH ключи
|
|
156
|
+
2. **AES-256-GCM шифрование** - надежное шифрование с защитой целостности
|
|
157
|
+
3. **PBKDF2 деривация ключей** - безопасная генерация ключей из паролей
|
|
158
|
+
4. **Зашифрованное хранение** - секреты хранятся зашифрованными в репозитории
|
|
159
|
+
|
|
160
|
+
### Настройка SSH ключей
|
|
161
|
+
|
|
162
|
+
#### Локальная работа
|
|
163
|
+
|
|
164
|
+
Используйте стандартные SSH ключи:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
# Генерируем SSH ключ если нет
|
|
168
|
+
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
|
|
169
|
+
|
|
170
|
+
# Добавляем публичный ключ в GitHub/GitLab
|
|
171
|
+
cat ~/.ssh/id_rsa.pub
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
#### CI/CD настройка
|
|
175
|
+
|
|
176
|
+
Для автоматизации используйте переменные окружения:
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
# Экспортируем SSH ключ в переменную окружения
|
|
180
|
+
export SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)"
|
|
181
|
+
export SSH_PUBLIC_KEY="$(cat ~/.ssh/id_rsa.pub)"
|
|
182
|
+
|
|
183
|
+
# Используем в CI/CD
|
|
184
|
+
keysloth pull -r git@github.com:company/secrets.git -p $SECRET_PASSWORD
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
#### Использование системного SSH (GIT_SSH_COMMAND)
|
|
188
|
+
|
|
189
|
+
При использовании ключей из переменных окружения в CI создаются временные файлы ключей и применяется `GIT_SSH_COMMAND`, например:
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
export GIT_SSH_COMMAND='ssh -i /tmp/keysloth_ssh/id_rsa -o IdentitiesOnly=yes -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null'
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Для локальной разработки отключать проверку хостов не рекомендуется.
|
|
196
|
+
|
|
197
|
+
#### Требования к автору коммита
|
|
198
|
+
|
|
199
|
+
Перед отправкой изменений должны быть настроены глобальные параметры Git:
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
git config --global user.name "Your Name"
|
|
203
|
+
git config --global user.email "you@example.com"
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
#### Поведение git-операций
|
|
207
|
+
|
|
208
|
+
- Клонирование по умолчанию: `git clone --depth 1` (shallow).
|
|
209
|
+
- Если `git pull --ff-only` требует историю, выполняется `git fetch --unshallow`, затем повтор `pull`.
|
|
210
|
+
- Перед записью новых файлов очищаются все `.enc` в репозитории: `**/*.enc`.
|
|
211
|
+
|
|
212
|
+
### Рекомендации по безопасности
|
|
213
|
+
|
|
214
|
+
1. **Сильные пароли**: Используйте пароли длиной минимум 16 символов
|
|
215
|
+
2. **Ротация ключей**: Регулярно обновляйте SSH ключи и пароли шифрования
|
|
216
|
+
3. **Ограниченный доступ**: Предоставляйте доступ к репозиторию только необходимым участникам
|
|
217
|
+
4. **Аудит**: Регулярно проверяйте логи доступа к репозиторию
|
|
218
|
+
5. **Backup'ы**: Используйте автоматические backup'ы для восстановления
|
|
219
|
+
|
|
220
|
+
## Интеграция с CI/CD
|
|
221
|
+
|
|
222
|
+
### GitHub Actions
|
|
223
|
+
|
|
224
|
+
```yaml
|
|
225
|
+
name: Deploy with Secrets
|
|
226
|
+
on: [push]
|
|
227
|
+
|
|
228
|
+
jobs:
|
|
229
|
+
deploy:
|
|
230
|
+
runs-on: ubuntu-latest
|
|
231
|
+
steps:
|
|
232
|
+
- uses: actions/checkout@v3
|
|
233
|
+
|
|
234
|
+
- name: Setup SSH key
|
|
235
|
+
env:
|
|
236
|
+
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
|
|
237
|
+
run: |
|
|
238
|
+
mkdir -p ~/.ssh
|
|
239
|
+
echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
|
|
240
|
+
chmod 600 ~/.ssh/id_rsa
|
|
241
|
+
ssh-keyscan github.com >> ~/.ssh/known_hosts
|
|
242
|
+
|
|
243
|
+
- name: Install KeySloth
|
|
244
|
+
run: gem install keysloth
|
|
245
|
+
|
|
246
|
+
- name: Pull secrets
|
|
247
|
+
env:
|
|
248
|
+
SECRET_PASSWORD: ${{ secrets.SECRET_PASSWORD }}
|
|
249
|
+
run: |
|
|
250
|
+
keysloth pull -r git@github.com:company/secrets.git -p "$SECRET_PASSWORD"
|
|
251
|
+
|
|
252
|
+
- name: Deploy application
|
|
253
|
+
run: |
|
|
254
|
+
# Используем расшифрованные секреты для развертывания
|
|
255
|
+
./deploy.sh
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### GitLab CI
|
|
259
|
+
|
|
260
|
+
```yaml
|
|
261
|
+
deploy:
|
|
262
|
+
stage: deploy
|
|
263
|
+
before_script:
|
|
264
|
+
- gem install keysloth
|
|
265
|
+
- mkdir -p ~/.ssh
|
|
266
|
+
- echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
|
|
267
|
+
- chmod 600 ~/.ssh/id_rsa
|
|
268
|
+
- ssh-keyscan gitlab.com >> ~/.ssh/known_hosts
|
|
269
|
+
script:
|
|
270
|
+
- keysloth pull -r git@gitlab.com:company/secrets.git -p "$SECRET_PASSWORD"
|
|
271
|
+
- ./deploy.sh
|
|
272
|
+
variables:
|
|
273
|
+
SSH_PRIVATE_KEY: $SSH_PRIVATE_KEY
|
|
274
|
+
SECRET_PASSWORD: $SECRET_PASSWORD
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
## Разработка
|
|
278
|
+
|
|
279
|
+
### Установка для разработки
|
|
280
|
+
|
|
281
|
+
```bash
|
|
282
|
+
git clone https://github.com/keysloth/keysloth.git
|
|
283
|
+
cd keysloth
|
|
284
|
+
bundle install
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Запуск тестов
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
# Все тесты
|
|
291
|
+
bundle exec rake spec
|
|
292
|
+
|
|
293
|
+
# Тесты с покрытием кода
|
|
294
|
+
COVERAGE=true bundle exec rake spec
|
|
295
|
+
|
|
296
|
+
# Линтинг кода
|
|
297
|
+
bundle exec rake rubocop
|
|
298
|
+
|
|
299
|
+
# Все проверки
|
|
300
|
+
bundle exec rake check
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### Структура проекта
|
|
304
|
+
|
|
305
|
+
```
|
|
306
|
+
keysloth/
|
|
307
|
+
├── lib/keysloth/ # Основная логика
|
|
308
|
+
│ ├── crypto.rb # Криптографические операции
|
|
309
|
+
│ ├── git_manager.rb # Работа с Git
|
|
310
|
+
│ ├── file_manager.rb # Файловые операции
|
|
311
|
+
│ ├── cli.rb # CLI интерфейс
|
|
312
|
+
│ ├── config.rb # Конфигурация
|
|
313
|
+
│ ├── logger.rb # Логирование
|
|
314
|
+
│ └── errors.rb # Обработка ошибок
|
|
315
|
+
├── bin/keysloth # Исполняемый файл
|
|
316
|
+
├── spec/ # Тесты RSpec
|
|
317
|
+
└── keysloth.gemspec # Спецификация gem'а
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
## Лицензия
|
|
321
|
+
|
|
322
|
+
MIT License. См. [LICENSE](LICENSE) для деталей.
|
|
323
|
+
|
|
324
|
+
## Поддержка
|
|
325
|
+
|
|
326
|
+
- **Документация**: [GitHub Wiki](https://github.com/keysloth/keysloth/wiki)
|
|
327
|
+
- **Issues**: [GitHub Issues](https://github.com/keysloth/keysloth/issues)
|
|
328
|
+
- **Обсуждения**: [GitHub Discussions](https://github.com/keysloth/keysloth/discussions)
|
|
329
|
+
|
|
330
|
+
## Troubleshooting
|
|
331
|
+
|
|
332
|
+
### Часто встречающиеся проблемы
|
|
333
|
+
|
|
334
|
+
#### Ошибки аутентификации Git
|
|
335
|
+
|
|
336
|
+
**Проблема**: `Permission denied (publickey)` при выполнении pull/push
|
|
337
|
+
|
|
338
|
+
**Решение**:
|
|
339
|
+
```bash
|
|
340
|
+
# Проверьте SSH ключи
|
|
341
|
+
ssh-add -l
|
|
342
|
+
|
|
343
|
+
# Добавьте SSH ключ если необходимо
|
|
344
|
+
ssh-add ~/.ssh/id_rsa
|
|
345
|
+
|
|
346
|
+
# Проверьте соединение с GitHub/GitLab
|
|
347
|
+
ssh -T git@github.com
|
|
348
|
+
ssh -T git@gitlab.com
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
#### Ошибки расшифровки
|
|
352
|
+
|
|
353
|
+
**Проблема**: `Неверный пароль или поврежденные данные`
|
|
354
|
+
|
|
355
|
+
**Решение**:
|
|
356
|
+
1. Проверьте правильность пароля
|
|
357
|
+
2. Убедитесь что файлы не повреждены: `keysloth validate`
|
|
358
|
+
3. Попробуйте восстановить из backup'а: `keysloth restore`
|
|
359
|
+
|
|
360
|
+
#### Ошибки файловой системы
|
|
361
|
+
|
|
362
|
+
**Проблема**: `Permission denied` при создании/чтении файлов
|
|
363
|
+
|
|
364
|
+
**Решение**:
|
|
365
|
+
```bash
|
|
366
|
+
# Проверьте права доступа к директории
|
|
367
|
+
ls -la ./secrets
|
|
368
|
+
|
|
369
|
+
# Измените права если необходимо
|
|
370
|
+
chmod 755 ./secrets
|
|
371
|
+
chmod 644 ./secrets/*
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
#### Проблемы с Git репозиторием
|
|
375
|
+
|
|
376
|
+
**Проблема**: `Repository not found` или `Could not read from remote repository`
|
|
377
|
+
|
|
378
|
+
**Решение**:
|
|
379
|
+
1. Проверьте URL репозитория
|
|
380
|
+
2. Убедитесь что у вас есть доступ к репозиторию
|
|
381
|
+
3. Для приватных репозиториев проверьте SSH ключи
|
|
382
|
+
|
|
383
|
+
#### Ошибки в CI/CD
|
|
384
|
+
|
|
385
|
+
**Проблема**: Команды KeySloth не работают в CI/CD
|
|
386
|
+
|
|
387
|
+
**Решение**:
|
|
388
|
+
```yaml
|
|
389
|
+
# Настройка SSH ключей в GitHub Actions
|
|
390
|
+
- name: Setup SSH key
|
|
391
|
+
env:
|
|
392
|
+
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
|
|
393
|
+
run: |
|
|
394
|
+
mkdir -p ~/.ssh
|
|
395
|
+
echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
|
|
396
|
+
chmod 600 ~/.ssh/id_rsa
|
|
397
|
+
ssh-keyscan github.com >> ~/.ssh/known_hosts
|
|
398
|
+
|
|
399
|
+
# Установка gem'а
|
|
400
|
+
- name: Install KeySloth
|
|
401
|
+
run: gem install keysloth
|
|
402
|
+
|
|
403
|
+
# Использование с переменными окружения
|
|
404
|
+
- name: Pull secrets
|
|
405
|
+
env:
|
|
406
|
+
SECRET_PASSWORD: ${{ secrets.SECRET_PASSWORD }}
|
|
407
|
+
run: keysloth pull -r $REPO_URL -p "$SECRET_PASSWORD"
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
#### Логирование для отладки
|
|
411
|
+
|
|
412
|
+
Используйте различные уровни логирования для диагностики:
|
|
413
|
+
|
|
414
|
+
```bash
|
|
415
|
+
# Подробное логирование для отладки
|
|
416
|
+
keysloth pull -r repo_url -p password --verbose
|
|
417
|
+
|
|
418
|
+
# Тихий режим для CI/CD
|
|
419
|
+
keysloth pull -r repo_url -p password --quiet
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
#### Backup и восстановление
|
|
423
|
+
|
|
424
|
+
При проблемах с секретами используйте backup'ы:
|
|
425
|
+
|
|
426
|
+
```bash
|
|
427
|
+
# Посмотреть доступные backup'ы
|
|
428
|
+
keysloth status
|
|
429
|
+
|
|
430
|
+
# Восстановить из backup'а
|
|
431
|
+
keysloth restore secrets_backup_20231215_143022
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
### Получение помощи
|
|
435
|
+
|
|
436
|
+
Если проблема не решается:
|
|
437
|
+
|
|
438
|
+
1. **Проверьте логи** с флагом `--verbose`
|
|
439
|
+
2. **Создайте минимальный пример** для воспроизведения
|
|
440
|
+
3. **Откройте issue** в [GitHub Issues](https://github.com/keysloth/keysloth/issues) с:
|
|
441
|
+
- Версией KeySloth (`keysloth version`)
|
|
442
|
+
- Версией Ruby (`ruby --version`)
|
|
443
|
+
- Полным текстом ошибки
|
|
444
|
+
- Шагами для воспроизведения
|
|
445
|
+
|
|
446
|
+
## Changelog
|
|
447
|
+
|
|
448
|
+
См. [CHANGELOG.md](CHANGELOG.md) для истории изменений.
|
data/Rakefile
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'bundler/gem_tasks'
|
|
4
|
+
require 'rspec/core/rake_task'
|
|
5
|
+
require 'rubocop/rake_task'
|
|
6
|
+
|
|
7
|
+
# Настройка задач RSpec для тестирования
|
|
8
|
+
RSpec::Core::RakeTask.new(:spec) do |task|
|
|
9
|
+
task.rspec_opts = '--format documentation --color'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Настройка задач RuboCop для линтинга
|
|
13
|
+
RuboCop::RakeTask.new(:rubocop) do |task|
|
|
14
|
+
task.options = ['--display-cop-names']
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Задача для автоматического исправления RuboCop
|
|
18
|
+
RuboCop::RakeTask.new('rubocop:autocorrect') do |task|
|
|
19
|
+
task.options = ['--autocorrect']
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Задача для установки зависимостей
|
|
23
|
+
desc 'Установить зависимости'
|
|
24
|
+
task :install do
|
|
25
|
+
sh 'bundle install'
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Задача для сборки gem'а
|
|
29
|
+
desc 'Собрать gem'
|
|
30
|
+
task :build do
|
|
31
|
+
sh 'gem build keysloth.gemspec'
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Задача для очистки временных файлов
|
|
35
|
+
desc 'Очистить временные файлы'
|
|
36
|
+
task :clean do
|
|
37
|
+
FileUtils.rm_rf('tmp/')
|
|
38
|
+
FileUtils.rm_rf('coverage/')
|
|
39
|
+
FileUtils.rm_f(Dir.glob('*.gem'))
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Задача для полной проверки кода
|
|
43
|
+
desc 'Запустить все проверки (тесты + линтинг)'
|
|
44
|
+
task check: %i[rubocop spec]
|
|
45
|
+
|
|
46
|
+
# Задача для подготовки к релизу
|
|
47
|
+
desc 'Подготовить к релизу (проверки + сборка)'
|
|
48
|
+
task release_prepare: %i[clean check build]
|
|
49
|
+
|
|
50
|
+
# Задача для генерации документации
|
|
51
|
+
desc 'Генерировать YARD документацию'
|
|
52
|
+
task :docs do
|
|
53
|
+
sh 'yard doc'
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Задача по умолчанию
|
|
57
|
+
task default: :check
|
|
58
|
+
|
|
59
|
+
# Задачи для разработки
|
|
60
|
+
namespace :dev do
|
|
61
|
+
desc 'Установить git hooks для разработки'
|
|
62
|
+
task :setup_hooks do
|
|
63
|
+
hook_content = <<~HOOK
|
|
64
|
+
#!/bin/sh
|
|
65
|
+
echo "Запускаем проверки перед коммитом..."
|
|
66
|
+
bundle exec rake rubocop || exit 1
|
|
67
|
+
bundle exec rake spec || exit 1
|
|
68
|
+
echo "Все проверки пройдены успешно!"
|
|
69
|
+
HOOK
|
|
70
|
+
|
|
71
|
+
hook_path = '.git/hooks/pre-commit'
|
|
72
|
+
File.write(hook_path, hook_content)
|
|
73
|
+
File.chmod(0o755, hook_path)
|
|
74
|
+
puts 'Git pre-commit hook установлен'
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
desc 'Запустить интерактивную консоль'
|
|
78
|
+
task :console do
|
|
79
|
+
require_relative 'lib/keysloth'
|
|
80
|
+
require 'pry'
|
|
81
|
+
Pry.start
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Задачи для CI/CD
|
|
86
|
+
namespace :ci do
|
|
87
|
+
desc 'Запустить тесты с покрытием кода'
|
|
88
|
+
task :test_coverage do
|
|
89
|
+
ENV['COVERAGE'] = 'true'
|
|
90
|
+
Rake::Task[:spec].invoke
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
desc 'Проверить безопасность зависимостей'
|
|
94
|
+
task :security do
|
|
95
|
+
sh 'bundle audit check --update'
|
|
96
|
+
rescue StandardError => e
|
|
97
|
+
puts "Предупреждение: проверка безопасности не прошла: #{e.message}"
|
|
98
|
+
end
|
|
99
|
+
end
|
data/bin/keysloth
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require_relative '../lib/keysloth'
|
|
5
|
+
require_relative '../lib/keysloth/cli'
|
|
6
|
+
|
|
7
|
+
begin
|
|
8
|
+
KeySloth::CLI.start(ARGV)
|
|
9
|
+
rescue KeySloth::KeySlothError => e
|
|
10
|
+
warn "Ошибка KeySloth: #{e.message}"
|
|
11
|
+
exit 1
|
|
12
|
+
rescue StandardError => e
|
|
13
|
+
warn "Неожиданная ошибка: #{e.message}"
|
|
14
|
+
warn "Backtrace: #{e.backtrace.join("\n")}" if ENV['DEBUG']
|
|
15
|
+
exit 1
|
|
16
|
+
end
|
data/keysloth.gemspec
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'lib/keysloth/version'
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |spec|
|
|
6
|
+
spec.name = 'keysloth'
|
|
7
|
+
spec.version = KeySloth::VERSION
|
|
8
|
+
spec.authors = ['KeySloth Team']
|
|
9
|
+
spec.email = ['team@keysloth.org']
|
|
10
|
+
|
|
11
|
+
spec.summary = 'Ruby gem для управления зашифрованными секретами в Git репозиториях'
|
|
12
|
+
spec.description = <<~DESC
|
|
13
|
+
KeySloth - инструмент для безопасного хранения и управления секретами (сертификаты,#{' '}
|
|
14
|
+
ключи, конфигурационные файлы) в зашифрованном виде в Git репозиториях.#{' '}
|
|
15
|
+
Обеспечивает простое получение, изменение и отправку секретов с использованием#{' '}
|
|
16
|
+
AES-256-GCM шифрования.
|
|
17
|
+
DESC
|
|
18
|
+
spec.homepage = 'https://github.com/keysloth/keysloth'
|
|
19
|
+
spec.license = 'MIT'
|
|
20
|
+
spec.required_ruby_version = '>= 2.7.0'
|
|
21
|
+
|
|
22
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
|
23
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
|
24
|
+
spec.metadata['source_code_uri'] = 'https://github.com/keysloth/keysloth'
|
|
25
|
+
spec.metadata['changelog_uri'] = 'https://github.com/keysloth/keysloth/blob/main/CHANGELOG.md'
|
|
26
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
|
27
|
+
|
|
28
|
+
# Определяем, какие файлы включить в gem
|
|
29
|
+
spec.files = Dir.chdir(__dir__) do
|
|
30
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
|
31
|
+
f.start_with?('spec/', 'test/', 'features/', '.git', 'appveyor', 'Gemfile')
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
spec.bindir = 'bin'
|
|
36
|
+
spec.executables = ['keysloth']
|
|
37
|
+
spec.require_paths = ['lib']
|
|
38
|
+
|
|
39
|
+
# Основные зависимости
|
|
40
|
+
spec.add_dependency 'thor', '~> 1.2' # CLI интерфейс
|
|
41
|
+
# Используем системные git команды вместо rugged для упрощения установки
|
|
42
|
+
# Используем встроенный openssl, доступный в Ruby по умолчанию
|
|
43
|
+
|
|
44
|
+
# Зависимости для разработки
|
|
45
|
+
spec.add_development_dependency 'rspec', '~> 3.12'
|
|
46
|
+
spec.add_development_dependency 'rubocop', '~> 1.50'
|
|
47
|
+
spec.add_development_dependency 'rubocop-performance', '~> 1.17'
|
|
48
|
+
spec.add_development_dependency 'rubocop-rspec', '~> 2.20'
|
|
49
|
+
spec.add_development_dependency 'simplecov', '~> 0.22'
|
|
50
|
+
spec.add_development_dependency 'yard', '~> 0.9'
|
|
51
|
+
end
|