Jenkins Pipeline и Vault Plugin рецепты на русском

Что решаем?

Здесь собраны примеры использования Vault Plugin в Jenkins.

Примеры:

1. Недекларативный вариант

Недекларативный вариант с использованием плагина hashicorp-vault-plugin (без дополнения для Pipeline Declarative). Приемуществом данного варианта является сокрытие паролей в Jenkins Console Output

timestamps {

    node {

        def VAULT_SECRETS = [[
                path: 'stage/google-recaptcha', 
                secretValues: [
                    [envVar: 'SECRET_GOOGLE_RECAPTHCA_PRIVATE_KEY', vaultKey: 'SECRET_GOOGLE_RECAPTHCA_PRIVATE_KEY'], 
                    [envVar: 'SECRET_GOOGLE_RECAPTHCA_PUBLIC_KEY', vaultKey: 'SECRET_GOOGLE_RECAPTHCA_PUBLIC_KEY']
                    ]
                ]]

        def VAULT_CONFIG =  [engineVersion: 2, timeout: 60, vaultCredentialId: 'Vault-App-Role-Credential', vaultNamespace: 'namespace.name', vaultUrl: 'https://vault.yourdomain.com']

        def ALL_SECRETS = [:]

        stage('pull secrets') {

            sh 'env'

            withVault(configuration: VAULT_CONFIG, vaultSecrets: VAULT_SECRETS) {
                sh "echo -e \"<?php\n\\\$VAULT_SECRETS = [];\" > secrets.php"
                VAULT_SECRETS.each{ settings -> 
                    settings.secretValues.each{ item ->
                        ALL_SECRETS["$item.envVar"] = env."$item.envVar"
                        // просто сгенерируем файл PHP (как вариант)
                        sh "echo -e \"\\\$VAULT_SECRETS[\\\"$item.envVar\\\"] = \\\""+env."$item.envVar"+"\\\";\" >> secrets.php"
                        // или создаем файл  .env 
                        sh "echo \"$item.envVar="+env."$item.envVar"+"\" >> .env"
                    }
                }
            }
        }

        // Таким образом всё-таки можно раскрыть пароли, не рекомендую использовать. Разве что для отладки:
        // stage('Saving secrets to secrets.php as local file'){
        //     ALL_SECRETS.each{key, value->
        //         sh "echo -e \"\\\$VAULT_SECRETS[\\\"$key\\\"] = \\\"$value\\\";\" >> secrets.php"
        //     }
        // }

        // Один из вариантов доставки секретов на сервер
        stage('push secrets) {
            sshagent (credentials: ['stage-rsa']) {
                sh 'scp secrets.php stage@192.168.1.65:/application/configs/'
                sh 'scp .env stage@192.168.1.65:/application/'
            }
        }
    }
}

2. Декларативный вариант


def getSecretsConfig(){
    return [[path: 'stage/google-recaptcha', secretValues: [[envVar: 'SECRET_GOOGLE_RECAPTHCA_PRIVATE_KEY', vaultKey: 'SECRET_GOOGLE_RECAPTHCA_PRIVATE_KEY'], [envVar: 'SECRET_GOOGLE_RECAPTHCA_PUBLIC_KEY', vaultKey: 'SECRET_GOOGLE_RECAPTHCA_PUBLIC_KEY']]]]
}

pipeline {
    agent any
    stages {
        stage ("pull & push secrets"){
            steps {
                withVault(configuration: [engineVersion: 2, timeout: 60, vaultCredentialId: 'Vault-App-Role-Credential', vaultNamespace: 'namespace.name', vaultUrl: 'https://vault.yourdomain.com'], vaultSecrets: getSecretsConfig()) {

                    sshPublisher(publishers: [sshPublisherDesc(configName: 'stage', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo $SECRET_GOOGLE_RECAPTHCA_PUBLIC_KEY > /home/secret.txt', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/home/', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '*')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])

                }
            }
        }
    }
}

Was this helpful?

0 / 0