Docker を使用してローカルでパイプラインをデバッグする
Docker を使用して、Bitbucket Pipelines のビルドをローカルでテストできます。Docker イメージが適切かどうか、またはビルドしようとしたときに Pipelines でメモリの問題が発生するかどうかを確認する際に便利です。
このガイドでは、3 段階のテストについて説明します。
- コンテナのビルドのテスト
- コンテナの実行のテスト
- コンテナ内でのコマンドの実行のテスト
詳細については、Docker のドキュメントを参照してください。
はじめる前に
ローカル環境を準備します。bitbucket-pipelines.yml ファイルの準備ができている Bitbucket リポジトリのローカル コピーがあることを確認します。
例
このシナリオでは、次の bitbucket-pipelines.yml ファイルをテストします。
# You can use a Docker image from Docker Hub or your own container # registry for your build environment. image: python:2.7 pipelines: default: - step: script: # Modify the commands below to build your repository. - docker --version
- python --version - python myScript.py
オンライン バリデーターを使用して bitbucket-pipelines.yml ファイルをチェックすることができます。
ステップ 1: マシンに Docker をインストールする
インストール手順は、使用するオペレーティング システムによって異なります。Docker が提供しているインストール ガイドラインに従ってください。
Doker をインストールしたら、ターミナルに移動して以下を実行します。
$ docker --version
SSH をインストール済みの場合、コマンドはバージョンの詳細情報を返し、適切にインストールされていることを示します。Bitbucket での実行時にローカル バージョンがパイプラインで使用されているバージョンと一致していることを確認してください。異なる場合、互換性の問題が発生する可能性があります。
Docker のインストールを完了すると、独自のカスタム イメージをビルドしたり、既存のイメージ (Docker Hub からダウンロード可能なものなど) を使用したりすることができます。
ステップ 2: カスタム Docker イメージのビルドをテストする
独自イメージのビルドでは、コンテナを定義するための dockerfile を定義済みであることを前提としています。dockerfile がない場合、イメージの作成手順または Docker の公式スタート ガイドを参照してください。
$ docker build --memory=1g --memory-swap=1g -t account/imageName:tag -f my.dockerfile .
ここで:
docker build | Docker イメージのビルドを行うことを指定します。 |
--memory=1g --memory-swap=1g | スワップ領域を持たない 1 GB メモリのコンテナをビルドします (スワップはスワップ値 - メモリ値で計算されます)。このメモリ量は 1 つのサービス コンテナでの Pipelines のメモリ制限のシミュレーションを行います (両方のフラグが必要です)。 ローカルでデバッグする際には、可能な限り Pipelines に近い状態を再現するためにメモリ制限を設定して、Pipelines のメモリ制限に該当しないことを確認することをおすすめします。ローカルで合格するパイプラインが失敗する原因の多くはメモリ制限です。 Docker ドキュメントでメモリの管理に関する詳細を確認できます。 |
-t accountName/imageName:tag | 指定された名前、イメージ名、およびタグで、アカウントのイメージを作成します。 |
-f my.dockerfile | イメージのビルド時に使用する docker ファイルの名前を指定します。 |
. | docker ビルド コンテキストでルートとして使用するディレクトリを指定します (指定しない場合はカレント)。 |
注意
Pipelines ファイルでイメージを定義していない場合、アトラシアンの既定のイメージが使用されます。
ステップ 3: Docker コンテナの実行をテストする
コンテナをビルド済みの場合、実行をテストできます。この例では、Docker Hub の python 2.7 イメージを使用します。
$ docker run -it --volume=/Users/myUserName/code/localDebugRepo:/localDebugRepo --workdir="/localDebugRepo" --memory=4g --memory-swap=4g
--memory-swappiness=0 --entrypoint=/bin/bash python:2.7
ここで:
docker run -it | TTY と STDIN open の状態で Docker コンテナを実行します。つまり、コンテナは対話モードで開き、ユーザーはコンテナ内でコマンドを実行できます。 |
|
注意 コンテナ内で発生するリポジトリ コンテンツへの変更は、ご使用のリポジトリのローカル クローンに反映されます。 |
--workdir= "/localDebugRepo" | 開始点となるディレクトリを設定します。このディレクトリでコマンドが実行されます。既定では、コンテナのルート ディレクトリになります。 |
--memory=4g --memory-swap=4g --memory-swappiness=0 | ビルド コンテナでの Pipelines のメモリ制限のシミュレーションを行うための、スワップ領域を持たない 4 GB メモリのコンテナを実行します (3 つのフラグすべてが必要です)。 ローカルでデバッグする際には、可能な限り Pipelines に近い状態を再現するためにメモリ制限を設定して、Pipelines のメモリ制限に該当しないことを確認することをおすすめします。ローカルで合格するパイプラインが失敗する原因の多くはメモリ制限です。 Docker ドキュメントでメモリの管理に関する詳細を確認できます。 |
python: 2.7
| 実行する Docker イメージ。 |
--entrypoint=/bin/bash | bash プロンプトを開始します。 |
環境変数をコンテナに渡すには、-e スイッチを使用できます (例: --e "VAR1=hello" -e "VAR2=world
を上述のコマンドの -it
の前に追加、または --env-file=env-vars.txt
ファイルを使用)。詳細情報
Docker イメージが実行され、次のように ID を確認できるようになっているはずです。
root@1af123ef2211:/localDebugRepo
これは、ユーザーは作業ディレクトリ内にいて、コマンドの実行を開始できることを意味します。
ビルド サービスでのテスト
ビルドで MySQL などのサービスを標準的に使用する場合、別のコンテナを使用してこれをローカルでテストすることもできます。
サービスを使用するには、メイン コンテナの前にサービス コンテナを開始します。
MySQL の例:
docker run --name my-mysql-name \ -e MYSQL_DATABASE='pipelines' \ -e MYSQL_RANDOM_ROOT_PASSWORD='yes' \ -e MYSQL_USER='test_user' \ -e MYSQL_PASSWORD='test_user_password' \ -d mysql:<tag>
次に、メイン コンテナの実行中に、--link
オプションを使用して、サービス コンテナにリンクします。
ステップ 3 のコマンドの例は次のようになります。
docker run -it --link my-mysql-name:mysql --volume=/Users/myUserName/code/localDebugRepo:/localDebugRepo --workdir="/localDebugRepo" --memory=4g --memory-swap=4g --memory-swappiness=0 --entrypoint=/bin/bash python:2.7
ステップ 4: ローカル環境でスクリプトをテストする
コンテナをビルドして実行したら、Pipelines スクリプトに一覧化したコマンドを実行できます。
ローカルでデバッグできる問題が見つかり、その修正を行った場合は、bitbucket-piplines.yml を更新して一致させます。
実際にこれを使用した場合の例を見てみましょう。
例
この段階で、オープンな python:2.7
コンテナがあり、ユーザーはリポジトリ ディレクトリ内にいます。
ここから、次のことが実行できます。
bitbucket-pipelines.yml
から個々のコマンドを実行してテストするコンテナ内のツールを構成する
このガイドの冒頭で触れた bitbucket-pipelines.yml
ファイルをテストします。
スクリプトの最初のステップは、python バージョンのテストです。
$ python --version
出力に問題はないようです。
Python
2.7
.
11
次に、python スクリプトを実行します。
$ python myScript.py
注意: この例は、リポジトリに myScript.py スクリプトがある場合にのみ動作します。スクリプトには、上記で実行したバージョン コマンドが含まれます。
ここでも、出力にエラーは表示されていません。
Python
2.7
.
11
次に、コンテナ内で設定を行う場合があります。
$ pip install scipy
出力:
Collecting scipy
Downloading scipy-
0.17
.
1
-cp27-cp27mu-manylinux1_x86_64.whl (
39
.5MB)
100
% |████████████████████████████████|
39
.5MB 34kB/s
Installing collected packages: scipy
Successfully installed scipy-
0.17
.
1
これが正常に実行されているため、これを bitbucket-pipelines.yml
ファイルに追加して変更をコミットし、パイプラインをエラーなしで実行できることを確認できます。
# You can use a Docker image from Docker Hub or your own container
# registry for your build environment.
image: python:2.7
pipelines:
default:
- step:
script: # Modify the commands below to build your repository.
- python --version
- python myScript.py
- pip install scipy