Circle CIでCloud Functionをデプロイする
Circle CIからGoogle Cloud Functionsに関数をデプロイする方法を調べたのでメモします。
具体的には、GitHub → Circle CI → Cloud Source Repository → Cloud Functionの流れで継続的インテグレーションと継続的デプロイを行います。
- 開発者がGitHubのリポジトリにソースコードをpushする。
- Circle CIでビルドとテストを行う。
- Circle CIでCloud Source Repositoryに成果物をpushする。
- 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でチーム開発する時のデファクトですね。
私は本番環境のリリースを自動化したエモい話をしました。
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.js
とpackage.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 APIのAPIキーを取得しておく必要があります。今のところ管理コンソールでは実行時の環境変数を設定できないようなので、ソースコードにAPIキーを直書きしています。
デプロイしたらURLに ?id=username
を付けてアクセスしてみましょう。RSSフィードが表示されるはずです。
ソースコードを下記に置いているのでご参考まで。