自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

流水線(xiàn)即代碼

開(kāi)發(fā) 開(kāi)發(fā)工具
大意是將復(fù)雜的構(gòu)建流程納入一個(gè)簡(jiǎn)單的腳本文件,然后用一條命令調(diào)用。這樣,任意的開(kāi)發(fā)者都能在自己的工作區(qū)中執(zhí)行腳本重建一套一模一樣的構(gòu)建環(huán)境,從而消除CI/CD環(huán)境由于散亂配置腐化而成的特異性。

2016年11月份的技術(shù)雷達(dá)中給出了一個(gè)簡(jiǎn)明的定義:流水線(xiàn)即代碼(Pipeline as Code)通過(guò)對(duì)持續(xù)集成/持續(xù)交付(CI/CD)運(yùn)行工具進(jìn)行編碼而非配置的方式定義部署流水線(xiàn)。其實(shí)早在2015年11月份的技術(shù)雷達(dá)當(dāng)中就已經(jīng)有了類(lèi)似的概念:

  • The way to avoid programming in your CI/CD tool is to extract the complexities of the build process from the guts of the tool and into a simple script which can be invoked by a single command. This script can then be executed on any developer workstation and therefore eliminates the privileged/singular status of the build environment.

大意是將復(fù)雜的構(gòu)建流程納入一個(gè)簡(jiǎn)單的腳本文件,然后用一條命令調(diào)用。這樣,任意的開(kāi)發(fā)者都能在自己的工作區(qū)中執(zhí)行腳本重建一套一模一樣的構(gòu)建環(huán)境,從而消除CI/CD環(huán)境由于散亂配置腐化而成的特異性。

這么做的原因很好理解,使用CI/CD工具是為了暴露產(chǎn)品代碼中的問(wèn)題,如果它們自身已經(jīng)復(fù)雜到不穩(wěn)定的地步,我們還使用它就是自找麻煩。

從某種程度上看,實(shí)施流水線(xiàn)即代碼是不證自明的。在CI/CD的實(shí)踐過(guò)程中,凡是可以被編碼的東西都已經(jīng)被代碼化了,比如:構(gòu)建、測(cè)試、數(shù)據(jù)庫(kù)遷移、部署和基礎(chǔ)設(shè)施/環(huán)境配置(Infrastruture as Code)等。說(shuō)得爛俗點(diǎn),流水線(xiàn)已經(jīng)是CI/CD實(shí)踐過(guò)程中的“***一公里”,讓流水線(xiàn)變成軟件開(kāi)發(fā)中的“一等公民”(即代碼)是大勢(shì)所趨、民心所向。

[[184553]]

不過(guò),這種論斷畢竟欠缺說(shuō)服力,我們接著從實(shí)踐的痛點(diǎn)出發(fā)總結(jié)當(dāng)前流水線(xiàn)遇到的問(wèn)題。

實(shí)踐中的痛點(diǎn)

我給客戶(hù)搭建和配置過(guò)不少CI/CD流水線(xiàn)(被同事戲謔地稱(chēng)為“CI/CD搭建獸”),***的痛苦莫過(guò)于每次都得從頭來(lái)過(guò),即便大部分情況下所用的工具和配置都大同小異。

其次是手工操作產(chǎn)生的配置漂移(configuration drift)。以Jenkins為例,暫且不談1.0版本無(wú)法直接支持流水線(xiàn)這一問(wèn)題,為了支持構(gòu)建、測(cè)試和部署等,我們一般會(huì)先手工安裝所需插件,在多個(gè)文本框中粘貼大量shell/batch腳本,下載依賴(lài)包、設(shè)置環(huán)境變量等等。

久而久之(實(shí)際上用不了多久),這臺(tái)Jenkins服務(wù)器就變成無(wú)法替代(特異化)的“怪獸”了,因?yàn)闆](méi)人清楚到底對(duì)它做了哪些更改,也不知道這些更改對(duì)系統(tǒng)產(chǎn)生了哪些影響,這時(shí)的Jenkins服務(wù)器就腐化成了Martin Fowler口中的雪花服務(wù)器(snowflake server)。雪花服務(wù)器有兩點(diǎn)顯著的特征:

  • 特別難以復(fù)現(xiàn)
  • 幾乎無(wú)法理解

***點(diǎn)是由于以往所做的更改并沒(méi)有被記錄下來(lái),所以做過(guò)的操作都是七零八落的,沒(méi)有辦法復(fù)現(xiàn)同樣的操作,也無(wú)法復(fù)制一個(gè)同樣的系統(tǒng)。

第二點(diǎn)則是由于絕大部分情況下散亂的配置是沒(méi)有文檔描述的,哪部分重要、哪部分不重要已經(jīng)無(wú)從知曉,改動(dòng)的風(fēng)險(xiǎn)很大。

這些問(wèn)題會(huì)在流水線(xiàn)的演化過(guò)程中惡化得越來(lái)越嚴(yán)重。

一般來(lái)講,除非不再使用,否則流水線(xiàn)不會(huì)保持一成不變。具體實(shí)施過(guò)程中,考慮到項(xiàng)目,尤其是遺留項(xiàng)目當(dāng)前的特點(diǎn)和團(tuán)隊(duì)成員的“產(chǎn)能”,我們會(huì)先將構(gòu)建和部署自動(dòng)化;部署節(jié)奏穩(wěn)定后,開(kāi)始將單元測(cè)試和代碼分析自動(dòng)化;接著可以指導(dǎo)測(cè)試人員將驗(yàn)收測(cè)試自動(dòng)化;然后嘗試將發(fā)布自動(dòng)化。

在這之后,并未結(jié)束,團(tuán)隊(duì)還要持續(xù)優(yōu)化流水線(xiàn),包括CI的速度和穩(wěn)定性等。換句話(huà)說(shuō),流水線(xiàn)的演化階段其實(shí)是和項(xiàng)目的當(dāng)前進(jìn)展密切相關(guān)的,保證這樣的對(duì)應(yīng)關(guān)系有時(shí)是有必要的,比如:在多分支的版本控制下,發(fā)布分支所需流水線(xiàn)和主干分支會(huì)存在不同。發(fā)布分支是主干分支某個(gè)時(shí)刻分出去的,它需要在那時(shí)的流水線(xiàn)上才能正常工作。由于前面所說(shuō)雪花服務(wù)器的特征,重建這樣一條流水線(xiàn)并不是一件容易的事情。

如何解決

其實(shí),流水線(xiàn)即代碼本身已經(jīng)回答了這個(gè)問(wèn)題。當(dāng)前實(shí)現(xiàn)這一概念的CI/CD工具大體遵循了兩種模式:

  • 版本控制
  • DSL(領(lǐng)域特定語(yǔ)言)

對(duì)于特別難以復(fù)現(xiàn)、沒(méi)有保證對(duì)應(yīng)關(guān)系的痛點(diǎn),我們就把流水線(xiàn)寫(xiě)成代碼放到版本控制工具中管理起來(lái)。這樣一來(lái),每一次更改都能被記錄下來(lái),而且它會(huì)始終和此時(shí)的項(xiàng)目進(jìn)展保持同步。

對(duì)于幾乎無(wú)法理解、沒(méi)有文檔支持的痛點(diǎn),我們就選用領(lǐng)域特定語(yǔ)言描述整條流水線(xiàn)。舉個(gè)Jenkins2.0例子,它允許我們?cè)陧?xiàng)目的特定目錄下放置一個(gè)Jenkinsfile的文件,內(nèi)容如下:

  1. node('master') { 
  2.    stage('Checkout') {…} 
  3.    stage('Code Analysis') {…} 
  4.    stage('Unit Test') {…} 
  5.    stage('Packing') {…} 
  6.    stage('Archive') {…} 
  7.    stage('DEV') {…} 
  8. stage('SIT') { 
  9.    timeout(time:4, unit:'HOURS') { 
  10.        input "Deploy to SIT?" 
  11.    } 
  12.    node('master') {…} 
  13. stage('Acceptance Test') { 
  14.    node('slave') {…} 

Jenkins2.0使用Groovy實(shí)現(xiàn)了一套描述流水線(xiàn)的DSL,我們即便不了解Groovy語(yǔ)言,只要對(duì)流水線(xiàn)稍微熟悉,就能按照文檔中的例子編寫(xiě)出符合要求的代碼。

類(lèi)似的工具還有Concourse.ci、λCD(LambdaCD)等。 Concourse.ci使用了基于yaml的DSL,獨(dú)立抽象出Resource(外部依賴(lài),如:git repo)、Job(函數(shù),對(duì)Resource進(jìn)行g(shù)et或put操作)以及Task(純函數(shù),必須明確定義Input/Output)模型。效果圖如下:

而λCD則使用Clojure語(yǔ)言實(shí)現(xiàn)了DSL,抽象出Pipeline和Step模型,使用了Lisp特有的宏(macro)擴(kuò)展和自定義普通函數(shù),編寫(xiě)起來(lái)簡(jiǎn)單明了。如下:

  1. (def pipeline-def 
  2.  `( 
  3.    (either 
  4.     manualtrigger/wait-for-manual-trigger 
  5.     wait-for-repo) 
  6.  
  7.    (with-workspace 
  8.      clone 
  9.      (in-parallel 
  10.       run-some-tests 
  11.       run-smokeing-tests) 
  12.  
  13.      run-package 
  14.      deploy))) 

上述的pipeline-def就是這條流水線(xiàn)的定義,極為優(yōu)雅得是,它的代碼和UI事實(shí)上構(gòu)成了——映射的關(guān)系,簡(jiǎn)單到***。

值得一提的是,λCD有別于其它同類(lèi)型的工具,它本身就是一份用Clojure寫(xiě)就的微服務(wù)。換句話(huà)說(shuō),其它的工具可能需要借助基礎(chǔ)設(shè)施即代碼完成自身的安裝,但λCD不用,它完全可以采用其它微服務(wù)的部署方式,比如用λCD部署它自己,類(lèi)似于編譯器的自舉(bootstraping)。這個(gè)時(shí)候,我們就需要兩套λCD服務(wù),一套用于部署λCD自身,另一套部署開(kāi)發(fā)中的工程。

小結(jié)

流水線(xiàn)即代碼是個(gè)新概念,也就意味著我們還需要花時(shí)間去探索與之相關(guān)的實(shí)踐,比如,調(diào)試和測(cè)試(既然是代碼就需要測(cè)試)。一旦有了這些實(shí)踐,我們就可以把流水線(xiàn)本身作為產(chǎn)品放到流水線(xiàn)上運(yùn)作起來(lái),那時(shí)將會(huì)看到一種很好玩的現(xiàn)象——舊的流水線(xiàn)會(huì)構(gòu)建并部署新流水線(xiàn),發(fā)生上文所說(shuō)自舉(bootstraping)現(xiàn)象,這也表明流水線(xiàn)是不斷進(jìn)化的。

此外,當(dāng)流水線(xiàn)成為代碼,它在最終的交付物中必然占據(jù)一席之地,其潛在的價(jià)值還等待我們挖掘,至少?gòu)木娴慕嵌?,流水線(xiàn)能做的事情還有很多。

【本文是51CTO專(zhuān)欄作者“ThoughtWorks”的原創(chuàng)稿件,微信公眾號(hào):思特沃克,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來(lái)源: 51CTO專(zhuān)欄
相關(guān)推薦

2022-07-18 06:05:28

Gitlab流水線(xiàn)

2017-02-28 16:00:45

DevOpsMarkdownreST

2023-05-10 15:08:00

Pipeline設(shè)計(jì)模式

2013-06-06 09:31:52

2017-02-28 15:40:30

Docker流水線(xiàn)Azure

2021-11-08 07:41:16

Go流水線(xiàn)編程

2024-01-07 12:47:35

Golang流水線(xiàn)設(shè)計(jì)模式

2023-11-08 00:25:14

CI云原生DevOps

2021-06-26 14:22:34

Tekton流水線(xiàn)Kubernetes

2022-01-26 08:12:42

Jenkins開(kāi)源流水線(xiàn)

2023-08-18 10:24:52

GitLabCI 流水線(xiàn)

2020-10-25 11:28:12

開(kāi)源端到端流水線(xiàn)

2021-06-28 06:32:46

Tekton Kubernetes Clone

2021-12-24 08:02:48

GitLabCI模板庫(kù)流水線(xiàn)優(yōu)化

2021-06-18 05:48:02

Tekton DevopsKubernetes

2023-09-27 08:24:49

2024-04-03 09:55:56

代碼pipeline項(xiàng)目

2021-01-05 08:39:51

容器前端流水線(xiàn)

2012-04-19 11:44:52

iPhone

2018-10-23 16:35:19

華為云
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)