专栏首页Tencent Serverless 官方专栏SCF场景下的DevOps实现--Jenkins篇

SCF场景下的DevOps实现--Jenkins篇

当前Serverless热度越来越高,越来越多的开发者们开始抛弃传统开发模式基于Serverless来搭建自己的产品服务。在享受腾讯云Serverless产品SCF的免运维、低成本优势的同时,也要适应SCF与传统开发模式的差异。其中DevOps便是很重要的一环,因为SCF特有的runtime,使得开发者无法复用现有DevOps平台完成CI/CD流程。

为此,腾讯云中间件团队基于Jenkins、CODING企业版以及蓝盾三种DevOps方案进行了整合打通,本文意图描述在SCF场景下,如何基于Jenkins搭建自己的CI/CD流程。后续,将会介绍基于其他两种方案的DevOps实现。

前言

本文核心目的在于描述SCF与现有DevOps平台结合的实践,以Jenkins为例。因此不会介绍过多背景知识。因此假设你已经具备以下技能。

  • Jenkins或类似平台使用背景。
  • 了解SCF产品
  • scf cli,SCF的命令行工具:https://github.com/tencentyun/scfcli

源码介绍

git地址:

https://github.com/NevenMoore/scf_devops_demo

  1. Jenkinsfile, jenkins的pipeline描述文件。
pipeline {
agent any


stages {
stage('Checkout') {
steps {
echo "Checkout"
git 'https://github.com/NevenMoore/scf_devops_demo.git'
}
}
stage('Build') {
steps {
echo 'Building'
sh "pip install -r requirements.txt"
}
}
stage('Test') {
steps {
echo 'Testing'
script {
ret = sh(script: "scf native invoke -t ./template.yaml --no-event", returnStatus: true)
if (ret != 0) {
echo '[Test] Failed'
currentBuild.result = 'FAILURE'
return
}
}


}
}
stage('Deploy - Staging') {
steps {
echo 'Deploy - Staging'
}
}
stage('Sanity check') {
steps {
input "Does the staging environment look ok?"
}
}
stage('Deploy - Production') {
steps {
echo 'Deploy - Production'
script {
ret = sh(script: "scf package -t ./template.yaml", returnStatus: true)
if (ret != 0) {
echo '[Deploy] Failed'
currentBuild.result = 'FAILURE'
return
}
ret = sh(script: "scf deploy -t ./deploy.yaml -f", returnStatus: true)
if (ret != 0) {
echo '[Deploy] Failed'
currentBuild.result = 'FAILURE'
return
}
}
}
}
}


post {
success {
echo 'I succeeeded!'
}
unstable {
echo 'I am unstable :/'
}
failure {
echo 'I failed :('
}
changed {
echo 'Things were different before...'
}
}
}
  1. Checkout:检出,从github拉取代码。
  2. Build: 用pip安装项目依赖。
  3. Test:测试,SCF有自己的runtime,SCF命令行可模拟线上环境。
  4. Deploy - Staging: 灰度发布,当前云上灰度能力未完全开放,暂且跳过。
  5. Sanity check:发布审批。
  6. Deploy - Production:发布上线,这里利用了scf cli的发布能力。

2. index.py。就是scf cli init出来的helloworld模版,为了演示build阶段,特意import flask。

# -*- coding: utf8 -*-
import flask

def main_handler(event, context):
print(str(event))
return "hello world"

3. template.yaml, scf的元信息文件,例如runtime,memsize等信息,可参见scf cli文档。

Jenkins pipeline配置

比较简单,将上面的jenkinsfile内容粘贴下配置即可完成。

触发&构建

>>>>

触发

简单起见在jenkins上手动出发流程(当然你可以选择webhooks)自动触发。

>>>>

阶段视图

可以看见前面的checkout->build->test>Deploy - Staging阶段已自动化完成,因为上面配置了人工确认,手动确认后pipeline会将scf发布到腾讯云现网环境。

>>>>

完整输出

Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /var/lib/jenkins/workspace/scf_devops_demo
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Checkout)
[Pipeline] echo
Checkout
[Pipeline] git
No credentials specified
> git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
> git config remote.origin.url https://github.com/NevenMoore/scf_devops_demo.git # timeout=10
Fetching upstream changes fromhttps://github.com/NevenMoore/scf_devops_demo.git
> git --version # timeout=10
> git fetch --tags --progress https://github.com/NevenMoore/scf_devops_demo.git +refs/heads/*:refs/remotes/origin/*
> git rev-parse refs/remotes/origin/master^{commit} # timeout=10
> git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
Checking out Revision a500383602e314911b62a74045295f0008b0288f (refs/remotes/origin/master)
> git config core.sparsecheckout # timeout=10
> git checkout -f a500383602e314911b62a74045295f0008b0288f
> git branch -a -v --no-abbrev # timeout=10
> git branch -D master # timeout=10
> git checkout -b master a500383602e314911b62a74045295f0008b0288f
Commit message: "flask"
First time build. Skipping changelog.
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Build)
[Pipeline] echo
Building
[Pipeline] sh
+ pip install -r requirements.txt
Requirement already satisfied: flask in /usr/local/lib/python3.6/site-packages (from -r requirements.txt (line 1)) (1.0.2)
Requirement already satisfied: click>=5.1 in /usr/local/lib/python3.6/site-packages (from flask->-r requirements.txt (line 1)) (6.7)
Requirement already satisfied: itsdangerous>=0.24 in/usr/local/lib/python3.6/site-packages (from flask->-r requirements.txt (line 1)) (1.1.0)
Requirement already satisfied: Werkzeug>=0.14 in/usr/local/lib/python3.6/site-packages (from flask->-r requirements.txt (line 1)) (0.14.1)
Requirement already satisfied: Jinja2>=2.10 in /usr/local/lib/python3.6/site-packages (from flask->-r requirements.txt (line 1)) (2.10)
Requirement already satisfied: MarkupSafe>=0.23 in/usr/local/lib64/python3.6/site-packages (from Jinja2>=2.10->flask->-r requirements.txt (line 1)) (1.1.1)
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] echo
Testing
[Pipeline] script
[Pipeline] {
[Pipeline] sh
+ scf native invoke -t ./template.yaml --no-event
START RequestId: 59d1d0b0-c206-4a6d-a025-ebd364952bc9
{}

END RequestId: 59d1d0b0-c206-4a6d-a025-ebd364952bc9
REPORT RequestId: 59d1d0b0-c206-4a6d-a025-ebd364952bc9 Duration: 0 ms BilledDuration: 100 ms Memory Size: 128 MB Max Memory Used: 32 MB


"hello world"
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Deploy - Staging)
[Pipeline] echo
Deploy - Staging
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Sanity check)
[Pipeline] input
Does the staging environment look ok?
Proceed or Abort
Approved by 帅哥
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Deploy - Production)
[Pipeline] echo
Deploy - Production
[Pipeline] script
[Pipeline] {
[Pipeline] sh
+ scf package -t ./template.yaml
Generate deploy file 'deploy.yaml' success
[Pipeline] sh
+ scf deploy -t ./deploy.yaml -f
deploy default begin
default scf_devops_demo already exists, update it now
Deploy function 'scf_devops_demo' success
deploy default end
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Declarative: Post Actions)
[Pipeline] echo
Things were different before...
[Pipeline] echo
I succeeeded!
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

>>>>

控制台检验

scf_devops_demo函数已经正确上传。

总结

从阶段视图可以看出SCF环境下的DevOps并没有什么不同。唯一的区别在于SCF有自己的runtime,需要官方提供的scf cli来模拟线上运行环境。deploy阶段直接用scf cli相比写代码云API也简单了许多。

对于一些有特殊需求的SCF用户(私网CI/CD),本文有一定借鉴作用。

最后,pip install scf。下载一个scf cli,上车。

本文分享自微信公众号 - ServerlessCloudNative(ServerlessGo),作者:李帅

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 云函数场景下的DevOps实践--蓝盾

    本文将展示使用云函数+ 蓝盾,开发部署一个"给用户发送提醒短信"的微服务。以这个非常简单的应用,探索一下ServerLess结合DevOps所能产生的合力,畅想...

    腾讯云serverless团队
  • 云函数场景下的DevOps实践--CODING企业版

    云函数scf init 命令可以进行项目初始化操作。基于Git仓库模板项目可以快速创建出一个简单的模板项目,进行进一步的开发。

    腾讯云serverless团队
  • 火力全开 | 持续集成、持续交付 | 5分钟了解一个容器典型应用场景系列

    5分钟了解一个容器典型应用场景系列篇 关于容器解决方案的概念、架构、成功案例,笔者已经分享了很多了。为了使读者能够花更短的时间,迅速感性地解容器的典型应用场景。...

    魏新宇
  • ​深圳 | 首届腾讯运维技术开放日,为你而来

    7x24 小时连轴转已成为运维工程师的常态,故而每年的 7 月 24 日被视为运维日,代表着运维全天候的保障系统稳定、维护业务正常运行、时刻准备着一线工作的召唤...

    CODING
  • 首届腾讯运维技术开放日!对外报名正式启动!

    服务不停歇,运维不休息。 运维的工作长达7*24 小时,故而每年的 7月24日被视为运维日,代表着运维全天候的保障系统稳定、维护业务正常运行、时刻准备着一线工...

    腾讯技术工程官方号
  • 基于 Jenkins 的 DevOps 平台应该如何设计凭证管理

    了解到行业内有些团队是基于 Jenkins 开发 DevOps 平台。而基于 Jenkins 实现的 DevOps 平台,就不得不考虑凭证的管理问题。

    LinuxSuRen
  • DevOps 三剑客:Dev,Ops and Jenkins

    每一位开发、测试和运维工程师,都有一个私人管家,他的名字叫Jenkins. Jenkins World就像这位管家的生日Party,大家聚在一起狂欢,分享Jen...

    DevOps时代
  • 自动化工具后起之秀Ansible的部署实践

    从早期手动加脚本的部署方式,到后来自动化工具(chef, puppet, saltstack, ansible等)的出现,再到如今DevOps的盛行,企业应用部...

    yuanyi928
  • Jenkins Area Meetup 2018 深圳站圆满结束 (附 PPT 下载)

    Jenkins在10年间从一个单一的CI工具,成长为软件交付的Pipeline级解决方案。本次活动现场火爆,到达率极高,活动的成功举办离不开大家的支持!

    DevOps时代
  • 当Jenkins遇上Kubernetes

    Jenkins是大名鼎鼎的DevOps自动化平台,由于其开源,社区支持力度大,插件生态丰富等优势,成为持续开发,持续集成,持续测试和持续交付领域的王者。它的口号...

    muntainyang
  • 『中级篇』docker导学(一)

    IT架构圈
  • 『中级篇』docker导学(一)

    IT架构圈
  • 完整的 CI/CD 集合[教程]

    LinuxSuRen
  • 【Kubernetes系列】第8篇 CI/CD之组件部署

    应对敏捷开发的需求,对CI(持续集成))/CD(持续交付)的提出了更高的标准,今天来讨论下,如何基于开源组件(gitlab/jenkins/harbor/kub...

    HankerCloud
  • DevOps建设之基于钉钉OA审批流的自动化上线

    随着DevOps在公司的不断实践落地,基于环境现状,目前已经发展成较为成熟和稳定的工作流。负责DevOps建设的团队目前的工作是内部Ops平台开发和不断发现挖掘...

    仙人技术
  • Jenkins Area Meetup 2019 北京首站沙龙精彩回顾(附PPT)

    2019年5月19日,首都天气晴朗,万里无云,100多名 Jenkins 用户同时相聚在北五环的北辰泰岳大厦, 2019 年首次 Jenkins Area Me...

    DevOps时代
  • 「持续集成实践系列」Jenkins 2.x 搭建CI需要掌握的硬核要点

    随着互联网软件行业快速发展,为了抢占市场先机,企业不得不持续提高软件的交付效率。特别是现在国内越来越多企业已经在逐步引入DevOps研发模式的变迁,在这些背景催...

    测试开发技术
  • 腾讯云 Serverless 开发者工具最佳实践

    注:本文整理自上周六举办的「Hello Serverless」技术沙龙深圳站演讲内容,文末提供了讲师演讲 PDF 的下载,回复「Serverless 深圳」免费...

    腾讯云serverless团队
  • 「持续集成实践系列」Jenkins 2.x 搭建CI需要掌握的硬核要点(一)

    随着互联网软件行业快速发展,为了抢占市场先机,企业不得不持续提高软件的交付效率。特别是现在国内越来越多企业已经在逐步引入DevOps研发模式的变迁,在这些背景催...

    测试开发技术

扫码关注云+社区

领取腾讯云代金券