本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: https://www.huangyunkun.com/2020/01/03/use-github-action-deploy-to-aliyun-serverless/
本文首发于:https://developer.aliyun.com/article/741408 修改后发于本博客
阿里云提供了函数计算,即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: "."
然后准备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的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传入即可。
参考
https://help.github.com/en/actions/automating-your-workflow-with-github-actions/building-actions
https://github.com/htynkn/aliyun-serverless-action
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: https://www.huangyunkun.com/2020/01/03/use-github-action-deploy-to-aliyun-serverless/