這個文章以一個簡單的Nodejs應用爲例,示例如何使用Github Actions來自動構建,測試和部署一個應用. node
<!-- more -->linux
首先簡單介紹下什麼是Github Actions? Github Actions是Github官方提供的一個與Github集成在一塊兒的CI/CD工具,使用Github Actions能夠很是容易地自動化你的全部軟件工做流程,包括持續集成(CI)和持續發佈(CD). git
不過要使用Github Actions,你須要將你的項目代碼庫放在Github上,而後爲代碼庫配置相應的工做流(Workflows). github
使用Github Actions來執行工做流任務,還須要一個可執行的環境,Actions Runner就是提供這樣的環境,Github Actions支持兩種類型的Runner:web
在Github Actions中有一個Action的概念,Actions是一個獨立的任務,你能夠組合這些任務成爲要完成一個工做的步驟. docker
在工做步驟中,你能夠本身寫執行命令組成Action,也能夠直接使用Github社區提供的針對一個寫公共任務的Actions,能夠到Github市場查找社區或者其餘開發人員編寫的Actions. npm
例如一個最經常使用的Action - checkout,可用來檢出代碼庫:json
- uses: actions/checkout@v2
除了以上概念以外,Github Actions還有其餘概念須要瞭解,具體可參考 (https://help.github.com/en/ac...ubuntu
接下來,咱們就那個簡單的nodejs應用來看看如何使用Github Actions建立CI/CD的流程. 緩存
首先,你的項目代碼庫須要放在Github上,例如 https://github/mengzyou/hello... ,訪問你的代碼庫主頁,而後點擊 Actions
進入Actions頁面.
根據你的代碼庫的語言類型,Github推薦了一些Workflow的模板,這裏咱們將使用Nodejs的模板
直接點擊 Set up this workflow
來應用這個模板,而後Github會直接打來Web編輯器來編輯這個模板文件
你能夠直接使用該文件,也能夠修改,添加須要的Actions,完成以後能夠點擊 Start commit
按鈕來提交Workflow文件,Github會自動爲代碼庫建立目錄 .github/workflows/
,以及把該文件放在該目錄下,例如 .github/workflows/nodejs.yml
.
提交以後,Github Actions就會根據Workflow的內容開始運行相應的工做.
其實咱們也能夠直接編輯本地代碼庫,添加目錄 .github/workflows/
,以及建立相應的Workflows配置文件,例如咱們建立一個 .github/workflows/nodejs.yml
name: Node.js CI on: push: branches: - master jobs: build: runs-on: ubuntu-latest container: node:12.16-alpine steps: - name: Checkout repository code uses: actions/checkout@v2 - name: Cache node modules uses: actions/cache@v1 env: cache-name: cache-node-modules with: path: ./node_modules key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-build-${{ env.cache-name }}- ${{ runner.os }}-build- ${{ runner.os }}- - name: Install Dependencies run: npm install - name: Test run: npm test env: CI: true
咱們就定義了一個Workflow,並命名爲 Node.js CI,將在master分支發生push時執行.而且定義了一個名爲 build 的工做(job),該工做將使用Github-Hosted Runner(ubuntu-latest,Github-Hosted Runner會虛擬化一個相應的操做系統環境),咱們也會使用容器來執行相應的步驟,這裏使用了Docker容器鏡像node:12.16-alpine
.
setps
定義將要執行的沒有個步驟,能夠給每一個步驟命名,也能夠直接調用相應的Actions,或者直接使用 -run
來執行命令.
上面的步驟中,有使用 actions/checkout@v2
來拉去代碼庫,也有使用 actions/cache@v1
來建立使用緩存(使用緩存可加速工做流的執行),而後使用直接行命令 npm install
和 npm test
的步驟.
當咱們編寫好以後,建立一個提交,而後Push到Github上master分支,就會出發一次定義的CI流程,以下圖所示
咱們能夠經過Github代碼庫的Actions
頁面查看Workflow執行的狀態和結果,也能夠查看執行的日誌.
在上面的示例中,咱們的工做流裏只有一個Job,就是測試代碼,咱們能夠添加更多的Job來只想其餘任務.例如打包咱們的應用,部署咱們的應用.
下面咱們就添加更多工做來完成咱們的整個CI/CD工做流.
咱們編輯 .github/workflows/nodejs.yml
文件,添加如下內容
package: runs-on: ubuntu-latest needs: build steps: - name: Checkout repository code uses: actions/checkout@v2 - name: Build & Push container image uses: mr-smithers-excellent/docker-build-push@v2 with: image: mengzyou/hellonode tag: latest registry: docker.io username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }}
咱們添加兩一個job - package,這個job將運行在Github-Hosted Runner(ubuntu-latest)上,needs
表示該job須要 build
job成功執行完成以後才執行.
包括了兩個步驟,拉取代碼庫,而後是使用 mr-smithers-excellent/docker-build-push@v2
Action來執行容器鏡像的構建和推送.
這個Action中,咱們還使用到了Github Actions的Secrets,Secrets能夠配置一些敏感的變量,到Github代碼庫設置的Secrets進行配置
這裏咱們配置了推送Docker鏡像到Dokcer Hub須要的用戶名和訪問憑證. 對於Docker Hub,推薦使用Docker Hub Access Token做爲訪問密碼.
咱們將Workflow提交到master分支後,在地一個build
工做以後,就發觸發這個job,打包鏡像並推送到Docker Hub.
接下來,爲了完成整個CI/CD的演示,咱們再添加一個job,名爲 deploy
. 對於這個job的執行,咱們須要使用一個Self-Hosted的Runner.
訪問代碼庫的Github界面,點擊Settings
,而後點擊左側邊欄的Actions
,再點擊Add runner
按鈕
按照彈出來的指導,在須要部署應用的服務器上安裝 action-runner
,這裏咱們選擇的是在一個Linux上安裝,成功啓動runner應用以後,會鏈接Github服務,在Gihub的Self-hosted runners
下能看到添加的runner的狀態,這樣添加的一個Self-hosted runner會具備標籤['self-hosted','linux','x86'],這些標籤將會用於job選擇合適runner來執行.
添加了Self-hosted Runner以後,咱們就能夠在Workflow裏添加相應的job了
deploy: runs-on: [self-hosted,linux] needs: package env: CONTAINER_IMAGE: mengzyou/hellonode CONTAINER_NAME: webapps_hellonode steps: - name: Docker pull image run: docker image pull $CONTAINER_IMAGE - name: Docker stop container run: docker container stop $CONTAINER_NAME - name: Docker remove container if: always() run: docker container rm -f $CONTAINER_NAME - name: Docker run container if: always() run: docker container run --name $CONTAINER_NAME -d -p 8000:3000 $CONTAINER_IMAGE - name: Prune images if: always() run: docker image prune -f # remove the dangling images
這裏,咱們將 runs-on
設置爲 [self-hosted,linux] 來選擇運行的Runner服務器,而後該job須要 package
job 成功完成以後纔會執行.
咱們還配置了兩個Job(.job.env)範圍內的變量來使用咱們的容器鏡像和名字.而後包含了如下執行步驟:
提交代碼,Push到master分支,這樣一個包含3個Jobs的Workflow就會自動執行,若是在任何一個Job中只想錯誤,都會中止後續的Jobs,而且給出反饋.
上面經過爲一個簡單的nodejs應用添加了Github Actions來完成了一個構建,打包,部署的CI/CD流程.經過使用Github Actions,能夠很容易地爲咱們放在Github上的項建立CI/CD流程,管理軟件開發的生命週期(SDLC).
Gihhub Actions相似於Gitlab的Gitlab-CI,以及[Jinkens](https://jenkins.io/zh/),還有不少第三方的CI/CD服務.
Github Actions是Github原生支持的,所以對於代碼庫管理在Github上的組織和用戶,更容易使用.