簡體   English   中英

如何在 Gitlab CI for android 中管理簽名密鑰庫

[英]How to manage signing keystore in Gitlab CI for android

親愛的stackoverflow社區,我再次求助於你:)

我最近遇到了 Gitlab 的奇跡和他們非常好的捆綁 CI/CD 解決方案。 它工作得很好,但是,我們都需要對我們的二進制文件進行簽名,不是嗎,我發現沒有辦法像我那樣上傳密鑰到 Jenkins 服務器來執行此操作。

那么,在構建版本時,我如何在不簽入我的密鑰和秘密的情況下簽署我的 android(實際上是顫振)應用程序?

據我所知,大多數人使用簽名設置來定義構建作業,該簽名設置是指指定本地 keystore.jks 的未提交 key.properties 文件。 這在本地構建 APK 時效果很好,但是如果我想將它們構建並歸檔為 CI/CD 工作的一部分,我該怎么做?

對於密鑰,例如密鑰庫本身的密碼,我發現我可以簡單地將它們存儲為受保護的變量,而不是實際的密鑰庫文件本身。 我能做些什么呢?

任何想法,建議都非常受歡迎。 干杯

編輯:我很抱歉從未在這里標記正確的答案,並且@IvanP 提出了將單個值寫入文件的解決方案是我長期以來使用的解決方案。 但是正如@VonC 后來添加的那樣,Gitlab 現在能夠將數據作為實際文件進行處理,這簡化了這一點,所以我將其標記為正確答案。

通常我將密鑰庫文件(作為 base64 字符串)、別名和密碼存儲到 Gitlab 的秘密變量中。

在 .gitlab-ci.yml 中執行以下操作:

create_property_files:
  stage: prepare
  only:
    - master
  script:
    - echo $KEYSTORE | base64 -d > my.keystore
    - echo "keystorePath=my.keystore" > signing.properties
    - echo "keystorePassword=$KEYSTORE_PASSWORD" >> signing.properties
    - echo "keyAlias=$ALIAS" >> signing.properties
    - echo "keyPassword=$KEY_PASSWORD" >> signing.properties
  artifacts:
    paths:
      - my.keystore
      - signing.properties
    expire_in: 10 mins

最后,在您的構建 gradle 中:

signingConfigs {
    release {
        file("../signing.properties").with { propFile ->
            if (propFile.canRead()) {
                def properties = new Properties()
                properties.load(new FileInputStream(propFile))

                storeFile file(properties['keystorePath'])
                storePassword properties['keystorePassword']
                keyAlias properties['keyAlias']
                keyPassword properties['keyPassword']
            } else {
                println 'Unable to read signing.properties'
            }
        }
    }
}

感謝@IvanP 的回答,但我必須在 Gitlab 管道中進行一些更改才能使其正常工作。

將 Keystore 導出為 base64 字符串:

openssl base64 -A -in my.keystore > base64

創建一個新變量並將值復制粘貼到文件 base64 中。 這樣做時要小心,我搞砸了格式,管道無法解碼密鑰庫。 變量必須用 ${} 來引用,而不僅僅是 $。

- echo -n ${ANDROID_KEYSTORE} | base64 -d > my.keystore
- echo "keystorePath=../my.keystore" > myapp.properties
- echo "keystorePassword=${KEYSTORE_PASSWORD}" >> myapp.properties
- echo "keyAlias=${ALIAS_NAME}" >> myapp.properties
- echo "keyPassword=${KEY_PASSWORD}" >> myapp.properties

請參閱您的 build.gradle 中的 myapp.properties,如上面@IvanP 的回答中所述。

我過去曾使用git-secret來簽入受密碼保護的機密文件。 然后通過秘密/受保護的環境變量(如您所知)傳遞密碼並修改 .gitlab-ci.yml 以使用密碼打開文件並使用它們。

來自IvanP回答

通常我將密鑰庫文件(作為 base64 字符串)、別名和密碼存儲到 Gitlab 的秘密變量中。

使用GitLab 15.0 (2022 年 5 月)應該會更容易

公開測試版中的項目級安全文件

以前,很難在 CI/CD 管道中使用二進制文件,因為 CI/CD 變量只能包含文本值。 這使得使用配置文件、證書、密鑰庫和其他安全信息變得困難,這些對於構建移動應用程序的團隊來說很重要。

今天,我們正在公開測試版中發布項目級安全文件。 現在,您可以將二進制文件上傳到 GitLab 中的項目,並將這些文件包含在 CI/CD 作業中,以便根據需要在構建和發布過程中使用。 安全文件存儲在版本控制之外,不是項目存儲庫的一部分。

請在反饋問題中留下您對使用此功能的體驗的反饋。

請參閱文檔問題

另一種解決方案是使用android.injected屬性:

  1. 首先對證書文件進行編碼:
openssl enc -base64 -in certFile -out certFileEncoded
  1. 獲取certFileEncoded文件的內容並在 Gitlab 設置中定義為文件類型變量。

  2. 在 assemble 任務中注入證書、別名和密碼:

script:
    - openssl enc -d -base64 -in $CERT_FILE_BASE_64 -out certFile
    - ./gradlew :app:assembleRelease -Pandroid.injected.signing.store.file=$(pwd)/certFile -Pandroid.injected.signing.store.password=$CERT_PASS -Pandroid.injected.signing.key.alias=$CERT_ALIAS -Pandroid.injected.signing.key.password=$CERT_PASS

這里CERT_ALIASCERT_PASS是掩碼變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM