search
LoginSignup
0

posted at

updated at

Organization

GitHub Actionsでprivateリポジトリのライブラリをflutter pub getする方法

導入

iPresenceでは社内で作ったFlutterのライブラリをGitHubのPrivateリポジトリで管理しています。
プロジェクトで使う分には pubspec.yaml内でGitHubのリポジトリを指定して上げれば問題なく開発はできます。

テスト駆動で開発を進めていく内にGitHub Actionsを導入してテスト周りの効率化を図りたくなってきました、
ただ普通にGitHub Actions内でflutter pub get を実行しただけではprivateリポジトリのライブラリを取得しようとした際に
Permissionエラーになってしまいテストを実行する前にActionが失敗してしまい、GitHub Actionsの導入を諦めるめかけていましたが、
SSH keyを適切に設定しActions内で読み込ませることでprivateリポジトリのライブラリも問題なく取得できるようになりました。

SSH Keyの作成

まずはプロジェクトのリポジトリからライブラリのリポジトリへアクセスできるようにするためにSSH keyを作成します。
SSH Keyの作成はいつもどおりの ssh-keygen コマンドでやっていきます

cd ~/.ssh
ssh-keygen -t rsa -b 4096 -C "{EMAIL}" -f FILENAME

EMAILにはGitHubに登録しているメールアドレス(privateリポジトリにアクセス権限のあるもの)を
FILENAMEには作成するSSH Keyのファイル名を指定します。

コマンドを実行すると FILENAMEFILENAME.pub というファイルができているはずです。
FILENAMEが秘密鍵、FILENAME.pubが公開鍵になっています。

GitHubへ鍵の設定

作成したSSH KeyをそれぞれGitHubへ登録していきます。

秘密鍵

まず秘密鍵の登録です。
秘密鍵はGitHub Actionsを実行するリポジトリに登録します。

リポジトリの Setting → Security → Actions に移動します。
https://github.com/ユーザ名/リポジトリ/settings/secrets/actions

秘密鍵1.png

New repository secretのボタンをクリックすると秘密鍵の登録画面になります。

秘密鍵2.png

NAME: 鍵の名前 兼 Actions内の変数名
Secret: 事前に用意した秘密鍵

をそれぞれ入力して Add secret をクリックすると秘密鍵の登録は完了です。

公開鍵

次に公開鍵の登録です。
公開鍵はアカウントの設定から登録していきます。

アカウントの settings → SSH and GPG keys → New SSH Key でSSH Keyの登録画面まで移動します。
https://github.com/settings/ssh/new

公開鍵.png

Title: 鍵のタイトルです、プロジェクト名などわかりやすものがおすすめです。
Key Type: Authentication Key を指定します。
Key: 事前に作成した公開鍵の内容

をそれぞれ入力して Add SSH key をクリックして公開鍵の登録をします。

GitHub Actionsの設定

プロジェクトのディレクトリ内に .github/workflows/test.yaml というテストを実行するActionsのファイルを用意します。
ファイルの中身は以下のようになります。

name: test
on:
  - pull_request
permissions:
  contents: read
  id-token: write
jobs:
  test: 
    name: flutter test
    runs-on: ubuntu-latest
    steps:
      - name: set up repository
        uses: actions/checkout@v2
      - name: Install Chrome
        run: |
          sudo wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
          sudo apt update
          sudo apt-get install google-chrome-stable
      - name: set up java
        uses: actions/setup-java@v1
        with:
          java-version: "12.x"
      - uses: subosito/flutter-action@v1
        with:
          flutter-version: "3.3.2"
      - name: flutter doctor
        run: flutter doctor -v
      - name: flutter pub get
        env: 
          ENV_SECRET_KEY: ${{ secrets.SECRET_KEY }}
        run:
          mkdir -p ~/.ssh;
          echo "$ENV_SECRET_KEY" | tr -d '\r' > ~/.ssh/secret_key;
          chmod 700 ~/.ssh/secret_key;
          eval $(ssh-agent -s);
          ssh-add ~/.ssh/secret_key;
          ssh-keyscan -H github.com >> ~/.ssh/known_hosts;
          export GIT_SSH_COMMAND="ssh -i $HOME/.ssh/secret_key";
          flutter pub get;
      - name: flutter unit test
        run: flutter test  

この中で今回重要になるのがflutter pub get をしている以下の箇所です

      - name: flutter pub get
        env: 
          ENV_SECRET_KEY: ${{ secrets.SECRET_KEY }}
        run:
          mkdir -p ~/.ssh;
          echo "$ENV_SECRET_KEY" | tr -d '\r' > ~/.ssh/secret_key;
          chmod 700 ~/.ssh/secret_key;
          eval $(ssh-agent -s);
          ssh-add ~/.ssh/secret_key;
          ssh-keyscan -H github.com >> ~/.ssh/known_hosts;
          export GIT_SSH_COMMAND="ssh -i $HOME/.ssh/secret_key";
          flutter pub get;

まず env の項目でリポジトリに指定した秘密鍵を環境変数として読み込めるようにします。
ENV_SECRET_KEYがActions内で使用できるようになる環境変数
secrets.SECRET_KEYSECRET_KEY 部分が秘密鍵を登録した際に入力したNAMEになります。

        env: 
          ENV_SECRET_KEY: ${{ secrets.SECRET_KEY }}

環境変数として使えるようにできれば後は`run` 内でbash上でSSH Keyを使用するときと同じようにssh-agentに登録していくだけです。

        run:
          mkdir -p ~/.ssh; # 鍵を置くディレクトリの作成
          echo "$ENV_SECRET_KEY" | tr -d '\r' > ~/.ssh/secret_key; # 用意したディレクトリに秘密鍵のファイルを作成
          chmod 700 ~/.ssh/secret_key; # 秘密鍵の権限を変更
          eval $(ssh-agent -s); # ssh-agentの起動
          ssh-add ~/.ssh/secret_key; # ssh-agentへ秘密鍵を追加 
          ssh-keyscan -H github.com >> ~/.ssh/known_hosts; # ホスト鍵登録のknown_hostsファイルを作成
          export GIT_SSH_COMMAND="ssh -i $HOME/.ssh/secret_key"; # gitコマンド実行時に使用する鍵を秘密鍵に指定
          flutter pub get; # Flutterのライブラリ取得です。

pubspec.ymlの編集

ライブラリの取得先をhttpsを使っている場合は取得先をsshを使いようにします。

pubspec.yml
~ 前略 ~
dependencies:
  flutter:
    sdk: flutter
  private_repo_lib:
    git:
      # url: https://github.com/hogefuga/private_repo_lib.git
      url: git@github.com:hogefuga/private_repo_lib.git
      ref: 1.0.0

最後に

以上のようにしてGitHub Actions内からでもprivateリポジトリのライブラリを取得できるようになりました。
実際この問題にハマってネット上にも知見が転がってなかったので数ヶ月Actionsの導入を諦めていましたが、ようやく使えるようになりました。
同じようにGitHubActionsでflutter pub getができずに諦めている人の解決に繋がれば幸いです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0