seism0saurus
seism0saurus

Reputation: 426

Why are files missing after installation of my rpm?

I build my first rpm package. It is the prescriped way to deploy applications to our distributed SuSE Servers. The application is build with NodeJs and Typescript.

We have a build step that transcribes the Typescript to Javascript into a dist folder. NPM provides the dependencies in a node_modules folder. Then there are some .env config files, a bash script to start the application called myApplication and a init.d script called myDaemon. These are all packed into a tar.gz file. The structure is the following:

myApplication.tar.gz
|
|--dist
|  |
|  |-index.js
|  |-...
|
|--node_modules
|  |
|  |-dependency_a
|  |-dependency_b
|  |-...
|
|--.env
|--.env.production
|--.env.development
|--.env.sample
|--myApplication
|--myDaemon

The rpmbuild unpacks the tar.gz file, creates the needed folders in the build root and copies the files to the correct folders. dist and node_modules go the a folder in /opt. The configuration files to folder in /etc/, the daemon to /etc/init.d and the executable bash script to start the application to /usr/bin. The README is treated as documentation and the logfiles are marked as ghost. This is the spec file:

%define debug_package %{nil}

# Use other payload algorithm to fix the following error on SuSE: Failed dependencies: rpmlib(FileDigests) <= 4.6.0-1 is needed
%define _binary_filedigest_algorithm   1

# automatically generate requires and provides from package.json
%{?nodejs_find_provides_and_requires}

# filter out any false provides created due to dependencies with native components
%{?nodejs_default_filter}

# name of zip file containing source without .zip extension
%define modname myApplication

Summary: The %{modname} is a nodeJs project
Name:    %{modname}
Group:   Applications/Server
Version: 0.1
Release: 1
License: None
URL:     https://private.git/myApplication
Source0: myApplication.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildArch: x86_64
ExclusiveArch: x86_64
BuildRequires: npm
Requires: nodejs10
AutoReq: no
AutoProv: no

%description
%{Summary}

#Unpack the tar.gz file
%prep
%setup -q -n myApplication

%build
#Code is already build

%install
rm -rf $RPM_BUILD_ROOT

mkdir -p $RPM_BUILD_ROOT/etc/myApplication
%{__cp} -r $RPM_BUILD_DIR/myApplication/.env* $RPM_BUILD_ROOT/etc/myApplication

mkdir -p $RPM_BUILD_ROOT/opt/myApplication/dist
%{__cp} -r $RPM_BUILD_DIR/myApplication/dist $RPM_BUILD_ROOT/opt/myApplication/

mkdir -p $RPM_BUILD_ROOT/opt/myApplication/node_modules
%{__cp} -r $RPM_BUILD_DIR/myApplication/node_modules $RPM_BUILD_ROOT/opt/myApplication/

mkdir -p $RPM_BUILD_ROOT/usr/bin
%{__cp} -r $RPM_BUILD_DIR/myApplication/myApplication $RPM_BUILD_ROOT/usr/bin/myApplication

mkdir -p $RPM_BUILD_ROOT/etc/init.d/
%{__cp} -r $RPM_BUILD_DIR/myApplication/myDaemon $RPM_BUILD_ROOT/etc/init.d/myDaemon

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(0755, root, root)

%doc README.md

%dir /etc/myApplication
%config /etc/myApplication/.env
%config /etc/myApplication/.env.production
%config /etc/myApplication/.env.development
/etc/myApplication/.env.sample

/opt/myApplication
/usr/bin/myApplication
/etc/init.d/myDaemon

%ghost /var/log/myApplication.log
%ghost /var/log/myDaemon.log

%changelog
* Wed Sep 29 2021 seism0saurus
- Initial spec file for myApplication

The rpm build with -vv runs fine and lists all dependencies from node_modules. I can also open the rpm with a zip utility and can see all needed dependencies inside the /opt/myApplication/node_modules folder.

But only some of the dependencies in that node_modules folder are installed, when I run zypper install myApplication.rpm. For example dependency_b is missing but dependency_a was installed. I can check that with rpm -V -v --nodeps -p myApplication.rpm. The folders are marked as missing. Here is a part from the output:

.......T    /opt/myApplication/node_modules/triple-beam/test.js
missing     /opt/myApplication/node_modules/url-parse
missing     /opt/myApplication/node_modules/url-parse/LICENSE
missing     /opt/myApplication/node_modules/url-parse/README.md
missing     /opt/myApplication/node_modules/url-parse/dist
missing     /opt/myApplication/node_modules/url-parse/dist/url-parse.js
missing     /opt/myApplication/node_modules/url-parse/dist/url-parse.min.js
missing     /opt/myApplication/node_modules/url-parse/dist/url-parse.min.js.map
missing     /opt/myApplication/node_modules/url-parse/index.js
missing     /opt/myApplication/node_modules/url-parse/package.json
........    /opt/myApplication/node_modules/util-deprecate

I usually use Debian/GNU Linux and not SuSE, so I don't have any experience with rpm. Can someone explain, why the folders and files are not installed, although rpm knows, that they should be installed and shows them as missing? How can I fix that? Is something wrong with my spec or my approach to package a NodeJs application?

--- EDIT ---

The rpm package works fine inside my Leap 15 containers (rpm 4.14.3). The problems is only on a SLES 11 installation (rpm 4.4.2.3). So the problems seems to be related with the old version of rpm.

--- EDIT 2 ---

I tweaked the spec by configuring the compression algorithm:

%define _source_payload w0.gzdio
%define _binary_payload w0.gzdio

Now i can install the package correctly with rpm but zypper has still the same problem. Any thoughts on that?

Kind regards,

seism0saurus

Upvotes: 3

Views: 1325

Answers (2)

BrentHarsh
BrentHarsh

Reputation: 33

I ran into a vaguely similar problem, and the OP's comment regarding "It seems to be a caching issue" under his original question prompted me to clean the yum cache on my target VM, and this resolved my issue. I had built an RPM containing several custom firewall service definition files which were to be placed into the /etc/firewalld/services/ directory. In this build, I had simply added one new XML file to the RPM and rebuilt. I'd tried "yum update" and also tried completely removing the original and installing the new, but only the original firewall service templates were being added. My spec file seemed correct, and the .rpm file seemed to contain my new file also, but it was never showing up. After a "yum clean cache," my new XML file is now being successfully added in the correct spot. Hopefully this extra answer will encourage someone in a similar situation to try cleaning the cache.

Upvotes: 0

seism0saurus
seism0saurus

Reputation: 426

The final solution was to use a different compression algorithm in the spec file and to give the package a new version number, so that zypper doesn't use the old version from cache.

%define _source_payload w0.gzdio
%define _binary_payload w0.gzdio

Upvotes: 0

Related Questions