構建自動化工具記錄,釋放我們的雙手

你曾是少年
S.H.E
00:00/04:49
一,構建工具
1 什麼是構建工具?
維基百科給出的概念如下:
Build automation is the process of automating the creation of a software build and the associated process including:compiling computer source code into binary code,packageing binary code,and running automated tests.
翻譯如下:
構建工具是一個把源代碼生成可執行應用程序的過程自動化的程序,包括:將計算機源碼編譯成二進位代碼,打包二進位代碼以及運行自動化測試。
構建的自動化其實就是自動化的執行一系列動作,而這些動作在軟體開發中經常使用,例如:
下載依賴
將源代碼編譯成二進位代碼
打包生成的二進位代碼
進行單元測試
部署到生成系統。
2 為什麼要使用構建自動化?
因為我們不想在做機械重複的事情,解放我們的雙手的,讓一些流程自動化地執行完成我們想要的任務。在小型項目中,開發者往往手動調用構建過程,但是在大型的項目中很不實用,在構建過程中難以跟蹤什麼需要被構建,按照什麼順序構建以及項目中存在哪些依賴,使用自動化工具會使構建過程更連續,工作效率更高。
二,部署應用程序
部署自己的應用程序,要根據具體情況具體分析,然後給出一套解決方案。這裡只是做個簡單的示例:本次我們需要部署的對象是Spring Boot應用程序,所以為此開發一個自動化構建工具,讓一切流程自動化,方便快捷部署應用程序到應用伺服器。
搭建環境,Linux系統下安裝JDK 和Maven工具
JDK是Java語言的軟體開發工具包,主要用於移動設備,嵌入式設備的java應用程序。JDK是整個Java開發的核心,它包含了Java的運行環境(JVM+Java系統類庫)。
Apache Maven是一套軟體工程管理和整合工具。基於工程對象模型(POM)的概念,通過一個中央信息管理模塊,Maven能夠管理項目的構建,報告和文檔。
本次操作,我們在阿里雲伺服器上安裝JDK和Maven工具。
在/home目錄下創建兩個文件夾:jvm和maven目錄。
JDK的下載和解壓
下載完成之後解壓,
tar -zxvf jdk-8u161-linux-x64.tar.gz
此次操作存放在/home/jvm/目錄,重命名文件夾為jdk1.8。
Maven的下載和解壓
下載maven的tar包
wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.5.0/binaries/apache-maven-3.5.3-bin.tar.gz
下載完成後解壓tar包
此次操作存放在/home/maven/目錄,重命名文件夾為maven3.5.3
配置環境變數
重啟機器或者執行命令
source /etc/profile或sudo shutdown -r now
查看安裝情況
出現上面信息,則表示JDK和Maven已經在Linux下成功安裝。
三,版本控制工具
版本控制工具提供完備的版本管理功能,用於存儲,追蹤目錄和文件的修改歷史,是軟體開發者必備的工具。目前,自己在工作中已經接觸過三種版本控制管理工具,分別是Clearcase,Git,SVN版本控制系統。
Clearcase是由IBM Rational Software提供,此軟體是配置管理方面的高端軟體,功能強大,價格極高。
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
git是一個開源的分散式版本控制系統,快速高效的處理從很小到非常大的項目版本控制。
SVN是基於CVS的基礎上,有CollabNet提供開發的,也是開源工具,使用非常廣泛,非常受大家歡迎。
版本控制工具的作用
可以協同代碼管理,讓多人開發代碼得以實現。
回歸到以前的任何一個已記錄版本的代碼處。(對比之後發現之前更加美好,依然可以歸位。版本控制工具用日誌記錄了文件的每一次修改,可以通過查看日誌回到任何一個自己想要的版本)。
代碼衝突的問題,主要是多人操作同一個文件(團隊開發很常見)。
可以查看每個人具體的操作,便於出現問題後及時排查(由於某個員工個人失誤造成很大的bug,可以方便的追究責任)。
集中式版本控制和分散式版本控制的對比:
Git和SVN是目前最常用的團隊協作的版本控制系統。
SVN是集中式版本控制系統,版本庫是集中放在中央伺服器的。如下圖:
集中式版本控制,有一個包含所有版本文件的單個伺服器和一個數字(版本號),所有的客戶端從這個Server上檢出文件(只是文件,本地沒有倉庫的概念)。
集中式的版本控制必須連接網路才能工作,嚴重的缺陷就是中央伺服器的單點故障。如果伺服器宕機一個小時,在這期間,沒有任何人可以在工作的版本上很好的保存某一個版本的改變。另外,如果中央資料庫的磁碟壞了,並且沒有保存備份,那麼將丟失所有的東西
分散式版本控制(Git)
Git是目前世界上最先進的分散式版本控制系統。
Git 中每個克隆(clone)的版本庫都是平等的。可以從任何一個版本庫的克隆來創建屬於自己的版本庫,同時你的版本庫也可以作為源提供給他人,只要你願意。Git 的每一次提取操作,實際上都是一次對代碼倉庫的完整備份。提交完全在本地完成,無須別人給你授權,你的版本庫你作主,並且提交總是會成功。Git 的提交不會被打斷,直到你的工作完全滿意了,PUSH給他人或者他人PULL你的版本庫,合併會發生在PULL和PUSH過程中,不能自動解決的衝突會提示你手工完成。
Git的缺點就是工作目錄只能是整個項目。比如 checkout,建分支,都是基於整個項目的,而 svn 可以基於項目中的某一個目錄。
對比結果:
git是分散式的scm,svn是集中式的。(最核心)
git是每個歷史版本都存儲完整的文件,便於恢復,svn是存儲差異文件,歷史版本不可恢復。(核心)
git可離線完成大部分操作,svn則不能。
git有著更優雅的分支和合併實現。
git有著更強的撤銷修改和修改歷史版本的能力。
git速度更快,效率更高。
獲取單純的代碼
在SVN中,如果不需要任何歷史信息,只想要某個版本純粹的代碼(經常會有這種需求,這樣做本地數據比較小) 那麼,使用svn export命令即可以實現。在git中,似乎沒有這樣的命令,不過,由於git的本地倉庫信息完全維護在project根目錄的.git目錄下,(不像svn一樣,每個子目錄下都有單獨的.svn目錄)。所以,只要clone,checkout然後刪除.git目錄就可以了。
四,shell編程實例總結
這裡我主要是把相關的操作過程過程函數化,這樣就可以精簡代碼以及為了代碼的復用。
1)判斷文件夾是否存在,不存在則創建
2)判斷當前執行命令是否執行成功。
3)shell如何檢測網路連通性?
網路性能的好壞直接影響程序對外提供服務的穩定性和可靠性。
4)談談Log日誌記錄
在項目開發中,記錄錯誤日誌是一個很有必要的功能,好處如下:
方便調試;
便於發現系統運行過程中的錯誤;
存儲業務數據,便於後期分析;
簡單定義Log日誌級別如下:
info:輸入你感興趣的或者重要信息,綠色列印輸出。
success: 執行成功的重要的信息,屏幕綠色字元列印輸出,並記錄到log文件中。
error:錯誤信息,屏幕紅色字元列印輸出,退出當前程序,並記錄到log文件中。
示例代碼如下:
5)shell中exit 0 和exit 1的區別
exit(0):正常運行程序並退出程序;
exit(1):非正常運行導致退出程序;
exit 0 可以告知你的程序的使用者:你的程序是正常結束的。
exit 非 0 值,可以告知你的程序的使用者:你的程序產生了一個錯誤,異常結束。
在shell中調用完你的程序之後,用echo $?命令就可以看到你的程序的exit值。
在shell腳本中,通常會根據上一個命令的$?值來進行一些流程式控制制。在一個腳本中如果要執行多條命令,那麼如何確保調用此shell腳本中的所有命令都執行成功!那麼看看上面log_error中的exit 1命令吧。
五,系統服務管理工具Systemd的使用
在項目中,是否開機啟動應用程序或者啟動依賴的相關服務程序,我們可以根據具體需求分析,自己定義的相應 service 文件,通過systemd的主命令systemctl來管理服務。
對於那些支持 Systemd 的軟體,安裝的時候,會自動在/usr/lib/systemd/system目錄添加一個配置文件。我們可以通過Systemd的主命令systemct用於管理系統的相關服務。下面以nfs服務作為演示:
傳統的Linux系統啟動過程主要由著名的init進程(也被稱為SysV init啟動系統)處理,而基於init的啟動系統被認為有效率不足的問題。
下面的命令用來啟動服務。
$ sudo /etc/init.d/hpptd start#或者$ service hpptd start
這種方法有兩個缺點:
一是啟動時間長。init進程是串列啟動,只有前一個進程啟動完,才會啟動下一個進程。
二是啟動腳本複雜。init進程只是執行啟動腳本,不管其他事情。腳本需要自己處理各種情況,這往往使得腳本變得很長。
Systemd就是為了解決這些問題而誕生的。它的設計目標是,為系統的啟動和管理提供一套完整的解決方案systemd是Linux系統機器的另一種啟動方式,宣稱彌補了以傳統Linux SysV init為基礎的系統的缺點。
Systemd的優點是功能強大,使用方便,缺點是體系龐大,非常複雜。看看圖不說話,要深入理解和掌握Systend的,需要花費一段時間學習。
關於構建自動化,就是不想在做機械重複的事情,解放我們的雙手的,讓一些流程自動化地執行完成我們想要的任務,應用於工作中,效率極高。就目前工作中處理的問題,只要是人為操作都可以用程序自動化實現。
記得剛開始工作的時候,小團隊為了整個項目開發了一個自動化流程工具,讓人為操作流程需要花費兩個小時的工作,只需要執行一條命令就搞定了,這樣既防止了人為的錯誤,又提高了工作效率。後來工作中自己也幫過硬體工程師將處理BOM表的流程工作自動化,之前每一個工程師都需要花費一兩個小時去處理BOM表的數據,通過數據分析,將一些人為操作流程化開發出一個工具,最終的效果就是只要點擊一個按鈕,一分鐘之內搞定任務。
只要是人為操作的流程,一切都可以實現自動化,然後就可以偷懶睡覺去了。在想想人工智慧時代,機械性,可重複的腦力/體力勞動,都將被人工智慧/機器人取代,有些職業會面臨消失,這時候會需要更多新的,深度的,創意性的人才出現!


TAG:shareeyes |