golang 使用 rpm 包交付部署

    線上交付代碼須要打成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等方式實現,可是就複雜多了。運維

相關文章
相關標籤/搜索