serverless教程:使用Github Actions进行持续集成/部署


在开发无服务器应用的时候,通过纯手工方式创建各种资源的话,效率会非常低,因此需要借助一些框架,比如serverless来提高开发效率。下面介绍如何使用Github Actions进行持续集成/部署serverless项目。

serverless教程
serverless教程

环境变量

在项目中如果需要使用一些类似token,secret之类的机密信息的,那么就需要将其保存在环境变量中。如果在serverless.yml中声明了某个环境变量,那么在部署后到AWS之后,serverless就会在其对应的Lambda中创建环境变量:

如何使用Github Actions进行持续集成/部署
如何使用Github Actions进行持续集成/部署

因此第一个要解决的问题就是如何把这些环境变量正确的传递给serverless。

本地部署

如果在本地部署的话,就相对简单些。

1)首先,创建.env文件(注意将其添加到.gitignore中):

bash
TWITTER_CONSUMER_KEY=
TWITTER_CONSUMER_SECRET=
TWITTER_ACCESS_TOKEN= 
TWITTER_ACCESS_TOKEN_SECRET=
TELEGRAM_TOKEN=
TELEGRAM_CHAT_ID=

2)安装serverless插件

bash
yarn add -D serverless-dotenv-plugin

3)在serverless中使用这个插件

yaml
plugins:
  - serverless-dotenv-plugin

同时,在serverless.yml引用这些变量:

yaml
environment:
  region: ${self:provider.region}
  TWITTER_CONSUMER_KEY: ${env:TWITTER_CONSUMER_KEY}
  TWITTER_CONSUMER_SECRET: ${env:TWITTER_CONSUMER_SECRET} 
  TWITTER_ACCESS_TOKEN: ${env:TWITTER_ACCESS_TOKEN}
  TWITTER_ACCESS_TOKEN_SECRET: ${env:TWITTER_ACCESS_TOKEN_SECRET}
  TELEGRAM_TOKEN: ${env:TELEGRAM_TOKEN}
  TELEGRAM_CHAT_ID: ${env:TELEGRAM_CHAT_ID}

在部署后就能看到AWS Lambda中对应的环境变量了。

通过Github Actions部署

设定Github Actions secrets

访问 https://github.com/你的用户名/项目名/settings/secrets/actions/new 并设定以下Github Action secrets:

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • TWITTER_CONSUMER_KEY
  • TWITTER_CONSUMER_SECRET
  • TWITTER_ACCESS_TOKEN
  • TWITTER_ACCESS_TOKEN_SECRET
  • TELEGRAM_TOKEN
  • TELEGRAM_CHAT_ID

这样做就非常灵活了,之后如果要部署到不同的AWS账户的话,只需要更新AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY就可以了。

如果想要针对不同的branch部署到不同的AWS账户,也可以这样:

  • DEV_AWS_ACCESS_KEY_ID
  • DEV_AWS_SECRET_ACCESS_KEY
  • STAGE_AWS_ACCESS_KEY_ID
  • STAGE_AWS_SECRET_ACCESS_KEY
  • PROD_AWS_ACCESS_KEY_ID
  • PROD_AWS_SECRET_ACCESS_KEY

然后在后面设定action的时候针对不同的branch使用不同的secret就可以了。

创建.github/workflows/ci.yml:

yaml
name: Deploy to AWS

on:
  push:
    branches:
      - main

jobs:
  deploy:
    name: deploy
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - uses: actions/setup-node@v3
      with:
        node-version: 16.x
    - run: sudo npm i -g serverless
    - run: npm install
    - name: Make .env file
      uses: SpicyPizza/create-[email protected]
      with:
        envkey_DEBUG: false
        envkey_TWITTER_CONSUMER_KEY: ${{ secrets.TWITTER_CONSUMER_KEY }}
        envkey_TWITTER_CONSUMER_SECRET: ${{ secrets.TWITTER_CONSUMER_SECRET }}
        envkey_TWITTER_ACCESS_TOKEN: ${{ secrets.TWITTER_ACCESS_TOKEN }}
        envkey_TWITTER_ACCESS_TOKEN_SECRET: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }}
        envkey_TELEGRAM_TOKEN: ${{ secrets.TELEGRAM_TOKEN }}
        envkey_TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }}
        file_name: .env
    - name: serverless deploy
      uses: serverless/github-action@v3
      with:
        args: deploy
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

对关键的两步说明一下:

首先是在使用serverless部署前创建.env。这里使用的是 SpicyPizza/[email protected] 这个Github Actions插件。需要注意的是,所有想要设置的环境变量前需要 添加关键字 envkey_ 。经过这一步,就会将所有的环境变量保存在.env文件中。也可以看到,这里通过 secrets.XXX 来访问在Github Actions secrets中定义的变量。

其次是在真正进行serverless部署的时候,使用的是 serverless/github-action@v3 这个Github Actions插件。这里需要指定AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY。同样,这两个变量值是从Github Actions secrets中获取的。

在serverless.yml中的设置

由于在serverless部署之前,已经由Github Actions创建好了.env文件,因此,这里就可以直接引用这些变量值了:

yaml
environment:
  region: ${self:provider.region}
  TWITTER_CONSUMER_KEY: ${env:TWITTER_CONSUMER_KEY}
  TWITTER_CONSUMER_SECRET: ${env:TWITTER_CONSUMER_SECRET} 
  TWITTER_ACCESS_TOKEN: ${env:TWITTER_ACCESS_TOKEN}
  TWITTER_ACCESS_TOKEN_SECRET: ${env:TWITTER_ACCESS_TOKEN_SECRET}
  TELEGRAM_TOKEN: ${env:TELEGRAM_TOKEN}
  TELEGRAM_CHAT_ID: ${env:TELEGRAM_CHAT_ID}

至此,一旦完成部署,就会在AWS Lambda中创建对应的环境变量了。那么,在Lambda代码中就可以这样访问了:

JavaScript
import { TwitterClient } from 'twitter-api-client';
import { Telegraf } from 'telegraf'

const twitterClient = new TwitterClient({
  apiKey: process.env.TWITTER_CONSUMER_KEY,
  apiSecret: process.env.TWITTER_CONSUMER_SECRET,
  accessToken: process.env.TWITTER_ACCESS_TOKEN,
  accessTokenSecret: process.env.TWITTER_ACCESS_TOKEN_SECRET,
});
const bot = new Telegraf(process.env.TELEGRAM_TOKEN);

测试

将项目提交到Github,就会自动触发Github Actions的构建过程。


文章作者: 逻思
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 逻思 !