💭

.gcloudignoreの書き方

2020/11/30に公開4

.gcloudignore の設定が思ったとおりに、いかなかったのでまとめます。
.gitignoreと同じらしいですが、そもそもgitで今まで全体をignoreすることはやったことなかったので

基本はコチラに書いてあるのですが、わからなかった部分も含みます

https://cloud.google.com/sdk/gcloud/reference/topic/gcloudignore

# 始まりはコメントです

基本の考え

ファイル指定

以下パターンすべてプロジェクト直下のものが対象になります。
否定する場合は ! をつけます。
!a.txt というファイルをデプロイ対象にしたい場合は \ でエスケープします

.gcloudignore
a.txt # a.txtがデプロイされない
/a.txt # a.txtというファイルがデプロイされない
!a.txt # a.txtがデプロイされる
/\!a.txt # !a.txtというファイルがデプロイされない

ちなみに、上記で書いた場合、 a.txt はデプロイされ、 !a.txt はデプロイされません。後勝ち。

フォルダ指定

フォルダの場合は後ろに /をつける必要があります
以下パターンすべてプロジェクト直下のものが対象になります。

.gcloudignore
test/ # testというディレクトリがデプロイされない
!test/ # testというディレクトリがデプロイされる
/test/ # testというディレクトリがデプロイされない
!/test/ # testというディレクトリがデプロイされる

ちなみに、上記で書いた場合、 test の中身はデプロイされます。これも後勝ち。

自分がつまずいたこと

* がちょっと厄介でした。全部ignoreして、その後に対象のものだけ ! で対象ファイルやディレクトリを上書きしようとします。

.gcloudignore
*
!a.txt
!test/

とやった場合は a.txt だけがdeployされ、 test の中身はdeployされません(上書きができません)
代わりに、

.gcloudignore
*
!test/**

とやった場合は、 test ディレクトリの内容がuploadされます。
つまり、ディレクトリのignoreが若干勝手が違うということです。ファイルを指定すると考えてください。

まとめ

これで自分の意志通り、不要なものをdeployしなくても済むようになりますね。

最後に僕がGAE上でNuxt.jsのSPAをやる際にまとめた設定を載せておきます。package.jsonでのhttp-serverは適宜自分の利用したいものに変えてください

.gcloudignore
*
!/dist/**
!package.json
!package-lock.json
package.json
{
  "scripts": {
    "start": "http-server ./dist",
  },
}
app.yaml
runtime: nodejs12
instance_class: F1

handlers:
  - url: /_nuxt
    static_dir: dist/_nuxt
    secure: always

  - url: /(.*\.(gif|png|jpg|ico|txt))$
    static_files: static/\1
    upload: static/.*\.(gif|png|jpg|ico|txt)$
    secure: always

  - url: /.*
    script: auto
    secure: always

env_variables:
  HOST: "0.0.0.0"
  NODE_ENV: "production"

Discussion

大学生だった.大学生だった.

このやり方で全てのファイルを*無視した後で、deployしたいファイル!index.js, !package.jsonだけ指定したのですがデプロイ先が空でエラーになります。試しに上記のファイルを別のフォルダに移動させてデプロイしたら上手く行ったので .gcloudignoreの書き方に問題がある気がします。しかし、gcloud meta list-files-for-upload で確認すると評価結果はアップロードしたいファイルになっています。 何か考えられる原因はないでしょうか?

佐藤慧太佐藤慧太

全く気づかずすいません、これですが、パターンとしてはあり得るのってもはやgcloud commandのエラーということしか考えにくいんですよねぇ。。。
一応確認ではありますが、以下のような.cloudignoreであっていますでしょうか?

*
!index.js
!package.json
rnotornirnotorni

cloud functionsなどの場合は current dir も入れないといけない時があるらしいですね

+ !.

It's worth noting that the implementation of .gcloudignore seems to be subtly different between appengine and cloud functions - appengine .gcloudignore doesn't seem to require the explicit allow of current dir (!.), whereas cloud function deploy does.

https://stackoverflow.com/questions/52976199/gcloudignore-doesnt-allow-standard-wildcard-whitelist

佐藤慧太佐藤慧太

おお、なるほど、そういう場合があるんですね!
ありがとうございます