GitOps—通過CI/CD自動化構建虛擬機模版

2020-10-12 DevOps小強


概述:

從2月份開始的[模版自動化系列],已通過一系列的文章熟悉多種虛擬機模版的自動化構建,但在企業實際環境中模版的數量會遠遠超過這些,此時單一通過shell進行管理和更新,依然非常複雜和繁瑣的(雖然相比以前已經有了很大的提高)。現在把自己基於GitOps的方式來管理模版分享出來,進一步提高模版的構建和管理效率,本篇文章將介紹如何通過GitLab CI/CD對模版進行自動化管理。

對於模版保存還存在一個重要的難題需要解決,那就是當雲平臺或其他自動調用的時候,並不是通過模版名稱進行識別,那僅僅通過名稱更新模版,就會導致其他系統無法正確識別新模版。vCenter 6.5開始支持模版更新,此特性正解決了我們遇到的問題,並且Packer也是在8月底的版本支持此特性(OVF模版)。使用vCenter內容庫還有一個好處,內容庫支持訂閱,在企業內部如果包含多個vCenter環境的情況下,只需構建一次即可。

通過之前的文章大家對模版構建已經很熟悉了,為了提高行動裝置的閱讀體驗,本手冊不再介紹詳細的模版配置,您可以通過訪問 https://github.com/6547709/gitops-packer 直接查看代碼和配置。

基於GitOps自動化構建vSphere模版特性:

  1. 使用Gitlab存儲模版配置文件;
  2. 基於Gitlab CI/CD實現自動化模版構建;
  3. 基於Git提交記錄進行語義版本管理(feet、fix),版本號自增,並存儲到模版的Notes中;
  4. 定時執行CI/CD任務實現模版變異;
  5. 採用vCenter內容庫存儲模版,並以-latest為後綴;
  6. 每次構建自動更新vCenter內容庫模版,保持ID不變,以保證vRA雲平臺或其他工具調用最新模版;
  7. 所有密碼和配置,通過.gitlab-ci.yml進行定義;
  8. 提供Windows2016/2019、Ubuntu1804/1910/2004、CentOS7/8等多種模版;
  9. 所有模版進行基礎優化(可參考對應模版的自動應答文件);
  10. Windows模版使用ISO鏡像已集成最新補丁,縮短了部署時間;
  11. 經過vSphere 7.0、Packer 1.6.4環境測試。

相關工具:

Packer:是一個開源的自動化虛擬機模版構建工具,支持私有雲和公有雲,幾乎涵蓋所有的環境。

vSphere:是VMware企業級虛擬化軟體,被企業客戶廣泛使用,具備穩定性高、性能好、安全性高和易使用的特點。

govc:是一個基於govmomi的cli工具,實現對vSphere的遠程管理。

https://github.com/vmware/govmomi

Packer-provisioner-windows-update:Windows Update for packer插件。

https://github.com/rgl/packer-provisioner-windows-update

Gitlab CI/CD:是一個CI/CD工具,與代碼集成在一起工作。

https://docs.gitlab.com/ee/ci/

Semantic-delivery-gitlab:鏡像用於實現語義版本管理。
Harbor:是私有Docker鏡像倉庫,用於存儲用於執行Packer、Govc和Genisoimage的Docker鏡像。

https://hub.docker.com/r/hutson/semantic-delivery-gitlab

相關代碼:中包含了Gitlab CI/CD所需的所有文件。

https://github.com/6547709/gitops-packer

針對各模版的配置請參考歷史的文章。
CI/CD可以根據情況選擇不同工具,原理都相同。


環境需求

  • Gitlab伺服器和Gitlab-Runner伺服器,其中Runner運行在Docker模式;
  • 一臺Windows/Linux/MacOS電腦,能夠連接vCenter Server;
  • Packer程序、Govc程序、Windows Update for Packer程序;
  • 各作業系統安裝鏡像;
  • VMware Tools、Windows pvscsi驅動;
  • vCenter內容庫;
  • Semantic-delivery-gitlab鏡像;

步驟概要

  1. 搭建Harbor鏡像倉庫,用於存儲本地鏡像;
  2. 搭建Gitlab和Gitlab CI/CD相關環境,使用Docker Runner模式;
  3. 在Gitlab中創建項目,並上傳相關代碼、修改相關配置;
  4. 執行自動構建測試;
  5. 在Gitlab CI/CD中添加定時任務;
  6. 完成。

構建用於執行Packer命令的DockerIamge

需要先通過相關工具中的地址下載packer、govc和windows update for packer三個執行文件,存儲到與Dockerfile相同的目錄中,Dockerfile如下:

FROM centos:8LABEL maintainer="Alex Li <guoqiangli@vmware.com>"ENV PACKER_VERSION=1.6.4ENV GOVC_VERSION=v0.23.0ENV GOVC_INSECURE=trueENV TIME_ZONE Asia/ShanghaiRUN ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtimeADD ./govc /usr/bin/ADD ./packer /usr/bin/ADD ./packer-provisioner-windows-update /usr/binRUN chmod a+x /usr/bin/govc /usr/bin/packer /usr/bin/packer-provisioner-windows-update && yum install -y genisoimageWORKDIR /tmpCMD ["/bin/bash"]

使用Docker Build構建Docker Image,並上傳到容器倉庫(私有或公共)中:

docker build -t harbor.corp.local/library/gitops-packer:v1.0 .docker push login harbor.corp.localdocker login -u admin harbor.corp.localdocker push harbor.corp.local/library/gitops-packer:v1.0

上傳semantic-devlivery-gitlab鏡像到Harbor

docker pull hutson/semantic-delivery-gitlab:9.1.0docker tag hutson/semantic-delivery-gitlab:9.1.0 harbor.corp.local/library/semantic-delivery-gitlab:9.1.0docker push harbor.corp.local/library/semantic-delivery-gitlab:9.1.0

在Gitlab中創建Access Token

  1. 使用個人帳戶登錄Gitlab;
  2. 進入到用戶設置->訪問令牌;
  3. 填寫令牌名稱、到期日期和選擇權限->創建個人訪問令牌;
  4. 保存Token備用;

創建項目,並提交所有代碼到倉庫中

這裡不進行詳細操作說明,下面是最終倉庫內容的截圖:


修改.gitlab-ci.yml配置文件

此文件是Gitlab CI/CD的主配置文件,常用配置參數在此文件中定義,無需修改packer和作業系統自動應答文件。

提示1:本手冊為了易讀,所有敏感信息也在此配置文件中聲明,強烈建議使用Gitlab項目變量進行定義,避免敏感信息洩漏。
提示2:以下代碼示例已經過刪減,完成代碼請從Github獲取。

# 環境變量定義,生產環境不建議在此配置敏感定義(例如:密碼)variables: DOCKER_DRIVER: "overlay2" GITLAB_TOKEN: "xxxxxxxxxxxxx"# 定義用於執行packer、govc和genisoimage的Docker鏡像,需要提前構建 PACKER_DOCKER_IMAGE: "harbor.corp.local/library/packer-gitops:v1.0"# 定義用於創建模板的vCenter相關信息,密碼部分推薦在Gitlab的項目變量定義,以提高安全性。 VC_SERVER: "vcenter.corp.local" VC_USERNAME: "Administrator@vsphere.local" VC_PASSWORD: "VMware1!" VC_DATACENTER: "Labs-DC02" VC_CLUSTER: "DC02-Cluster" VC_CONTENT_LIBRARY: "DC02-VM-Templates" VC_FOLDER: "Templates" VC_DATASTORE: "SSD_DATASTORE"# 定義VM相關配置 VM_NETWORK: "vlan100" VM_CPU: 2 VM_MEM: 4096 VM_DISK: 81920 VM_VIDEO_RAM: 16384 VM_HW_VERSION: 17# 定義安裝光碟的存儲路徑,Winodws系統需要根據安裝光碟的不同調整自動應答文件。# -----此處省略部分代碼,從github中獲取完整代碼------ OS_CENTOS8_ISO: "[SSD_DATASTORE 0-ISO/CentOS-8.2.2004-x86_64-dvd1.iso" OS_WINDOWS2016_ISO: "[SSD_DATASTORE] 0-ISO/cn_windows_server_2016_vl_x64_dvd.iso"# 定義CentOS8自動應答光碟的存儲路徑,每次編譯會自動覆蓋之前版本。 OS_CENTOS8_KS_ISO: "[SSD_DATASTORE] 0-ISO/centos8-ks.iso" OS_CENTOS8_GUI_KS_ISO: "[SSD_DATASTORE] 0-ISO/centos8-gui-ks.iso"# 定義VMware Tools安裝路徑 OS_WINDOWS_VMTOOLS: "[SSD_DATASTORE] 0-ISO/VMware-tools-windows-11.1.5.iso"# 定義Windows系統使用pvscsi驅動的路徑,此文件只能同時被一個VM掛載,需要為每個Windows系統配置一個文件。 OS_WIN2016_DRIVER: "[SSD_DATASTORE] 0-ISO/win2016-pvscsi-Windows8.flp"# 定義GOVC環境變量,用於上傳CentOS8自動應答的ISO(ks.cfg) GOVC_URL: ${VC_SERVER} GOVC_USERNAME: ${VC_USERNAME} GOVC_PASSWORD: ${VC_PASSWORD}# 此配置用於定義Linux root和ops用戶、Windows Administrator和ops用戶的密碼,密碼推薦在Gitlab的項目變量定義,以提高安全性。 LINUX_SSH_PASSWORD: "VMware1!" WINDOWS_PASSWORD: "VMware1!"# 此變量用於定義虛擬機名稱,最終會以-latest作為後綴存儲到vCenter內容庫中。 CENTOS8_VM_NAME: "CentOS8" WIN2016_VM_NAME: "Win2016"# 定義Windows安裝KEY,根據不同的安裝版本配置。 WIN2016_KEY: "XXXXX-XXXXX-XXXXX-XXXXX-XXXX-XXXX" WIN2019_KEY: "XXXXX-XXXXX-XXXXX-XXXXX-XXXX-XXXX"#定義CI/CD的階段,devliver階段用於生成版本號,validate階段用於驗證packer配置文件是否正確,build-iso階段用於CentOS8的ISO製作,並自動上傳到共享存儲中,,build階段用於模版構建,list-library階段用於列出內容庫模版。stages: - deliver - validate - build-iso - build - list-library#採用語義版本管理,基於commit消息增加版本號和生成Release文檔,此階段不會進行打包和部署,僅僅是添加版本tag。deliver: image: name: harbor.corp.local/library/sematic-delivery-gitlab:9.1.0 entrypoint: [""] stage: deliver only: - master script: - semantic-delivery-gitlab --token ${GITLAB_TOKEN}#此階段用於驗證packer配置文件是否正確。packer-validate: image: name: ${PACKER_DOCKER_IMAGE} stage: validate script: - packer validate ./CentOS8/centos-vsphere.json - packer validate ./Win2016/win2016-vsphere.json only: - tags dependencies: - deliver#此階段用於構建CentOS8所需的ISO文件,並上傳到vSphere存儲中(自動覆蓋之前版本)。#for CentOS8。CentOS8-ks-iso-build: image: name: ${PACKER_DOCKER_IMAGE} stage: build-iso script: - cd CentOS8 - sed -i 's/__PASSWORD__/'"${LINUX_SSH_PASSWORD}"'/g' ./ks.cfg - genisoimage -o centos8-ks.iso -V "OEMDRV" ./ks.cfg - govc datastore.upload -ds ${VC_DATASTORE} centos8-ks.iso 0-ISO/centos8-ks.iso only: changes: - CentOS8/ks.cfg# -----此處省略部分代碼,從github中獲取完整代碼------ #此階段用於生成虛擬機模板,模板名基於job中變量定義,最終模板使用-latest最為後綴。#for CentOS8。packer-build-CentOS8: image: name: ${PACKER_DOCKER_IMAGE} stage: build variables: VM_NAME: ${CENTOS8_VM_NAME} script: - cd CentOS8 - packer build --force centos-vsphere.json only: - tags dependencies: - packer-validate# -----此處省略部分代碼,從github中獲取完整代碼------ #for Windows Server 2016。packer-build-Win2016: image: name: ${PACKER_DOCKER_IMAGE} stage: build variables: VM_NAME: ${WIN2016_VM_NAME} OS_WINDOWS_DRIVER: ${OS_WIN2016_DRIVER} script: - cd Win2016 - sed -i 's/__PASSWORD__/'"${WINDOWS_PASSWORD}"'/g' ./Autounattend.xml - sed -i 's/__LICENSEKEY__/'"${WIN2016_KEY}"'/g' ./Autounattend.xml - packer build --force win2016-vsphere.json timeout: 120m only: - tags dependencies: - packer-validate# -----此處省略部分代碼,從github中獲取完整代碼------ #list vcenter content library。list-content-library: image: name: ${PACKER_DOCKER_IMAGE} stage: list-library script: - govc library.info -json ${VC_CONTENT_LIBRARY}/* only: - tags

標準git commit消息格式

標準且規範的commit消息不僅可以保證版本歷史的可讀性,還可以了解每次變更的內容和影響範圍,並會自動在Release頁面生成文檔,所以,強烈建議採用標準的commit消息格式和內容。

fix: 當修復代碼問題時,使用此標記。示例:fix: 修復Windows模版ISO文件錯誤。版本號變化:1.0.0->1.0.1

feat: 當新增功能或模版時,使用此標記。示例:feat: 增加Photon模版。版本號變化:1.0.0->1.1.0

[skip ci] 當不希望自動執行CI/CD時,在消息中增加此標記。示例:fix: 更新ReadME.[skip ci]。版本號變化:無變化


驗證執行過程和結果

當提交變更後,Gilab CI/CD會基於.gitlab-ci.yml中的配置自動執行流水線,整個過程分為2組5個步驟:

  1. 執行語義版本管理,為代碼增加tag標記;
  2. 基於tag執行packer配置文件驗證、CentOS8自動應答ISO構建、鏡像構建和列出內容庫內容;

流水線執行過程如下圖所示,共花費25分鐘時間,完成8個模版的自動化構建:




登錄vCenter內容庫查看模版更新:


添加定時任務

在Gitlab CI/CD的計劃中,添加一個每周/月的定時執行計劃,添加完成後如下圖所示。


[可選]Windows鏡像集成最新補丁

在模版構建過程中,Windows的構建時間最長,某些情況下長達2個小時,可能會觸發Gitlab CI/CD的超時和Packer的超時機制,導致任務失敗。為提高模版構建效率和降低出錯率,建議自行封裝帶有最新補丁的模版,下面是大致的製作過程,共參考。

  1. 下載DISM++工具(國人製作,圖形化操作);
  2. 解壓縮系統安裝光碟到目錄中(d:\win2016-iso),並提取解壓目錄下\sources\install.wim文件,拷貝到另一目錄中(d:\win2016-iso);
  3. 打開DISM++工具,載入install.wim文件,掛載路徑需提前創建(d:\win2016-iso\mnt);
  4. 選中載入的install.wim系統,打開會話;
  5. 使用系統安裝光碟安裝系統,並執行系統更新,更新完成後在已安裝系統更新中(添加/刪除程序)找到安裝的補丁版本號;
  6. 登錄到https://www.catalog.update.microsoft.com/網站,基於版本好下載補丁的msu格式文件,保存到目錄中(d:\win2016-iso\msu);
  7. 在DISM++工具頁面,控制面板->更新管理->添加(d:\win2016-iso\msu),並執行安裝,等待安裝完成(時間較長);
  8. 補丁安裝完成後,DISM++->文件->另存為映像(d:\win2016-iso\new.wim)存儲新的映像;
  9. 使用new.wim替換系統安裝盤解壓縮目錄的install.wim(名稱必須是install.wim);
  10. DISM++->常用工具->工具箱->ISO生成器,源選擇替換install.wim文件的系統安裝盤加壓縮目錄,目標選擇d:\win2016-iso\目錄,並指定新光碟名稱和添加標籤;
  11. DISM++->文件->卸載映像;
  12. 包含指定補丁的系統安裝光碟製作完成;
  13. 上傳新的ISO到共享存儲中,並修改.gitlab-ci.yml文件使用新的ISO鏡像路徑。

提示1:DISM++雖然提供系統更新的功能,但是針對Windows Server系統似乎不正常,所以建議使用手工添加補丁的方式。

提示2:通過DISM工具還可以將pvscsi的驅動添加到安裝光碟中,這樣就無需額外添加pvscsi驅動。

完成

至此通過Gitlab CI/CD、Govc和Packer實現了vSphere環境下的模版GitOps,以後只要修改了相關配置文件,就會自動執行模版構建,由於此構建是並發執行的,效率非常高,最後,祝大家可以輕鬆工作和快樂生活。

相關焦點

  • 使用 GitLab CI 與 Argo CD 進行 GitOps 實踐
    我們可以將該項目代碼上傳到我們自己的 GitLab 上面去,我這裡的 GitLab 安裝在 Kubernetes 之上,通過配置域名 git.k8s.local 進行訪問,調整過後我們本地的代碼倉庫地址為:http://git.k8s.local/course/gitops-webapp 。
  • [自動化系列]一、使用Packer自動化構建模版—CentOS7.x
    ,帶來潛在的風險;二次修改帶來的不穩定性,如果在克隆後的模版中再進行修改,穩定性會產生影響;在「自動化」的背景下,CI/CD會基於模版進行自動化部署或伸縮,模版的更新不僅僅包含作業系統,還包含應用在內。
  • vSphere虛擬機模版—高級定製(OVF屬性)
    自使用Packer來自動化構建虛擬機模版後,也逐步收到一些需求和使用過程中的挑戰:如何在部署的過程中添加第二塊硬碟,用於存儲數據,並自動對磁碟進行分區、格式化和掛載;如何在部署時使用靜態IP位址和相關網絡配置,減少部署後的操作;如何在部署時指定Root帳戶密碼,避免使用模版中包含的默認密碼;
  • 使用Packer構建虛擬機模版-Windows Server 2019
    相關工具:Packer是一個開源的自動化虛擬機模版構建工具,支持私有雲和公有雲,幾乎涵蓋所有的環境。:定義虛擬機模版保存在哪個文件夾中;vm-cpu-num:定義虛擬機模版配置的CPU數量,通過模版再部署時可以修改;vm-mem-size:定義虛擬機模版配置的內存容量(MB單位),通過模版再進行部署時可以修改;vm-disk-size
  • 使用Packer構建虛擬機模版-Ubuntu18.04/19.10/20.04
    相關工具:Packer,是一個開源的自動化虛擬機模版構建工具,支持私有雲和公有雲,幾乎涵蓋所有的環境。:定義虛擬機模版保存在哪個文件夾中;vm-cpu-num:定義虛擬機模版配置的CPU數量,通過模版進行部署時可以修改;vm-mem-size:定義虛擬機模版配置的內存容量(MB單位),通過模版再進行部署時可以修改;vm-disk-size
  • 「自動化系列」二、使用Packer自動化構建模版—Windows2016
    相關工具:Packer是一個開源的自動化虛擬機模版構建工具,支持私有雲和公有雲,幾乎涵蓋所有的環境。:定義虛擬機模版保存在哪個文件夾中;vm-cpu-num:定義虛擬機模版配置的CPU數量,通過模版再進行部署時可以修改;vm-mem-size:定義虛擬機模版配置的內存容量(MB單位),通過模版再進行部署時可以修改;vm-disk-size
  • 敏捷開發與Gitlab CI/CD持續集成
    開發人員提交代碼後,系統自動進行構建、(單元)測試,通過自動化測試保障所有的提交在合併主線之後不會出現質量問題,對可能出現的一些問題進行預警。需要具備的條件需要為每個新功能、代碼改進、或者問題修復創建自動化測試用例。你需要一個持續集成伺服器,它可以監控代碼提交情況,對每個新的提交進行自動化測試。儘可能快地提交代碼。
  • 騫雲科技 DevOps 實踐一 構建更好的CI/CD流程
    在DevOps的具體實踐中,一方面, Gerrit + GitLab + Jenkins + CMP(Ansible)共同構建了更好的 CI/CD 流程,對自動化持續交付流水線進行了優化;另一方面,CMP(Self-Service Portal)幫助建立了自服務自運維門戶,公司所有人員都可以通過統一的門戶自助申請各類資源,並自助完成日常運維。
  • 使用Packer自動構建vSphere模版—CentOS8
    CentOS 8中增加了很多新特性,也使得Packer自動化構建有所不同,本博客介紹如何使用Packer在vSphere7.0環境中構建CentOS 8模版。博客地址:https://www.guoqiangli.com/2020/10/06/using-packer-to-automatically-build-vsphere-virtual-machine/相關工具:Packer:是一個開源的自動化虛擬機模版構建工具
  • 「Kubernetes系列」在K8S中部署GitOps(一)
    當您在Git系統中將所有內容聲明性地配置為代碼時,此Git集中式工作流程將使您能夠大規模管理基礎架構,並為加速自動化奠定了基礎,即「將Git作為單一事實來源」。在此示例中,我們將學習如何使用GitLab CI,帶有Helm Chart的ArgoCD端到端構建GitOps工作流程。
  • 12個可以替代jenkins的CI/CD工具
    它使用交付管道來構建、測試和部署軟體。這些管道是由100多個現成的動作創建的,這些動作可以以任何方式進行安排——就像您構建一個用磚砌成的房子一樣。CruiseControl(官網:http://cruisecontrol.sourceforge.net)既是CI工具又是可擴展框架。它用於構建自定義的連續構建過程。它有許多用於各種原始碼控制、構建技術(包括電子郵件和即時消息)的插件。
  • CI/CD 最佳實踐的基本原則
    而這是因為採用了 DevOps 方法,並且主要歸功於持續集成、自動化測試和持續部署。每個組織都試圖在建立 CI/CD 流水線時引入自己的方法,最終找到完美的平衡,我們通常將其稱為「最佳實踐」。本文就來談一些有效且安全的 CI/CD 流水線的基本原則。
  • CI/CD工具:Jenkins還是GitLab CI/CD?
    它有一組強大的功能,可以將軟體的構建、測試、部署、集成和發布等相關任務自動化。這款用於測試的自動化 CI/CD 工具可以在 macOS、Windows 和各種 UNIX 版本(例如 OpenSUSE、Ubuntu、Red Hat 等)系統上使用。
  • 「自動化系列」三、使用Terraform結合Packer批量部署虛擬機
    概述通過第一部分和第二部分我們已經將模版通過聲明式進行了自動化管理自定義虛擬機備註(應用名稱、負責人、創建時間等);3. 自定義虛擬機標籤;4. 自定義虛擬機文件夾和資源池;5. 獲取中國標準時間(+08:00);提示,由於Packer示例中,模版名是以日期作為後綴的,所以每天只會產生一個模版,同時如果做計劃任務,每天都會有一個模版,要注意清理,避免過度佔用磁碟空間。
  • 炸裂,如此這般用 GitLab 做 CI/CD 是什麼感覺,太強了
    對於每次向倉庫的推送,你都可以創建一組腳本來自動構建和測試你的應用程式,從而減少了向應用程式引入錯誤的機會。這種做法稱為持續集成,對於提交給應用程式(甚至是開發分支)的每項更改,它都會自動連續進行構建和測試,以確保所引入的更改通過你為應用程式建立的所有測試,準則和代碼合規性標準。
  • k8s集群CI/CD集成介紹四:Jenkins部署應用到rancher集群
    由於內容過多,本文將分多章介紹k8s集群構建過程,並發布demo到k8s集群,簡單演示一個完整CI/CD的自動化過程。筆者機器資源所限,超過3臺虛擬機,個人筆記本電腦將無法工作。使用者可根據具體情況增加虛擬機節點。
  • k8s集群CI&CD集成介紹四:Jenkins部署應用到rancher集群
    由於內容過多,本文將分多章介紹k8s集群構建過程,並發布demo到k8s集群,簡單演示一個完整CI/CD的自動化過程。筆者機器資源所限,超過3臺虛擬機,個人筆記本電腦將無法工作。使用者可根據具體情況增加虛擬機節點。
  • Net微服務實戰之CI/CD
    CI/CD不一定限制於微服務,我認為無論在什麼樣風格的架構和怎麼樣組織架構的團隊,自動化技術越早使用收效越高。  我認為IT人員更多是腦力大於體力的勞動者,一些重複的、錯誤率高的、無法對自己有增長的工作應該儘早交給自動化技術處理,節省了不需要浪費的時間與精力,這樣才能更好的去完成有價值、有意義的工作。
  • Gitlab-ci: 從零開始的前端自動化部署
    && 自動化部署工具的運行機制 1.2 自動化部署給我們帶來的好處二.知識預備 2.1 gitlab-ci涉及的抽象概念(Runner/PipeLine/Executor/Job ) 2.2 YML文件的基本語法規則 2.3 .gitlab-ci.yml配置的特定關鍵字三.CI實戰 3.1 編寫一個gitlab-ci的「hello world」四.坑點總結五.gitlab-ci進階 5.1
  • 新一代 CI 持續集成工具 flow.ci 正式開源
    flow.ci 是國內首套開源持續集成(CI) 解決方案,幫助企業團隊實現開發流程(build-test-deploy)自動化,快速持續交付高質量軟體。官方網站:https://flow.ci 開源地址:https://github.com/flowci以此,你可以將功能完整的 flow.ci 持續集成服務部署到內網使用。