如果要問軟體工程師有什麼共通點,那想必是大家都有個GitHub帳號吧!在這裡可以看到許多大神們公開分享的程式碼,幫助無數人省下一整天時間;許多工程師們自己平常閒暇之餘的小專案也都會公開分享,GitHub可以說是工程師們的社交平台,軟體工程師的工作面試也經常被問到是否有經營GitHub,我想GitHub是最快讓人瞭解你寫程式的風格以及是否會在閒暇之餘自我學習成長的地方。
GitHub Actions是什麼?
我在工作上的團隊使用GitHub作為代管平台,因此就順勢使用GitHub Actions來作為CI/CD的工具,GitHub Actions是一個即開即用的工具,它可以配合Git可版本控制,監聽git上面的event做出自動化的行為,例如,你可以監聽某個特定程式庫、分支是否有新的push,又或是團隊有人推送新的tag,都可以作為GitHub Actions自動作動的event。
我為什麼要寫這篇文章?
在建構自家團隊的GitHub Actions時遭遇到許多小問題,期望這篇文章可以作為入門的教學,讓你少走點歪路。這邊文章會介紹大部分關鍵的基礎步驟,剩下的就是自己的部署環境需要客製化的部分了。
若你剛好也是使用GitHub作為你的程式碼代管平台,那麼直接使用GitHub Actions絕對是你最快速方便的首選,你不需要安裝任何東西,也不會有後需要維護的問題。
過去我為團隊建置過Jenkins,前置作業需要建置環境安裝Jenkins,而Jenkins設置完成後還需要幫團隊設置帳號等等的一堆工作需要做,如今有剛好有個現成工具,就直接拿來使用減少重複造輪子的時間。
GitHub Actions基本觀念
GitHub Actions的設定是放在程式庫根目錄底下的「.github/workflows」資料夾內,用一個YAML檔來描述所有自動化的流程。你可以從GitHub Actions官網找到所有需要學習的知識,用官網的實例說明幫助你快速上手:
我們把整個流程視覺化就長得像上圖那樣,意思是:有個Event監聽「push」這個動作,當Event被觸發就會依序執行設定好的「Job」內的四個步驟,設定流程YAML檔案如下:
name: learn-github-actions
on: [push]
jobs:
check-bats-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '14'
- run: npm install -g bats
- run: bats -v
逐行解析內容如下:
name: learn-github-actions
顯示在GitHub Actions側邊欄的名稱
on: [push]
監聽的項目,這裡是監聽所有「push」的event,可以是別人發的PR、送出的分支push
jobs:
job集中定義的地方
check-bats-version:
job的名稱
runs-on: ubuntu-latest
決定job要運行在哪個平台(runner)
steps:
多個步驟集中定義的地方
- uses: actions/checkout@v3
這裡使用「uses」關鍵字,在你指定的平台上執行actions/checkout@v3 action。
- uses: actions/setup-node@v3
with:
node-version: '14'
執行actions/setup-node@v3 action,安裝Node.js版本14。
- run: npm install -g bats
「run」就是在你指定的平台上執行script,用npm安裝bats
- run: bats -v
執行指令查看bats的版本
執行結果如下圖所示:
以上的流程可以從官網的教學文件中找到
實際案例展示
接著就根據自己實際的環境來調整吧!
我使用Express.js開發一個簡易的網頁應用,使用GitHub作為我的程式碼管理平台,透過AWS的服務Elastic Beanstalk協助處理基礎建設上的繁雜程序方便教學。這篇文章專注在使用GitHub Actions,AWS EB設置的部份知識量比較龐大,未來也許有機會寫一篇教學文,在此就不詳細說明了。
首先將git以及AWS EB設置完成後,新增GitHub actions的YAML檔案於「.github/workflows」如下:
name: Softaverse Demo GitHub Actions
on:
push:
branches:
- master
env:
AWS_ENVIRONMENT_NAME: Testapp-env
AWS_DEFAULT_REGION: ap-southeast-1
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '16.x'
registry-url: 'https://registry.npmjs.org'
- name: Install
run: |
node -v
npm install
- name: Deploy
uses: hmanzur/[email protected]
with:
command: 'deploy ${{ env.AWS_ENVIRONMENT_NAME }}'
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: ${{ env.AWS_DEFAULT_REGION }}
在這裡我用到了環境變數env,提供workflow後面部署的步驟必要變數
env:
AWS_ENVIRONMENT_NAME: Testapp-env
AWS_DEFAULT_REGION: ap-southeast-1
以及名為secrets的context,這是設置在GitHub Repo內的設定參數,兩者皆是AWS EB部署時需要用到的參數,如果是商業應用,一些比較敏感的資料如資料庫帳號、密碼就可以存放在這邊,GitHub會幫你加密不會洩漏出去,在自動部署時可以呼叫變數出來使用。
最後一段部署的部份會根據自己的專案環境而有所不同,在這邊以AWS EB為例方便快速部署,減少伺服器設置上的步驟:
- name: Deploy
uses: hmanzur/[email protected]
with:
command: 'deploy ${{ env.AWS_ENVIRONMENT_NAME }}'
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: ${{ env.AWS_DEFAULT_REGION }}
這邊直接拿別人寫好的action來使用,直接將express的應用部署到AWS EB上!順帶一提,別人寫好的acton必須是開放原始碼才能上架至GitHub marketplace,若有任何疑慮可以自行去檢視原始程式碼是否有問題喔!或者自己動手寫一個專屬自己的action。
以上設置就完就大功告成了!整個CD流程,執行的結果如下:
進入AWS EB稍微檢查一下部署結果也成功了!
透過網頁瀏覽器檢視網頁結果正常,如此一來全部的自動化部署流程就確定順利完成囉!
結論
這篇文章主要想教大家如何使用GitHub Actions,透過簡單的範例分享以及步驟解析,希望能幫助大家減少入門研究的時間,並且針對你自己的應用能夠帶來啟發。
實務上透過自動化工具能夠幫助團隊大大減少重複性的工作時間,讓整個團隊運作起來更有效率,這也是我一直專注在自動化工具的原因,我就懶XD。希望大家能跟我一起成為最懶的那個工程師(?
這邊也提供上面Demo的程式碼供大家參考囉!
喜歡運用科技工具提升工作效率、並自主開發實用小工具的長時間使用電腦工作者。對新科技工具深感興趣,樂於分享如何運用科技工具提升生活和工作效率的技巧。