部署服务过程中经常获取代码,安装的需求,一般运维方法有写安装脚本,在将脚本和包远程cp到目标文件。因为有些繁琐的步骤,将需要安装的包,还有脚本打包成RPM包不失为一种高效简单的方法。目标机器只需要加入新的yum源,然后yum install就可以了。
目标机器加入新的yum源方法:
新yum源文件格式:test.repo
[test]
name=test - $basearch
baseurl=yum源的地址
enabled=1
gpgcheck=0
cp test.repo /etc/yum.epo/
下面来讲一下制作RPM包的方法:
首先,机器上需要安装必要的软件
yum install rpm-build
yum install rpmrebuild
yum install rpmdevtools
想要修改rpmbuild的默认路径,修改文件 /root/.rpmmacros
例如:
cat /root/.rpmmacros
%_topdir /data/rpmbuild
将rpmbuild路径修改到 /data/rpmbuild下面了。
运行命令,rpmdev-setuptree 在当前目录下生成rpmbuild 目录,rpmbuild目录就是编译用的目录。生成的目录结构为:
rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
一、生成 test.spec
将需要的步骤编辑 test.spec 文件 放到 rpmbuild/SPECS;
test.spec记录了变成rpm包的步骤,其中,test.spec包含以下几个步骤:
第一部分:变量定义
例如:
%global test_dir /opt/test
这三个值分别对应:
%变量属性 变量名 变量值
软件说明,例如Name,Version,Summary 总结
Source0: 需要用到的文件名
Source关键字指定所有需要用到的文件
%description 描述
%prep 编译前的阶段,可以做一些解压包,创建用户等操作
%build 这个阶段为建立前的阶段, 如make等操作
%install
部署的关键步骤,安装包的阶段,如 make install
%clean
部署完成之后的清理步骤
%files
部署涉及到的文件,说明文档(doc),配置文件(config)及执行程序,还可定义文件存取权限,拥有者及组别。
%post
mkdir -p /var/log/supervisord
pip install -r ${RPM_BUILD_ROOT}requirements.txt
如果在安装完成之后,想要在目标机器上执行一系列操作,可以把shell命令放在 %post部分。例如以上,安装完成之后,pip 安装软件包。
%changelog
变更日志
%
写好test.spec是关键一步,里面有很多宏定义和写作规范,在制作的过程中,有自己的语法规则,比如文件 SOURCES 指定编号,后面执行这个文件的用途;
关键字介绍:
install命令,可以将文件copy到指定的目录下,并且指定文件的权限
install -m 640 %{SOURCE0}/agent/supervisord.conf ${RPM_BUILD_ROOT}/etc/
将%{SOURCE0}/agent/supervisord.conf 文件cp到 ${RPM_BUILD_ROOT}/etc/,cp之后的文件权限是640。
%setup
setup 安装之前对代码包操作,操作的对象是Source0,操作完之后,程序进入到目标目录
setup 可以带多个参数, 比如
%setup -q 相当于对源文件的压缩包执行 tar -xof
%setup -u 对于Source0中带有参数的,可以做参数的替换
Name: cello
Source0: https://example.com/%{name}/release/hello-%{version}.tar.gz
…
%prep
%setup -n hello
其中 hello 和 cello 名字是不同的,这种情况下需要执行要压缩的文件名。
%setup -a and -b
Source0: https://example.com/%{name}/release/%{name}-%{version}.tar.gz
Source1: examples.tar.gz
…
%prep
%setup -a 1
Source1 也是压缩包,在进入到工作目录之后,Source1也需要操作的时候。 -a after
相应的 %setup -b 1 是进入工作目录之前需要压缩的文件,-b before
需要的文件放到 rpmbuild/SOURCES 下面。
关于目录
首先要确定rpm包在目标机器的安装目录是什么?编译目录和安装目录的关系。
BUILDROOT 下面有关项目的目录是在什么时候创建的?
二、命令
spectool -g -R SPECS/test.spec
rpmbuild -bb SPECS/test.spec
可以看出命令执行过程,如果顺利执行完毕,会在 rpmbuild/RPMS 目录下面生成目标rpm包。
网友评论