最近一年都在捣腾Electron,从0.X版本,到现在最新Stable的3.X版本。一路上踩的坑很多,Electron的版本号也飞快的。项目设立的初衷是一份代码,即可构建出WindowsMac,并且部分功能模块可以与Web版公用,因此我们项目名为:三体

由于程序比较复杂,使用Electron程度也较深,因此对比一般的桌面程序,构建流程比较繁琐,因此项目开始之初,就使用Jenkins作为我们项目的自动构建的工具。随着时间的推移,Jenkins的构建任务也一步步的智能化,力求智能,省心,省力。

Jenkins的安装和部署这些就不多说了,读者自行了解。

Jenkins单独部署

项目开始之初,采用的Jenkins的方式就是:windows构建主机安装一个Jenkins,Mac主机安装一个Jenkins。当需要构建时候,手动点下运行任务。

这估计也是最多人使用Jenkins的方式,0门槛的入门。

优点:部署简单,入门快 弱点:每次执行任务,需要访问两个Jenkins(这个时候,我们就只有两个主机构建,如果多个主机,则需要访问多个Jenkins),然后再执行任务。

Jenkins多节点部署

到了某个时候,发现实在太麻烦了,就使用单个Jenkins,然后通过节点管理执行Jenkins任务。

由于我们桌面端程序,构建过程,还需要把其他团队的项目进行构建,放入到我们程序的指定目录(JsBundle),这时候Jenkins的Config Files就大显身手,把构建其他JsBundle的命令放入Config Files(如果包没变更,则跳过构建,获取缓存的包),这样就没必要每个构建任务重复录入相同的流程,如图feature, master等。

这时候幸福满满的,所有任务都可以通过Jenkins执行了,而且构建权限开放给所有开发,随时构建包。

优点:充分利用不同机器资源,组建为构建集群。

Jenkins多配置

如上图所示,我们有很多构建任务,有C++的,有第三方Node(预构建为二进制包,例如Napajs),但是核心构建我们的安装包也有不同的任务,例如开发构建的是feature,测试构建的是master,灰度和发布则还有其他。但其实他们的构建流程都几乎一致的。

上述的Jenkins使用方式,大概持续了大半年多,一直也挺满意,觉得挺美好的。这时候,公司大力发展混合云,桌面端程序也需要按企业资源构建(简单理解,就是类似手机的各种渠道包吧)

但是混合云的构建,由别的团队负责,因此搭了另外一套Jenkins,我们团队提供构建步骤,并且额外还有替换企业资源包的步骤。好景不长,这样的方式,进行了一两个月,问题逐渐暴露出来,每当我们需要修改构建步骤,都需要通知其他团队一并进行修改。

因此思考,有没方式可以改善这种方式呢?恰逢把Jenkins升级了一番,发现以下这

根据描述,好像可以解决我们一些问题,例如上面图里面的全平台构建,不需要再搞两个任务了,起码能干掉一半的任务,每次修改脚本,可以省掉一半修改量了。

但是还是没根本解决问题,只是优化了一点。这时候,发现了Jenkins Pipeline,赶紧了解一下,眼前一亮,好像很美好。

Jenkins Pipeline

赶紧尝试一下,由于我们项目过于复杂,没办法很省心省力的用起来。试了几回,都打算放弃了几回,只是不甘心,还是念念不忘。真正的从入门到“放弃”。

由于Jenkins Pipeline对于大部分人来说,过于高深,因此一直担心脚本太复杂,对其他维护的同事来说是个负担。(作为Lead,还是得考虑维护成本的,否则自个Hight不行),因此寻求简单易懂,但又能组织形成复杂的构建步骤的平衡点。

Jenkins Pipeline的脚本形式分为:声明式脚本式,初次采用了声明式,因此易懂,类似json的结构。但是尝试了写了下来,发现嵌套层数很多,有点累赘。最后还是采用了脚本式的,结合现学的groovy语法把一些复杂的逻辑,以前通过Config Files编写的逻辑独立为单独的文件,保持主文件的清爽。

最结合之前的Multi-configuration,完美...

废话不说,直接上脚本代码

properties([parameters([string(name: 'runNode', defaultValue: 'mac', description: '节点'),string(name: 'cloudhubX_branch', defaultValue: 'master', description: '三体分支'),string(name: 'xx_branch', defaultValue: 'release', description: 'XX分支'),
])])node ("${params.runNode}") {checkout scm;def noCacheToBuild = load("${WORKSPACE}/.jenkins/noCacheToBuild.groovy")def check = load("${WORKSPACE}/.jenkins/check.groovy")stage('pre') {// 检查任务check()sh 'rm -rf node_modules build dist bundle'}ansiColor('xterm') {stage('XX') {dir(".resource/xx") {def git = git(branch: env.xx_branch,credentialsId: 'git_ssh', changelog:true, url: '.............')noCacheToBuild(git, 'JsBundle的目录名', 'dist') { // 如果缓存找不到,则构建,否则返回缓存sh """yarn installyarn run build"""}}}// .............stage('cloudhub') {sh """yarn installyarn buildyarn run publish $OS"""// 推送到nginxsshPublisher(publishers: [sshPublisherDesc(configName: 'master', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: "/$cloudhubx_branch/${OS}", remoteDirectorySDF: false, removePrefix: 'install', sourceFiles: 'install/*.*')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}}
}复制代码

发展到这,项目都可以复用一个构建任务,如下图,由上游项目传不同的参数触发

下一步计划

这次的调整,可以把公有云的产品构建都统一为一个了。把Jenkinsfile放入到工程,以后修改都可以直接修改,不用担心构建任务与项目代码不匹配了。

  • 干掉混合云的Jenkins,都收拢在一个构建平台
  • 尝试把构建任务不同stage,由不同机器执行。例如:C++的由指定平台的编译机器,JsBundle由服务器Docker构建,Electron本身由另外的机器打包

Jenkins Pipeline 构建复杂的Electron程序相关推荐

  1. Jenkins Pipeline构建流水线发布

    Jenkins Pipeline构建流水线发布 1. Jenkins Pipeline 核心概念 Jenkins Pipeline是一套插件,支持在Jenkins中实现持续集成.交付管道; Pipel ...

  2. Jenkins + Pipeline 构建流水线发布

      Jenkins + Pipeline 构建流水线发布 利用Jenkins的Pipeline配置发布流水线 参考: https://jenkins.io/doc/pipeline/tour/depl ...

  3. jenkins pipeline php,Jenkins + Pipeline 构建自动化发布

    Jenkins + Pipeline 构建流水线发布 利用Jenkins的Pipeline配置发布流水线 新建一个名为pipeline-loop的 pipeline项目,然后配置,关键配置如下: 生成 ...

  4. 使用jenkins pipeline构建发布流水线

    插件的安装 jenkins的安装不是本文主要内容,请自行查找. 安装完jenkins后,在主要系统管理>管理插件>可安装,在右上角搜索框里输入Pipeline查找,安装后重启jenkins ...

  5. helm部署jenkins到k8s并创建pipeline构建项目

    安装部署nfs 1. nfs服务器创建目录 [yeqiang@harbor ~]$ sudo mkdir /home/nfs/jenkins -p 2. 设置其他用户可以写入该目录 [yeqiang@ ...

  6. Jenkins Pipeline任务构建

    1.关于Jenkins Pipeline Jenkins Pipeline(管道)是Jenkins中支持持续集成(Continuous Integration).持续交付(Continuous del ...

  7. Jenkins Pipeline Kubernetes 如何创建 Pod

    Jenkins Pipeline & Kubernetes 如何创建 pod 文章目录 Jenkins Pipeline & Kubernetes 如何创建 pod 1. 前言 2. ...

  8. 基于K8S构建企业级Jenkins CI/CD平台实战(三) 之 带你实战Spring boot/Cloud 项目 CI/CD jenkins自动化构建、部署过程

    需要环境 Git(GitLab) Harbor 私服 kubernetes-plugin 使用 Kubernetes jenkins 通过前面三篇我们已经了解了jenkins和 kubernetes- ...

  9. 基于Jenkins Pipeline的ASP.NET Core持续集成实践

    最近在公司实践持续集成,使用到了Jenkins的Pipeline来提高团队基于ASP.NET Core API服务的集成与部署,因此这里总结一下. 一.关于持续集成与Jenkins Pipeline ...

最新文章

  1. Redis入门教程(一)
  2. 华为FusionSphere概述——计算资源、存储资源、网络资源的虚拟化,同时对这些虚拟资源进行集中调度和管理...
  3. 使用vue-cli + webpack搭建vue项目环境
  4. 双向链表操作c语言 函数,c语言 双向链表的基础操作
  5. 在WordPress文章中插入表格的四种方法,史上最全
  6. pythonmain是什么意思_Python中if __name__ == __main__详细解释
  7. Objective C的那点小语法
  8. 06 全局锁和表锁 :给表加个字段怎么有这么多阻碍? *(笔记)转
  9. 力扣268.丢失的数字
  10. 企业职工能实行弹性退休吗?
  11. 今日七夕!不取标题,只想娶你
  12. 狂神说Reids完结篇
  13. 《深入浅出Python机器学习》读书笔记 第二章 基于Python语言的环境配置
  14. 【foobar 2000】如何在手机、电脑上播放局域网内另一台电脑上存储的音乐?FTP服务器、UPnP/DLNA协议、构建Music server、创建音乐服务器
  15. ffplay-主要数据结构分析
  16. Python 文字转语音(TTS)
  17. 求传递闭包c语言具体编程,实验一_传递闭包的实现.doc
  18. Kettle使用 js 文件生成节假日表文件 附带2019-2020节假日文件
  19. 使用LibreOffice将office文档转pdf(java实现)
  20. 红黑树 插入算法(一)

热门文章

  1. happens-before俗解
  2. 多线程之线程池的应用
  3. Deep Learning简明深度学习方法概述
  4. 百度前端fex-team团队面试指南
  5. 深度学习(七)caffe源码c++学习笔记
  6. 偷梁换柱——揭开多态的面纱
  7. Linux文本处理三剑客之sed
  8. Docker问题记录
  9. WEB 进程的查看和关闭(kill)
  10. 对网站的代码采集实例