編寫本身的 GitHub Action,體驗自動化部署

本文將介紹如何使用 GitHub Actions 部署前端靜態頁面,以及如何本身建立一個 Docker 容器 Action。

簡介 Actions

GitHub Actions 是 GitHub 官方推出的持續集成/部署模塊服務(CI/CD),和 jenkins、Travis CI 是同一類產品定位。前端

但 Actions 的最大優點,就是它是與 GitHub 高度整合的,只需一個配置文件便可自動開啓服務。甚至你不須要購買服務器 —— GitHub Actions 自帶雲環境運行,包括私有倉庫也能夠享用,並且雲環境性能也十分強勁。node

固然這也意味着項目必須存放在 GitHub 才能享受這項服務。若是你的 GitHub 上有一些項目須要部署,那不妨把構建、上傳等工做放到 Actions 裏。好比最近我有個前端項目須要打包成靜態文件,而後上傳到騰訊雲 COS 裏,這是典型的自動化部署應用場景,咱們能夠藉助 Actions 實現一勞永逸。python

配置 workflow

前文說到,開啓 GitHub Actions 只需一個配置文件,這個文件就是 workflow(工做流),它須要存在倉庫目錄下 .github/workflows/*.yml,文件名任意,但須要是一個 YAML 配置文件。git

這個文件用來規定自動化操做在何時觸發啓動,而後須要作哪些事情,好比這樣:github

name: Deploy

on:
  push:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout master
        uses: actions/checkout@v2
        with:
          ref: master

      - name: Setup node
        uses: actions/setup-node@v1
        with:
          node-version: "10.x"

      - name: Build project
        run: yarn && yarn build

      - name: Upload COS
        uses: zkqiang/tencent-cos-action@master
        with:
          args: delete -r -f / && upload -r ./dist/ /
          secret_id: ${{ secrets.SECRET_ID }}
          secret_key: ${{ secrets.SECRET_KEY }}
          bucket: ${{ secrets.BUCKET }}
          region: ap-shanghai

首先配置裏全部 name 都是能夠自定義的,只是用於可視化中進行識別。docker

on: 用來指定啓動觸發的事件,push 則表示在監聽到 git push 到指定分支時觸發。如此以外還能夠是 pull_requestshell

jobs: 是工做任務,能夠包含多個 job,而且每一個 job 是獨立的虛擬環境。不一樣 job 之間默認是並行的,若是想順序執行,能夠這樣 build-job: needs: test-job編程

runs-on: 用來指定執行系統環境,不只有經常使用的 Linux 發行版,還能夠是 macOS 或 Windows。ubuntu

steps: 表示每一個 job 須要執行的步驟,好比這裏我分紅了四步,拉取分支 → 安裝 Node 環境 → 構建項目 → 上傳 COS。bash

uses: 指的是這一步驟須要先調用哪一個 Action。

Action 是組成工做流最核心最基礎的元素。每一個 Action 能夠看做封裝的獨立腳本,有本身的操做邏輯,咱們只須要 uses 並經過 with 傳入參數便可。

好比 actions/checkout@v2 就是官方社區貢獻的用來拉取倉庫分支的 Action,你不須要考慮安裝 git 命令工具,只須要把分支參數傳入便可。

更多 Action 你能夠經過 GitHub 頂部的 Marketplace 裏找到,不過問題來了,我在其中搜索騰訊 COS 並無找到相關 Action。

騰訊官方提供了 coscmd 命令行工具,是基於 Python 開發,很惋惜沒有二進制版本。所以若是使用在 Actions 中,就必須有 Python 環境,有兩種思路:

  1. 在 Steps 里加入 actions/setup-python 這一步驟安裝 Python 環境,而後再使用 pip install coscmd
  2. 將上面的步驟封裝成獨立的 Action,以後直接 uses 便可。

第一種很簡單,能夠在 steps 里加入:

steps:
- uses: actions/setup-python@v1
  with:
    python-version: '3.x'
    architecture: 'x64'

- name: Install coscmd
  run: pip install -U coscmd

- name: Upload COS
  run: |
    coscmd config ....
    coscmd upload -r ./dist/ /

可是我選擇了第二種,順便了解如何建立本身的 Action。

建立 Docker 容器 Action

官方提供了兩種方式建立 Action,一種是使用 JavaScript 環境建立,另外一種是經過 Docker 容器建立。coscmd 既然依賴 Python,這裏使用 Docker 容器更簡單一些。

建立 Dockerfile

那咱們首先建立一個 Dockerfile:

FROM python:3.7-slim

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN pip install --upgrade --no-cache-dir coscmd

COPY "entrypoint.sh" "/entrypoint.sh"
RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

若是不瞭解 Docker 也不要緊,只須要知道 FROM 是指定容器環境,而後 RUN 去執行 pip install coscmd 的操做。最後將倉庫目錄下的 entrypoint.sh 拷貝到容器中,並用 ENTRYPOINT 執行,至於這個 sh 文件後面再說 。

建立 action.yml

這裏定義了 Action 相關的配置:

name: 'Tencent COS Action'
description: 'GitHub Actions for Tencent COS Command'
author: 'zkqiang <zkqiang@126.com>'
branding:
  icon: 'cloud'
  color: 'blue'
inputs:
  args:
    description: 'COSCMD args'
    required: true
  secret_id:
    description: 'Tencent cloud SecretId'
    required: true
  secret_key:
    description: 'Tencent cloud SecretKey'
    required: true
  bucket:
    description: 'COS bucket name'
    required: true
  region:
    description: 'COS bucket region'
    required: true
runs:
  using: 'docker'
  image: 'Dockerfile'

除了一些描述性信息,最重要的是定義 input: args 輸入參數,也就是 step 裏 with 傳遞的參數,能夠經過 required 設置該參數是否必傳。這裏傳遞的參數都是識別和驗證對象桶的必需參數。

最後經過 runs 指定 docker 環境和 Dockerfile 文件。

建立 entrypoint.sh

這裏須要使用 shell 來寫傳遞參數後的執行邏輯,因爲 coscmd 自己就是命令行工具,因此咱們只需將參數再傳給它便可。

#!/bin/bash

set -e

if [ -z "$INPUT_ARGS" ]; then
  echo 'Required Args parameter'
  exit 1
fi

# ...省略部分代碼

coscmd config -a $INPUT_SECRET_ID -s $INPUT_SECRET_KEY -b $INPUT_BUCKET -r $INPUT_REGION -m $THREAD

IFS="&&"
arrARGS=($INPUT_ARGS)

for each in ${arrARGS[@]}
do
  unset IFS
  each=$(echo ${each} | xargs)
  if [ -n "$each" ]; then
  echo "Running command: coscmd ${each}"
  coscmd $each
  fi
done

action.yml 中的參數會自動轉成 INPUT_ 前綴而且大寫的變量傳入,所以咱們能夠直接引用。

驗證完參數以後(也可省略,action.yml 已判斷),先配置 coscmd config,而後將 args 參數傳入 coscmd 便可。另外爲了方便使用多條命令,加入了支持 && 鏈接命令,腳本里須要對其分割。

調用自建的 Action

將剛纔建立的 Action 推送到 GitHub 上,就調用這個 Action 了,前文的 workflow 配置裏也已經包含了:

name: Upload COS
uses: zkqiang/tencent-cos-action@master
with:
  args: delete -r / && upload -r ./dist/ /
  secretId: ${{ secrets.SECRET_ID }}
  secretKey: ${{ secrets.SECRET_KEY }}
  bucket: ${{ secrets.BUCKET }}
  region: ap-shanghai

args: delete -r -f / && upload -r ./dist/ /,至關於先清空對象桶,而後再執行上傳。deleteupload 都是 coscmd 本身的命令參數,其餘命令能夠查閱官方文檔。

另外有沒有注意到 ${{ secrets.XXX }} 這種參數,並非具體的值,而是調用了 GitHub Settings 裏保存的 secrets,添加方式以下:

設置 secrets 的步驟

爲何這樣作?是由於 workflow 代碼在公開倉庫中也是任意可見的,若是將 SecretKey 這些信息暴露,等於將 COS 操做權限交出,而存在 settings 裏則不會有這個問題。

而後就可使用 Actions 功能了,向包含 workflow 的倉庫 master 分支推送一次代碼,若是沒有配錯的話,過段時間能夠在 Actions 欄裏看到一列綠色的對號。

Actions 執行結果

結語

至此咱們瞭解瞭如何使用 GitHub Actions 部署,以及如何本身建立一個 Action,可見這一項免費的服務真的很是好用,藉助 Action 開源市場也能夠大幅簡化使用。

固然 CI 的應用不只僅在部署這方面,絕大部分從開發完成到交付/部署之間的動做也均可以用自動化完成,只要是重複的操做就應該考慮能不能加入自動化來解放雙手。

本文 COS Action 的代碼倉庫

workflow 官方文檔

更多的 Actions 能夠從 Marketplaceawesome-actions 裏獲取。


本文屬於原創,首發於微信公衆號「面向人生編程」,如需轉載請後臺留言。

相關文章
相關標籤/搜索