Github の Personal Access Token を使って `git submodule update --init --recursive` する in Travis CI

はじめに

プライベートリポジトリをサブモジュールとして利用する必要があったので、 Private Dependencies - Travis CI をいろいろ調べていたら Github の Personal Access Token を利用して git submodule update --init --recursive が行える方法があったのでまとめてみました.

本家では Gemfile を利用していましたが、作るのが面倒だったのでシェルスクリプトに置き換えました.

なぜ Personal Access Token を利用するのか?

.travis.yml さえ作ってしまえば、コマンドを使わずに設定が可能だからです. 今から説明する方法は、Travis CI の [Environment Variables] にトークンを登録すれば簡単に更新することができます. SSH鍵の生成やら暗号化とかの手間が必要ありません. すべてブラウザの中で完結するので、引き継ぎ作業が発生した場合に楽になります.

ただし、今から説明する初期設定はターミナルを利用しています. (Travis CI の [Environment Variables] にトークンをする作業なんて説明がなくてもできるので)

Travis CI の設定

Github Personal Access Tokens の生成

Personal Access Tokens にて生成する. [Generate new token] から生成画面へ移動します. [Token description] と [Select scopes] に適切な入力を行います.

トークンの説明 (Token description) に 「Travis CI for myaccount/myrepository」 と記述すると myaccount/myrepository のために Travis CI で利用しているトークンであるということがわかりやすいです.

サブモジュールとして利用するのであれば、スコープ (Select scopes) の repo にチェックをするだけで十分です.

Travis CI に Github Personal Access Token を登録

平文で扱うのはよくないので暗号化します. (あらかじめ gem install travistravis をインストールする必要があります.)

travis env set CI_USER_TOKEN the-generated-token --private -r myorg/main

the-generated-token は先程取得した Github Personal Access Token です.)

これで、 myaccount/myrepositoryTravis CI 内では $CI_USER_TOKEN が利用できるようになりました.

.netrc の作成

ログイン処理を省略するために必要なファイルです.

machine github.com
  login the-generated-token

中身に先程取得した the-generated-token (Github Personal Access Token) を記述する必要があるので bash コマンドで生成してしまいましょう.

echo -e "machine github.com\n  login $CI_USER_TOKEN" >> ~/.netrc

.gitmodules

このファイル内の git@github.com:myaccount/myrepository.git 形式を https://the-generated-token@github.com/myaccount/myrepository.git 形式に変更しなければいけません. このとき、 Personal Access Token を付与する必要があるのでこちらも bash コマンドで変更してしまいましょう.

sed -i -e "s/git@github.com:/https:\/\/$CI_USER_TOKEN@github.com\//" ./.gitmodules

.travis.yml

上記に記載したスクリプト等を .travis.yml に追加すると以下のようになります. 例として、 Android のビルドを想定しています.

language: android
sudo: required
android:
  components:
    - tools
    - platform-tools
    - build-tools-25.0.1
    - android-25
    - extra
git:
  submodules: false
before_install:
  - sed -i -e "s/git@github.com:/https:\/\/$CI_USER_TOKEN@github.com\//" ./.gitmodules
  - echo -e "machine github.com\n  login $CI_USER_TOKEN" >> ~/.netrc
  - git submodule update --init --recursive
script:
  - "./gradlew clean build"
branches:
  only:
  - master
  - develop
  - "/^release.*$/"

さいごに

スコープの設定をいじると他のことも簡単にできそうなので、いろいろ試してみるのも面白いと思います.

Qiita で書いた記事