GeekFactory

int128.hatenablog.com

Circle CIでCloud Functionをデプロイする

Circle CIからGoogle Cloud Functionsに関数をデプロイする方法を調べたのでメモします。

具体的には、GitHub → Circle CI → Cloud Source Repository → Cloud Functionの流れで継続的インテグレーションと継続的デプロイを行います。

  1. 開発者がGitHubリポジトリソースコードをpushする。
  2. Circle CIでビルドとテストを行う。
  3. Circle CIでCloud Source Repositoryに成果物をpushする。
  4. Cloud Source RepositoryからCloud Functionにデプロイが行われる。

開発者がCloud Source Repositoryに直接pushしてもよいのですが、CIをパスした場合のみデプロイしたい、あるいはビルドした成果物をデプロイしたい場合はCircle CIを経由させると実現できます。

設定方法

まず、Cloud Source Repositoriesで新しいリポジトリを作成します。リポジトリを作成したら、 “Generate and store your Git credentials” でSSHでアクセスするためのクレデンシャルを取得します。下記のような文字列が表示されるのでメモしておきます。

machine source.developers.google.com login **** password ****

Circle CIの管理コンソールで環境変数を設定します。

キー 設定値
GCLOUD_PROJECT GCPのプロジェクト名
GCLOUD_REPO Cloud Source Repositoriesのリポジトリ
NETRC リポジトリSSHでアクセスするためのクレデンシャル(前述)

circle.yml を作成します。

machine:
  node:
    version: 6

deployment:
  cloud-repository:
    branch: master
    commands:
      - echo "$NETRC" > "$HOME/.netrc"
      - git remote add google "https://source.developers.google.com/p/${GCLOUD_PROJECT}/r/${GCLOUD_REPO}"
      - git push google master -f

GitHubリポジトリにmasterブランチをpushしてみましょう。Circle CIでビルドが実行されて、Cloud Source Repositoriesのリポジトリが新しくなれば成功です。

最後に、Cloud Source RepositoryからデプロイするようにCloud Functionを設定すれば完了です。

APIキー等の秘密情報を追加してデプロイする

Circle CIで秘密情報を管理してデプロイ時に追加することで、公開リポジトリから秘密情報を切り出すことができます。(Cloud Functionsが環境変数に対応するまでのワークアラウンドですが)

deployment:
  cloud-repository:
    branch: master
    commands:
      - git config user.name circle
      - git config user.email circle@example.com
      - echo "$TWITTER_API_CREDENTIALS_JSON" > twitter-api-credentials.json
      - git add twitter-api-credentials.json
      - git commit -m 'Add Twitter API Credentials'
      - echo "$NETRC" > "$HOME/.netrc"
      - git remote add google "https://source.developers.google.com/p/${GCLOUD_PROJECT}/r/${GCLOUD_REPO}"
      - git push google master -f

ビルドした成果物をデプロイする

Babel等でビルドした成果物をデプロイしたい場合は、下記のように成果物をコミットしてからpushします。もしくは、新しいローカルリポジトリに成果物を追加してpushします。

deployment:
  cloud-repository:
    branch: master
    commands:
      - git config user.name circle
      - git config user.email circle@example.com
      - git add build
      - git commit -m 'Add build'
      - echo "$NETRC" > "$HOME/.netrc"
      - git remote add google "https://source.developers.google.com/p/${GCLOUD_PROJECT}/r/${GCLOUD_REPO}"
      - git push google master -f

第10回Jenkins勉強会でエモい話をした

第10回Jenkins勉強会に参加しました。

今回はMultibranch Pipelineの話が多かったですね。GitHub + Jenkinsでチーム開発する時のデファクトですね。

私は本番環境のリリースを自動化したエモい話をしました。

speakerdeck.com

LTだったので技術的な話は省きましたが、本番環境のリリースを自動化するには技術とプロセスの両者が必須です。12 Factor AppやContinuous Deliveryに書いてあることを地道に実践するのが良いと思います。検証環境と同じものを同じ方法で本番環境にリリースすることは大事です。

ビルド職人はJenkinsだけでなくアプリケーションフレームワークやインフラの知識も求められるし、継続的にサービスを改善するための仕組みを作る価値の高い仕事をしていると思います。なので、ビルド職人の需要がもっと増えて待遇もよくなるとよいですね。

勉強会運営のみなさま、ありがとうございました!

Google Cloud FunctionsでTwitter検索のRSSフィードを作る

Twitterの検索結果をRSSフィードで提供するサービスはいくつかありますが、リフレッシュ間隔がいまいちだったのでGoogle Cloud Functionsで自作することにしました。

Twitter Search APIの結果をRSSフィードに変換して返して、SlackでRSSフィードを購読します。

Twitter APIへのアクセスやRSSフィードの生成には以下のモジュールを利用することにしました。

Cloud Functionsでは管理コンソールからエディタでindex.jspackage.jsonを直接編集できるので便利です。

下記のようなスクリプトを書きます。

exports.search = (req, res) => {
  const { id } = req.query;
  if (id) {
    const client = new Twitter(credential);
    // idユーザのツイートを検索する
    client.get('search/tweets', {q: `from:${id}`}).then(tweets => {
      const feed = new Feed({
        id: id,
        title: `${id}'s Tweets`,
      });
      // フィードに追加する
      tweets.statuses.forEach(tweet => feed.addItem({
        id: tweet.id,
        title: tweet.text,
        date: new Date(tweet.created_at),
      }));
      res.status(200).contentType('application/xml').send(feed.rss2());
    });
  } else {
      res.status(400).end();
  }
};

あらかじめTwitter APIAPIキーを取得しておく必要があります。今のところ管理コンソールでは実行時の環境変数を設定できないようなので、ソースコードAPIキーを直書きしています。

デプロイしたらURLに ?id=username を付けてアクセスしてみましょう。RSSフィードが表示されるはずです。

ソースコードを下記に置いているのでご参考まで。

github.com