GitHub Actions,從入門到自動入墳

最近想把手邊的一組API改寫成Google Cloud Function (搭配Google Firestore),然後之前模擬面試有被提到要去了解CI/CD,所以就有了這篇筆記

參考Repo:https://github.com/nickchen120235/google-cloud-cicd

Workflow檔案

  1. on決定這個workflow什麼時候觸發
  2. jobs的下一個key決定不同job在GitHub Actions的頁面顯示什麼名字
  3. runs-on無腦ubuntu-latest就對了,除非有特殊需求
  4. permissions參考https://github.com/google-github-actions/auth
  5. steps列出每一步要做什麼
  6. 任何不希望被看到的東西要放在secrets底下!!! (Repo/Settings/Secutiry/Secrets/Actions)
    • Google Cloud Project ID
    • Google Cloud Authentication JSON

Google Cloud相關設定

Authentication

參考:https://github.com/google-github-actions/auth

  1. Google Cloud Console/IAM與管理/服務帳戶 (Service Accounts) 建立服務帳戶
  2. 「將專案存取權授予這個服務帳戶」:Cloud Functions管理員
  3. 「完成」
  4. 在管理頁面點進剛剛建的帳戶 -> 金鑰 -> 新增金鑰 -> 建立新的金鑰 -> 把json檔案的內容貼到GitHub那邊放secrets的地方
  5. 給權限:開啟Google Cloud Shell -> (設定當前專案gcloud config set project <PROJECT_ID>) -> gcloud iam service-accounts add-iam-policy-binding <SERVICE_ACCOUNT> --member=serviceAccount:<CICD_ACCOUNT> --role=roles/iam.serviceAccountUser
    • SERVICE_ACCOUNT填你在IAM與管理看到的以appspot.gserviceaccount.com結尾的帳號
    • CICD_ACCOUNT填在第一步建立的帳號

GitHub Actions的部份只要注意with/credentials_json有設好就好

Deploy

沒什麼好寫的,參考https://github.com/google-github-actions/deploy-cloud-functions即可

唯一值得注意的是region不要寫錯

還有Functions deploy完預設是只有authenticated的使用者才可以存取,要開給所有人的話參考https://cloud.google.com/functions/docs/securing/managing-access-iam#after_deployment

NPM packages?

可以使用require去引用其他的package,但是要記得把package.jsonpackage-lock.json一起複製到build/(或到時候deploy的資料夾),這樣在Google Cloud Functions那端deploy的時候就不會有問題

us.artifacts.<PROJECT_ID>.appspot.com

要客家就要把東西清乾淨

想說換區了應該不會再被收錢了吧,結果還是有消費紀錄,打開Google Cloud Console一看才發現有一個multi-region的bucket出現在那邊,有人在搞?

餵狗之後才發現說那是Cloud Build留下來的痕跡,由於Cloud Functions在佈署的時候會使用Cloud Build,所以就會留下一堆container的cache

手動清除是沒有問題,可是既然都用CI/CD了,當然這個部份也要自動化

Google有提供一個Setup Google Cloud SDK的GitHub Action在Authentication完之後使用就可以使用gcloudgsutil這兩個CLI工具,在佈署完後加上一個step去清就可以了

也就是像這樣的action.yml

btw如果Service Account是自訂的話,要多給一個storage.buckets.delete權限

Environment Variables

如果想要使用環境變數的話,在佈署的時候加一個選項env_vars就好

Bonus:要把npm的npm_package_version弄出去的話,把它加到GitHub Actions的$GITHUB_ENV就好,詳細寫法

參考資料