線上交付代碼須要打成rpm 包,而後呢,我給運維的時候,運維說了句,你有空教我下,怎麼打rpm包,當時我就驚呆了,表情是這樣的,😳。python
該文章後續仍在不斷的更新修改中, 請移步到原文地址http://dmwan.ccgolang
其實 golang 能build 成二進制文件,因此,其實打rpm包和c 基本是一致的,使用rpmbuild 模塊便可。下面以一個具體。重點就是編寫spec 文件。bash
Name: hellorpm #名字爲源碼tar.gz 包的名字 Version: 1.0.0 #版本號,必定要與tar.gz包的一致哦 Release: 1%{?dist} #釋出號,也就是第幾回製做rpm Summary: helloword #軟件包簡介,最好不要超過50字符 License: GPL #許可,GPL仍是BSD等 URL: #能夠寫一個網址 Packager: abel Source0: %{name}-%{version}.tar.gz #定義用到的source,也就是你的源碼 BuildRoot: %_topdir/BUILDROOT #這個是軟件make install 的測試安裝目錄. BuildRequires: gcc,make #製做過程當中用到的軟件包 Requires: python-apscheduler >= 2.1.2-1.el7,python-daemon >= 1.6-1.el7 #軟件運行依賴的軟件包,也能夠指定最低版本如 bash >= 1.1.1 %description #描述,隨便寫 %prep #打包開始 %setup -q #這個做用靜默模式解壓並cd %build #編譯製做階段,主要目的就是編譯,若是不用編譯就爲空 ./configure \ %{?_smp_mflags} #make後面的意思是:若是就多處理器的話make時並行編譯 %install #安裝階段 rm -rf %{buildroot} #先刪除原來的安裝的,若是你不是第一次安裝的話 cp -rp %_topdir/BUILD/%{name}-%{version}/* $RPM_BUILD_ROOT #將須要須要打包的文件從BUILD 文件夾中拷貝到BUILDROOT文件夾下。 #下面的幾步pre、post、preun、postun 不必能夠不寫 %pre #rpm安裝前制行的腳本 %post #安裝後執行的腳本 %preun #卸載前執行的腳本 %postun #卸載後執行的腳本 %clean #清理段,刪除buildroot rm -rf %{buildroot} %files #rpm要包含的文件 %defattr (-,root,root,-) #設定默認權限,若是下面沒有指定權限,則繼承默認 /etc/hello/word/helloword.c #將你須要打包的文件或目錄寫下來 ### 7.chagelog section 改變日誌段 %changelog
咱們要寫的重點是什麼呢?在% build 階段build,在%install 階段移動文件到目標文件夾,在 %pre 階段作些清掃工做,在post 階段添加安裝後啓動和添加開機啓動。而後,完了。下面是我具體一個項目的實例:app
#軟件包簡要介紹 Summary: build refresh_agent #軟件包的名字 Name: refresh_agent #軟件包的主版本號 Version: 0.0.1 #軟件包的次版本號 Release: 1 #源代碼包,默認將在上面提到的SOURCES目錄中尋找 Source0: %{name}-%{version}.tar.gz #受權協議 License: GPL #軟件分類 Group: Development/Tools #軟件包的內容介紹 %description refresh_agent服務 #表示預操做字段,後面的命令將在源碼代碼BUILD前執行 %prep #BUILD字段,將經過直接調用源碼目錄中自動構建工具完成源碼編譯操做 %build cd /devops/app/go/src/refresh_agent go build -o refresh_agent cmd/agent_bin.go #file #安裝字段 %install # 二進制執行文件 mkdir -p ${RPM_BUILD_ROOT}/usr/local/bin/ cp -f /devops/app/go/src/refresh_agent/refresh_agent ${RPM_BUILD_ROOT}/usr/local/bin/refresh_agent # 日誌目錄 mkdir -p ${RPM_BUILD_ROOT}/bbd/logs/refresh_agent # 配置文件 mkdir -p ${RPM_BUILD_ROOT}/etc/refresh_agent cp -f /devops/app/go/src/refresh_agent/etc/online.config.ini ${RPM_BUILD_ROOT}/etc/refresh_agent/config.ini #logrotate mkdir -p ${RPM_BUILD_ROOT}/etc/logrotate.d cp -f /devops/app/go/src/refresh_agent/etc/refresh_agent_logrotate.conf ${RPM_BUILD_ROOT}/etc/refresh_agent/refresh_agent_logrotate.conf #日誌蒐集 mkdir -p ${RPM_BUILD_ROOT}/etc/rsyslog.d cp -f /devops/app/go/src/refresh_agent/scripts/refresh_agent.conf ${RPM_BUILD_ROOT}/etc/rsyslog.d/refresh_agent.conf # 控制腳本 mkdir -p ${RPM_BUILD_ROOT}/etc/init.d cp -f /devops/app/go/src/refresh_agent/scripts/refresh_agent.sh ${RPM_BUILD_ROOT}/etc/init.d/refresh_agent %post # 添加開機自啓動 # 更改權限 chmod 775 /etc/init.d/refresh_agent # 加入自啓動 chkconfig --add refresh_agent echo -e "has added refresh_agent to chkconfig \n" # 安裝啓動 /etc/init.d/refresh_agent start echo -e "start log rewrite to /var/log/messsge \n" #調用源碼中安裝執行腳本 #文件說明字段,聲明多餘或者缺乏都將可能出錯 %files %defattr(-,root,root) /usr/local/bin/refresh_agent /etc/init.d/refresh_agent /etc/rsyslog.d/refresh_agent.conf /etc/refresh_agent/refresh_agent_logrotate.conf %dir /etc/refresh_agent /bbd/logs/refresh_agent
由於golang 能打成二進制文件,因此製做rpm 很簡單,相比起來,python 雖然也能夠用ominibus等方式實現,可是就複雜多了。運維