GitHub Actions,從入門到自動入墳
最近想把手邊的一組API改寫成Google Cloud Function (搭配Google Firestore),然後之前模擬面試有被提到要去了解CI/CD,所以就有了這篇筆記
參考Repo:https://github.com/nickchen120235/google-cloud-cicd
Workflow檔案
on決定這個workflow什麼時候觸發jobs的下一個key決定不同job在GitHub Actions的頁面顯示什麼名字runs-on無腦,除非有特殊需求ubuntu-latest就對了permissions參考https://github.com/google-github-actions/authsteps列出每一步要做什麼- 任何不希望被看到的東西要放在
secrets底下!!! (Repo/Settings/Secutiry/Secrets/Actions)- Google Cloud Project ID
- Google Cloud Authentication JSON
Google Cloud相關設定
Authentication
參考:https://github.com/google-github-actions/auth
- Google Cloud Console/IAM與管理/服務帳戶 (Service Accounts) 建立服務帳戶
- 「將專案存取權授予這個服務帳戶」:Cloud Functions管理員
- 「完成」
- 在管理頁面點進剛剛建的帳戶 -> 金鑰 -> 新增金鑰 -> 建立新的金鑰 -> 把json檔案的內容貼到GitHub那邊放secrets的地方
- 給權限:開啟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.serviceAccountUserSERVICE_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.json跟package-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完之後使用就可以使用gcloud、gsutil這兩個CLI工具,在佈署完後加上一個step去清就可以了
也就是像這樣的action.yml
btw如果Service Account是自訂的話,要多給一個storage.buckets.delete權限
Environment Variables
如果想要使用環境變數的話,在佈署的時候加一個選項env_vars就好
Bonus:要把npm的npm_package_version弄出去的話,把它加到GitHub Actions的$GITHUB_ENV就好,詳細寫法
參考資料
- gcloud iam service-accounts add-iam-policy-binding | Google Cloud CLI Documentation
- Using IAM to Authorize Access | Cloud Functions Documentation | Google Cloud
- google-github-actions/auth
- google-github-actions/deploy-cloud-functions
- Can I delete container images from Google Cloud Storage artifacts bucket? - Stack Overflow