GAミント至上主義

Web Monomaniacal Developer.

Google Cloud Buildの完了をCloud Functionsで受け取る

GitHubへのPushからCloud Buildで自動ビルド&Container Registoryにアップロードまでができた続き。

uyamazak.hatenablog.com

Cloud Pub/Subに

projects/{project id}/topics/gcr

というトピックが勝手にできていて、gcrはGoogle Cloud Registoryだと思うので、何かのタイミングでここにメッセージが来ると予想。

でもググると、GCRではなくCloud Buildの方もPub/Subトピックが自動で出来てると下記には書いてあるけど自分のプロジェクトにはない。なぜ?

ビルド通知の送信  |  Cloud Build  |  Google Cloud

試しにCloud BuildのAPIをオンオフしてみたらFunctions側で選択できるようになった。

とりあえずデフォルトのコードを使いログ出力だけしてみる。
f:id:uyamazak:20190121184044p:plain

トピックcloud-buildsこんなのが出た。QUEUED、WORKING、SUCCESSの三種。ビルド開始、成功、失敗(未確認)をslackに流すならこっちかも
f:id:uyamazak:20190121185810p:plain

トピックgcrはINSERTでアップしたイメージのURLが来るので、自動デプロイするならこっちが必要になりそう。Functionsでできるのだろうか。
f:id:uyamazak:20190121185940p:plain

Google Cloud Platform エンタープライズ設計ガイド

Google Cloud Platform エンタープライズ設計ガイド

WSL(Windows Subsystem for Linux)でDockerを動かす(使えない)

2019/1/21追記

Docker Desktop for Windowsは動いた(使えそう)
docs.docker.com

追記ここまで

普段の開発はLinux上で行っているけど、WSLに関してはLinux信者として興味があり、以前Bash on Windowsを動かしてみたりはしてた。
でも日本語がダメだったり、普通にLinuxが使える環境であれば実用性はなく放置してたけど、最近Dockerが動くようになったと聞くようになったので試してみた。
Amazonプライムで2019年のアニメがいろいろ始まったけどまだ何見ていいかわからない状態。

WSL(Windows Subsystem for Linux)に関してはここらへん
qiita.com

参考はここらへん。
qiita.com
qiita.com

Microsoft StoreからUbuntu16.04を入れ、上記記事を参考にdockerをインストールしたが動かなかった。
その後、Windowsアップデートをして下記バージョンにしたところ、hello-worldやnginxは動くようになった。

f:id:uyamazak:20190116165552p:plain

じゃあさっそく自分が作ってるアプリを動かしてみようと下記のnode、puppeteerを使ったPDFサーバーをcloneしてビルドしてみたところ失敗。

github.com

Unpacking dh-python (2.20170125) ...
Setting up libpython3.5-minimal:amd64 (3.5.3-1+deb9u1) ...
Setting up python3.5-minimal (3.5.3-1+deb9u1) ...
Traceback (most recent call last):
  File "/usr/lib/python3.5/py_compile.py", line 186, in <module>
    sys.exit(main())
  File "/usr/lib/python3.5/py_compile.py", line 178, in main
    compile(filename, doraise=True)
  File "/usr/lib/python3.5/py_compile.py", line 136, in compile
    os.makedirs(dirname)
  File "/usr/lib/python3.5/os.py", line 241, in makedirs
    mkdir(name, mode)
OSError: [Errno 39] Directory not empty: '/usr/lib/python3.5/__pycache__'
dpkg: error processing package python3.5-minimal (--configure):
 subprocess installed post-installation script returned error exit status 1
dpkg: dependency problems prevent configuration of python3-minimal:
 python3-minimal depends on python3.5-minimal (>= 3.5.3-1~); however:
  Package python3.5-minimal is not configured yet.

dpkg: error processing package python3-minimal (--configure):
 dependency problems - leaving unconfigured
Errors were encountered while processing:
 python3.5-minimal
 python3-minimal
W: Download is performed unsandboxed as root as file '/var/cache/apt/archives/partial/fontconfig_2.11.0-6.7+b1_amd64.deb' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)
E: Sub-process /usr/bin/dpkg returned an error code (1)
The command '/bin/sh -c wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -   && sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'   && apt-get update   && apt-get install -y google-chrome-stable --no-install-recommends   && rm -rf /var/lib/apt/lists/*   && rm -rf /src/*.deb' returned a non-zero code: 100
uyamazak@windows10pro:~/hcep-pdf-server$ sudo docker build -t hcep-pdf-server:latest .

chromeインストールでこけている。

もしかして開発に使ってるLinux(Ubuntu16.04)でだけ?と思ったけど、GCPのCloud Buildでもビルドは成功しているのでWSL側の問題である確率の方が高そう。
エラー出してる部分をなんとか直せば上手くいくのかもしれないけど、使わないWSLのためにそこまでしたくない。

開発作業以外なら、Windowsでも社内の事情、ハードウェアの自由もあるし全然嫌ではない。

でも開発環境はVM、ハイパーバイザーなどを使わない素に近いLinux、強いて言えば本番環境に近いLinux、強いて言えばDebian, Ubuntuがいいなぁと改めて思った。

Firebaseでユーザー作成/削除時にFunctionsでなんかやる

今更ゾンビランドサガを見始めて宮野節を堪能してます。
yagish履歴書でユーザー側でのアカウント削除を実装するにあたり、退会率などをみるため、せめてログには残したいと思った。
おかげさまで退会率は1%以下で使用するユーザーはかなり限られるため最低限の実装を予定。

自分でアカウントを削除させる処理

削除は下記公式どおり、ユーザーオブジェクトのdelete()を実行するだけ。
だけどログインしてから一定(詳細は不明)時間経つとエラーになるので、一度ログアウトし、再度ログインをしてもらう必要があった。
実行するまで切れてるか分からないので、エラーが出たら再ログインを求める案内文言でカバー。

var user = firebase.auth().currentUser;

user.delete().then(function() {
  // User deleted.
}).catch(function(error) {
  // An error happened.
});

https://firebase.google.com/docs/auth/web/manage-users?hl=ja#delete_a_user

Functions側

とりあえずログに出すだけ。
user(UserRecord)を受け取れるのでそれを使っていろいろできる。

exports.loggingUserCreate = functions
  .auth
  .user()
  .onCreate(user => {
    const data = JSON.stringify(user.toJSON())
    console.log(`account created ${data}`)
    return true
  })

userが持っている情報は下記ドキュメント
Interface: UserRecord  |  Firebase

最後のreturnは

Function returned undefined, expected Promise or value

というエラーが出るのでつけているが値に特に意味はなさそう。

ログであればemail, uidなど指定で出したほうがいいけど、とりあえずtoJSONで全部出して試してた段階。

登録、退会時に通知メールを送るにはSendGridなどを使う必要がありそう。
社内向けなら以前書いたようなHangOutsチャット連携もありかもしれない。

uyamazak.hatenablog.com

あとはuidを元にfirestoreに保存してあるデータを削除するのがよくやりそうだけど、yagishの場合はユーザー側に機能があるのでそちらで明示的にやってもらうことを考えている。