【技术视野】窥探CI/CD

前言:

互联网时代的软件交付周期有别于传统软件行业,快与变及其关键的两个关键词。如若采取老旧的shell人工构建、人工推包、折腾环境进行运维的方式,必将加大每次提测与交付的成本,CI/CD的概念产生即是为了解决此技术痛点。CI/CD持续交付,快速试错,为实现devOps的目标提供了关键的一环。

闲聊我司

在这里我必须先赞一波我司的基础架构产品,两年前刚进来的时候真的觉得开发效率贼高,真正理解devOps这个概念确实是得益于我实际工作中接触到我司云平台自动化构建产品:

  1. 基于开源CI&CD鼻祖jenkins
  2. 融合我司自身云以及其它组件
  3. 定制化用户体验界面,比原生jenkin以及blueoceanu对用户更亲和,更简化。

这也是促使我去了解jenkins的原因。

持续集成的业界产品

GitLab CI:基于YAML描述管道,支持集成K8S,使用 Herokuish 构建包来确定语言以及如何构建应用程序,遵循遵MIT 许可协议
Go CD:遵循 Apache 2.0 许可协议,感兴趣上去看吧https://www.gocd.org/哈哈哈哈并不是我有偏见,就一天写作急赶紧继续写。
Jenkins:提供基本的构建流程,以及基于jenkinfiles描述的pipeline构建方式,社区生态提供上千个插件,jenkins自身允许集成各种语言执行编译的环境,也支持通过插件agent到不同节点(use docker/as a k8s pod/or a node machine)完成管道工作。开放接口支持二次开发。遵循 MIT 许可协议。https://www.jenkins.io/zh/

万变不离其宗

虽然实现不一样,不过核心原理都差不多。任何高大上的产品都离不开迭代,任何迭代都有一个巨人肩膀或者我称之为基线。。比如日志采集基线->elk体系,爬虫->webmagic,大数据->hadoop/hive/spark 好吧扯远了

俗话说咱不能为了炒个肉,自己养猪,钻木取火,自己磨刀吧。。咱关注的维度如何组合出一道菜而不是如何养猪。。同理,做个软件没必要逻辑门或者电子元件都自己搞吧hhh ci/cd的这条基线选jenkins没错啦哈哈哈哈

进入主题:

jenkins提供了什么

在这里插入图片描述

  • 依托版本控制软件如git以及容器技术docker,为开发/运维/测试人员提供一套高效ci/cd流程管理平台,以pipeline核心概念围绕ci/cd提供诸如【scm自动触发】【自定义前置触发器】【代码构建】【静态代码检查】【自动化测试】【远程部署】等功能。
  • 丰富的插件生态解决了大部分业务场景,开放的接口与插件能力为二次开发提供了扎实的基础:界面流程定制,插件开发,组件集成…
  • 如图所示,至于决定将所有构建依赖都安装在jenkins所在机器上还是节点分离这是看个人喜好和需求的。图只是一种简单的部署实现

  • 安装途径
    1.1. docker :docker run -u root --rm -d -p 8080:8080 -p 50000:50000 -v jenkins-data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean 使用blueocean提供的基础镜像,并指定挂载目录(便于存放第三方jenkins插件)以及本机docker socke挂载(搭配docker pipeline插件更香,agent本机提供docker服务)
    1.2. war文件。http://mirrors.jenkins.io/war-stable/latest/jenkins.war java -jar jenkins.war --httpPort=9090
    1.3. iOS brew install jenkins
    1.4. linux (debian) apt-get install jenkins
  • 基本功能。
    2.1. 流水线任务构建:scm触发,pipeline,自由风格…
    2.2. 构建历史
    2.3. 系统管理:插件管理,用户管理,工作空间,凭据管理,cloud节点管理。
  • 丰富插件
    Docker Pipeline插件允许在pipeline中使用docker agent
    DOCKER 插件使外部docker作为一个jenkins从节点
    在这里插入图片描述
    在这里插入图片描述
    K8S 使jenkins可以在k8s集群中使用pod作为jenkins slave agent。类似上述docker插件
    其它基础依赖插件如 git/gradle/maven/node/中文… 在新手教程会指引安装。
    在这里插入图片描述
    插件安装方式,通过插件地址下载hpi格式文件手动上传/admin进入插件管理选择插件下载。

在这里插入图片描述在这里插入图片描述

  • 开放接口:java为例

Java API wrappers
The jenkins-rest library is an object oriented java project that provides access to the Jenkins REST API programmatically to some remote API Jenkins provides. It is build using the amazing jclouds toolkit and can easily be extended to support more REST endpoints. Its feature set evolves and users are invited to contribute new endpoints via pull-requests. In its current state it is possible with this library to submit a job, track its progress through the queue, and during its execution until its completion, and obtain the build status. Services currently offered include:

  • Endpoint definition (property or environment variable)
  • Authentication (basic and API token via property or environment variable)
  • Crumbs Issuer support (auto-detect crumbs)
  • Folder support
  • Jobs API (build, buildInfo, buildWithParameters, config, create, delete, description, disable, enable, jobInfo, lastBuildNumber, lastBuidTimestamp and progressiveText)
  • Plugin manager API (installNecessaryPlugins, list current plugins)
  • Queue API (cancel, list queue items, query queue item)
  • Statistics API (overall load)
  • Systems API (systemInfo)
    The project can evolve rapidly, this list is accurate only as of the date of writing.

参考自jenkins remote api

jenkins的基础使用(demo)

此处选择使用docker pipeline插件,安装方式为docker。

手动编写触发jenkins任务,实现检验node环境并构建vue-admin项目并上传静态文件到git这一流程

scm方式或者自由风格软件方式等更多内容可以移步官方文档~

  • 本机安装并允许docker,重复一下命令
    docker run -u root --rm -d -p 8080:8080 -p 50000:50000 -v jenkins-data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean
    在这里插入图片描述
  • 进入jenkins admin ,选择pipeline风格创建一个流水线,编写脚本指定docker agent以及检验docker node版本。
    任务类型
    处理脚本
    (此处可以进行多个stage的定义,包括集成测试,代码检查之类的,有shell有api就啥都有了,此处只是为了简单演示,仅校验目标agent的node环境)
    在这里插入图片描述
    从构建日志信息中可以看出ok了
  • 准备git项目 选择master分支,此处我fork了广为人知的element-admin项目。https://github.com/mori-gduf-vip/electron-vue-admin
  • 修改流水线定义,scm检索触发构建,并在vue-admin项目下定义jenkinsfiles文件并提交到git,作用:node容器打包部署静态文件结果到mac
    在这里插入图片描述
    jenkins脚本:指定docker agent执行流水线构建并在jenkins工作空间产生结果文件。
pipeline {
   agent {
       docker { image 'node:latest' }
   }
    stages {
           stage('Build') {
               steps {
                   sh 'node --version'
                   echo 'Building..'
                   sh 'npm install'
                   echo 'packing..'
                   sh 'npm run pack'
                   echo 'build..'
                   sh 'npm run build'

               }
           }
           stage('Test') {
               steps {
                   echo 'Testing..something'
               }
           }
           stage('Deploy') {
               steps {
                   echo 'Deploying....'
               }
           }

       }
}

提交代码
提交代码
scm检出触发流水线
在这里插入图片描述
在这里插入图片描述
构建完查看workspace
在这里插入图片描述
当然可以把本demo打包成dmg安装包(下图上半部分是本地打包,下半部分是进入jenkins工作空间看到的流水线结果),此处演示默认build linux的包
在这里插入图片描述
后面再加点后置脚本,shell将工作空间的静态文件提交到git或者部署或者运行或者集成测试都可以。jenkins灵活且强大。

over~~

扩展

  1. 插件定制开发 say hello world 插件
    在这里插入图片描述

  2. about jenkinsfile

Jenkins 流水线(pipeline)的优势:
使用Groovy DSL(领域特定语言)编写代码
代码存储在一个名为Jenkinsfile的文本文件中,该文件可以存放到代码
库中
支持各种复杂的逻辑操作
可以与其他插件集成

结语:

bb两句:全文手撸,拙见轻喷。水滴石穿,做我们自己的基础架构。helloworld虽然不比企业的复杂架构/需求场景/历史技术沉淀/丰富的人力资源,但是我们依旧可以helloworld出真知,以自己的刚需为导向去发掘自己能迭代什么。jenkins,解放我撸代码提交部署的双手,即使只是部署到本机,那以后可能部署到树莓派,部署到阿里云之类的。东西多了,量级起来了,轮子的作用就出现了!一键触发!。轮子不够用了,又促使你继续去研究以及解决刚需。开源时代有则改之,无则开发哈哈哈哈

猜你喜欢

转载自blog.csdn.net/vipshop_fin_dev/article/details/106036955