前面一篇文章《蓝鲸DevOps深度解析系列(1):蓝盾平台总览》,我们总览了蓝鲸DevOps平台的背景、应用场景、特点和能力;
?
接下来我们继续解析蓝盾平台的核心组件——流水线引擎。本文介绍的是蓝盾流水线的用户体验,为了让大家有更直观的感受,所以图片较多,请谅解。
传统的瀑布式软件开发模型在需求明确、业务稳定的项目中,有着明显的优势;而面对需求频繁变化的项目、持续迭代的互联网产品,敏捷开发方法正好适合。
DevOps则帮助开发、测试和运维团队共同创建了一个强大的、可预测的软件交付方式。
DevOps强调“将软件建设的所有环节进行自动化&全面监控”,也就是使用正确的持续集成(CI)和持续交付(CD)工具集,把持续交付的过程变得自动化,更快速、可靠;并且将过程数据进行尽可能完整的数据采集和分析,用于持续的精益改进。
实现这一切的核心是实现高效交付的自动化流水线。根据《2018全球DevOps现状调查报告》,基于 DevOps 改进了软件交付效能的精英组织相比低效组织来说,吞吐量和可靠性的提升,流水线居功至伟。
蓝盾流水线的背景
在腾讯互动娱乐事业部(IEG),庞大的持续部署和持续集成、持续运营的需求,驱动着流水线也经历了两条不同主线的发展:
1) CD/CO流:从自动化应用部署和发布工具,到通用的运维平台支撑部署和运营作业流水线
时至今日,腾讯IEG运营的六百多款产品使用的语言、技术架构、数据库、运行环境差异化仍然非常大。面对每个产品的部署发布、运营作业的编排和执行需要,摆在面前有两条路可以选择:
● 为每个产品的部署发布、运营场景定制开发特定的工具,一个个工具变成一个个烟囱,开发团队需要面对不同的需求疲于奔命;
● 建立技术运营的体系,将平台的建设和运营场景的建设分开,平台建设团队不断的丰富平台能力,产品运营团队基于平台以组装的方式来实现部署发布和运营场景。
如果我们为数百款产品开发数百个部署、运营工具平台,那么数百款产品的运维、运营工具的开发,会导致巨大的成本、稳定性问题。
显然,建立技术运营体系这条路是不得不走的路,这个平台也就是诞生于IEG的蓝鲸平台。蓝鲸平台的介绍文章颇多,在此不做详细的介绍。
2) DevOps流:从基于Jenkins的持续集成流水线,到自研的强大流水线引擎
无论是在初创公司还是大型企业,在需要持续交付的项目/产品研发中引入DevOps都可以减少人为错误的发生。
该模型允许研发维持质量,同时加快端到端快速交付流程。在DevOps体系中,流水线结合研发效能工具可以帮助企业创建自己的快速交付管道。
DevOps落地过程中,最关键的、同时挑战最大的是构建自动化持续交付流水线。
自动化持续交付流水线涉及到代码拉取、代码静态分析、编译构建、单元测试、制品归档、自动化测试、安全扫描、压力测试、部署测试环境、部署预发布环境、发布等等环节的串联和自动化执行。
建设企业级的统一DevOps平台,开源的Jenkins 流水线在性能、可扩展性、稳定性、安全性、用户体验方面都存在明显的不足,踩过了若干坑之后腾讯IEG不得不重新设计了流水线引擎,而且它必须要比Jenkins更为强大,才能有存在的价值。
蓝盾流水线的用户体验
如果流水线引擎不能带来良好的用户体验,不能适应各种场景下的流水线灵活编排,那么它和执行脚本有什么区别?
在用户体验方面,蓝盾的流水线可以说做到了极致,本文就从用户体验着手,来初步解析蓝盾流水线:
1) 轻松简单的流水线编排
蓝盾流水线让用户不需要学习Jenkins的Pipeline语法,也不需要过于关注和工具平台如何对接。
图形界面的可视化的流水线设计,灵活组装各种原子,配置化原子设置,降低了使用难度,也减少了脚本难以调试、容易出错的问题。更不会出现人员更迭导致无法维护的问题。
下面的流水线示例,各一个纵列是一个阶(Stage),每个块是一个任务原子(Task),近百种原子模板可以根据业务的需求,灵活组装出各种流水线,对接各种工具实现CI/CD环节的各种功能和流程。
我们可以从空白模板开始创建流水线,也可以从流水线模板库中的模板来建立流水线。模板可以预先设置好流水线的阶段、构建环境、原子类型等,降低流水线编排的难度。模板可以由用户自己来创建。
流水线可以把任务分为多个阶段(Stage),每个阶段(Stage)下面,还可以有多个并行的作业(Job),每个作业都可以指定不同的构建环境,我们可以在构建阶段并行进行不同的构建环境下的程序的构建,例如:后台服务、Web端、移动端。每个作业下面,还可以有多个串行执行的任务原子(Task)。
每个任务原子都是可以配置的,每个原子模板都有特定的功能,我们可以选择任何一种原子类型下面的原子模板。蓝盾内置了近百种原子模板供我们选择和组装,如果没有满足的原子,也允许用户自己扩展开发。
例如,我们选择了拉取GitLab仓库代码原子模板,我们就可以直接在图形界面进行原子的参数化配置GitLab代码仓库的信息,流水线执行到该原子时,就会根据配置自动的从指定代码仓库拉取指定版本的代码。
如果我们选择了代码检查任务模板,我们就可以配置代码检查执行任务中的语言和代码检查工具;流水线执行到该原子时,就会启动代码检查平台按照指定的设置开展代码扫描了。
2) 直观清晰的流水线跟踪
流水线被执行之后,我们需要了解流水线的执行情况,例如:成功与否、耗时、日志;我们还需要拿到流水线执行的产出物(即制品包)、报告(代码检查报告、单元测试报告)。过往这些信息往往是散落在不同的工具平台中的,给我们的实际工作带来很多不必要的困扰。
上图中,流水线的每次执行的结果,都可以在执行历史中被展示出来。包括:启动时间、构建序号、耗时、版本号、触发方式和执行人等。如果需要看更加详细的信息,我们可以点击其中一次记录,就可以看到该次执行的具体信息。
如果有异常,流水线会自动停止和发送通知,在执行结果界面清晰的标识出哪个原子出现了异常。
如果需要进行更进一步的了解原子的执行情况,在执行结果中点击任何一个原子,我们可以深入查看和分析该原子更细节的日志,例如:
在“查看构件”标签页,我们可以直观看到本次流水线执行生成的制品包,如果有需要可以直接下载到本地或者查看元数据,而不是需要到切换到制品仓库软件中去查找。
在“代码变更记录”页,我们直接可以查看到本次流水线的执行涉及的代码变更版本号范围以及具体的Commit信息,可以用于追踪产出的新的版本,涉及了哪些需求或变更、缺陷的修复。
在“产出物报告”标签页中,集中展示流水线中各个环节产生的报告,例如下面的代码检查原子产生的代码检查报告。
以及在单元测试环境产出的单元测试报告。
3) 流水线的设置
在流水线的设置中,我们可以配置流水线的运行锁定、通知设置、权限设置等。例如:可以设置流水线在同一时间可以运行一个或多个实例。
流水线在构建成功或失败时,对哪些人进行某种方式的通知。
public string Sentiment_Text;
[VectorType(600)]
public int[] Features;
[VectorType(2)]
public float[] Prediction;
}
[TensorFlowFact]
public void TensorFlowSentimentClassificationTest()
{
var mlContext = new MLContext(seed: 1, conc: 1);
var data = new[] { new TensorFlowSentiment(www.dfgjpt.com) { Sentiment_Text = "this film was just brilliant casting location scenery story direction everyone's really suited the part they played and you could just imagine being there robert is an amazing actor and now the same being director father came from the same scottish island as myself so i loved the fact there was a real connection with this film the witty remarks throughout the film were great it was just brilliant so much that i bought the film as soon as it was released for and would recommend it to everyone to watch and the fly fishing was amazing really cried at the end it was so sad and you know what they say if you cry at a film it must have been good and this definitely was also to the two little boy's that played the of norman and paul they were just brilliant children are often left out of the list i think because the stars that play them all grown up are such a big profile for the whole film but these children are amazing and should be praised for what they have done don't you think www.jrgjze.com/ the whole story was so lovely because it was true and was someone's life after all that was shared with us all" } };
var dataView = mlContext.Data.ReadFromEnumerable(data);
var lookupMap = mlContext.Data.ReadFromTextFile(@"sentiment_model/imdb_word_index.csv",
columns: new[]
{
new TextLoader.Column("Words", DataKind.TX,www.yongshi123.cn 0),
new TextLoader.Column(www.xianjingshuiqi.com"Ids", www.gen-okamoto.com DataKind.I4, 1),
},
separatorChar: ','
);
var estimator = mlContext.Transforms.Text.TokenizeWords("TokenizedWords", "Sentiment_Text")
.Append(mlContext.Transforms.Conversion.ValueMap(lookupMap, "Words", "Ids", new[] { ("Features", "TokenizedWords") }));
var dataPipe = estimator.Fit(dataView)
.CreatePredictionEngine<TensorFlowSentiment, TensorFlowSentiment>(mlContext);
string modelLocation = @"sentiment_model";
var tfEnginePipe = mlContext.Transforms.ScoreTensorFlowModel(modelLocation, new[] { "Prediction/Softmax" }, new[] { "Features" })
.Append(mlContext.Transforms.CopyColumns(("Prediction", "Prediction/Softmax")))
.Fit(dataView)
.CreatePredictionEngine<TensorFlowSentiment, TensorFlowSentiment>(mlContext);
//Predict the sentiment for the sample data
var processedData = www.mren2yule.com dataPipe.Predict(data[0]);
Array.Resize(ref www.xycheng178.com processedData.Features, 600);
var prediction www.jlzkyy.com= tfEnginePipe.Predict(processedData);
从上述信息可以看到,蓝盾流水线的用户体验可以说超越了所有的其他流水线工具,这种用户体验带来的不只是界面好看本身,而是蓝盾产品团队对DevOps的更多考虑:
● 蓝盾作为企业级的DevOps平台,我们希望的是靠平台的强大、极致的用户体验吸引各个研发团队将研发流程迁移到平台上,而不是通过行政命令要求各个团队必须使用蓝盾DevOps平台;行政命令则可能会带来用户反弹和博弈,而蓝盾是一个能“润物细无声”的帮助企业把DevOps研发标准、规范体系推广到全企业的研发效能平台;
● 用户体验绝不只是“界面好看”四个字所能概括的,极致的用户体验是建立在对市场竞品的调研和分析,对庞大的DevOps团队用户进行调研和分析,对平台的不断优化和打磨,对蓝盾工具链的各个工具进行深度打通等等的基础之上;平台的功能、稳定性、扩展性等必须做到极致,才是用户体验能达到极致的前提;
● 用户体验不应只是带来用户的方便,直接或者间接带来的更多是:学习成本的降低、研发效能的提升、交付频率更高、交付时间更短,由于流水线编排出错导致的部署失败、运行事故降低到极低,由于人员变动带来的影响更小;IT团队在DevOps项目中的参与度更高、团队更加稳定,可以有更多的精力放在业务层面的运营和优化中。