天天看點

使用Github Action釋出函數到阿裡雲serverless平台自定義Github Action優化總結參考

阿裡雲提供了函數計算,即serverless支援。同時阿裡雲還提供了fun cli指令行工具友善項目驗證、釋出等。

釋出函數雖然隻是一句指令行的事情,但是做到內建釋出平台還是需要準備對應的環境,配置和工具等,稍顯複雜。

在travis-ci中可以用shell腳本完成,但是要求nodejs環境。在從travis-ci切換到Github Action的時候直接拷貝shell腳本也能支援,但是Github Action支援Dockerfile模式,可以使用更簡單的方式來實作,同時更有利于複用。

Github Action主要有兩個方法支援自定義:

第一種是javascript路線(nodejs環境),第二種是dockerfile路線,支援直接run docker鏡像;

第二種使用覆寫面更廣也更容易使用,特别是我對nodejs的調試一直不太熟練;

我們要建構的這個Github Action思路很簡單,提供一個node環境,預安裝fun的穩定版本,然後直接運作fun deploy就行了。

所有需要的參數要麼通過ENV傳遞,要麼通過input傳遞。

自定義Github Action

自定義的幾個主要步驟如下:

  • 建立action.yml檔案
  • 建立Dockerfile和必要的其他檔案,比如entrypoint.sh
  • 建立README (釋出到marketplace必要)

    首先建立一個action.yml檔案,這個檔案的内容會展示到github action marketplace中。

示例如下:

name: "Aliyun Serverless Action"
description: "GitHub Actions for Aliyun Serverless 🚀 Deploy function automatically."
author: "Yunkun Huang"
runs:
  using: "docker"
  image: "Dockerfile"
  args:
    - ${{ inputs.functionFolder }}
branding:
  icon: "upload-cloud"
  color: "blue"
inputs:
  functionFolder:
    description: "Folder name for function"
    required: false
    default: "."           

這裡inputs聲明了所需參數,branding主要定義在marketplace的展示,這裡是藍色的“上傳到雲”圖示。

然後準備Dockerfile。這個就比較直接了,安裝了fun cli以後拷貝entrypoint.sh即可。

FROM node:8

RUN npm install -g @alicloud/[email protected]

COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT [ "/entrypoint.sh" ]
           

entrypoint中稍微多一點内容

#!/bin/bash

set -e
# set -ex

function print_info() {
    echo -e "\e[36mINFO: ${1}\e[m"
}

FOLDER_NAME=$1

cd "$FOLDER_NAME"
print_info "use function in folder \"$FOLDER_NAME\""

print_info 'show files'
ls

print_info 'show fun client version'
fun --version

print_info 'start deploy function'
fun deploy
print_info 'deploy success'           

再加上README之後,所必要的檔案就夠了。

在Github點選release,勾選釋出到marketplace(

https://github.com/marketplace/actions/aliyun-serverless-action

),效果如下圖:

使用Github Action釋出函數到阿裡雲serverless平台自定義Github Action優化總結參考

使用的話在github action的yml直接寫

uses: htynkn/aliyun-serverless-action@master
env:
  ACCOUNT_ID: ${{ secrets.ACCOUNT_ID }}
  REGION: cn-shanghai
  ACCESS_KEY_ID: ${{ secrets.ACCESS_KEY_ID }}
  ACCESS_KEY_SECRET: ${{ secrets.ACCESS_KEY_SECRET }}           

完整例子參考:

https://github.com/htynkn/aliyun-serverless-action/blob/master/.github/workflows/test.yml

優化

我們自定義的Github Action就這麼完成了,這裡還有不少地方可以優化。

首先是項目自己的CI和測試,先說CI,因為項目設計到了Dockerfile和bash腳本,那麼我們需要關心

  • Dockerfile能否建構成功
  • bash腳本檢測
  • Dockerfile lint
name: ci

on:
  pull_request:
    types: [opened, synchronize]
    paths-ignore:
      - "**.md"
  push:
    paths-ignore:
      - "**.md"
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-18.04

    steps:
      - uses: actions/checkout@v2
      - name: build
        env:
          DOCKER_IMAGE: docker.pkg.github.com/${{ github.repository }}/action:latest
        run: |
          docker build . --file Dockerfile --tag ${DOCKER_IMAGE}
  shellcheck:
    runs-on: ubuntu-18.04
    steps:
      - uses: actions/checkout@v2
      - name: shellcheck
        run: shellcheck ./entrypoint.sh

  hadolint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: burdzwastaken/[email protected]
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          HADOLINT_ACTION_DOCKERFILE_FOLDER: .           

自動化測試我們直接部署一個函數到阿裡雲,然後驗證。為了友善就是用HTTP觸發器那種,部署完成後直接請求

name: test

on:
  push:
    paths-ignore:
      - "**.md"
    branches:
      - master

jobs:
  deploy:
    runs-on: ubuntu-18.04

    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v1
        with:
          node-version: "8.x"
      - run: cd test && npm install
      - uses: htynkn/aliyun-serverless-action@master
        env:
          ACCOUNT_ID: ${{ secrets.ACCOUNT_ID }}
          REGION: cn-shanghai
          ACCESS_KEY_ID: ${{ secrets.ACCESS_KEY_ID }}
          ACCESS_KEY_SECRET: ${{ secrets.ACCESS_KEY_SECRET }}
        with:
          functionFolder: test/
      - run: wget https://135603.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/http-demo/nodejs8/ -O response.json
      - run: test -f response.json           

運作效果:

使用Github Action釋出函數到阿裡雲serverless平台自定義Github Action優化總結參考

總結

Github Action配合Github自身使用确實很友善,提供自定義的手段擴大了使用範圍也降低了門檻。如果部署中需要一些私密資訊,可以存儲在secrets中,通過ENV傳入。不敏感的資訊通過input傳入即可。

參考

https://help.github.com/en/actions/automating-your-workflow-with-github-actions/building-actions https://github.com/htynkn/aliyun-serverless-action

繼續閱讀