Travis CIにはファイルを暗号化して秘密情報を公開リポジトリ上に安全に保存するような仕組みがあります。これはtravis
コマンドのサブコマンドencrypt-file
で提供されており、下記のように利用します。
$ travis encrypt-file secret.txt
encrypting secret.txt for hnw/foobar
storing result as secret.txt.enc
storing secure env variables for decryption
Please add the following to your build script (before_install stage in your .travis.yml, for instance):
openssl aes-256-cbc -K $****_key -iv $****_iv -in secret.txt.enc -out secret.txt -d
Pro Tip: You can add it automatically by running with --add.
Make sure to add secret.txt.enc to the git repository.
Make sure not to add secret.txt to the git repository.
Commit all changes to your .travis.yml.
secret.txt
を暗号化するとsecret.txt.enc
が生成されますので、これをGitリポジトリにcommitして利用します。指定されたopenssl
コマンドを.travis.yml
内で利用することで、暗号化されたファイルを復号することができます。
このencrypt-file
では公開鍵暗号の公開鍵を利用して暗号化が行われます1。公開鍵暗号の鍵ペアはTravis CIプロジェクトごとに作られており、公開鍵はAPI経由で誰でも確認できますが、秘密鍵はTravis CIしか知らないため、復号できるのはTravis CIだけという仕組みになっています。
travis encrypt-file
で複数ファイルの暗号化に対応する
ところで、travis encrypt-file
で複数ファイルを暗号化すると、最後に暗号化したファイルしか復号できません。
このことはTravis CIのマニュアルにも記載があり、必要ファイルをtarに固めて1ファイルにするというワークアラウンドが紹介されています。
ただ、これを素直に書くと.travis.yml
の記述が長々しくなるのが気持ち悪いと感じたので、使いやすくなるようなシェルスクリプトを書いてみました。
#! /usr/bin/env bash
set -eu
usage_exit() {
echo "Usage: $0 [-K AES_KEY] [-v AES_IV] encrypted-tar-file [patternes]" 1>&2
exit 1
}
while getopts K:iv:h OPT
do
case $OPT in
K) AES_KEY=$OPTARG
;;
i)
;;
v) AES_IV=$OPTARG
;;
h) usage_exit
;;
\?) usage_exit
;;
esac
done
shift $((OPTIND - 1))
if [[ $# -eq 0 ]]; then
usage_exit
fi
if [[ ! -v AES_KEY || ! -v AES_IV ]]; then
echo "Error: -K and -v are required options." 1>&2
usage_exit
fi
ENC_TAR=$1
shift
PATTERNS="$@"
raw_tar=$(mktemp -d /tmp/XXXXXXXXX)/secrets.tar
openssl aes-256-cbc -K $AES_KEY -iv $AES_IV -in $ENC_TAR -out $raw_tar -d
tar xf $raw_tar $PATTERNS
rm $raw_tar
rmdir $(dirname $raw_tar)
これを使うと次のように暗号化tarを展開できます。
./extract-encrypted-tar.sh -K $****_key -iv $****_iv secrets.tar.enc
また、tarのオプションを渡せるので、下記のような指定も可能です。
./extract-encrypted-tar.sh -K $****_key -iv $****_iv secrets.tar.enc .ssh/ -C $HOME
この程度の粒度の処理もシェルスクリプトにまとめると.travis.yml
の見通しが良くなるのでオススメです。
-
正確には256bit AES-CBCのKeyとIVを4096bit RSAの公開鍵で暗号化しています ↩