questdb在opencloudos下的打包总结 zphj1987 2024-08-28 2024-08-28 背景 最近看到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 ~] config_opts['basedir' ] = '/var/lib/mock' config_opts['chroot_setup_cmd' ] = 'groupinstall server-product-environment 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\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] %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 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 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] [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里面复制进去,检测到了这个包存在,就不会下载了
总结 上面就是打包的整个过程,由于这个打包过程依赖太多在线下载的东西,可能存在不可控的因素比较多,这个可以直接下载官方提供的二进制或者自己打包一下即可 本篇就是记录整个打包过程,后续其它的打包的可以做一些参考