這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
線上交付代碼需要打成rpm 包,然後呢,我給營運的時候,營運說了句,你有空教我下,怎麼打rpm包,當時我就驚呆了,表情是這樣的,。
其實 golang 能build 成二進位檔案,所以,其實打rpm包和c 基本是一致的,使用rpmbuild 模組即可。下面以一個具體。重點就是編寫spec 檔案。
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 階段添加安裝後啟動和添加開機啟動。然後,完了。下面是我具體一個項目的執行個體:
#軟體包簡要介紹Summary: build refresh_agent#軟體包的名字Name: refresh_agent#軟體包的主要版本號Version: 0.0.1#軟體包的次版本號碼Release: 1#原始碼包,預設將在上面提到的SOURCES目錄中尋找Source0: %{name}-%{version}.tar.gz#授權協議License: GPL#軟體分類Group: Development/Tools#軟體包的內容介紹%descriptionrefresh_agent服務#表示預操作欄位,後面的命令將在源碼代碼BUILD前執行%prep#BUILD欄位,將通過直接調用源碼目錄中自動構建工具完成源碼編譯操作%buildcd /devops/app/go/src/refresh_agentgo 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_agentcp -f /devops/app/go/src/refresh_agent/etc/online.config.ini ${RPM_BUILD_ROOT}/etc/refresh_agent/config.ini#logrotatemkdir -p ${RPM_BUILD_ROOT}/etc/logrotate.dcp -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.dcp -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.dcp -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_agentecho -e "has added refresh_agent to chkconfig \n"# 安裝啟動/etc/init.d/refresh_agent startecho -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等方式實現,但是就複雜多了。