- spec文件
%define name ×××
这一行定义了一个宏变量 name,值为×××。宏变量可以在后续使用,用于简化代码。
%define version <version>
%define unmangled_version <version>
%define release <software_release>
%define pypi_name ×××
这几行定义了几个宏变量,包括 version、unmangled_version、release 和 pypi_name,这些变量的具体值在使用时将通过替换实际的版本号和发布号等。
Summary: snic ops
这一行指定了软件包的概要描述,用于提供一个简短的描述信息。
Name: %{name}
这一行指定了软件包的名称,它使用先前定义的宏变量 %{name},将其替换
Version: %{version}
这一行指定了软件包的版本号,它使用先前定义的宏变量 %{version},将其替换为 <version>。
Release: %{release}
这一行指定了软件包的发布号,它使用先前定义的宏变量 %{release},将其替换为 <software_release>。
Source0: %{name}-%{unmangled_version}.tar.gz
这一行指定了软件包的源代码压缩包的位置和文件名。它使用先前定义的宏变量 %{name}和 %{unmangled_version},将其替换。
License: UNKNOWN
这一行指定了软件包的许可证,这里的示例中使用了 `UNKNOWN`,您可以将其替换为实际的许可证。
Group: Development/Libraries
这一行指定了软件包的归类,这里的示例中指定为 `Development/Libraries`,您可以根据软件包的实际情况进行设置。
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
这一行指定了用于构建软件包的临时目录。
Prefix: %{_prefix}
这一行指定了软件包安装时的前缀路径,默认使用宏变量 `%{_prefix}`,表示安装到标准的根目录(`/usr`)。
BuildArch: noarch
这一行将要构建的RPM包设置为不依赖于特定的体系结构,即为通用的。
Vendor: CTyun
Packager: CTyun
这两行指定了软件包的供应商和打包者的信息,这里的示例中设置为 `CTyun`,您可以替换为实际的值。
Requires: /usr/bin/python3
这一行指定了软件包的依赖关系,其中包含 `/usr/bin/python3`。
Url: none
这一行指定了软件包的 URL,这里的示例中设置为 `none`。您可以将其替换为实际的URL。
%description
这是软件包的详细描述,用于提供对软件包功能的详细说明。在描述的下面,可以添加具体的描述内容。
%prep
%setup -n %{name}-%{unmangled_version}
这几行指定了准备步骤,`%setup` 指令将源代码解压到指定的目录中,`-n` 选项指定了要解压的压缩包的名称和版本。这里使用了先前定义的宏变量 `%{name}` 和 `%{unmangled_version}`。
%build
python3 setup.py build
这几行指定了构建步骤,`%build` 指令用于执行实际的构建操作,这里调用了 `python3 setup.py build` 构建软件包。
%install
install -p -D -m 640 ×××
install -d -m 750 ×××
install -p -D -m 640 ×××
install -p -D -m 644 ×××
install -p -D -m 755 ×××
install -p -D -m 644 ×××
Install部分是spec文件的重点,这部分指定了安装步骤,`%install` 指令用于将构建的结果安装到指定的目录中。还有将其他一些文件复制到指定目录和创建目录等操作。
%files -f INSTALLED_FILES
%{_sysconfdir}/%{pypi_name}/
%{_localstatedir}/log/%{pypi_name}/
%{_sharedstatedir}/%{pypi_name}/
%{_unitdir}/snic_ops.service
%{_bindir}/snic_ops_tool
%doc README.md
%{_sysconfdir}/logrotate.d/snic_ops
这几行指定了软件包中包含的文件列表,`-f INSTALLED_FILES` 表示从文件 `INSTALLED_FILES` 中读取文件列表,其他行指定了其他的文件和目录。
%pre
%post
systemctl enable snic_ops
chmod +x %{_bindir}/snic_ops_tool
python3 -m pip install -r %{_sharedstatedir}/%{pypi_name}/requirements.txt
%systemd_post snic_ops.service
%preun
%systemd_preun snic_ops.service
%postun
%systemd_postun snic_ops.service
这几个空指令用于在安装、卸载过程中执行一些操作,这里是一个示例中的占位符。其中还包括 `systemctl enable snic_ops` 指令用于在安装后启用 `snic_ops` 服务,`chmod +x %{_bindir}/snic_ops_tool` 指令用于设置 `snic_ops_tool` 工具的执行权限,`python3 -m pip install -r %{_sharedstatedir}/%{pypi_name}/requirements.txt` 指令用于在安装后安装依赖,`%systemd_post`、`%systemd_preun` 和 `%systemd_postun` 是用于管理systemd服务的宏。
- 打rpm包的shell脚本
specdir=$(readlink -f "$(dirname "$0")")
这一行将当前脚本的目录路径赋值给变量 `specdir`。
rootdir=$(readlink -f "$specdir/../")
这一行将 `specdir` 的上级目录路径赋值给变量 `rootdir`。
cd ${rootdir}
这一行切换到 `rootdir` 目录。
version=`cat rpm/zijin_snapshot.spec |grep "define version" |awk '{print $3}' `
release=`cat rpm/zijin_snapshot.spec |grep "%define release" |awk '{print $3}' `
这两行从 `rpm/zijin_snapshot.spec` 文件中提取版本号和发布号,并将其赋值给变量 `version` 和 `release`。
if [ -n "$1" ]; then
version=$1
fi
if [ -n "$2" ]; then
release=$2
fi
这两个条件语句用于检查脚本执行时是否传入了版本号和发布号参数,如果有,则使用传入的参数覆盖之前的值。
echo "version: ${version}, release: ${release}"
这一行打印当前实际使用的版本号和发布号。
if [ -d ./rpmbuild ]; then
rm -rf rpmbuild
fi
这一行检查当前目录下是否存在 `rpmbuild` 目录,如果存在,则先删除该目录。
mkdir -pv rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS,BUILDROOT}
if [ $? -ne 0 ]; then
exit 1
fi
这几行创建 `rpmbuild` 目录及其子目录,其中使用 `-p` 选项表示递归创建目录,`-v` 选项表示显示详细的创建过程。创建过程中,如果出现错误,则退出脚本。
SRC=rpmbuild/SOURCES
mkdir ${SRC}/zijin-snic-snapshot-${version}
cp -r zijin_snapshot/* ${SRC}/zijin-snic-snapshot-${version}/
这几行赋值 `rpmbuild/SOURCES` 目录,并将 `zijin_snapshot` 目录下的所有文件和文件夹复制到 `rpmbuild/SOURCES/zijin-snic-snapshot-${version}` 目录中。
cp ./rpm/zijin_snapshot.spec rpmbuild/SPECS/
ls -l rpmbuild/SPECS/
这两行将 `./rpm/zijin_snapshot.spec` 文件复制到 `rpmbuild/SPECS/` 目录,并列出 `rpmbuild/SPECS/` 目录中的文件列表。
sed -i "s/<version>/$version/g" rpmbuild/SPECS/zijin_snapshot.spec
sed -i "s/<software_release>/$release/g" rpmbuild/SPECS/zijin_snapshot.spec
这两行用于在 `rpmbuild/SPECS/zijin_snapshot.spec` 文件中替换 `<version>` 和 `<software_release>` 字符串为实际的版本号和发布号。
oldpwd=`pwd`
cd rpmbuild/SOURCES
tar -zcf ./zijin-snic-snapshot-${version}.tar.gz ./zijin-snic-snapshot-${version}
cd ${oldpwd}
这几行记录当前目录路径,然后切换到 `rpmbuild/SOURCES` 目录中,将 `zijin-snic-snapshot-${version}` 目录中的文件和文件夹压缩成 `zijin-snic-snapshot-${version}.tar.gz` 文件,最后切换回之前记录的目录路径。
_topdir=${rootdir}/rpmbuild
git_branch=`git rev-parse --abbrev-ref HEAD`
git_commit=`git log --pretty=oneline --abbrev-commit | head -n +1`
rpmbuild -ba rpmbuild/SPECS/zijin_snapshot.spec --define "__python python3" --define "_topdir ${_topdir}" --define "git_branch ${git_branch}" --define " git_commit ${git_commit}" --clean --nodebuginfo
这一行用于执行 `rpmbuild` 命令来构建 RPM 包。其中使用了 `--define` 选项来定义一些宏变量,如 `__python`、`_topdir`、`git_branch` 和 `git_commit` 的值。最后的 `--clean` 和 `--nodebuginfo` 选项是可选的,用于清理构建过程中生成的临时文件和不生成调试信息。