008.OpenShift Metric應用

一 METRICS子系統組件

1.1 metric架構介紹


OpenShift metric子系統支持捕獲和長期存儲OpenShift集群的性能度量,收集節點以及節點中運行的所有容器的指標。



metric子系統被由以下開源項目的容器組件構成:

  • Heapster


從Kubernetes集群中的所有節點收集指標,並將其轉發給存儲引擎進行長期存儲。OCP使用Hawkular作為Heapster的存儲引擎。

Heapster項目是由Kubernetes社區孵化的,目的是為第三方應用程序提供一種從Kubernetes集群捕獲性能數據的方法。

  • Hawkular Metrics


提供用於存儲和查詢時間序列數據的REST API。Hawkular Metrics組件是更大的Hawkular項目的一部分。Hawkular Metrics使用Cassandra作為其數據存儲。

Hawkular是作為RHQ項目(Red Hat JBoss Operations Network product)的繼承者創建的,是Red Hat CloudForms產品中間件管理功能的一個關鍵部分。

  • Hawkular Agent


從應用程序收集自定義性能指標,並將其轉發到Hawkular Metrics進行存儲。應用程序為Hawkular agent提供度量標準。

Hawkular OpenShift Agent (HOSA)目前是一個技術預覽功能,默認情況下沒有安裝,Red Hat不支持技術預覽功能,也不建議將其用於生產。

  • Cassandra


將時間序列數據存儲在非關係分佈式數據庫中。

OpenShift Metrics子系統獨立於其他OpenShift組件工作。OpenShift只有三個部分需要metrics子系統來提供一些可選特性:

  • web控制台調用Hawkular Metrics API來獲取數據,以呈現項目中pod的性能圖形。如果沒有部署度量子系統,則不显示圖表。


注意,這些調用是從用戶web瀏覽器發出的,而不是從OpenShift主節點發出的。

  • oc adm top命令使用Heapster API來獲取關於集群中所有pod和節點的當前狀態的數據。
  • Kubernetes的autoscaler控制器調用Heapster API來從部署中獲取關於所有pod當前狀態的數據,以便決定如何伸縮部署控制器。


OCP並不強制一定部署完整的度量子系統,如果已經有一個監視系統,並且希望使用它來管理OpenShift集群,那麼可以選擇只部署Heapster組件,並將度量的長期存儲委託給外部監視系統。

如果現有的監視系統只提供警報和健康功能,那麼監視系統可以使用Hawkular API捕獲指標來生成警報。

Heapster收集節點及其容器的指標,然後聚合pod、namespace和整個集群的指標。

Heapster為一個節點收集的指標包括:

working set:節點中運行的所有進程有效使用的內存,以bytes為單位度量。

CPU usage:節點中運行的所有進程使用的CPU數量,以millicores單位度量,十個millicores相當於一個CPU繁忙時間的1%。

Heapster還支持對內存中保留的指標進行簡單查詢,這些查詢允許獲取在特定時間範圍內收集和聚合的度量。

1.2 訪問Heapster和Hawkular


OpenShift用戶需要區分聲明的資源請求(和限制)與實際的資源使用情況。pod聲明的資源請求用於調度,聲明的資源請求從節點容量中減去,其差值是節點的剩餘可用容量。

節點的可用容量不反映在節點內運行的容器和其他應用程序使用的實際內存和CPU。

oc describe node命令,在OCP 3.9中,只显示與pods聲明的資源請求相關的信息。如果pod沒有聲明任何資源請求,則不會考慮pod的實際資源使用情況,節點的可用容量可能看起來比實際容量大。

web控制台显示的信息與oc describe node命令相同,還可以显示Hawkular Metrics的實際資源使用情況。但是,OCP 3.9的web控制台只显示pod和項目的指標,web控制台不显示節點指標。

要獲得節點的實際資源使用情況,並確定節點是否接近其全部硬件或虛擬容量,系統管理員需要使用oc adm top命令。如果需要更詳細的信息,系統管理員可以使用標準的Linux命令,比如vmstat和ps。

OpenShift不向集群外部公開Heapster組件。外部應用程序需要訪問Heapster必須使用OpenShift master API代理。master API代理確保對內部組件API的訪問遵從OpenShift集群身份驗證和訪問控制策略。

將Hawkular暴露給外部訪問涉及到一些安全方面的考慮。如果系統管理員認為使用Heapster和Hawkular api過於複雜,那麼Origin和Kubernetes開源項目的上游社區還提供了與Nagios和Zabbix等流行的開源監控工具的集成,或者當前最火熱的Prometheus。

1.3 Metrics subsystem大小


OpenShift度量子系統的每個組件都使用自己的dc進行部署,並且獨立於其他組件進行伸縮。它們可以計劃在OpenShift集群的任何地方運行,但是建議為生產環境中的metrics子系統pod特定保留一些node0。

Cassandra和Hawkular是Java應用程序。Hawkular運行在JBoss EAP 7應用服務器中。Hawkular和Cassandra都利用了大規模的優勢,默認值是為中小型OpenShift集群設置的大小。測試環境可能需要更改默認值,以減少內存和CPU資源。

Heapster和Hawkular部署使用標準的OpenShift工具部署size、比例和調度。少量Heapster和Hawkular pods可以管理數百個OpenShift節點和數千個項目的指標。

可以使用oc命令配置Heapster和Hawkular部署。例如增加每個pod請求的副本數量或資源數量,但是推薦的配置參數的方法是修改為安裝Metrics的Ansible劇本中的變量。

Cassandra不能使用標準oc命令進行伸縮和配置,因為Cassandra(大多數數據庫都是這樣)不是無狀態雲應用程序。Cassandra有嚴格的存儲要求,每個Cassandra pod都有不同的部署配置。必須使用Metrics安裝playbook來伸縮和配置Cassandra部署。

1.4 CASSANDRA配置持久存儲


Cassandra可以部署為單個pod,使用一個持久卷。但至少需要三個Cassandra pod才能為度量子系統實現高可用性(HA)。每個pod都需要一個獨佔卷:Cassandra使用“無共享”存儲架構。

儘管Cassandra可以使用enptyDir存儲進行部署,但這意味着存在永久數據丟失的風險。通常生產環境不推薦使用臨時存儲(即emptyDir卷類型)。

每個Cassandra卷使用的存儲量不僅取決於預期的集群大小(節點和pod的數量),還取決於度量的時間序列的粒度和持續時間。

Metrics安裝劇本支持使用靜態供應的持久卷或動態卷。無論選擇哪種方法,playbook都基於前綴創建持久卷聲明,前綴後面附加一個序列號。對於靜態供應的持久卷,請確保使用相同的命名約定。

二 METRICS子系統

2.1 部署metrics子系統


OpenShift Metrics子系統由Ansible playbook部署,可以選擇使用基本playbook或單獨用於Metrics的playbook進行部署。

大多數Metrics子系統配置是使用用於高級安裝方法的Inventory文件中的Ansible變量執行的。儘管可以使用-e選項覆蓋或自定義某些變量的值,更建議在Inventory中定義metrics變量。如果需要更改度量Metrics配置,可更新Inventory中的變量並重新運行安裝劇本。

metrics子系統在許多生產環境中不需要認定配置,可直接通過運行metrics安裝劇本使用默認設置安裝。

示例:Ansible結合主配置文件和Metrics子系統playbook安裝。

Ansible主配置文件如下:

  1 [defaults]
  2 remote_user = student
  3 inventory = ./inventory
  4 log_path = ./ansible.log
  5 [privilege_escalation]
  6 become = yes
  7 become_user = root
  8 become_method = sudo
  9 Metrics子系統劇本:
 10 # ansible-playbook \
 11 /usr/share/ansible/openshift-ansible/playbooks

/openshift-metrics/config.yml \

-e openshift_metrics_install_metrics=True

提示:OpenShift metrics劇本由openshift-ansibl -playbooks包提供,該包是作為atom-openshift-utils包的依賴項安裝的。

openshift_metrics_install_metrics Ansible變量配置劇本用來部署metrics子系統,playbook為metrics子系統創建dc、service和其他支撐metrics的Kubernetes資源,還可以在用於部署集群的Inventory文件中定義該變量。

metrics子系統安裝playbook會在openshift-infra項目中創建所需Kubernetes資源。安裝playbook不配置任何節點選擇器來限制pod所運行的node。

2.2 卸載metrics子系統


卸載OpenShift metrics子系統的一種方法是手動刪除OpenShift-infra項目中的所有Kubernetes資源。通常需要多個oc命令,且容易出錯,因為其他OpenShift子系統也被部署到這個項目。

卸載metrics子系統的推薦方法是運行安裝劇本,但是將openshift_metrics_install_metrics Ansible變量設置為False,如下面的示例所示,-e選項覆蓋庫存文件中定義的值。

  1  # ansible-playbook \
  2 /usr/share/ansible/openshift-ansible/playbooks/openshift-metrics/config.yml \
  3 -e openshift_metrics_install_metrics=False


2.3 驗證metrics子系統


OpenShift metrics子系統playbook完成后,應該創建所有Cassandra、Hawkular和Heapster pod,並可能需要一些時間進行初始化。可能由於Cassandra pod初始化時間過長,會重新啟動Hawkular和Heapster pod。

除非另外配置,否則安裝程序劇本應該為每個組件創建一個dc,其中包含一個pod,並且openshift-infra項目的oc get pod能显示相應pod。

2.4 部署metrics子系統常見錯誤


造成部署錯誤的常見原因通常有:

  • image缺失;
  • metrics所需資源過高,節點無法滿足;
  • Cassandra pod所需的持久卷無法滿足。

2.5 其他配置


在所有pod準備好並運行之後,需要執行一個特定配置以便於和web對接。如果跳過此步驟,OpenShift web控制台將無法显示項目的metrics圖形,儘管底層metrics子系統正在正常工作。

OpenShift web控制台是一個JavaScript應用程序,它直接訪問Hawkular API,而不需要經過OpenShift master service。

但由於內部使用TLS訪問API,默認情況下,TLS證書不是由受信任的認證機構簽署的。因此web瀏覽器拒絕連接到Hawkular API endpoint。

在OpenShift安裝之後,web控制台本身也會出現類似證書不信任的問題。與metrics同樣的方式解決,配置瀏覽器接受TLS證書。為此,在web瀏覽器中打開Hawkular API歡迎頁面,並接受不受信任的TLS證書。

https://hawkular-metrics.<master-wildcard-domain>

主通配符域DNS後綴應該與OpenShift主服務中配置的後綴相同,並用作新路由的默認域。

playbook從Ansible hosts文件中獲取主通配符域值,由openshift_master_default_subdomain變量定義。如果更改了OpenShift master service配置,則它們將不匹配。在本例中,為metrics劇本中的openshift_metrics_hawkular_hostname變量提供新值。2.6

2.6 metrics涉及變量


OCP安裝和配置文檔提供了metrics安裝劇本使用的所有可能變量的列表,它們控制着各種配置參數。常見有:

每個組件的pod比例:

  • openshift_metrics_cassandra_replicas
  • openshift_metrics_hawkular_replicas


每個組件對pod的資源請求和限制:

  • openshift_metrics_cassandra_requests_memory
  • openshift_metrics_cassandra_limits_memory
  • openshift_metrics_cassandra_requests_cpu
  • openshift_metrics_cassandra_limits_cpu


對於Hawkular和Heapster,有類似配置:

  • openshift_metrics_hawkular_requests_memory
  • openshift_metrics_heapster_requests_memory


用於duration和resolution參數:

  • openshift_metrics_duration
  • openshift_metrics_resolution


Cassandra pods的持久卷聲明屬性:

  • openshift_metrics_cassandra_storage_type
  • openshift_metrics_cassandra_pvc_prefix
  • openshift_metrics_cassandra_pvc_size


用於pull metrics子系統容器image的倉庫:

  • openshift_metrics_image_prefix
  • openshift_metrics_image_version


其他配置參考:

  • openshift_metrics_heapster_standalone
  • openshift_metrics_hawkular_hostname


示例1:使用自定義配置安裝metrics子系統,用於覆蓋Inventory中定義的Cassandra配置。

  1 [OSEv3:vars]
  2 ...output omitted...
  3 openshift_metrics_cassandra_replicas=2
  4 openshift_metrics_cassandra_requests_memory=2Gi
  5 openshift_metrics_cassandra_pvc_size=50Gi



示例2:使用自定義配置,用於覆蓋Cassandra定義的屬性。

  1 # ansible-playbook \
  2 /usr/share/ansible/openshift-ansible/playbooks/openshift-metrics/config.yml \
  3 -e openshift_metrics_cassandra_replicas=3 \
  4 -e openshift_metrics_cassandra_requests_memory=4Gi \
  5 -e openshift_metrics_cassandra_pvc_size=25Gi



提示:大多數配置參數都可以使用OpenShift oc命令進行更改,但是推薦的方法是使用更新Inventory中變量值運行metrics安裝劇本進行修改。

三 安裝metrics子系統

3.1 前置準備


準備完整的OpenShift集群,參考《003.OpenShift網絡》2.1。

3.2 本練習準備

  1 [student@workstation ~]$ lab install-metrics setup

3.3 驗證image

  1 [student@workstation ~]$ docker-registry-cli registry.lab.example.com \
  2 search metrics-cassandra ssl
  3 [student@workstation ~]$ docker-registry-cli registry.lab.example.com \
  4 search ose-recycler ssl


3.4 驗證NFS

  1 [root@services ~]# ll -aZ /exports/metrics/
  2 drwxrwxrwx. nfsnobody nfsnobody unconfined_u:object_r:default_t:s0 .
  3 drwxr-xr-x. root      root      unconfined_u:object_r:default_t:s0 ..
  4 [root@services ~]# cat /etc/exports.d/openshift-ansible.exports




3.5 創建PV

  1 [student@workstation ~]$ cat /home/student/DO280/labs/install-metrics/metrics-pv.yml
  2 apiVersion: v1
  3 kind: PersistentVolume
  4 metadata:
  5   name: metrics
  6 spec:
  7   capacity:
  8     storage: 5Gi			#定義capacity.storage容量為5G
  9   accessModes:
 10   - ReadWriteOnce			#定義訪問模式
 11   nfs:
 12     path: /exports/metrics		#定義nfs.path
 13     server: services.lab.example.com	#定義nfs.services
 14   persistentVolumeReclaimPolicy: Recycl	#定義回收策略


  1 [student@workstation ~]$ oc login -u admin -p redhat https://master.lab.example.com
  2 [student@workstation ~]$ oc create -f /home/student/DO280/labs/install-metrics/metrics-pv.yml
  3 [student@workstation ~]$ oc get pv
  4 NAME        CAPACITY    ACCESS MODES    RECLAIM POLICY    STATUS    CLAIM    STORAGECLASS    REASON    AGE
  5 metrics     Gi          RWO             Recycle           Available                                    14s


3.6 規劃安裝變量


openshift_metrics_image_prefix:指向服務VM上的私有倉庫,並添加openshift3/ose-作為映像名稱前綴。

openshift_metrics_image_version:要使用的容器image標記,私有倉庫為image添加一個v3.9標記。

openshift_metrics_heapster_requests_memory:本環境配置300mb內存。

openshift_metrics_hawkular_requests_memory:本環境配置750mb內存。

openshift_metrics_cassandra_requests_memory:本環境配置750mb內存。

openshift_metrics_cassandra_storage_type:使用pv選擇一個持久卷作為存儲類型。

openshift_metrics_cassandra_pvc_size:本環境配置5gib容量。

openshift_metrics_cassandra_pvc_prefix:使用metrics作為pvc名稱的前綴.

提示:生產環境中建議根據實際規劃進行配置,可適當調大配置規格。

3.7 配置安裝變量

  1 [student@workstation ~]$ cd /home/student/DO280/labs/install-metrics
  2 [student@workstation install-metrics]$ cat metrics-vars.txt
  3 # Metrics Variables
  4 # Append the variables to the [OSEv3:vars] group
  5 openshift_metrics_install_metrics=True
  6 openshift_metrics_image_prefix=registry.lab.example.com/openshift3/ose-
  7 openshift_metrics_image_version=v3.9
  8 openshift_metrics_heapster_requests_memory=300M
  9 openshift_metrics_hawkular_requests_memory=750M
 10 openshift_metrics_cassandra_requests_memory=750M
 11 openshift_metrics_cassandra_storage_type=pv
 12 openshift_metrics_cassandra_pvc_size=5Gi
 13 openshift_metrics_cassandra_pvc_prefix=metrics
 14 [student@workstation install-metrics]$ cat metrics-vars.txt >> inventory
 15 [student@workstation install-metrics]$ lab install-metrics grade		#本環境使用腳本判斷配置


3.8 執行安裝

  1 [student@workstation install-metrics]$ ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/openshift-metrics/config.yml



3.9 驗證安裝

  1 [student@workstation install-metrics]$ oc get pvc -n openshift-infra		#驗證持久卷是否成功掛載
  2 NAME        STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  3 metrics-1   Bound     metrics   5Gi        RWO                           5m
  4 [student@workstation install-metrics]$ oc get pod -n openshift-infra		#驗證metric相關pod
  5 NAME                         READY     STATUS    RESTARTS   AGE
  6 hawkular-cassandra-1-6k7fr   1/1       Running   0          5m
  7 hawkular-metrics-z9v85       1/1       Running   0          5m
  8 heapster-mbdcl               1/1       Running   0          5m
  9 [student@workstation install-metrics]$ oc get route -n openshift-infra		#查看metric route地址
 10 NAME                HOST/PORT                                PATH    SERVICES            PORT    TERMINATION    WILDCARD
 11 hawkular-metrics   hawkular-metrics.apps.lab.example.com             hawkular-metrics    <all>   reencrypt
 12 None



瀏覽器訪問:

https://hawkular-metrics.apps.lab.example.com



提示:瀏覽器信任SSL證書。

3.10 部署測試應用

  1 [student@workstation ~]$ oc login -u developer -p redhat \
  2 https://master.lab.example.com				#登錄OpenShift
  3 [student@workstation ~]$ oc new-project load		#創建project
  4 [student@workstation ~]$ oc new-app --name=hello \
  5 --docker-image=registry.lab.example.com/openshift/hello-openshift	#部署應用
  6 [student@workstation ~]$ oc scale --replicas=9 dc/hello			#擴展應用
  7 [student@workstation ~]$ oc get pod -o wide				#查看pod
  8 NAME            READY     STATUS    RESTARTS   AGE       IP            NODE
  9 hello-1-4nvfd   1/1       Running   0          1m        10.129.0.40   node2.lab.example.com
 10 hello-1-c9f8t   1/1       Running   0          1m        10.128.0.22   node1.lab.example.com
 11 hello-1-dfczg   1/1       Running   0          1m        10.128.0.23   node1.lab.example.com
 12 hello-1-dvdx2   1/1       Running   0          1m        10.129.0.36   node2.lab.example.com
 13 hello-1-f6rsl   1/1       Running   0          1m        10.128.0.20   node1.lab.example.com
 14 hello-1-m2hb4   1/1       Running   0          1m        10.129.0.39   node2.lab.example.com
 15 hello-1-r64z9   1/1       Running   0          1m        10.128.0.21   node1.lab.example.com
 16 hello-1-tf4l5   1/1       Running   0          1m        10.129.0.37   node2.lab.example.com
 17 hello-1-wl6zx   1/1       Running   0          1m        10.129.0.38   node2.lab.example.com
 18 [student@workstation ~]$ oc expose svc hello


3.11 壓力測試

  1 [student@workstation ~]$ sudo yum -y install httpd-tools
  2 [student@workstation ~]$ ab -n 300000 -c 20 http://hello-load.apps.lab.example.com/


3.12 查看資源使用情況

  1 [student@workstation ~]$ oc login -u admin -p redhat
  2 [student@workstation ~]$ oc adm top node \
  3 --heapster-namespace=openshift-infra \
  4 --heapster-scheme=https
  5 NAME                     CPU(cores)   CPU%      MEMORY(bytes)   MEMORY%
  6 master.lab.example.com   273m         13%       1271Mi          73%
  7 node1.lab.example.com    1685m        84%       3130Mi          40%
  8 node2.lab.example.com    1037m        51%       477Mi           6%



提示:保持3.11的壓測程序,重開終端進行查看。

3.13 獲取指標

  1 [student@workstation ~]$ cat ~/DO280/labs/install-metrics/node-metrics.sh	#使用此腳本獲取指標



  1 [student@workstation ~]$ ./DO280/labs/install-metrics/node-metrics.sh




瀏覽器訪問:https://master.lab.example.com

查看相關性能監控。


本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

中國高新汽車國際峰會 – 汽車行業思想領袖的國際峰會

  探索新一代節能智聯車輛的創新業務與技術戰略   第二屆中國高新汽車國際峰會由法蘭克福展覽(上海)有限公司和中國國家發展和改革委員會 國際合作中心聯合主辦,是真正國際化的行業思想領袖盛會。演講嘉賓和與會代表將相互交流,分享理念,推廣新策略、新協作、新技術、新服務與新應用。 與會代表在峰會中將獲得有關商業模式、產品和服務戰略、技術創新的寶貴新創意和洞察力, 將推動OEM廠商、供應商和服務提供商朝著更加可持續、更具盈利能力的未來繼續前進。    本屆峰會的演講和討論會將深入探索各種熱門主題,包括:    1.
中國汽車行業和相關市場實現可持續發展的政策、首要任務與積極措施演變 2.
國外經驗與案例分析:為汽車行業發展而採用的商業模式和技術創新 3.
促進中國國有和民營汽車企業的發展:朝著真正合作、技術轉讓和全球市場渠道邁進 4.
電動方程式賽車(Formula E)來臨中國 – 對電動車的研發,性能,安全性,可靠性和消費者的接受程度帶來潛在附帶利益 5.
個人交通的新方向如何與中國未來智能生態城市發展的目標接軌 6.
電動交通和電動化 – 使市場增長的關鍵步驟 7.
未來高增長售後市場的機會:實現盈利發展和客戶滿意度 8.
經銷商和分銷商將業務擴大至新維修市場的潛力 9.
將威力強大的數字營銷和社交媒體戰略用於汽車市場的發展:OEM廠商及零售商的最佳實 踐 10.
評估乘用車和商用車市場中的綜合機遇 11.
在中國的商用車輛和運輸車隊中減排,實現更清潔高效的運作 12.
汽車智聯技術創新實現遠程信息處理之外的新商機   聆聽各大OEM商、供應商和政府政策制定者的新見解,目前,來自國內外的多位高級別演講嘉賓業已確認出席:   ‧
中國國家發展和改革委員會:高級司長 ‧
中國科技部:高級司長 ‧
王成先生,中國汽車技術研究中心 (CATARC), 汽車產業發展研究所副 總工程師及清潔能源汽車生產力促進中心執行主任 ‧
呂洋先生, 中國海億汽車賽事管理(北京)有限公司副總裁及CEO ‧
Thomas Hajek先生, 德國菲亞特克萊斯勒集團董事會成員 ‧
Boriana Lambreva女士,大眾汽車(中國)公司新能源汽車集團戰略與規劃高 級經理 ‧
原誠寅博士, 北京汽車新能源汽車有限公司產品工程院副院長 ‧
Ridzuan Yusof先生, 馬來西亞Proton電動 車輛項目總監 ‧
Martin Rosell先生, 瑞典WirelessCar公司董事總經理 ‧
Christophe Aufrere先生,法國佛吉亞集團首席技術官 ‧
Christian Heep先生,德國電動交通協會(BEM)首席執行官兼營銷總監 ‧
董揚先生, 中國汽車工業協會(CAAM) 秘書長 ‧
Francois Schoentgen先生,大陸汽車集團動力總成變速箱控制董事總經理 ‧
Klaus Paur先生,中國益普索公司全球汽車業總監製 ‧
Ing Bernd Kraemmer先生, 奧地利iO Vehicles/ iO-E-Scooter公司董事總經理 ‧
Rebecca Zhu女士, 中國HTI業務發展總監(休斯通信公司) ‧
Rick Longobart先生,美國聖塔阿娜市 設施與車隊經理兼市政設備維護協會 (MEMA)主席 ‧
宋健教授,清華大學汽車技術研究院院長及汽車工程系教授 ‧
Madani Sahari先生, 馬來西亞汽車研究院(MAI)首席執行官 ‧
林程博士,北京理工大學電動車輛國家工程實驗室(NELEV)教授兼副主任   詳細內容請上 

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

氣溫創紀錄野火頻燒 專家:熱浪發生率倍增

摘錄自2018年7月29日蘋果日報報導

「世界天氣歸因」組織研究人員在前天(27日)發表的報告中指出,人類活動所導致的氣候變遷,已讓熱浪發生的可能性倍增。另外,相對於南半球而言,北半球受到氣候變遷的影響尤其明顯。

研究人員指出,位於芬蘭、挪威和瑞典的4個氣象站,其夏季氣溫觀測數據每年變化較大,總體上熱浪發生可能性在增加,只是較難進行量化分析。荷蘭、丹麥和愛爾蘭3個氣象站記錄的數據則呈現明顯趨勢,反映出由人類活動導致的氣候變遷,已讓熱浪發生可能性平均增加1倍以上。

參與這項研究的英國牛津大學研究員奧托(Friederike Otto)表示,曾被視為異常的極端高溫天氣將變得司空見慣,在某些地方甚至已經成為現實,人們應對此做好準備,「我們無疑能夠並應該盡可能大幅度地限制溫室氣體的排放,以約束各種極端天氣事件的發生機率不再增加。」

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

北京上海等城市 將加大新能源車投放力度

據新華網報導,北京、上海、天津等城市,擬大量更新公交車,以減少機動車尾氣排放。中國近期霾害肆虐,正加速審核新能源政策落實。臺灣進軍中國大陸電動巴士市場的F-立凱、長園科業績將受惠此一政策。

上週北京交通部門與環保部門通過計畫,今年起5年將投資100億元(人民幣),將現有公交車大規模更新為電動車及天然氣車。今後5年,北京公交集團計畫更新13,825輛,其中新能源車(電動巴士)4,058輛。

上海則是從明年開始,將以不低於50%的比例發展新能源公交車,北汽集團、比亞迪等中國汽車業者,也都瞄準此一商機,協尋新能源電池公司。

臺灣市場也推出10年6,200輛電動巴士上路計畫,計畫明年正式啟動。 F-立凱繼今年底完成在台44台電動巴士上路後,明年也將跟進台灣、大陸兩岸政策。

長園科則著眼於大陸新能源補助金額,參與大陸中宇4.2億安時鋰電池項目開工儀式,也與大陸電芯廠潔神合作發展邯鄲市動力電池計畫,參與河北省電動巴士試點運行計畫。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

深入淺出PyTorch(算子篇)

Tensor

自從張量(Tensor)計算這個概念出現后,神經網絡的算法就可以看作是一系列的張量計算。所謂的張量,它原本是個數學概念,表示各種向量或者數值之間的關係。PyTorch的張量(torch.Tensor)表示的是N維矩陣與一維數組的關係。

torch.Tensor的使用方法和numpy很相似(https://pytorch.org/…tensor-tutorial-py),兩者唯一的區別在於torch.Tensor可以使用GPU來計算,這就比用CPU的numpy要快很多。

張量計算的種類有很多,比如加法、乘法、矩陣相乘、矩陣轉置等,這些計算被稱為算子(Operator),它們是PyTorch的核心組件。

算子的backend一般是C/C++的拓展程序,PyTorch的backend是稱為”ATen”的C/C++庫,ATen是”A Tensor”的縮寫。

Operator

PyTorch所有的Operator都定義在Declarations.cwrap和native_functions.yaml這兩個文件中,前者定義了從Torch那繼承來的legacy operator(aten/src/TH),後者定義的是native operator,是PyTorch的operator。

相比於用C++開發的native code,legacy code是在PyTorch編譯時由gen.py根據Declarations.cwrap的內容動態生成的。因此,如果你想要trace這些code,需要先編譯PyTorch。

legacy code的開發要比native code複雜得多。如果可以的話,建議你盡量避開它們。

MatMul

本文會以矩陣相乘–torch.matmul()為例來分析PyTorch算子的工作流程。

我在深入淺出全連接層(fully connected layer)中有講在GPU層面是如何進行矩陣相乘的。Nvidia、AMD等公司提供了優化好的線性代數計算庫–cuBLAS/rocBLAS/openBLAS,PyTorch只需要調用它們的API即可。

Figure 1是torch.matmul()在ATen中的function flow。可以看到,這個flow可不短,這主要是因為不同類型的tensor(2d or Nd, batched gemm or not,with or without bias,cuda or cpu)的操作也不盡相同。

at::matmul()主要負責將Tensor轉換成cuBLAS需要的格式。前面說過,Tensor可以是N維矩陣,如果tensor A是3d矩陣,tensor B是2d矩陣,就需要先將3d轉成2d;如果它們都是>=3d的矩陣,就要考慮batched matmul的情況;如果bias=True,後續就應該交給at::addmm()來處理;總之,matmul要考慮的事情比想象中要多。

除此之外,不同的dtype、device和layout需要調用不同的操作函數,這部分工作交由c10::dispatcher來完成。

Dispatcher

dispatcher主要用於動態調用dtype、device以及layout等方法函數。用過numpy的都知道,np.array()的數據類型有:float32, float16,int8,int32,…. 如果你了解C++就會知道,這類程序最適合用模板(template)來實現。

很遺憾,由於ATen有一部分operator是用C語言寫的(從Torch繼承過來),不支持模板功能,因此,就需要dispatcher這樣的動態調度器。

類似地,PyTorch的tensor不僅可以運行在GPU上,還可以跑在CPU、mkldnn和xla等設備,Figure 1中的dispatcher4就根據tensor的device調用了mm的GPU實現。

layout是指tensor中元素的排布。一般來說,矩陣的排布都是緊湊型的,也就是strided layout。而那些有着大量0的稀疏矩陣,相應地就是sparse layout。

Figure 2是strided layout的演示實例,這裏創建了一個2行2列的矩陣a,它的數據實際存放在一維數組(a.storage)里,2行2列只是這個數組的視圖。

stride充當了從數組到視圖的橋樑,比如,要打印第2行第2列的元素時,可以通過公式:\(1 * stride(0) + 1 * stride(1)\)來計算該元素在數組中的索引。

除了dtype、device、layout之外,dispatcher還可以用來調用legacy operator。比如說addmm這個operator,它的GPU實現就是通過dispatcher來跳轉到legacy::cuda::_th_addmm。

END

到此,就完成了對PyTorch算子的學習。如果你要學習其他算子,可以先從aten/src/ATen/native目錄的相關函數入手,從native_functions.yaml中找到dispatch目標函數,詳情可以參考Figure 1。

更多精彩文章,歡迎掃碼關注下方的公眾號, 並訪問我的簡書博客:https://www.jianshu.com/u/c0fe8671254e

歡迎轉發至朋友圈,工作號轉載請後台留言申請授權~

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

美法院裁決 環保署須下令禁用陶斯松

摘錄自2018年8月10日中央社報導

聯邦第九巡迴上訴法院今天(10日)裁決,美國環境保護署(EPA)須在60天內下令禁用陶斯松(chlorpyrifos)。批評人士指出,這種廣泛使用的農藥會傷害兒童和農民。

第九巡迴上訴法院以2票贊成、1票反對的裁決結果,推翻前環保署長普魯特(Scott Pruitt)2017年3月拒絕接受環保團體請願的決定。當時環保團體呼籲,禁止陶斯松用於水果、蔬菜和堅果等糧食作物。

代表第九巡迴上訴法院撰寫裁決書的法官拉柯夫(Jed Rakoff)指出,「科學證據顯示,殘留在糧食上(的陶斯松)會對兒童神經發育造成損害」,但環保署未能提出有力反駁,因此下令環保署須在60天內下令禁用陶斯松。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

恕我直言你可能真的不會java第5篇:Stream的狀態與并行操作

一、回顧Stream管道流操作

通過前面章節的學習,我們應該明白了Stream管道流的基本操作。我們來回顧一下:

  • 源操作:可以將數組、集合類、行文本文件轉換成管道流Stream進行數據處理
  • 中間操作:對Stream流中的數據進行處理,比如:過濾、數據轉換等等
  • 終端操作:作用就是將Stream管道流轉換為其他的數據類型。這部分我們還沒有講,我們後面章節再介紹。

看下面的腦圖,可以有更清晰的理解:

二、中間操作:有狀態與無狀態

其實在程序員編程中,經常會接觸到“有狀態”,“無狀態”,絕大部分的人都比較蒙。而且在不同的場景下,“狀態”這個詞的含義似乎有所不同。但是“萬變不離其宗”,理解“狀態”這個詞在編程領域的含義,筆者教給大家幾個關鍵點:

  • 狀態通常代表公用數據,有狀態就是有“公用數據”
  • 因為有公用的數據,狀態通常需要額外的存儲。
  • 狀態通常被多人、多用戶、多線程、多次操作,這就涉及到狀態的管理及變更操作。

是不是更蒙了?舉個例子,你就明白了

  • web開發session就是一種狀態,訪問者的多次請求關聯同一個session,這個session需要存儲到內存或者redis。多次請求使用同一個公用的session,這個session就是狀態數據。
  • vue的vuex的store就是一種狀態,首先它是多組件公用的,其次是不同的組件都可以修改它,最後它需要獨立於組件單獨存儲。所以store就是一種狀態。

回到我們的Stream管道流

  • filter與map操作,不需要管道流的前面後面元素相關,所以不需要額外的記錄元素之間的關係。輸入一個元素,獲得一個結果。
  • sorted是排序操作、distinct是去重操作。像這種操作都是和別的元素相關的操作,我自己無法完成整體操作。就像班級點名就是無狀態的,喊到你你就答到就可以了。如果是班級同學按大小個排序,那就不是你自己的事了,你得和周圍的同學比一下身高並記住,你記住的這個身高比較結果就是一種“狀態”。所以這種操作就是有狀態操作。

三、Limit與Skip管道數據截取

List<String> limitN = Stream.of("Monkey", "Lion", "Giraffe", "Lemur")
        .limit(2)
        .collect(Collectors.toList());
List<String> skipN = Stream.of("Monkey", "Lion", "Giraffe", "Lemur")
        .skip(2)
        .collect(Collectors.toList());
  • limt方法傳入一個整數n,用於截取管道中的前n個元素。經過管道處理之後的數據是:[Monkey, Lion]。
  • skip方法與limit方法的使用相反,用於跳過前n個元素,截取從n到末尾的元素。經過管道處理之後的數據是: [Giraffe, Lemur]

四、Distinct元素去重

我們還可以使用distinct方法對管道中的元素去重,涉及到去重就一定涉及到元素之間的比較,distinct方法時調用Object的equals方法進行對象的比較的,如果你有自己的比較規則,可以重寫equals方法。

List<String> uniqueAnimals = Stream.of("Monkey", "Lion", "Giraffe", "Lemur", "Lion")
        .distinct()
        .collect(Collectors.toList());

上面代碼去重之後的結果是: [“Monkey”, “Lion”, “Giraffe”, “Lemur”]

五、Sorted排序

默認的情況下,sorted是按照字母的自然順序進行排序。如下代碼的排序結果是:[Giraffe, Lemur, Lion, Monkey],字數按順序G在L前面,L在M前面。第一位無法區分順序,就比較第二位字母。

List<String> alphabeticOrder = Stream.of("Monkey", "Lion", "Giraffe", "Lemur")
        .sorted()
        .collect(Collectors.toList());

排序我們後面還會給大家詳細的講一講,所以這裏暫時只做一個了解。

六、串行、并行與順序

通常情況下,有狀態和無狀態操作不需要我們去關心。除非?:你使用了并行操作。

還是用班級按身高排隊為例:班級有一個人負責排序,這個排序結果最後就會是正確的。那如果有2個、3個人負責按大小個排隊呢?最後可能就亂套了。一個人只能保證自己排序的人的順序,他無法保證其他人的排隊順序。

  • 串行的好處是可以保證順序,但是通常情況下處理速度慢一些
  • 并行的好處是對於元素的處理速度快一些(通常情況下),但是順序無法保證。這可能會導致進行一些有狀態操作的時候,最後得到的不是你想要的結果。
Stream.of("Monkey", "Lion", "Giraffe", "Lemur", "Lion")
        .parallel()
        .forEach(System.out::println);
  • parallel()函數表示對管道中的元素進行并行處理,而不是串行處理。但是這樣就有可能導致管道流中後面的元素先處理,前面的元素后處理,也就是元素的順序無法保證。

如果數據量比較小的情況下,不太能觀察到,數據量大的話,就能觀察到數據順序是無法保證的。

Monkey
Lion
Lemur
Giraffe
Lion

通常情況下,parallel()能夠很好的利用CPU的多核處理器,達到更好的執行效率和性能,建議使用。但是有些特殊的情況下,parallel並不適合:深入了解請看這篇文章:
https://blog.oio.de/2016/01/22/parallel-stream-processing-in-java-8-performance-of-sequential-vs-parallel-stream-processing/
該文章中幾個觀點,說明并行操作的適用場景:

  • 數據源易拆分:從處理性能的角度,parallel()更適合處理ArrayList,而不是LinkedList。因為ArrayList從數據結構上講是基於數組的,可以根據索引很容易的拆分為多個。
  • 適用於無狀態操作:每個元素的計算都不得依賴或影響任何其他元素的計算,的運算場景。
  • 基礎數據源無變化:從文本文件裏面邊讀邊處理的場景,不適合parallel()并行處理。parallel()一開始就容量固定的集合,這樣能夠平均的拆分、同步處理。

歡迎關注我的博客,裏面有很多精品合集

  • 本文轉載註明出處(必須帶連接,不能只轉文字):字母哥博客。

覺得對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創作動力! 。另外,筆者最近一段時間輸出了如下的精品內容,期待您的關注。

  • 《手摸手教你學Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2一本通》
  • 《實戰前後端分離RBAC權限管理系統》
  • 《實戰SpringCloud微服務從青銅到王者》
  • 《VUE深入淺出系列》

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

避稅天堂撐腰 牛肉、大豆產業吞噬亞馬遜雨林

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

chromedp入門

chromedp入門

chromedp是什麼?

chromedp是go寫的,支持Chrome DevTools Protocol 的一個驅動瀏覽器的庫。並且它不需要依賴其他的外界服務(比如 Selenium 和 PhantomJs)。

Chrome DevTools Protocol (CDP)

Chrome DevTools Protocol (CDP) 的主頁在:https://chromedevtools.github.io/devtools-protocol/。 它提供一系列的接口來查看,檢查,調整並且檢查 Chromium 的性能。Chrome 的開發者工具就是使用這一系列的接口,並且 Chrome 開發者工具來維護這些接口。

所謂 CDP 的協議,本質上是什麼呢?本質上是基於 websocket 的一種協議。比如

在我們打開 webtool 調試工具的時候,其實調試工具也是一個web頁面,兩個web頁面通過websocket建立了一個聯繫。
所以我們如果寫了一個客戶端程序,也和目標頁面創建一個基於 CDP 的 websocket連接,我們也可以通過這個協議來對頁面進行操作。

如何打開 Protocol Monitor

在chrome的開發者工具中

打開實驗選項 Protocol Monitor

重啟chrome,在console的更多裏面就可以打開對應的 Monitor

CDP 協議內容

我們從 Protocol Monitor 面板中可以看到,其中有幾個字樣,Method,Request,Response。
這裏的 Method 就是對應官網 https://chromedevtools.github.io/devtools-protocol/ 左側每個Domain的 Event。

這裏的每個Method方法可能是調試頁面給目標頁面發送的,但是更多是目標頁面給調試頁面發送的消息。所以我們需要讀懂每個Method的內容。不過很可惜,我個人感覺官網的每個Method文檔的描述寫的實在是太簡單了,也沒有看到更詳細的描述,只能通過名字和事件來猜測每個Method意思了。

chromedp 使用

chromedp的使用最快的方法就是看 https://github.com/chromedp/examples 這個項目

基本我們可以熟悉最常用的幾個方法了:

  • chromedp.NewContext() 初始化chromedp的上下文,後續這個頁面都使用這個上下文進行操作
  • chromedp.Run() 運行一個chrome的一系列操作
  • chromedp.Navigate() 將瀏覽器導航到某個頁面
  • chromedp.WaitVisible() 等候某個元素可見,再繼續執行。
  • chromedp.Click() 模擬鼠標點擊某個元素
  • chromedp.Value() 獲取某個元素的value值
  • chromedp.ActionFunc() 再當前頁面執行某些自定義函數
  • chromedp.Text() 讀取某個元素的text值
  • chromedp.Evaluate() 執行某個js,相當於控制台輸入js
  • network.SetExtraHTTPHeaders() 截取請求,額外增加header頭
  • chromedp.SendKeys() 模擬鍵盤操作,輸入字符
  • chromedp.Nodes() 根據xpath獲取某些元素,並存儲進入數組
  • chromedp.NewRemoteAllocator
  • chromedp.OuterHTML() 獲取元素的outer html
  • chromedp.Screenshot() 根據某個元素截圖
  • page.CaptureScreenshot() 截取整個頁面的元素
  • chromedp.Submit() 提交某個表單
  • chromedp.WaitNotPresent() 等候某個元素不存在,比如“正在搜索。。。”
  • chromedp.Tasks{} 一系列Action組成的任務

實踐

我們嘗試打開 https://www.cnblogs.com/ 的首頁,然後獲取所有文章的標題和鏈接:

package main

import (
	"context"
	"fmt"
	"log"

	"github.com/chromedp/cdproto/cdp"
	"github.com/chromedp/chromedp"
)

func main() {

	ctx, cancel := chromedp.NewContext(
		context.Background(),
		chromedp.WithLogf(log.Printf),
	)
	defer cancel()

	var nodes []*cdp.Node
	err := chromedp.Run(ctx,
		chromedp.Navigate("https://www.cnblogs.com/"),
		chromedp.WaitVisible(`#footer`, chromedp.ByID),
		chromedp.Nodes(`.//a[@class="titlelnk"]`, &nodes),
	)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("get nodes:", len(nodes))
	// print titles
	for _, node := range nodes {
		fmt.Println(node.Children[0].NodeValue, ":", node.AttributeValue("href"))
	}
}

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

一分鐘開始持續集成之旅系列之:C 語言 + Makefile

作者:CODING – 朱增輝

前言

make 工具非常強大,配合 makefile 文件可以實現軟件的自動化構建,但是執行 make 命令依然需要經歷手動輸入執行、等待編譯完成、將目標文件轉移到合適位置等過程,我們真正關心的是最終的輸出,卻在這些中間過程上浪費了很多時間。利用 CODING 持續集成功能可以實現自動觸發構建,構建全程自動化,無須分心看護,節省時間。

本文通過一個 C 語言 + Makefile Demo 項目講解如何使用 CODING 持續集成功能創建構建計劃,自動觸發構建,以及如何將生成的目標文件發布到 CODING generic 製品庫。

準備工作

環境

本文涉及到以下工具,請確認已存在,或者根據鏈接的文檔進行安裝。

  • git
  • make
  • gcc

另外,您還需準備一個 CODING 項目。

代碼

我已經準備了一份簡單的示例代碼,使用 make 工具構建 Hello-world 程序。

// hello.c
#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

您可以通過下面的命令克隆到本地。

git clone https://e.coding.net/coding-public/demo-c-make.git

倉庫中還包含了一個 makefile 文件,定義了簡單的規則來完成軟件構建。

all: hello

hello: hello.o
	gcc -o hello hello.o

hello.o: hello.c
	gcc -c hello.c

clean:
	rm -rf hello.o hello

您可以在本地執行 make 命令以驗證構建正常。

下面我們正式開始通過一個 Demo 演示 CODING 平台持續集成功能的使用。

步驟一 創建製品庫

為了方便隨時使用構建出來的目標文件,我們將構建物存儲到 CODING 平台製品庫,因此需要先創建合適的製品倉庫,這裏創建 generic 倉庫比較合適。

從左側導航欄打開製品庫

單擊新建倉庫,選擇 generic 類型,按照提示指定倉庫名稱,這裏倉庫名取為 generic。

步驟二 創建並配置構建計劃

從左側導航欄打開持續集成 --> 構建計劃頁面,點擊新建構建計劃配置創建並配置新的構建計劃。在彈出的頁面中,輸入構建計劃名稱,選擇代碼倉庫,配置來源指的的該構建計劃的構建腳本存放位置,對於簡單的、變動不頻繁的腳本可以使用靜態配置的選項,否則更推薦使用代碼倉庫中的腳本,這樣更加靈活,方便管理

點擊使用模板,可根據自己需要選擇合適模板,這裏選擇 簡易模板

保存構建計劃后,系統會自動將構建模板對應的 Jenkinsfile 推送到倉庫,默認為 master 分支。

步驟三 編寫構建腳本

構建腳本定義構建過程的具體步驟,是構建計劃的核心部分。CODING 平台提供了圖形化編輯器方便您快速編寫構建腳本。

CODING 持續集成底層基於開源 CI/CD 軟件領導者 Jenkins 實現,完全兼容 Jenkins pipeline 構建腳本語法,根據 Jenkins 官方提供的腳本編寫指南,可以實現更複雜的構建任務,CODING 也提供了文本編輯器方便您在線編輯。

代碼倉庫中已包含一個簡單的構建腳本(Jenkisnfile),您可以按照自己的想法參考編寫。

// Jenkinsfile
pipeline {
  agent any
  stages {
    stage('檢出') {
      steps {
        checkout([
          $class: 'GitSCM',
          branches: [[name: env.GIT_BUILD_REF]],
          userRemoteConfigs: [[
            url: env.GIT_REPO_URL,
            credentialsId: env.CREDENTIALS_ID
          ]]])
        }
      }
      stage('構建') {
        steps {
          echo '構建中...'
          sh 'make'
          echo '構建完成.'
        }
      }
      stage('發布') {
        steps {
          echo '發布中...'
          codingArtifactsGeneric(
            files: 'hello',
            repoName: "${env.GENERIC_REPO_NAME}",
            version: "${env.GIT_COMMIT}",
          )
          echo '發布完成'
        }
      }
    }
  }
}

構建腳本中的大部分內容都比較容易理解,稍顯陌生的是 codingArtifactsGeneric 步驟,這是 CODING 官方提供的插件,方便上傳到 CODING generic 製品庫。該插件通過環境變量 GENERIC_REPO_NAME 獲取倉庫名,因此需要配置構建計劃設置該變量值。

步驟四 配置觸發構建規則

CODING 持續功能支持多種觸發方式包括代碼源觸發、定時觸發、API 觸發及手動觸發,這幾種觸發方式可以同時配置互不衝突,其中代碼源觸發又可配置為推送到指定分支或標籤觸發,觸發方式多樣,可滿足絕大部分場景需要。

如前言中所說,我們希望把更多的精力放在源代碼上,盡量減少構建所帶來的干擾,因此這裏必不可少的是配置通過代碼源觸發,通過配置如下正則表達式,可以在推送代碼到匹配的分支名時自動觸發構建。

^refs/(heads/(release|release-.*|build-.*|feat-.*|fix-.*|test-.*|mr/.*))

步驟五 執行構建

執行構建最簡單的方式是手動觸發構建,選中想要構建的構建計劃,單擊立即構建會彈出配置窗口,在這裏可以配置此次構建使用的參數,單擊確定即可開始構建。

按照步驟四的配置,我們的構建計劃也支持推送的匹配分支觸發構建,您可以執行如下命令創建新分支並推送到遠端倉庫,即可觸發構建。

git checkout -b build-ci-test
git push origin HEAD

觸發后,構建會自動執行,您可以繼續做其他事情。

步驟六 下載目標文件

步驟三中定義的構建腳本會將構建出的目標文件發布到 CODING 製品庫,如果我們想要在本地使用也是很方便下載的。在製品倉庫中單擊文件名即可看到指引頁,裏面給出了對文件不同操作的命令。

總結

本文通過一個 C 語言 + makefile 的 Demo 項目講解了 CODING 持續集成、製品庫的簡單使用。藉由 CODING 平台的這些功能,我們像是雇了一個永不會累的助手,承擔了耗時的構建工作,從而節省了時間,提高了效率。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!