Jenkins 憑證管理 - 看這一篇就夠了~

許多三方網站和應用能夠與Jenkins交互,如Artifact倉庫,基於雲的存儲系統和服務等. 在Jenkins中添加/配置credentials,Pipeline項目就可使用 credentials 與三方應用交互git

Credential 類型

參考: https://jenkins.io/zh/doc/book/using/using-credentials/docker

Jenkins能夠存儲如下類型的credentials:shell

  • Secret text - API token之類的token (如GitHub我的訪問token)api

  • Username and password - 能夠爲獨立的字段,也能夠爲冒號分隔的字符串:username:password(更多信息請參照 處理 credentials)安全

  • Secret file - 保存在文件中的加密內容bash

  • SSH Username with private key - SSH 公鑰/私鑰對服務器

  • Certificate - a PKCS#12 證書文件 和可選密碼ssh

  • Docker Host Certificate Authentication credentials.ide

Credential 安全

爲了最大限度地提升安全性,在Jenins中配置的 credentials 以加密形式存儲在Jenkins 主節點上(用Jenkins ID加密),而且 只能經過 credentials ID 在Pipeline項目中獲取gitlab

這最大限度地減小了向Jenkins用戶公開credentials真實內容的可能性,而且阻止了將credentials複製到另外一臺Jenkins實例

Credential 建立

  • 選擇適合的憑證類型

  • 建立 「Username and password」 憑證

  • 建立 「SSH Username with private key」 憑證

Credential ID 定義

  • 在 ID 字段中,必須指定一個有意義的Credential ID- 例如 jenkins-user-for-xyz-artifact-repository。注意: 該字段是可選的。 若是您沒有指定值, Jenkins 則Jenkins會分配一個全局惟一ID(GUID)值。

  • 請記住: 一旦設置了credential ID,就不能再進行更改。

Credential 使用

參考: https://www.jenkins.io/doc/book/pipeline/jenkinsfile/#handling-credentials

存儲在Jenkins中的credentials能夠被使用:

  1. 適用於Jenkins的任何地方 (即全局 credentials),

  2. 經過特定的Pipeline項目/項目 (在 處理 credentials 和 使用Jenkinsfile部分了解更多信息),

  3. 由特定的Jenkins用戶 (如 Pipeline 項目中建立 Blue Ocean的狀況).

    • Blue Ocean 自動生成一個 SSH 公共/私有密鑰對, 確保 SSH 公共/私有祕鑰對在繼續以前已經被註冊到你的Git服務器

實際使用中,下面幾個場景會用到creential

  • gitlab 訪問、API調用
  • jenkins slave 建立

Credential 相關插件

注意: 上述 Credential 類型都依賴於 jenkins插件,一樣jenkins pipeline 也須要這些插件的安裝以支持代碼片斷

  • Credentials Binding: https://plugins.jenkins.io/credentials-binding/

    • For secret text, usernames and passwords, and secret files
    environment {
    MAGE_REPO_CREDENTIALS = credentials('COMPOSER_REPO_MAGENTO')
    COMPOSER_AUTH = """{
      "http-basic": {
          "repo.magento.com": {
              "username": "${env.MAGE_REPO_CREDENTIALS_USR}",
              "password": "${env.MAGE_REPO_CREDENTIALS_PSW}"
          }
      } }"""
    }
    • For other credential types
    withCredentials([usernamePassword(credentialsId: 'amazon', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) {
    // available as an env variable, but will be masked if you try to print it out any which way
    // note: single quotes prevent Groovy interpolation; expansion is by Bourne Shell, which is what you want
    sh 'echo $PASSWORD'
    // also available as a Groovy variable
    echo USERNAME
    // or inside double quotes for string interpolation
    echo "username is $USERNAME"
    }
  • Jenkins Plain Credentials Plugin: https://plugins.jenkins.io/plain-credentials/

  • SSH Credentials: https://plugins.jenkins.io/ssh-credentials/

最佳實踐

  • 爲了便於管理和使用, 強烈建議使用統一的約定來指定credential ID

  • 建議使用相似下面的format作爲credential ID, 便於jenkinsfile開發時直接使用,同時在」描述「裏寫清楚credential的做用

    gitlab-api-token、gitlab-private-key、gitlab-userpwd-pair、harbor-xxx-xxx

實踐:

  • 以下所示,將憑證使用統一的ID命名以後,便於複用,憑證定義一次,可屢次,多個地方統一使用,不管是後期維護,複用都很是方便!

    environment {
            // HARBOR="harbor.devopsing.site"
            HARBOR_ACCESS_KEY = credentials('harbor-userpwd-pair')
            SERVER_ACCESS_KEY = credentials('deploy-userpwd-pair')
                }
        .....
    
        docker login --username=${HARBOR_ACCESS_KEY_USR} --password=${HARBOR_ACCESS_KEY_PSW} ${HARBOR}
    
        sshpass -p "${SERVER_ACCESS_KEY_PSW}" ssh -o StrictHostKeyChecking=no ${SERVER_ACCESS_KEY_USR}@${DEPLOY_SERVER} "$runCmd"
相關文章
相關標籤/搜索