# GitHub ActionsでAPIキーを扱いたいとき

# 今回やったこと

  • AndroidプロジェクトでAPIキーを取り扱いたい。
  • APIキーは.gitignoreに入れておきたい。
  • でもGitHub Actionsでビルドは走らせたい。

というときにどうするかをメモしておきます。

# ざっくりとした流れ

ざっくりと3ステップです。

  1. APIキーを *.properties ファイルから読み込む仕組みにする。
  2. SettingsのSecretsでBase64エンコードしたファイル内容を登録する。
  3. 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

    # (省略)

そうするとちゃんと何事もなかったかのようにビルドが走ってくれます。
ちなみに、ちゃんとシークレットの部分は伏せ字にしてくれるみたいです。

シークレットの伏せ字

サブネミミッミの分はないよ?

アッチョンミミッミ