【技術視野】窺探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,解放我擼代碼提交部署的雙手,即使只是部署到本機,那以後可能部署到樹莓派,部署到阿里雲之類的。東西多了,量級起來了,輪子的作用就出現了!一鍵觸發!。輪子不夠用了,又促使你繼續去研究以及解決剛需。開源時代有則改之,無則開發哈哈哈哈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章