
Android開発でGoogleCloudAPIキーの隠蔽とGit運用を最適化してみた話
こんにちは。現在研究でAndroid開発に取り組んでいるんですが、自宅と出先で同一のリポジトリをいじるために、githubにプロジェクトをアップしております。どこでも作業ができるので便利なのですが、少し困ったことが。
何かというと、publicなリポジトリにはAPIキーなどの機密な内容はpushしてはならないということ。キーが悪用されてしまうと大変なことが起こりますからね。クラウド破産という恐ろしい言葉もあるほどで。
そこでgit secretsを活用して、機密な内容をコミットしようとすると警告が出るように設定したのですが、問題は機密情報をどのように隠蔽するか。
毎回書き換えて隠蔽し、それぞれPCのローカル上にファイルをセーブしておいて、作業時には元に戻す。こんな運用をしようとしましたが、これってとても面倒。
ということで今回はシェルスクリプトをサクッと設定して、半自動化してみました。
細かいことは割愛しますが、こんなかんじでやってみたよーってのを以下に書いていきますね。
ちなみに環境はmacOSです。Windowsの方は適宜読み替えて、bat書いてみてください。今回は最適化の大枠を紹介するだけなので悪しからず。
さて、ここから具体的なお話ですが、今回私はGoogle CloudのAPIキー情報等を含むjsonファイルの中身を隠して、gitにpushし、pullした後にローカルにおいたjsonファイルの中身をそれぞれ再度書き込むことで、動作環境を保持する、的なことをやりました。これを実現するために以下のソースファイルを用意しました。
hide_json.sh: コミット前にJSONの中身を隠蔽するためのスクリプト
# 対象のディレクトリパス
TARGET_DIRECTORY="{隠蔽対象のディレクトリパス}"
# 指定したディレクトリ内のJSONファイルを検索して上書きする関数
hide_json_files() {
local directory="$1"
find "$directory" -type f -name "*.json" | while read -r file; do
# JSONファイルの内容を*で上書き
echo -n '//// THIS IS HIDDEN ////' > "$file"
echo "JSON file '$file' contents are hidden."
done
}
# 指定したディレクトリ内のJSONファイルを隠す
hide_json_files "$TARGET_DIRECTORY"
copy_json.sh: プル後にJSONの中身を復旧するためのスクリプト
# ソースディレクトリとターゲットディレクトリのパス
SOURCE_DIRECTORY="{コピー元のパス}"
TARGET_DIRECTORY="{コピー先のパス}"
# ソースディレクトリ内のJSONファイルを検索してコピーする関数
copy_json_files() {
local source_dir="$1"
local target_dir="$2"
find "$source_dir" -type f -name "*.json" | while read -r file; do
local filename=$(basename "$file")
local target_file="$target_dir/$filename"
# JSONファイルの内容をコピーして上書き
cat "$file" > "$target_file"
echo "JSON file '$filename' copied to '$target_file'."
done
}
# JSONファイルをソースディレクトリからターゲットディレクトリにコピーして上書き
copy_json_files "$SOURCE_DIRECTORY" "$TARGET_DIRECTORY"
# 対象のディレクトリパス
TARGET_DIRECTORY="隠蔽対象のディレクトリパス"
# 指定したディレクトリ内のJSONファイルを検索して上書きする関数
hide_json_files() {
local directory="$1"
find "$directory" -type f -name "*.json" | while read -r file; do
# JSONファイルの内容を*で上書き
echo -n '//// THIS IS HIDDEN ////' > "$file"
echo "JSON file '$file' contents are hidden."
done
}
# 指定したディレクトリ内のJSONファイルを隠す
hide_json_files "$TARGET_DIRECTORY"
以上の二つのスクリプトを適切なディレクトリに配置しました。
chmodコマンドで適切な権限を設定するのをお忘れなく。
.zshrcにエイリアスを書く
ここでもうワンポイント手を加えます。
terminalで"hidejson", "copyjson"とコマンドを打つとそれぞれのシェルスクリプトが走るようにエイリアスを書いていきます。
alias hidejson='{各自パスを設定}/hide_json.sh' #APIkey隠蔽用
alias copyjson='{各自パスを設定}/copy_json.sh' #APIkey復旧用
このエイリアスを書いたら、一旦ターミナルを落とします。
コマンドが通るのを確認したら完成です。
こんな感じで、commit前にhidejson、pull後にcopyjsonと叩くことで、APIを隠蔽しながら、作業環境を同期できるようになりました。
私の場合、自宅ではMacStudio、出先ではMacBook Airなので、それぞれにエイリアスを書いておきました。さらに合わせ技で、シェルスクリプトや、ローカルのJSONファイルはどちらもiCloudで同期しているため、どのMacからでも触ることができる状態にしています。
iCloudを使うと、どのMacからも同じDocumentsフォルダをいじることができるのでとても便利。ただし、gitとの併用はお勧めしません。内部でファイルの重複が起こって暗黙にファイル名が変わったりして、ビルドが通らなくなるので。
なので、Androidプロジェクトに関しては、iCloud管轄外において運用しています。
まあざっくりこんな感じでAndroid開発 with GitにおけるGoogle Cloud APIのAPIキー隠蔽運用について備忘録としてまとめてみましたー。
ではまた。