メインコンテンツまでスキップ

Dockerでのビルドのローカル実行

Docker Hub のレート制限

2024年7月15日から、Docker Hub からのダウンロードにレート制限が適用されます。当社のLinuxマシン上の Bitrise ビルド中に、認証なしで Docker Hub から Docker イメージをプルすると、レート制限により問題が発生する場合があります。

Bitrise は一部の人気のあるパブリック docker イメージをミラーリングしていますが、レート制限によるこれらの問題を避けるために、次のいずれかを実行できます。

  • Docker Hub に対する Docker イメージのプルリクエストを認証する。詳細と Docker の完全なポリシーについては、Docker Hub rate limitを参照してください。
  • イメージを保存するために、別の Docker レジストリに切り替える。

Linux スタックのビルドをローカルで実行するには、dockerが必要です。

  • Linux の場合は、公式のインストール手順に従ってください。
  • Mac の場合は、Docker for Mac を使用すると最も簡単に始められます。

このガイドでは、この Bitrise Android サンプルプロジェクトを使用します。

大きなイメージについて

公式の Bitrise Docker イメージは、さまざまなツールがプリインストールされているため、非常に大きくなっています。少なくとも 20~25 GB の空きディスク容量が必要です。

Bitrise CLIに慣れていない場合は、まずそちらを試してください。CLIを使いこなす必要はありません。bitrise local run WORKFLOW の動作を理解していれば、このチュートリアルには十分です。

docker イメージのダウンロードClick to copy link​

  1. dockerをインストールします。

  2. リポジトリに bitrise.yml があることを確認してください。

    コミットする必要はありませんが、ファイルがリポジトリのルートディレクトリに存在している必要があります。

  3. cd で、Mac/Linux 上のリポジトリのディレクトリに移動します。

  4. レジストリからイメージをプルします。

    docker pull bitriseio/android-20.04:latest
  5. 次のコマンドを実行します。

    docker run --privileged --env CI=false --volume "$(pwd):/bitrise/src" --volume "/var/run/docker.sock:/var/run/docker.sock" --rm bitriseio/android-20.04:latest bitrise local run WORKFLOW

    コンテナーに入って中で試してみたい場合は、--rm bitriseio/android-20.04:latest bitrise local run WORKFLOW を -it bitriseio/android-20.04:latest bash に置き換えると、コンテナー内で対話型の bash シェルが起動します。例:

    docker run --privileged --env CI=false --volume "$(pwd):/bitrise/src" --volume "/var/run/docker.sock:/var/run/docker.sock" -it bitriseio/android-20.04:latest bash

    一般的に、プロジェクトが Android プロジェクトで Android NDK を使用しない場合は、貴重なディスク容量を節約するために、bitriseio/android docker イメージを使用してください。その他の公式 Bitrise docker イメージは、Quay のページで確認できます。この例では bitriseio/android のイメージを使用しています。

  6. Quayから docker イメージをダウンロードします。

    docker pull bitriseio/android-20.04:latest

    このイメージは 10 GB を超えるため、ダウンロードにはかなり時間がかかる場合があります。ダウンロードが失敗したりハングしたりした場合は、同じコマンドをもう一度実行すればいつでも再開できます。

  7. Bitrise のビルド設定(bitrise.yml)をリポジトリのルートディレクトリにダウンロードします。

    bitrise.ioの Workflow Editor の bitrise.yml タブから、プロジェクトの bitrise.yml をダウンロードできます。

    または、Bitrise CLI でダウンロードすることもできます: bitrise yml get --app APP-ID > bitrise.yml。Downloading the bitrise.yml fileを参照してください。このコマンドには Bitrise CLI 3.0.0 以降が必要です。

  8. ターミナル/コマンドラインで、リポジトリのルートディレクトリに移動(cd)します。この場所に bitrise.yml があることを確認してください。

問題を再現しようとする場合は、リポジトリを新しいディレクトリに git clone して、リポジトリにコミットされたファイルだけがディレクトリに含まれるようにしてください。通常の作業ディレクトリでコマンドを実行すると、リポジトリにコミットされていないファイル(たとえば .gitignore にあるファイル)が存在することが多く、再現性の問題がよく発生します。

ビルドの実行Click to copy link​

次のコマンドでビルドを実行します。

docker run --privileged --env CI=false --volume "$(pwd):/bitrise/src" --volume "/var/run/docker.sock:/var/run/docker.sock" --rm bitriseio/android:latest bitrise local run WORKFLOW
  • --rm bitriseio/android:latest bitrise local run WORKFLOW

    -it bitriseio/android:latest bash を指定すると、コンテナー内で対話型の bash シェルが起動します。

    例:

    docker run --privileged --env CI=false --volume "$(pwd):/bitrise/src" --volume "/var/run/docker.sock:/var/run/docker.sock" -it bitriseio/android:latest bash

    このコマンドは、現在のディレクトリ(リポジトリのディレクトリ)を共有ボリュームとして docker コンテナーと共有し、コンテナー内のパス /bitrise/src で利用できるようにします。

    その後、bitrise local run WORKFLOW を実行すると、コンテナー内で Workflow が実行されます。コンテナーを終了するには、exit を実行します。

  • WORKFLOW は、bitrise.yml 内の Workflow の実際の ID に置き換えてください(primary のような形式です)。

  • --env CI=false フラグは、環境変数 CI を false に設定します。これにより、Bitrise CLI は CI 環境でのみ実行する意味のある一部の Step をスキップします。たとえば、Git Clone Step です。コードはすでにあるため、docker コンテナー内で再度 git clone する必要はありません(そのため、コードディレクトリを --volume として共有しました)。

  • --rm フラグは、docker run コマンドの終了後に docker がコンテナーを破棄するよう指示します。つまり、コマンドを再実行した場合、docker run .. コマンド間で保持されるのは、共有 --volume(リポジトリのディレクトリ内)に保存されたファイルだけです。一時ディレクトリなどの他の場所に生成されたファイルはすべて破棄され、保持されません。

    失敗したビルドの後でコンテナーをデバッグしたい場合は、--rm フラグを削除し、既存の docker コンテナーに接続する方法を解説した Docker のチュートリアルを参照してください。コマンドを再実行しても同じコンテナーは使用されず、新しいコンテナーが作成されることに注意してください。

  • --privileged フラグは、docker コンテナーからホストへのアクセス制御を許可します。そのため、使用する docker イメージを信頼できる場合を除き、このフラグは使用しないでください。このフラグは、たとえば VPN が動作する(ホストのネットワーク設定を変更する)ために必要です。

  • --volume "/var/run/docker.sock:/var/run/docker.sock" フラグは、ホストの docker ソケットをコンテナーに公開します。これは、コンテナー内から他の docker コンテナーを実行する場合や、ビルド中またはコンテナー内で docker コマンドを実行する場合に必要です。