gitlab-ciでfrontendをGCSへ自動アップロード
2022/01/16
フロントエンドをGCSへアップロードする際によく使用している.gitlab-ci.yml
に関しての紹介です。(備忘録も兼ねる)
.gitlab-ci.yml
普段使用している.gitlab-ci.yml
を簡潔にすると以下のような感じになります。
image: node:16-alpine
stages:
- build
- deploy
build:
stage: build
artifacts:
expire_in: 1 week
paths:
- out/
script:
- yarn install
- yarn build
- yarn export
only:
- master
deploy:
stage: deploy
image: google/cloud-sdk:alpine
script:
- echo $GCP_SERVICE_KEY > ${HOME}/gcloud-service-key.json
- gcloud auth activate-service-account --key-file ${HOME}/gcloud-service-key.json
- gcloud config set project $GCP_PROJECT_ID
- gsutil -m rsync -d -r out gs://バケット名
only:
- master
build
build stageのscript
でpackageのinstallとフロントエンドのbuildを行っています。
※ 例としてあげている.gitlab-ci.yml
はNext.jsの使用を想定しています。create-react-appやVue、Nuxt.jsを使用する場合は各々のbuild方法にあわせて修正してください。
build:
stage: build
artifacts:
expire_in: 1 week
paths:
- out/
script:
- yarn install
- yarn build
- yarn export
artifacts
ではbuildしたファイル群(out
フォルダ)を次のdeploy stage
でも使えるように設定しています。
deploy
deploy stageではbuildしたfile群(out
フォルダ)をgoogleのcloud-sdkを使用してGCSへアップロードします。
GCSへのアップロードには対象ProjectのIDと事前に適切な権限を持ったjson形式のservice account key
が必要です。
こちらの手順にしたがってservice account keyが作成できたら、gitlabのSettings > CI/CD > Variables
でProject IDとaccount keyの中身を登録しておきます。
ここで設定したVariablesは.gitlab-ci.yml
内で$Key名
とすることで環境変数として使用することができます。
secret keyなどの重要な情報は.gitlab-ci.yml
に直接書くのではなく、Variablesで設定することをおすすめします。
deploy:
stage: deploy
image: google/cloud-sdk:alpine
script:
- echo $GCP_SERVICE_KEY > ${HOME}/gcloud-service-key.json
- gcloud auth activate-service-account --key-file ${HOME}/gcloud-service-key.json
- gcloud config set project $GCP_PROJECT_ID
- gsutil -m rsync -d -r out gs://バケット名
only:
- master
ci全体を通して使用するdocker imageはnode:16-alpine
を指定していますが、
deploy stageではgoogleが提供しているimage(cloud-sdkが事前にinstallされている)を使用したいので、image: google/cloud-sdk:alpine
としています。
scriptのecho $GCP_SERVICE_KEY > ${HOME}/gcloud-service-key.json
では、gcloud-service-key.json
を作成し、事前に用意したGCPのservice keyの中身を書き込んでいます。
その後、そのkeyファイルをつかってservice accountを有効化し、project idを設定、
gsutil rsync
コマンドで対象バケットとbuildしたoutフォルダを同期する形でファイルをアップロードしています。