Bitbucket Pipelines を使用したスクリプト タスクのヒント

Bitbucket Pipelines を使用して手動タスクを自動化するための 5 つのヒントをご覧ください。

Sten Pittet Sten Pittet

Bitbucket Pipelines を使用すると、リポジトリに継続的なインテグレーションまたは継続的なデリバリー ワークフローを迅速に導入できます。このプロセスの重要な部分は、手動プロセスをスクリプトに変換して、人間の介入を必要とせずにマシンによって自動化できるスクリプトに変換することです。認証、依存関係のインストール、または課題の報告に関する問題がある可能性があるため、タスクを自動化するのは難しい場合があります。このガイドでは、スクリプトを書くためのヒントを紹介します。

製品要件

#1 - 機密情報をログ記録しない!

自動化の世界にさらに移行する前に、ログを確認して、API キー、認証情報、またはシステムの不正侵入に繋がりうる情報などの機密データを出力しないようにする必要があります。Bitbucket Pipelines を使用してスクリプトを実行するとすぐにログが保存されて、リポジトリにアクセスできるすべてのユーザーが読み取れるようになります。

#2 - SSH キーを使用してリモート サーバーに接続する

認証は、多くの場合、自動化で最も厄介な部分の 1 つです。SSH キーには、リモート サーバーへの接続を管理しやすくして、さらにセキュリティが高いという二重のメリットがあります。Bitbucket Pipelines を使用すると、リモート サーバーに接続するためのパイプライン実行ごとに新しいキー ペアを簡単に生成できます

Bitbucket Pipelines から SSH キーを直接生成する

実行中のパイプラインから接続できるようにするには、リモート サーバーに公開キーをコピーするだけです。たとえば、サーバー 上の に SSH キーが設定されると (URL または IP アドレスを使用できます)、以下のスクリプトはパスワード入力不要で、/var/www ディレクトリの下にファイル一覧を表示します。

bitbucket-pipelines.yml

image: node:4.6.0
   pipelines:
      default:
        - step:
           script:
              - ssh <user>@<server> ls -l /var/www

接続する必要があるすべてのサーバーの [Know hosts (ホストを知る)] セクションへの登録を忘れないでください。そうしないと、リモート サーバーに接続しようとするとパイプラインが承認待ち状態で停止します。

#3 - API キーと認証情報にセキュリティが確保された環境を使用する

スクリプトの一部としてリモート API を使用する必要がある場合は、API プロバイダーが API キーで保護されたリソースを使用できる可能性があります。セキュリティが確保された環境変数を使用して、Bitbucket Pipelines に認証情報を安全に追加できます。保存すると、スクリプトで呼び出せるようになって、ログ出力ではマスクされたままになります。

Bitbucket Pipelines はセキュリティで保護された変数をログでマスクしたままにします

#4 - 非インタラクティブ モードでコマンドを実行する

スクリプトの一部として依存関係をインストールする必要がある場合は、ユーザーに検証や入力を求めるプロンプトが表示されないことを確認してください。非インタラクティブに実行できるフラグがあるかどうかを確認するには、使用しているコマンドのドキュメントを参照してください。

たとえば、以下のコマンドのフラグ -y は Debian サーバーに PostgreSQL をインストールします。

apt-get install -y postgresql

フラグ -q を使用すると、非インタラクティブな方法で Google Cloud SDK コマンドを実行できます。

gcloud -q app deploy app.yaml

#5 - 準備が整った独自の Docker イメージを構築する

パイプラインの実行に必要な依存関係のインストールには、時間がかかることがあります。アプリケーションをビルドしてテストするのに必要な基本的なツールとパッケージを使用して、独自の Docker イメージを作成することで、実行時間を大幅に節約できます。

たとえば、次の Pipelines 構成では、AWS CLI を最初にインストールして後で使用し、AWS Elastic Beanstalk にアプリケーションをデプロイします。

bitbucket-pipelines.yml

image: node:7.5.0
   pipelines:
      default:
       - step:
          script: # Modify the commands below to build your repository.
           - apt-get update && apt-get install -y python-dev
           - curl -O https://bootstrap.pypa.io/get-pip.py
           - python get-pip.py
           - pip install awsebcli --upgrade
           - npm install
           - npm test
           - eb init helloworld-beanstalk-bbp -r eu-west-1 -p node
           - eb deploy hw-eb-tutorial

ここでの課題は、AWS CLI がコミットごとに変更されないことです。つまり、デフォルトでバンドルできる依存関係をインストールする時間が無駄になります。

次の Dockerfile を使用して、Elastic Beanstalk デプロイ用のカスタム Docker イメージを作成できます。

Dockerfile

FROM node:7.5.0 
RUN apt-get update \   && apt-get install -y python-dev \   && cd /tmp \   && curl -O https://bootstrap.pypa.io/get-pip.py \   && python get-pip.py \   && pip install awsebcli --upgrade \   && apt-get clean \   && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

参照 spittet/my-custom-image の下でプッシュすると、Bitbucket Pipelines 構成を簡素化して、アプリケーションを構築、テスト、デプロイするために必要なコマンドのみを含められます。

bitbucket-pipelines.yml

image: spittet/my-custom-image
   pipelines:
     default:
       - step:
            script: # Modify the commands below to build your repository.
              - npm install
              - npm test
              - eb init helloworld-beanstalk-bbp -r eu-west-1 -p node
              - eb deploy hw-eb-tutorial

参照 spittet/my-custom-image の下でプッシュすると、Bitbucket Pipelines 構成を簡素化して、アプリケーションを構築、テスト、デプロイするために必要なコマンドのみを含められます。

最後のアドバイス: スクリプトはコードでもあります

これらのヒントは、手動タスクを Bitbucket Pipelines などのサービスによって繰り返し確実に実行できる自動プロセスに変換するのに役立ちます。最終的に、これらはリリースを保護して、複数のサーバーやプラットフォームにまたがる本番環境全体のデプロイをトリガーできる、強力なツールになります。

自動化スクリプトをコードとして扱ってコードと同じレビューと品質プロセスを実行する必要があるのは、このためです。幸いにも、これは Bitbucket で簡単に実行できます。パイプライン構成がコードでチェックインされて、適切なコンテキストでプル リクエストを作成できます。

最後に、スクリプトを本番環境に適用する前に、テスト環境でスクリプトを実行することを忘れないでください。このちょっとした作業によって、誤って本番データを消去することを防止できます。