如何使用Jenkins测试git-crypt加密存储库

时间:2017-11-08 15:34:36

标签: jenkins encryption jenkins-pipeline

我在我的仓库中使用Jenkins(多分支管道)运行的测试通过keys.py在其中使用加密文件(git-crypt)。为了在本地使用该文件,我通常使用git-crypt unlock,但由于该命令的工作方式,我无法直接将此步骤添加到Jenkins文件中:

  1. gpg用于解密用于加密我的文件的对称密钥(即.git-crypt/keys/default/0/xxxx.gpg)。此密钥使用我的私钥使用RSA加密,并且此密钥具有密码短语,您在尝试使用时提示进入密码短语。
  2. 使用解密密钥解密keys.py

2 个答案:

答案 0 :(得分:0)

要解决提示问题,请手动插入git-crypt步骤 您的密码作为gpg的命令行参数和解密的对称 git-crypt unlock的关键。在这里,我们将使用更多技巧 像使用Jenkins environment variables一样轻松生活。

gpg --no-tty --passphrase YOUR_PASSPHRASE_GOES_HERE --output $WORKSPACE/.git-crypt/keys/default/0/decrypted.gpg --decrypt $WORKSPACE/.git-crypt/keys/default/0/YOUR_KEY_FILE_GOES_HERE.gpg && git-crypt unlock $WORKSPACE/.git-crypt/keys/default/0/decrypted.gpg

这里我们提出第二个问题,就是两次执行这个问题会引发一个问题 错误也是如此。我们希望repo仅在加密时才被解密。在 为了解决这个问题,首先检查包含对称密钥的文件 存在,仅在上一步骤中生成。最后,我们最终得到了一个 阶段看起来像:

stage('Unlock repo') { steps { script { sh("[ -f $WORKSPACE/.git-crypt/keys/default/0/decrypted.gpg ] || gpg --no-tty --passphrase YOUR_PASSPHRASE_GOES_HERE --output $WORKSPACE/.git-crypt/keys/default/0/decrypted.gpg --decrypt $WORKSPACE/.git-crypt/keys/default/0/YOUR_KEY_FILE_GOES_HERE.gpg && git-crypt unlock $WORKSPACE/.git-crypt/keys/default/0/decrypted.gpg") } } }

答案 1 :(得分:0)

我通过使用git-crypt创建一个单独的容器为git-crypt构建了另一种解决方案,并在主要构建步骤之前和之后分阶段调用了这些容器:

pipeline {
    environment {
       // $HOME is not set in build-agent
       JAVA_TOOL_OPTIONS = '-Duser.home=/home/jenkins/'
    }
    agent {
        label 'docker'
    }

    stages {
        stage('Decrypt') {
            agent {
                docker {
                    image 'wjung/jenkins-git-crypt:latest'
                    registryUrl 'https://index.docker.io/v1/'
                    registryCredentialsId 'docker-hub'
                }
            }
            steps {
                withCredentials([file(credentialsId: 'git-crypt-key', variable: 'FILE')]) {
                    sh 'cd $WORKSPACE; git-crypt unlock $FILE'
                }
            }
        }
        stage('Build docker image') {
            agent {
                docker {
                    image 'maven:3-jdk-11'
                    args '-v /services/maven/m2:/home/jenkins/.m2 -v /services/maven/m2/cache:/home/jenkins/.cache'
                }
            }
            steps {
                configFileProvider([configFile(fileId: 'mvn-setting-xml', variable: 'MAVEN_SETTINGS')]) {
                    sh 'mvn -s $MAVEN_SETTINGS -B -Dmaven.test.skip clean deploy'
                }
            }
        }
        stage('Lock dir') {
            agent {
                docker {
                    image 'wjung/jenkins-git-crypt:latest'
                    registryUrl 'https://index.docker.io/v1/'
                    registryCredentialsId 'docker-hub'
                }
            }
            steps {
                sh 'cd $WORKSPACE; git-crypt lock'
            }
        }
    }
}

git-crypt export-key TMPFILE从存储库导出加密密钥,然后将其添加为ID为git-crypt-key的秘密文件。