阿裡雲提供了函數計算,即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),效果如下圖:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yMwMTOkF2Y5YTY0UmZiZmYwQGM0ETMyQGZlVDMyUzM28CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
使用的話在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配合Github自身使用确實很友善,提供自定義的手段擴大了使用範圍也降低了門檻。如果部署中需要一些私密資訊,可以存儲在secrets中,通過ENV傳入。不敏感的資訊通過input傳入即可。