前言
随着敏捷和 DevOps 的流行,CI/CD 已经成了所有开发者在开发过程中必不可少的最佳实践,主要目标是以更快的速度、更短的周期向用户交付行之有效的软件。
它能给我们带来如下好处:
- 缩短发布周期
- 降低风险
- 提高代码质量
- 更高效的反馈循环
- 可视化过程
因此在 Serverless 越来越流行的今天,如何让 Serverless 的项目也能快速的搭建 CI/CD,是这篇文章的重点。
习惯了 CI/CD 的用户都期望有一个快速搭建自动化部署的教程,这篇文章会以下面几个流行的平台来讲解如何搭建自动化部署,让你能够推送代码的同时完成自动化部署。
- Github
- Jenkins
- Coding
基于 GitHub 的自动化部署
GitHub Actions(https://docs.github.com/cn/actions)是 Github 推出的自动化软件开发工作流。通过 Actions 可以执行任何任务,其中就包括 CI/CD。
前提条件
- 已托管你的 Serverless 项目代码到 Github。
- 项目中必须包含 Serverless framework 部署需要用到的
serverless.yml
。serverless.yml
的使用方式请参考官网文档:https://cloud.tencent.com/document/product/1154/51080。 - 如果是 Web 函数,需保证根目录有
scf_bootstrap
文件,具体请参考官网文档:https://cloud.tencent.com/document/product/583/56126。
操作步骤
为了让这个部署过程更简单,我在 GitHub 的市场中发布一个腾讯云 Serverless 部署的 Action 来帮助大家快速完成自动化部署。
在 GitHub 的 Marketplace 中搜索 tencent serverless (https://github.com/marketplace/actions/tencent-serverless-action) 就可以找到。如下图,里面有详细的 Action 代码:
首先,在 Actions 里面选择 Set up a workflow yourself,如下图。
如果知道如何使用 Action,那么直接用下面这句就可以了,里面封装了安装 Serverless framework 和执行部署命令的步骤。
代码语言:javascript复制 - name: serverless scf deploy
uses: woodyyan/tencent-serverless-action@main
如果不知道如何使用 Action,可以根据不同的语言选择下列不同的 yml 写法,下面我列举了 Python、Java、NodeJS 的写法。
适用于Python
项目
# 当代码推动到 main 分支时,执行当前工作流程
# 更多配置信息: <https://docs.github.com/cn/actions/getting-started-with-github-actions>
name: deploy serverless scf
on: #监听的事件和分支配置
push:
branches:
- main
jobs:
deploy:
name: deploy serverless scf
runs-on: ubuntu-latest
steps:
- name: clone local repository
uses: actions/checkout@v2
- name: deploy serverless
uses: woodyyan/tencent-serverless-action@main
env: # 环境变量
STAGE: dev #您的部署环境
SERVERLESS_PLATFORM_VENDOR: tencent #serverless 境外默认为 aws,配置为腾讯
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }} #您的腾讯云账号 sercret ID,请在Settings-Secrets中配置
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }} #您的腾讯云账号 sercret key,请在Settings-Secrets中配置
适用于Java
项目,请仔细看代码中的备注说明
name: deploy serverless scf
on: #监听的事件和分支配置
push:
branches:
- main
jobs:
build-and-deploy:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
distribution: 'temurin'
server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
settings-path: ${{ github.workspace }} # location for the settings.xml file
- name: Build with Gradle # Gradle项目用这个
uses: gradle/gradle-build-action@937999e9cc2425eddc7fd62d1053baf041147db7
with:
arguments: build
- name: Build with Maven # Maven项目用这个
run: mvn -B package --file pom.xml
- name: create zip folder # 此步骤仅用于Java Web函数,用于存放jar和scf_bootstrap文件。Java事件函数只需要在Serverless.yml中指定Jar目录就好。
run: mkdir zip
- name: move jar and scf_bootstrap to zip folder # 此步骤仅用于Java Web函数,用于移动jar和scf_bootstrap文件。Java事件函数只需要在Serverless.yml中指定Jar目录就好。注意如果是Maven编译请修改下面的jar路径为/target。
run: cp ./build/libs/XXX.jar ./scf_bootstrap ./zip
- name: deploy serverless
uses: woodyyan/tencent-serverless-action@main
env: # 环境变量
STAGE: dev #您的部署环境
SERVERLESS_PLATFORM_VENDOR: tencent #serverless 境外默认为 aws,配置为腾讯
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }} #您的腾讯云账号 sercret ID
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }} #您的腾讯云账号 sercret key
适用于NodeJS
项目
# 当代码推动到 main 分支时,执行当前工作流程
# 更多配置信息: <https://docs.github.com/cn/actions/getting-started-with-github-actions>
name: deploy serverless scf
on: #监听的事件和分支配置
push:
branches:
- main
jobs:
deploy:
name: deploy serverless scf
runs-on: ubuntu-latest
steps:
- name: clone local repository
uses: actions/checkout@v2
- name: install dependency
run: npm install
- name: build
run: npm build
- name: deploy serverless
uses: woodyyan/tencent-serverless-action@main
env: # 环境变量
STAGE: dev #您的部署环境
SERVERLESS_PLATFORM_VENDOR: tencent #serverless 境外默认为 aws,配置为腾讯
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }} #您的腾讯云账号 sercret ID,请在Settings-Secrets中配置
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }} #您的腾讯云账号 sercret key,请在Settings-Secrets中配置
最后,由于部署的时候需要用到腾讯云的TENCENT_SECRET_ID
和TENCENT_SECRET_KEY
,所以需要在 Github 代码仓库的设置中的 Secrets 里面配置这两个变量。如下图所示,ID 和 KEY 可以在腾讯云的访问控制里面获取:
配置完成之后,每次推送代码,都将会自动触发部署流程,同时在 Actions 中可以实时看到执行结果与错误日志。如下图:
大家还可以根据项目需要,在流程中添加测试、安全检查、发布等步骤。
基于 Jenkinsfile 的自动化部署
Jenkinsfile 是通用于 Jenkins、Coding 等平台的,因此只需要配置好 Jenkinsfile,则能在这些平台上完成自动化部署。
前提条件
- 已托管你的 Serverless 项目到 Coding/Github/Gitlab/码云等平台。
- 项目中必须包含 Serverless framework 部署需要用到的
serverless.yml
。serverless.yml
的使用方式请参考官网文档:https://cloud.tencent.com/document/product/1154/51080。 - 如果是Web函数,需保证根目录有
scf_bootstrap
文件,具体请参考官网文档:https://cloud.tencent.com/document/product/583/56126。
操作步骤
根据不同语言的需要,我把所有语言需要用到的语法都写在下面的 Jenkinsfile 中了,适用于 Python、Java、NodeJS,请仔细阅读注释。
代码语言:javascript复制pipeline {
agent any
stages {
stage('检出') {
steps {
checkout([$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]],
userRemoteConfigs: [[url: env.GIT_REPO_URL, credentialsId: env.CREDENTIALS_ID]]])
}
}
stage('Package'){ // 此stage仅用于Java项目
steps{
container("maven") {
echo 'Package start'
sh "mvn package" // 此行用于Java Maven项目
sh "./gradlew build" // 此行用于Java Gradle项目
sh "mkdir zip" // 此行仅用于Java Web函数,用于存放jar和scf_bootstrap文件。Java事件函数只需要在Serverless.yml中指定Jar目录就好。
sh "cp ./build/libs/XXX.jar ./scf_bootstrap ./zip" // 此行仅用于Java Web函数,用于移动jar和scf_bootstrap文件。Java事件函数只需要在Serverless.yml中指定Jar目录就好。注意如果是Maven编译请修改下面的jar路径为/target。
}
}
}
stage('安装依赖') {
steps {
echo '安装依赖中...'
sh 'npm i -g serverless'
sh 'npm install' // 此行用于NodeJS项目
echo '安装依赖完成.'
}
}
stage('部署') {
steps {
echo '部署中...'
withCredentials([
cloudApi(
credentialsId: "${env.TENCENT_CLOUD_API_CRED}",
secretIdVariable: 'TENCENT_SECRET_ID',
secretKeyVariable: 'TENCENT_SECRET_KEY'
),
]) {
// 生成凭据文件
sh 'echo "TENCENT_SECRET_ID=${TENCENT_SECRET_ID}\nTENCENT_SECRET_KEY=${TENCENT_SECRET_KEY}" > .env'
// 部署
sh 'sls deploy --debug'
// 移除凭据
sh 'rm .env'
}
echo '部署完成'
}
}
}
}
使用上面的 Jenkinsfile 就可以在 Jenkins、coding 等平台一键完成 CI/CD 配置了。
注意,需要在平台中配置腾讯云需要用到的TENCENT_SECRET_ID
和TENCENT_SECRET_KEY
这两个变量。
总结
作为开发者,总是希望所有代码工作都是自动化完成,都能提高效率。因此,熟练地掌握如何快速配置自动化的 CI/CD 流程,是每个开发者必须掌握的技能之一。
在这里分享这些开箱即用的配置,也是希望能大大减少大家的学习成本,快速上手开始核心业务开发。
未来我还会继续探索更多的适用于 Serverless 的 DevOps 实践,在腾讯云云函数公众号与大家分享。
如果有任何疑问或在操作中遇到任何困难可以在文章下方留言,我会回复大家。
最新活动
One More Thing
提交 Serverless 技术方案咨询,我们将在1-3个工作日联系您!
- 云函数官网:https://cloud.tencent.com/product/scf?from=15939
- 事件总线官网:https://cloud.tencent.com/product/eb?from=15940
点击「阅读原文 」,进入新春采购会场