questdb在opencloudos下的打包总结

背景

最近看到opencloudos社区有一些公开的任务可以做,尝试了做其中的一个打包的任务,整个任务的执行周期超过预期,但是中间还是掌握了一些新的东西
本篇文章就是总结这些新的知识点

具体过程

打包环境问题

以前的打包经验是从官网找到source的rpm包,然后本地解压,然后对着spec文件进行rpmbuild -bb即可生成当前系统的包
但是这个环境是需要使用mock跑一遍的,这个之前确实没接触过,只是在centos下包的时候,某些包的下载链接有koji这个地址的
这个是一套完整的环境

我们看下这个地方是怎么运行的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@myserver ~]# cat mock.cfg
# Auto-generated by the Koji build system

config_opts['basedir'] = '/var/lib/mock'
config_opts['chroot_setup_cmd'] = 'groupinstall server-product-environment development'
#config_opts['chroot_setup_cmd'] = 'groupinstall Server'
#config_opts['chroot_setup_cmd'] = 'install rpm-build shadow-utils systemd'
#config_opts['chroot_setup_cmd'] = 'groupinstall development'
config_opts['chroothome'] = '/builddir'
config_opts['dnf_warning'] = False
config_opts['package_manager'] = 'dnf'
config_opts['root'] = 'dist-ocs23-build-repo_latest'
config_opts['rpmbuild_networking'] = False
config_opts['rpmbuild_timeout'] = 86400
config_opts['target_arch'] = 'x86_64'
config_opts['use_host_resolv'] = False
#config_opts['yum.conf'] = '[main]\ncachedir=/var/cache/yum\ndebuglevel=1\nlogfile=/var/log/yum.log\nreposdir=/dev/null\nretries=20\nobsoletes=1\ngpgcheck=0\nassumeyes=1\nkeepcache=1\ninstall_weak_deps=0\nstrict=1\n\n# repos\n\n[build]\nname=build\nbaseurl=https://build.stream.opencloudos.tech/kojifiles/repos/dist-ocs23-build/latest/x86_64\n'
config_opts['yum.conf'] = '[main]\ncachedir=/var/cache/yum\ndebuglevel=1\nlogfile=/var/log/yum.log\nexclude= kernel-core*\nexclude=kmod-kvdo*\nexclude==vdo*\nexclude=kernel-modules*\nexclude=kernel-6.6.6*\nreposdir=/dev/null\nretries=20\nobsoletes=1\ngpgcheck=0\nassumeyes=1\nkeepcache=1\ninstall_weak_deps=0\nstrict=1\n\n# repos\n\n[build]\nname=build\nbaseurl=http://192.168.0.208/BaseOS/\n\n[Appstream]\nname=appstream\nbaseurl=http://192.168.0.208/AppStream/ '

config_opts['plugin_conf']['ccache_enable'] = False
config_opts['plugin_conf']['root_cache_enable'] = False
config_opts['plugin_conf']['yum_cache_enable'] = False

config_opts['macros']['%_host'] = 'x86_64-koji-linux-gnu'
config_opts['macros']['%_host_cpu'] = 'x86_64'
config_opts['macros']['%_rpmfilename'] = '%%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm'
config_opts['macros']['%_topdir'] = '/builddir/build'
config_opts['macros']['%dist'] = '.ocs23'
config_opts['macros']['%distribution'] = 'Koji Testing'
config_opts['macros']['%packager'] = 'Koji'
config_opts['macros']['%vendor'] = 'Koji'

这个是我的本地的mock配置文件,官方提供的是使用的官方的源,官方源是需要通过公网网络去下载rpm包,然后在本地构建了一个类似lxc或者docker的环境,然后在这个环境内打包的
这个环境的基础环境是通过上面的一些地方做控制的
yum.conf那里就是写的dnf的配置文件,这个地方决定了rpm包从哪里来的
chroot_setup_cmd那里就是安装的包环境的,需要多少就自己装就行,官方是用了一个build的group,这个包里面有多少内容就是官方去控制的,这个地方我们尽量去模拟一个跟官方类似的环境即可
上面的环境我自己是把cdrom直接mount本地
然后做了一个本机的nginx的源,然后dnf指定到这个源,这个可以根据自己的需要进行处理即可,方法很多,怎么方便怎么来即可

运行mock打包

1
mock -r mock.cfg --config-opts mirrored=False  --rebuild ~/rpmbuild/SRPMS/questdb-8.1.0-1.ocs23.src.rpm

这个跑起来就可以了,出错会提示是什么问题引起的

执行这个命令就会跑起自动的流程

mvn 打包

mvn是java打包的一个工具套件,这个之前也没用过,打包过程会提示很多依赖,然后自动下载,这个跟之前做go的一些打包有点类似,会自动取下一些依赖包,然后放到本地的目录,下次用的时候就不用下了

那么这个地方我们需要离线打包的话,需要把依赖都弄下来

1
mvn  package -DskipTests -P build-web-console  -Dmaven.repo.local=./repository/

这个就是一个打包的过程,打包过程会把依赖包都下载到./repository里面,那么下次再打包的时候就不用下载,我们就是利用这个来进行离线打包,其它mvn打包的都可以类似处理

spec的规范性问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
[root@myserver questdb]# cat questdb.spec
%define debug_package %{nil}

Summary: QuestDB is the fastest growing open-source time-series database offering blazingly fast, high throughput ingestion and dynamic, low-latency SQL queries.
Name: questdb
Version: 8.1.0
Release: 1%{?dist}
License: Apache License 2.0
URL: https://github.com/questdb/questdb/
Source0: https://github.com/questdb/questdb/archive/refs/tags/%{version}.tar.gz
Source1: repository.tar.gz
Source2: questdb.service
Source3: web-console.tgz
# mvn buid use many jar need download from maven center
# build on local server use command
# mvn clean package -DskipTests -P build-web-console,build-binaries -Dmaven.repo.local=./repository/
# tar the repository to repository.tar.gz
# rpmbuild can use mvn build local not need network or rpm

# web-console.tgz
# Source3 wget from https://registry.npmjs.org/@questdb/web-console/-/web-console-0.5.1.tgz
#

BuildRequires: maven-local
BuildRequires: java-17-konajdk-jmods
BuildRequires: git
BuildRequires: systemd-rpm-macros
Requires: java
%description
QuestDB is the fastest growing open-source time-series database offering blazingly fast, high throughput ingestion and dynamic, low-latency SQL queries. The entire high-performance codebase is built from the ground up in Java, C++ and Rust with no dependencies and zero garbage collection.

%prep
%autosetup
tar -xvf %{SOURCE1}
cp -ra %{SOURCE2} ./
mkdir -p core/target/site/
cp -ra %{SOURCE3} core/target/site/

%build
# skip 10000+ unit test
#%%mvn_build
#mvn clean package -Dmaven.test.skip=true -Dmaven.repo.local=./repository/
mvn package -DskipTests -P build-web-console -Dmaven.repo.local=./repository/

%install
install -m 0755 -D core/target/questdb-8.1.0.jar %{buildroot}%{_bindir}/questdb.jar
install -m 0755 -D core/src/main/bin/env.sh %{buildroot}%{_bindir}/env.sh
install -m 0755 -D core/src/main/bin/print-hello.sh %{buildroot}%{_bindir}/print-hello.sh
install -m 0755 -D core/src/main/bin/questdb.sh %{buildroot}%{_bindir}/questdb.sh
install -m 0644 -D ./questdb.service %{buildroot}%{_unitdir}/questdb.service


%files
%license core/LICENSE.txt
%{_bindir}/questdb.jar
%{_bindir}/env.sh
%{_bindir}/print-hello.sh
%{_bindir}/questdb.sh
%{_unitdir}/questdb.service


%changelog
* Tue Aug 6 2024 zphj1987 <[email protected]> - 8.1.0-1
- [Type] other
- [DESC] Initial build of questdb.

字段的语法规则

1
S -> N ->  V - >  R ->  L ->  U

按照这个顺序处理

license的放置问题

这个按标准的放置

1
%license core/LICENSE.txt

不用install,这个直接会在源码里面取,并且放到了标准的位置

install路径问题

之前计划把jar放到一个独立的/opt下面,后面发现启动里面还判断了java的路径,如果放在/usr/bin下面
就不会提示java_home没设置的问题,这个按标准处理即可

打包过程的缺包问题

java-17-konajdk-jmods-17.0.11-1.ocs23.x86_64

打包过程发现 Module java.management 缺失的问题,这个就是缺上面的包,应该是漏放到源里面了

这个地方我的处理是直接拿源码按当前的java版本重新打了上面的这个rpm包,安装后就通过了

编译无web的问题

最开始编译的时候,安装完没有web

1
mvn  package -DskipTests  -Dmaven.repo.local=./repository/

修改为

1
mvn  package -DskipTests -P build-web-console  -Dmaven.repo.local=./repository/

就可以了,这个github官方的repo里面有说明编译不同的东西

service问题

官方没提供service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@myserver questdb]# cat questdb.service
[Unit]
Description=QuestDB Service
After=network-online.target
Wants=network-online.target

[Service]
LimitNOFILE=1048576
LimitNPROC=1048576
Type=forking
Environment=QDB_DEFAULT_ROOT=/etc/questdb
ExecStart=/usr/bin/questdb.sh start -d $QDB_DEFAULT_ROOT
ExecReload=/usr/bin/kill -HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=mixed
PrivateTmp=true

[Install]
WantedBy=multi-user.target

这个就是service启动里面,我们对配置文件的目录做了一个控制,还有系统限制也可以做下控制

编译过程下载的问题

1
2
wget https://registry.npmjs.org/@questdb/web-console/-/web-console-0.5.1.tgz
cp -ra web-console-0.5.1.tgz /root/rpmbuild/BUILD/questdb-8.1.0/core/target/site/web-console.tgz

编译带web的包过程中需要下载上面的web代码,然后这个网不通畅,离线也不好编译,我们处理方式是,下载下来作为一个源码包
在spec里面复制进去,检测到了这个包存在,就不会下载了

总结

上面就是打包的整个过程,由于这个打包过程依赖太多在线下载的东西,可能存在不可控的因素比较多,这个可以直接下载官方提供的二进制或者自己打包一下即可
本篇就是记录整个打包过程,后续其它的打包的可以做一些参考