Перейти к основному содержимому
Версия: 7.0

Интеграции с CI/CD и инфраструктурой

Обзор

Пассворк интегрируется с CI/CD-системами через passwork-cli. Основной паттерн:

CI/CD Runner ──► passwork-cli exec ──► Деплой-скрипт с секретами в ENV
СистемаСпособ интеграции
GitLab CIDocker-образ passwork/passwork-cli как image
GitHub ActionsDocker-контейнер через docker run
Bitbucket PipelinesDocker-образ в pipe
KubernetesInit-контейнер или sidecar

GitLab CI

Базовый пример

stages:
- deploy

deploy_prod:
stage: deploy
image: passwork/passwork-cli:latest
variables:
PASSWORK_HOST: $PASSWORK_HOST
PASSWORK_TOKEN: $PASSWORK_TOKEN
PASSWORK_MASTER_KEY: $PASSWORK_MASTER_KEY
script:
- passwork-cli exec --folder-id "$SECRETS_FOLDER_ID" ./deploy.sh

Настройка переменных

В Settings → CI/CD → Variables добавьте:

ПеременнаяТипProtectedMasked
PASSWORK_HOSTVariable
PASSWORK_TOKENVariable
PASSWORK_MASTER_KEYVariable
SECRETS_FOLDER_IDVariable

Разные окружения

.deploy_template: &deploy_template
image: passwork/passwork-cli:latest
variables:
PASSWORK_HOST: $PASSWORK_HOST
PASSWORK_TOKEN: $PASSWORK_TOKEN
PASSWORK_MASTER_KEY: $PASSWORK_MASTER_KEY
script:
- passwork-cli exec --folder-id "$SECRETS_FOLDER_ID" ./deploy.sh

deploy_staging:
<<: *deploy_template
stage: deploy
variables:
SECRETS_FOLDER_ID: $STAGING_SECRETS_FOLDER_ID
environment:
name: staging

deploy_production:
<<: *deploy_template
stage: deploy
variables:
SECRETS_FOLDER_ID: $PROD_SECRETS_FOLDER_ID
environment:
name: production
when: manual

GitHub Actions

Базовый пример

name: Deploy

on:
push:
branches: [main]

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Deploy with secrets
run: |
docker run --rm \
-e PASSWORK_HOST="${{ secrets.PASSWORK_HOST }}" \
-e PASSWORK_TOKEN="${{ secrets.PASSWORK_TOKEN }}" \
-e PASSWORK_MASTER_KEY="${{ secrets.PASSWORK_MASTER_KEY }}" \
-v ${{ github.workspace }}:/app \
-w /app \
passwork/passwork-cli:latest \
exec --folder-id "${{ vars.SECRETS_FOLDER_ID }}" ./deploy.sh

Настройка секретов

В Settings → Secrets and variables → Actions:

  • Secrets: PASSWORK_HOST, PASSWORK_TOKEN, PASSWORK_MASTER_KEY
  • Variables: SECRETS_FOLDER_ID

Разные окружения

jobs:
deploy:
runs-on: ubuntu-latest
environment: ${{ github.ref == 'refs/heads/main' && 'production' || 'staging' }}
steps:
- uses: actions/checkout@v4

- name: Deploy
run: |
docker run --rm \
-e PASSWORK_HOST="${{ secrets.PASSWORK_HOST }}" \
-e PASSWORK_TOKEN="${{ secrets.PASSWORK_TOKEN }}" \
-e PASSWORK_MASTER_KEY="${{ secrets.PASSWORK_MASTER_KEY }}" \
-v ${{ github.workspace }}:/app \
-w /app \
passwork/passwork-cli:latest \
exec --folder-id "${{ vars.SECRETS_FOLDER_ID }}" ./deploy.sh

Bitbucket Pipelines

image: passwork/passwork-cli:latest

pipelines:
branches:
main:
- step:
name: Deploy to production
deployment: production
script:
- passwork-cli exec --folder-id "$SECRETS_FOLDER_ID" ./deploy.sh

Переменные настраиваются в Repository settings → Pipelines → Repository variables.

Kubernetes

Init-контейнер

Init-контейнер получает секреты перед запуском основного приложения:

apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
initContainers:
- name: fetch-secrets
image: passwork/passwork-cli:latest
env:
- name: PASSWORK_HOST
valueFrom:
secretKeyRef:
name: passwork-credentials
key: host
- name: PASSWORK_TOKEN
valueFrom:
secretKeyRef:
name: passwork-credentials
key: token
- name: PASSWORK_MASTER_KEY
valueFrom:
secretKeyRef:
name: passwork-credentials
key: master-key
command:
- sh
- -c
- |
passwork-cli exec --folder-id "$SECRETS_FOLDER_ID" env > /secrets/.env
volumeMounts:
- name: secrets-volume
mountPath: /secrets

containers:
- name: app
image: myapp:latest
command:
- sh
- -c
- |
set -a && source /secrets/.env && set +a
exec ./app
volumeMounts:
- name: secrets-volume
mountPath: /secrets
readOnly: true

volumes:
- name: secrets-volume
emptyDir:
medium: Memory

Sidecar для периодического обновления

Sidecar обновляет секреты после ротации без перезапуска пода:

apiVersion: v1
kind: Pod
metadata:
name: myapp-with-sidecar
spec:
containers:
- name: app
image: myapp:latest
# Приложение перечитывает /secrets/.env при изменении

- name: secrets-sync
image: passwork/passwork-cli:latest
env:
- name: PASSWORK_HOST
valueFrom:
secretKeyRef:
name: passwork-credentials
key: host
# ... остальные переменные
command:
- sh
- -c
- |
while true; do
passwork-cli exec --folder-id "$SECRETS_FOLDER_ID" env > /secrets/.env.new
mv /secrets/.env.new /secrets/.env
sleep 300 # обновление каждые 5 минут
done
volumeMounts:
- name: secrets-volume
mountPath: /secrets

volumes:
- name: secrets-volume
emptyDir:
medium: Memory

Преимущества централизованного хранения

АспектБез ПассворкаС Пассворком
Где хранятся секретыВ переменных каждой CI-системыЦентрализованно в Пассворке
РотацияОбновлять в каждой системе отдельноОбновить один раз в Пассворке
АудитРазрозненные логиЕдиный журнал в Пассворке
ДоступНастраивать в каждой системеRBAC в Пассворке
подсказка

В CI-системе храните только credentials для подключения к Пассворку (PASSWORK_HOST, PASSWORK_TOKEN, PASSWORK_MASTER_KEY). Все остальные секреты — в Пассворке.