🌊

GCP/GAE環境にて、デプロイバージョンに使えそうな値の取得

2021/09/12に公開

本職のサーバ開発者の大多数は、バージョン管理をしており、またなんらかの形で、デプロイ時の記録とそれを突き合わせてることだろう。

デプロイスクリプトと同時に、「今デプロイしたはずだ」的なマーキングを闇雲にcommitしてもよいが、デプロイ先サーバから客観的に「確かに最新版がデプロイできた」ことを確認できたほうが都合が良いだろう。

GCP python27 ランタイムにて、小生が愛用していた方法があるが、python37 ランタイムでも同質の方法が使えることがわかったので紹介しておく。

なおこの方法は無保証である。

python27 ランタイム

2024年1月30日にpython27 ランタイムのサポート終了が確定している。

https://cloud.google.com/appengine/docs/standard/lifecycle/support-schedule?hl=ja

サーバサイドでの実行ディレクトリは次のとおりになっている
これはサーバサイドでエラーを出せば、スタックトレースから簡単に読み取れる。

/base/data/home/apps/s~$PROJECT/$VERSION.$TIMESTAMP/

$VERSION もしくは $TIMESTAMP どちらかの値が書き換わるため、概ねデプロイ機会に対してユニークな文字列が得られる。

※タイムスタンプは64ビットのように見受けられる。が、時刻に戻そうとしたことはない。

具体的には、次の通りのスクリプトでデプロイ機会ユニークな文字列が得られる。

DEPLOYVER="-".join(__file__.split("/")[5:6])

python37 ランタイム

同じくpythonなので、例外を吐かせてスタックトレースが確認できる。のだが、 GCP側のデプロイ処理が大幅に変わったらしく、前述の通りの方法では取得できなくなった。

具体的には、スクリプトの格納ディレクトリが一意 /srv になり、しかもこのディレクトリおよび以降のファイル郡のタイムスタンプからは常に epochtime==0が得られる。つまりデプロイ時刻の目安としてはまったく使えなくなった。

python3ランタイムと同時期に、dockerベースのフレキシブル環境が提供されたので、python37版スタンダード環境もなんらかの形でこれを利用してるのだろうと思われる。

試行錯誤のすえ、次のディレクトリのタイムスタンプが使えそうなことを発見した。

/home

タイムスタンプなので、当然値はintとなる。

DEPLOYVER=os.path.getmtime("/home/.")

今後も同じ方法で取得できるかどうかは注意が必要だと思われる。

Discussion