# GitHub ActionsでAPIキーを扱いたいとき
# 今回やったこと
- AndroidプロジェクトでAPIキーを取り扱いたい。
- APIキーは.gitignoreに入れておきたい。
- でもGitHub Actionsでビルドは走らせたい。
というときにどうするかをメモしておきます。
# ざっくりとした流れ
ざっくりと3ステップです。
- APIキーを
*.properties
ファイルから読み込む仕組みにする。 - SettingsのSecretsでBase64エンコードしたファイル内容を登録する。
- CIの設定でビルド前にBase64エンコードしたシークレットをファイルに出力させる。
# 1. APIキーをpropertiesファイルから読み込む方法
Gradle Kotlin DSLを使った普通のAndroidプロジェクトを想定します。
プロジェクトルート/
│
├ app/
│ └ build.gradle.kts
│
├ build.gradle.kts
│
├ env.properties
プロジェクトのルートに env.properties
というファイルを作り、以下のような内容にします。
ApiKey=ここにAPIキーを記述
そして .gitignore
に /env.properties
というように追記し、無視リストに追加してやります。
これをしないとキーをお漏らししちゃいますので。
そして、この ApiKey
を読み込むように app/build.gradle.kts
に以下を追記します。
(android
ブロック等はいい感じにしておいてください。)
import org.jetbrains.kotlin.konan.properties.loadProperties
val env = loadProperties("$rootDir/env.properties")
android {
defaultConfig {
buildConfigField("String", "API_KEY", "\"${env["ApiKey"]}\"")
}
}
("\"${env["ApiKey"]}\""
の部分ですが、この部分がそっくりそのまんま BuildConfig
のフィールドになるみたいで、ダブルクォーテーションをこのように付けてやらないとだめっぽいです。)
これでコード中から BuildConfig.API_KEY
という書き方でAPIキーにアクセスできるようになりました。
# 2. シークレットの内容を登録
Base64エンコードで文字列化を行ってシークレットに登録し、ビルド前にシークレットをデコードしてファイルに戻すという方法を取ります。
例えば ↓ のような内容である場合、
ApiKey=サブネミミッミの分はないよ?
Base64エンコードを行うと ↓ の文字列になります。
QXBpS2V5PeOCteODluODjeODn+ODn+ODg+ODn+OBruWIhuOBr+OBquOBhOOCiD8K
これをSettingsのSecretのところに登録します。
シークレット名は分かりやすい名前にしましょう。
(私は GRADLE_ENV_PROPERTIES
という名前にしました。)
# 3. シークレットのデコード
文字列をBase64デコードしてファイルに出力したい場合は ↓ のコマンドを実行します。
echo デコードしたい文字列 | base64 -d > env.properties
実際にGitHub ActionsのYAMLでは $
を使って ↓ のように記述します。
# (省略)
- uses: actions/cache@v1
with:
path: ~/.gradle/caches
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle.kts') }}
restore-keys: |
${{ runner.os }}-gradle-
# ビルド前に「env.properties」を復元
- name: Restore env
run: echo ${{ secrets.GRADLE_ENV_PROPERTIES }} | base64 -d > env.properties
- name: Build
run: ./gradlew assembleDebug
# (省略)
そうするとちゃんと何事もなかったかのようにビルドが走ってくれます。
ちなみに、ちゃんとシークレットの部分は伏せ字にしてくれるみたいです。
サブネミミッミの分はないよ?