使用Github Actions建立CI/CD工做流

這個文章以一個簡單的Nodejs應用爲例,示例如何使用Github Actions來自動構建,測試和部署一個應用. node

<!-- more -->linux

什麼是Github Actions

首先簡單介紹下什麼是Github Actions? Github Actions是Github官方提供的一個與Github集成在一塊兒的CI/CD工具,使用Github Actions能夠很是容易地自動化你的全部軟件工做流程,包括持續集成(CI)和持續發佈(CD). git

不過要使用Github Actions,你須要將你的項目代碼庫放在Github上,而後爲代碼庫配置相應的工做流(Workflows).  github

Github-Actions

Actions Runner

使用Github Actions來執行工做流任務,還須要一個可執行的環境,Actions Runner就是提供這樣的環境,Github Actions支持兩種類型的Runner:web

  • Github-Hosted Runner : 由Github官方提供和維護的Runner服務器,不須要用戶本身維護和更新,有支持Linnux,Windows,macOS環境的構建
  • Self-Hosted Runner : 用戶本身使用本地機器,雲服務器安裝Actions應用,用戶能夠自定義硬件,軟件等需求

Actions

在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應用示例

接下來,咱們就那個簡單的nodejs應用來看看如何使用Github Actions建立CI/CD的流程. 緩存

首先,你的項目代碼庫須要放在Github上,例如 https://github/mengzyou/hello... ,訪問你的代碼庫主頁,而後點擊 Actions 進入Actions頁面.

Access-Actions

根據你的代碼庫的語言類型,Github推薦了一些Workflow的模板,這裏咱們將使用Nodejs的模板  

nodejs-template

直接點擊 Set up this workflow 來應用這個模板,而後Github會直接打來Web編輯器來編輯這個模板文件

nodjs-workflow-editor

你能夠直接使用該文件,也能夠修改,添加須要的Actions,完成以後能夠點擊 Start commit 按鈕來提交Workflow文件,Github會自動爲代碼庫建立目錄 .github/workflows/,以及把該文件放在該目錄下,例如 .github/workflows/nodejs.yml .  

提交以後,Github Actions就會根據Workflow的內容開始運行相應的工做.

建立一個執行測試CI工做流

其實咱們也能夠直接編輯本地代碼庫,添加目錄 .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流程,以下圖所示

nodejs-build-job

咱們能夠經過Github代碼庫的Actions頁面查看Workflow執行的狀態和結果,也能夠查看執行的日誌.

在上面的示例中,咱們的工做流裏只有一個Job,就是測試代碼,咱們能夠添加更多的Job來只想其餘任務.例如打包咱們的應用,部署咱們的應用.

下面咱們就添加更多工做來完成咱們的整個CI/CD工做流.

添加一個工做打包應用的Docker鏡像

咱們編輯 .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進行配置

actions-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按鈕

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)範圍內的變量來使用咱們的容器鏡像和名字.而後包含了如下執行步驟:  

  1. 從Docker Hub拉取上一個Job構建出來的容器鏡像
  2. 中止運行的容器
  3. 刪除以前的應用容器
  4. 使用新的鏡像運行一個新的應用容器
  5. 清理舊的容器鏡像

提交代碼,Push到master分支,這樣一個包含3個Jobs的Workflow就會自動執行,若是在任何一個Job中只想錯誤,都會中止後續的Jobs,而且給出反饋.

ci-ci-workflow

總結

上面經過爲一個簡單的nodejs應用添加了Github Actions來完成了一個構建,打包,部署的CI/CD流程.經過使用Github Actions,能夠很容易地爲咱們放在Github上的項建立CI/CD流程,管理軟件開發的生命週期(SDLC).  

Gihhub Actions相似於GitlabGitlab-CI,以及[Jinkens](https://jenkins.io/zh/),還有不少第三方的CI/CD服務.

Github Actions是Github原生支持的,所以對於代碼庫管理在Github上的組織和用戶,更容易使用.

參考

https://help.github.com/en/ac...

相關文章
相關標籤/搜索