使用Github Action发布函数到阿里云serverless平台

简介: 本文简述了如何通过自定义Github Action自动化部署云函数到阿里云serverless平台中

阿里云提供了函数计算,即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/fun@3.2.3

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-marketplace.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/hadolint-action@1.5.0
        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-deploy-example.png

总结

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

相关实践学习
【AI破次元壁合照】少年白马醉春风,函数计算一键部署AI绘画平台
本次实验基于阿里云函数计算产品能力开发AI绘画平台,可让您实现“破次元壁”与角色合照,为角色换背景效果,用AI绘图技术绘出属于自己的少年江湖。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
相关文章
|
4月前
|
缓存 自然语言处理 JavaScript
抓紧上车,别再错过啦, Github 开源后台管理平台,Naive UI !!!
naive-ui-pro 是基于 Vue3 + Vite + TypeScript 的免费开源中后台模板,主打“路由插件化架构”,将权限、页签、缓存等功能拆解为可插拔模块,像搭积木一样灵活组装。内置 14+ 插件、Pro Naive UI 组件库与丰富示例,支持移动端适配、多主题、国际化,MIT 许可,开箱即用,助力高效开发。
608 4
|
7月前
|
人工智能 Serverless API
TaskingA在GitHub上已突破 5.1k stars!这是一个真正被开发者认可的 AI Agent平台,AI开发者必看,如何用它实现生产力逆袭?
TaskingAI 是一个 AI-native 应用开发平台,通过整合模型、检索、助手与工具模块,为开发者提供一站式的 BaaS(后端即服务)体验,简化 AI 应用从开发、测试、到部署的全过程 。
213 5
|
开发工具 git
如何操作github,gitee,gitcode三个git平台建立镜像仓库机制,这样便于维护项目只需要维护一个平台仓库地址的即可-优雅草央千澈
如何操作github,gitee,gitcode三个git平台建立镜像仓库机制,这样便于维护项目只需要维护一个平台仓库地址的即可-优雅草央千澈
891 69
如何操作github,gitee,gitcode三个git平台建立镜像仓库机制,这样便于维护项目只需要维护一个平台仓库地址的即可-优雅草央千澈
|
9月前
|
存储 人工智能 项目管理
2025年GitHub平台上的十大开源MCP服务器汇总分析
本文深入解析了GitHub上十个代表性MCP(Model Context Protocol)服务器项目,探讨其在连接AI与现实世界中的关键作用。这些服务器实现了AI模型与应用程序、数据库、云存储、项目管理等工具的无缝交互,扩展了AI的应用边界。文中涵盖Airbnb、Supabase、AWS-S3、Kubernetes等领域的MCP实现方案,展示了AI在旅行规划、数据处理、云存储、容器编排等场景中的深度应用。未来,MCP技术将向标准化、安全性及行业定制化方向发展,为AI系统集成提供更强大的支持。
2201 2
2025年GitHub平台上的十大开源MCP服务器汇总分析
|
9月前
|
文字识别 网络协议 开发工具
GitHub封锁?推荐5个国产的Git仓库替代平台
近日,GitHub对中国区IP的部分限制引发了广泛关注。未登录用户被拒,已登录用户功能受限,南北网络环境差异更显“内卷”。为应对这一挑战,本文推荐了多个国产Git平台:Gitee(码云)、GitCode(CSDN旗下)、CODING(腾讯系)、CodeUP(阿里云支持)及微信代码管理工具。这些平台功能全面、稳定性强,是开发者迁移项目的理想选择。通过同步代码、配置CI/CD流水线等简单步骤,可确保项目平稳过渡。此次事件提醒我们,掌握核心技能与支持国产平台同样重要!
7707 11
|
10月前
|
存储 运维 安全
Github Action:让静态网站实现定时发布
本文探讨了静态网站实现定时发布的解决方案,针对静态博客缺乏原生定时发布功能的问题,作者基于Zola工具构建的静态网站,最终选择通过GitHub Action实现定时发布。文章对比了几种实现方式,包括人力、自建服务及平台原生功能等,指出最理想的是利用平台能力但多数平台缺乏该功能。文中详细介绍了GitHub Action方案的原理、部署过程和使用流程,并分享了高级配置如推送通知。同时分析了方案的局限性,如时间颗粒度粗、设置繁琐等,并提出改进建议。总结中展望了未来优化方向,旨在提升静态网站维护体验。
194 0
|
对象存储
一个通过 GitHub Action 将 GitHub 仓库与阿里云 OSS 完全同步的脚本
一种将 GitHub 仓库完全同步到阿里云 OSS 的方法。
|
安全 项目管理 开发工具
探索 GitHub:现代开发者的协作平台
GitHub 是一个基于 Git 的版本控制和协作平台,广泛应用于软件开发和项目管理。它不仅提供代码托管服务,还是开发者社区和开源项目的重要平台。本文介绍了 GitHub 的核心功能(如代码托管、协作工具、CI/CD 集成等)、使用技巧(如规范化提交信息、参与开源项目等),帮助开发者提升效率和协作能力。GitHub 自2008年成立以来,已成为全球最大的代码托管平台,支持团队协作和项目管理。
|
Linux C++ Docker
【Azure Developer】在Github Action中使用Azure/functions-container-action@v1配置Function App并成功部署Function Image
【Azure Developer】在Github Action中使用Azure/functions-container-action@v1配置Function App并成功部署Function Image
156 0
|
数据安全/隐私保护
【Azure Developer】Github Action使用Azure/login@v1插件登录遇见错误的替代方案
【Azure Developer】Github Action使用Azure/login@v1插件登录遇见错误的替代方案
216 0

相关产品

  • 函数计算