如何在云中利用開源軟件進行開發(fā)以提高創(chuàng)新能力
企業(yè)可以在自己的云平臺上利用開源軟件開發(fā)應(yīng)用程序以提高創(chuàng)新能力,而無需為創(chuàng)新支付更多的費用。
在大多數(shù)企業(yè)中,最主要的成本是人力資源。但是通過智能地利用開源軟件,可以顯著降低成本,即擁有GitHub的用戶群能夠為企業(yè)“免費”工作。但GitHub有6500萬個注冊用戶帳戶,必須假設(shè)其中大多數(shù)成員是開發(fā)人員。如果圍繞GitHub巧妙地構(gòu)建,實際上可以讓這些開發(fā)人員都成為企業(yè)的人力資源,從而使企業(yè)的工作效率遠(yuǎn)遠(yuǎn)超過亞馬遜、Facebook和微軟等大型公司,并顯著降低成本。首先說明這個問題,以便了解這個解決方案。
問題
一名資深的開發(fā)人員表示,在他曾經(jīng)就職的一家公司有一個這樣的案例,有人克隆了一個開源git存儲庫,然后將其代碼添加到該公司私有企業(yè)云的git存儲庫中,然后對這個存儲庫進行修改。而在兩年之后,該公司的開發(fā)人員花費6周的時間進行更新,以使用其他開發(fā)人員在GitHub上創(chuàng)建的最新版本,并嘗試在這一過程中盡可能多地保留自定義功能。行業(yè)專家并不認(rèn)同這個可能降低代碼質(zhì)量的做法,因為他所在的公司要負(fù)責(zé)代碼質(zhì)量。
如果可以的話,使用他所說的“Gitless Cloud Pipelines”要好得多。也就是在使用開源項目時,通常不會創(chuàng)建自己的git存儲庫,這意味著直接鏈接到開源git存儲庫。其結(jié)果是如果主要開源維護者發(fā)布了新的開源版本,這樣一來只要想更新自己的軟件,就可以從開源存儲庫中提取并更改,因為新的開源版本是由主要開源維護者發(fā)布的。這允許從企業(yè)內(nèi)部利用開源軟件,這樣開發(fā)人員就可以不斷地改進他們自己的軟件,當(dāng)然,這對于企業(yè)是免費的。
后端
以這名開發(fā)人員展示在其日常工作中如何使用Magic為例。其中最關(guān)鍵的一點是,他從未克隆Magic,而是創(chuàng)建了一個直接指向Magic的GitHub存儲庫的Azure管道,并注意到了“Get sources”部分的一些特性。
需要注意源代碼如何指向GitHub,而不是Azure存儲庫。在上面的截圖中,只是將它直接指向主分支。在實時生產(chǎn)環(huán)境中,可能更愿意將其指向特定標(biāo)簽,除非與項目維護者有非常密切的關(guān)系。只是因為即使它是“主”分支,它仍然可能包含臨時提交。其標(biāo)簽基本上是在創(chuàng)建項目的新版本時創(chuàng)建的,這通??梢愿玫乇WC項目的穩(wěn)定狀態(tài),然后是一些隨機的主提交。
由于這名開發(fā)人員是Magic的主要維護者,因此對此很熟悉,因為非常清楚當(dāng)前的“主”分支在任何特定時間點有多好。此外,他還關(guān)閉了管道上的CI觸發(fā)器,為提交到主分支的每個更改構(gòu)建項目。最后一部分至關(guān)重要,因為不希望任何隨機提交觸發(fā)新構(gòu)建,尤其是對于生產(chǎn)環(huán)境來說。這使得這一過程的自動化程度較低,因為必須人工觸發(fā)管道而不是使用CI觸發(fā)器,但這也能夠100%地控制從開放源代碼存儲庫創(chuàng)建新構(gòu)建的時間。
之后,這個管道將克隆Babel和Babelfish。這些技巧允許在特定的最終結(jié)果中使用想要的任何Magic微服務(wù)填充模塊文件夾。
這允許將模塊動態(tài)安裝到Magic后端,作為管道的一個集成部分。
對于這個特定的管道,想為Magic啟用Windows自動身份驗證,只需在構(gòu)建后端之前將NuGet包添加到核心即可輕松完成。
這允許使用任何插槽動態(tài)填充Magic后端,這些插槽是需要該特定管道的C#綁定。由于Magic的模塊化,這實際上會改變Magic的行為,而不需要任何代碼更改。
在部署后端后,將不得不應(yīng)用變量替換,只需在主要部署操作上啟用JSON變量替換即可輕松完成此操作,然后在管道的變量部分中引用想要替換的變量。
需要注意的是,出于安全原因,無法展示它們的值,但它們會在部署后端時動態(tài)交換相關(guān)的“appsettings.json”值。
前端
前端使用類似的機制構(gòu)建,在Angular項目中有一個npmrun-script部分,可以參考它來創(chuàng)建生產(chǎn)構(gòu)建。
誠然,前端有點混亂,因為Angular在構(gòu)建過程中將所有內(nèi)容打包到隨機生成的文件中,因此很難在這里智能地引用變量,除非在其代碼中對此進行了調(diào)整。因此為了簡單起見,在構(gòu)建管道階段在這里應(yīng)用變量替換。這會降低靈活性,因為必須為每個環(huán)境構(gòu)建變量,當(dāng)然,假設(shè)需要在每個環(huán)境中覆蓋這些變量的話。但這對于這個特定項目來說并不是什么大問題。
也可以使用替代機制,但這包括用看起來很奇怪的#{xxx}部分散布Angular代碼,使其無法在開箱即用的調(diào)試/開發(fā)環(huán)境中使用,而無需先更改一大堆無用配置值。因此,對于Magic的額外“每個環(huán)境一個構(gòu)建管道”要求的代價并不高,因為它能夠保持一切盡可能通用,零開發(fā)依賴性或配置要求使其在開發(fā)環(huán)境中工作。
基本上,這只替換了一個變量,即后端的URL,當(dāng)然可以與使用后端變量類似的方式創(chuàng)建這一變量,除了這發(fā)生在構(gòu)建步驟中,而不是在部署步驟中。
也可以部署任何認(rèn)為合適的方式。在日常工作的DEV環(huán)境中,只是在虛擬機上使用IIS服務(wù)器,因為這允許在一臺機器上部署30/50個Web應(yīng)用程序,從而顯著降低了成本。當(dāng)然,可能需要考慮采用其他應(yīng)用程序,例如Azure WebApps等。
“智能”部分
通過創(chuàng)建這樣的“Gitless云系統(tǒng)”,直接指向開源GitHub存儲庫,可以不斷利用添加到這些項目中的任何創(chuàng)新,而不必采用人工進行合并更改。
然而,并非所有項目都可以使用這種方法,例如因為它們需要修改代碼才能在環(huán)境中工作,不允許通過配置設(shè)置重寫其行為等?;蛘咚鼈冃枰郊庸δ?,并且不提供插件架構(gòu),允許像Magic那樣動態(tài)注入動態(tài)功能。因此,該項目在其核心架構(gòu)中必須是“超級敏捷”的,允許可能需要的任何方式攔截并添加到其核心。很少有GitHub項目在本質(zhì)上像Magic一樣“敏捷”,所以這可能是一個挑戰(zhàn)。
如果放棄了對核心項目的所有控制權(quán),這對于像Magic這樣的項目來說可能意義不大,因為它的靈活性和插件架構(gòu)。但是,不能再像控制在自己的git存儲庫中擁有源代碼的項目那樣“控制”項目。然而,大多數(shù)GitHub項目的開發(fā)人員和維護人員都非常愿意接受提供給他們的變更請求。
或者,可以激勵項目背后的開發(fā)人員,以加快項目開發(fā),并讓維護人員優(yōu)先考慮問題。如果企業(yè)可以免費利用6500萬開發(fā)人員以及他們所有的創(chuàng)新,那么在項目的開發(fā)人員和企業(yè)之間建立一種共生關(guān)系,可能是一種采用更多創(chuàng)新并且成本極其低廉的方法。