一、CI/CD 优势
·缩短发布周期
·降低风险
·提高代码质量
·更高效的反馈循环
·可视化过程
这篇以 GitHub、Jenkins 两个平台为例介绍如何结合 Serverless Cloud Framework 为 Serverless 项目快速搭建 CI/CD。
二、基于 GitHub 的自动化部署
GitHub Actions 是 GitHub 推出的自动化软件开发工作流。通过 Actions 可以执行任何任务,其中就包括 CI/CD。
三、前提条件
·Serverless 项目已经托管到 GitHub。
·项目中需要包含 Serverless Cloud Framework 执行需要用到的配置文件serverless.yml。
·如果使用 Web 函数,请将 scf_bootstrap 文件放在项目根目录下。
四、操作步骤
注意:SCF 已经在 GitHub 市场发布了 腾讯云 Serverless 部署的 Action。
1. 在 GitHub 市场中搜索 “Tencent Serverless Action”。
2. 在 Actions 中选择 Set up a workflow yourself:
3. 使用方式:
·如果熟悉 Action 用法,你可以使用下文的命令,其中已经封装了安装 Serverless Cloud Framework 和执行部署命令的步骤。
– name: serverless scf deploy uses: woodyyan/tencent-serverless-action@main
·如果不熟悉 Action 用法,你可以根据不同的语言选择下列不同的 yml 写法,这篇列举了Python、Java、NodeJS 三种语言的 yml 写法供参考。
PythonJavaNodeJS# 当代码推送到 main 分支时,执行当前工作流程# 更多配置信息: https://docs.github.com/cn/actions/getting-started-with-github-actionsname: deploy serverless scfon: #监听的事件和分支配置 push: branches: – mainjobs: 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中配置name: deploy serverless scfon: #监听的事件和分支配置 push: branches: – mainjobs: 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# 当代码推送到 main 分支时,执行当前工作流程# 更多配置信息: https://docs.github.com/cn/actions/getting-started-with-github-actionsname: deploy serverless scfon: #监听的事件和分支配置 push: branches: – mainjobs: 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 里进行变量配置:
腾讯云 Secret ID 和 Secret KEY 可在腾讯云的 访问管理 中获取。
4. 配置完成后,每次推送代码,都会自动触发部署流程,同时在 Actions 中可以实时看到执行结果与错误日志:
除此之外,你还可以根据项目需要,在流程中添加测试、安全检查、发布等步骤。
五、基于 Jenkinsfile 的自动化部署
Jenkinsfile 是通用于 Jenkins 平台的,完成 Jenkinsfile 的配置,则能在这些平台上完成自动化部署。
六、前提条件
·已将你的 Serverless 项目托管到 GitHub/GitLab/码云等平台。
·项目中需要包含 Serverless Cloud Framework 执行需要用到的配置文件 serverless.yml。
·如果使用 Web 函数,请将scf_bootstrap 文件放在项目根目录下。
七、操作步骤
这篇提供了 Python、Java、NodeJS 三种语言的 Jenkinsfile 写法供参考,请仔细阅读注释。
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 scf' 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 'scf deploy –debug' // 移除凭据 sh 'rm .env' } echo '部署完成' } } }}
使用上面的 Jenkinsfile 即可在 Jenkins 等平台一键完成 CI/CD 配置。
注意:部署时需要用到腾讯云的TENCENT_SECRET_ID和TENCENT_SECRET_KEY,可在 访问管理 中获取。