Search Results for ""

言語ガイド:Go

CircleCI では、Docker イメージにインストール可能な任意のバージョンの Go を使用して、Go プロジェクトをビルドできます。 お急ぎの場合は、以下の設定例をプロジェクトの root ディレクトリにある .circleci/config.yml にコピーし、ビルドを開始してください。

クイックスタート:デモ用の Goリファレンスプロジェクト

CircleCI 2.0 でのビルド方法を示すために、Go リファレンスプロジェクトを提供しています。

このプロジェクトには、コメント付きの CircleCI 設定ファイル .circleci/config.yml が含まれます。 このファイルは、Go プロジェクトで CircleCI 2.0 を使用するためのベストプラクティスを示しています。

設定例

version: 2 # CircleCI 2.0 を使用します
jobs: # 1回の実行の基本作業単位
  build: # Workflows を使用しない実行では、エントリポイントとして `build` ジョブが必要
    docker: # Docker でステップを実行します
      # CircleCI Go イメージは https://hub.docker.com/r/circleci/golang/ で入手できます
      - image: circleci/golang:1.8 #
      # CircleCI PostgreSQL イメージは https://hub.docker.com/r/circleci/postgres/ で入手できます
      - image: circleci/postgres:9.6-alpine
        environment: # プライマリコンテナの環境変数
          POSTGRES_USER: circleci-demo-go
          POSTGRES_DB: circle_test
    # ステップが実行されるディレクトリ。 パスは Go Workspace の要件に従う必要があります
    working_directory: /go/src/github.com/CircleCI-Public/circleci-demo-go

    environment: # ビルド自体のための環境変数
      TEST_RESULTS: /tmp/test-results # テスト結果を保存する場所のパス

    steps: # `build` ジョブを構成するステップ

      - checkout # ソースコードを作業ディレクトリにチェックアウトします
      - run: mkdir -p $TEST_RESULTS # テスト結果を保存するディレクトリを作成します

      - restore_cache: # 前回の実行以降の変更が検出されなかった場合、保存されているキャッシュを復元します
      # 依存関係キャッシュについては https://circleci.com/docs/ja/2.0/caching/ をお読みください
          keys:
            - v1-pkg-cache

      # 通常、このステップはカスタムプライマリイメージにあります
      # この例では、説明のためにここにステップを追加しました

      - run: go get github.com/lib/pq
      - run: go get github.com/mattes/migrate
      - run: go get github.com/jstemmer/go-junit-report

      #  CircleCi の Go Docker イメージには netcat が含まれています
      #  このため、DB ポートをポーリングして、ポートが開放されていることを確認してから処理を続行できます

      - run:
          name: Postgres が準備できるまで待機
          command: |
            for i in `seq 1 10`;
            do
              nc -z localhost 5432 && echo Success && exit 0
              echo -n .
              sleep 1
            done
            echo Failed waiting for Postgres && exit 1

      - run:
          name: 単体テストを実行
          environment: # データベース URL と移行ファイルのパスのための環境変数
            CONTACTS_DB_URL: "postgres://circleci-demo-go@localhost:5432/circle_test?sslmode=disable"
            CONTACTS_DB_MIGRATIONS: /go/src/github.com/CircleCI-Public/circleci-demo-go/db/migrations
          # テスト結果を $TEST_RESULTS ディレクトリに保存します
          command: |
            trap "go-junit-report <${TEST_RESULTS}/go-test.out > ${TEST_RESULTS}/go-test-report.xml" EXIT
            make test | tee ${TEST_RESULTS}/go-test.out

      - run: make # プロジェクトの依存関係をプルしてビルドします

      - save_cache: # キャッシュを /go/pkg ディレクトリに保存します
          key: v1-pkg-cache
          paths:
            - "/go/pkg"

      - run:
          name: サービスを開始
          environment:
            CONTACTS_DB_URL: "postgres://circleci-demo-go@localhost:5432/circle_test?sslmode=disable"
            CONTACTS_DB_MIGRATIONS: /go/src/github.com/CircleCI-Public/circleci-demo-go/db/migrations
          command: ./workdir/contacts
          background: true # サービスを実行したまま次のステップに進みます

      - run:
          name: サービスが稼働中であることをバリデーション
          command: |
            sleep 5
            curl --retry 10 --retry-delay 1 -X POST --header "Content-Type: application/json" -d '{"email":"test@example.com","name":"Test User"}' http://localhost:8080/contacts

      - store_artifacts: # アーティファクト (https://circleci.com/docs/ja/2.0/artifacts/) に表示するテストサマリーをアップロードします
          path: /tmp/test-results
          destination: raw-test-output

      - store_test_results: # テストサマリー (https://circleci.com/docs/ja/2.0/collect-test-data/) に表示するテスト結果をアップロードします
          path: /tmp/test-results

CircleCI のビルド済み Docker イメージ

CircleCI のビルド済みイメージを使用することをお勧めします。このイメージには、CI 環境で役立つツールがプリインストールされています。 Docker Hub (https://hub.docker.com/r/circleci/golang/) から必要なバージョンを選択できます。 デモプロジェクトでは、公式 CircleCI イメージを使用しています。

デモプロジェクトのビルド

CircleCI を初めて使用する際は、プロジェクトをご自身でビルドしてみることをお勧めします。 以下に、ユーザー自身のアカウントを使用してデモプロジェクトをビルドする方法を示します。

  1. GitHub 上のプロジェクトをお使いのアカウントにフォークします。
  2. CircleCI で [Add Projects (プロジェクトの追加)] ページにアクセスし、フォークしたプロジェクトの横にある [Build Project (プロジェクトのビルド)] ボタンをクリックします。
  3. 変更を加えるには、.circleci/config.yml ファイルを編集してコミットします。 コミットを GitHub にプッシュすると、CircleCI がそのプロジェクトをビルドしてテストします。

変更をローカルでテストする場合は、CircleCI の CLI ツールを使用して circleci build を実行します。


設定の詳細

このセクションでは、.circleci/config.yml 内のコマンドについて説明します。

config.yml は必ず version キーから始まります。 このキーは、互換性を損なう変更に関する警告を表示するために使用されます。

version: 2

次に、jobs キーを置きます。 どのコンフィグファイルにも「build」ジョブを含める必要があります。 これが、CircleCI によって自動的に選択され実行される唯一のジョブです。

このジョブで、working_directory を指定します。 Go では、Go Workspace の構造が厳密に定められているため、その要件を満たすパスを指定する必要があります。

version: 2
jobs:
  build:
    working_directory: /go/src/github.com/CircleCI-Public/circleci-demo-go

他のディレクトリが指定されない限り、以降の job ではこのパスがデフォルトの作業ディレクトリとして使用されます。

working_directory のすぐ下の docker で、このジョブのプライマリコンテナイメージを指定します。

    docker:
      - image: circleci/golang:1.8

ここで使用するカスタムイメージは golang:1.8.0 に基づいており、netcat も含まれます (後で使用します)。

さらに、PostgreSQL のイメージを使用し、データベースの初期化に使用する 2つの環境変数を指定します。

      - image: circleci/postgres:9.4.12-alpine
        environment:
          POSTGRES_USER: root
          POSTGRES_DB: circle_test

Docker を設定したら、テスト結果のパスを保存する環境変数を設定します。

    environment:
      TEST_RESULTS: /tmp/test-results

この build ジョブ内にいくつかの steps を追加する必要があります。

checkout ステップを使用して、ソースコードをチェックアウトします。 デフォルトでは、working_directory で指定されたパスにソースコードがチェックアウトされます。

    steps:
      - checkout

次に、テスト結果を収集するためのディレクトリを作成します。

      - run: mkdir -p $TEST_RESULTS

その後、キャッシュをプルダウンします (ある場合)。 初回実行時にはこの処理は実行されません。

      - restore_cache:
          keys:
            - v1-pkg-cache

JUnit レポート作成ツールの Go 実装とアプリケーションの他の依存関係をインストールします。 これらは、プライマリコンテナにプリインストールしておくと便利です。

      - run: go get github.com/lib/pq
      - run: go get github.com/mattes/migrate
      - run: go get github.com/jstemmer/go-junit-report

両方のコンテナ (プライマリと Postgres) が同時に起動されます。ただし、Postgres の準備には少し時間がかかるため、その前にテストが開始するとジョブが失敗します。 このため、依存サービスが準備できるまで待機することをお勧めします。 ここでは Postgres のみを使用するため、以下のようにステップを追加します。

      - run:
          name: Postgres が準備できるまで待機
          command: |
            for i in `seq 1 10`;
            do
              nc -z localhost 5432 && echo Success && exit 0
              echo -n .
              sleep 1
            done
            echo Failed waiting for Postgres && exit 1

netcat が CircleCI Go イメージにインストールされているのはこのためです。 これを使用して、このポートが開放されていることをバリデーションします。

次はテストの実行です。 そのためには、データベースの URL と DB 移行ファイルのパスを指定する環境変数を設定する必要があります。 このステップには、以下のようにいくつかの追加コマンドが必要です。

      - run:
          name: 単体テストを実行
          environment:
            CONTACTS_DB_URL: "postgres://rot@localhost:5432/circle_test?sslmode=disable"
            CONTACTS_DB_MIGRATIONS: /go/src/github.com/CircleCI-Public/circleci-demo-go/db/migrations
          command: |
            trap "go-junit-report <${TEST_RESULTS}/go-test.out > ${TEST_RESULTS}/go-test-report.xml" EXIT
            make test | tee ${TEST_RESULTS}/go-test.out

このプロジェクトでは、make を使用してビルドとテストを行っているため、make test を実行するだけです (Makefile の内容はこちらのページで参照)。 テスト結果を収集して後からアップロードするために、ここでは go-junit-report を使用します (テスト結果の詳細についてはプロジェクトのチュートリアルを参照)。

make test | go-junit-report > ${TEST_RESULTS}/go-test-report.xml

この場合、make test からの出力は、stdout に表示されることなく、すべて go-junit-report に直接渡されます。 その問題を解決するには、teetrap という、2つの Unix 標準コマンドを使用します。 最初のコマンドを使用すると、出力を stdout または別の場所に複製することができます (詳細についてはこちらのページを参照)。 2つめのコマンドを使用すると、スクリプトの終了時に実行するコマンドを指定できます (詳細についてはこちらのページを参照)。 つまり、以下のように記述できます。

trap "go-junit-report <${TEST_RESULTS}/go-test.out > ${TEST_RESULTS}/go-test-report.xml" EXIT
make test | tee ${TEST_RESULTS}/go-test.out

単体テストが正常に終了したら、サービスを開始し、それが実行中であることをバリデーションします。

      - run: make

      - save_cache:
          key: v1-pkg-cache
          paths:
            - ~/.cache/go-build

      - run:
          name: サービスを開始
          environment:
            CONTACTS_DB_URL: "postgres://root@localhost:5432/circle_test?sslmode=disable"
            CONTACTS_DB_MIGRATIONS: /go/src/github.com/CircleCI-Public/circleci-demo-go/db/migrations
          command: ./workdir/contacts
          background: true

      - run:
          name: サービスが稼働中であることをバリデーション
          command: curl --retry 10 --retry-delay 1 --retry-connrefused http://localhost:8080/contacts/test

make を使用してプロジェクトの依存関係をプルおよびビルドしたら、ビルドされたパッケージをキャッシュに保存します。 この方法で Go プロジェクトの依存関係をキャッシュすることをお勧めします。

サービスを開始するには、最初にそれをビルドする必要があります。 その後、テストステップで使用したものと同じ環境変数を使用して、サービスを開始します。 background: true を使用してサービスの実行を継続し、次のステップに進みます。このステップで、curl を使用して、サービスが正常に開始されたことと、サービスがリクエストに応答していることをバリデーションします。

最後に、テストの結果を保存するパスを指定します。

      - store_test_results:
          path: /tmp/test-results

完了です。 これで Go アプリケーション用に CircleCI 2.0 を設定できました。CircleCI でビルドを行うとどのように表示されるかについては、ジョブページを参照してください。

関連項目

デプロイターゲットの設定例については、「デプロイの設定」を参照してください。

キャッシュの詳細については、「依存関係のキャッシュ」を参照してください。