From f437f037b6ea82493c3677cef92f8ad58ac2b3d0 Mon Sep 17 00:00:00 2001 From: MCamp859 Date: Wed, 1 Jul 2020 15:26:38 -0400 Subject: [PATCH] Add packaging reference Closes-Bug: 1883327 Change-Id: I8045bf88d613adee73a01fceb645874e26c157ec Signed-off-by: MCamp859 --- .../developer_resources/build_guide.rst | 1 + .../figures/pkging_patch_comp.png | Bin 0 -> 68983 bytes doc/source/developer_resources/index.rst | 1 + .../developer_resources/packaging_ref.rst | 1176 +++++++++++++++++ 4 files changed, 1178 insertions(+) create mode 100644 doc/source/developer_resources/figures/pkging_patch_comp.png create mode 100644 doc/source/developer_resources/packaging_ref.rst diff --git a/doc/source/developer_resources/build_guide.rst b/doc/source/developer_resources/build_guide.rst index d414c263c..cdfa34095 100644 --- a/doc/source/developer_resources/build_guide.rst +++ b/doc/source/developer_resources/build_guide.rst @@ -384,6 +384,7 @@ Exit from the building Docker container. Run the following commands: cp -r $HOME/starlingx/workspace/localdisk/designer///stx-tools/centos-mirror-tools/output/stx-r1 $HOME/starlingx/mirror/CentOS/ +.. _create_stx_pkgs: ------------------------- Create StarlingX packages diff --git a/doc/source/developer_resources/figures/pkging_patch_comp.png b/doc/source/developer_resources/figures/pkging_patch_comp.png new file mode 100644 index 0000000000000000000000000000000000000000..1bd4a0b4b04ff449f07d2102631e223c5996ed5e GIT binary patch literal 68983 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

E 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 architecture_docs starlingx_patching diff --git a/doc/source/developer_resources/packaging_ref.rst b/doc/source/developer_resources/packaging_ref.rst new file mode 100644 index 000000000..c2c4991b8 --- /dev/null +++ b/doc/source/developer_resources/packaging_ref.rst @@ -0,0 +1,1176 @@ +=================== +Packaging Reference +=================== + +This guide contains information about creating StarlingX packages. + +.. contents:: + :local: + :depth: 1 + +--------------- +Tips and tricks +--------------- + +Here are some things to consider when creating packages: + +* Make sure you have the correct BuildRequires dependencies listed. Mock will + ensure that these packages are installed in the build environment before + trying to build the package in question. Be aware that CentOS often uses + ``-devel`` for developer packages (which typically include headers and the + ``.so`` shared library link) whereas StarlingX generally uses ``-dev``. For + BuildRequires, you can use the following: + + * Instead of ``virtual/x86_64-wrs-linux-gcc``, you can use ``gcc``. + * Instead of ``glib-2.0``, use ``glib2-devel``. + * Instead of ``sqlite3``, use ``sqlite-devel``. + * You can comment out or delete ``virtual/libc`` and + ``virtual/x86_64-wrs-linux-compilerlibs``. + +* Typically, you do not need to manually add dependencies due to shared + libraries to either Requires or Provides in the spec file. RPM will + usually add them automatically. + +* When your package creates a shared library, make sure to install it with 755 + (or other suitably executable) permissions. The automatic dependency + handling only runs if the library file is actually executable. + +* It can be useful to refer to a bitbake-generated spec file, especially for + STX-specific packages. Generally the ``build`` and ``install`` phases are + missing from the bitbake-generated spec file and you must add them. + +* Make sure all necessary files are listed, because the build_srpm phase will + only include source files listed in your spec file. In a simple case, this + can be just the following line: ``Source: %{name}-%{version}.tar.gz`` + +------------------------------------ +STX authored package with a makefile +------------------------------------ + +This section uses ``fm-common`` as a sample package to convert. + +#. Locate the root directory for the package. + + :: + + cd wr-cgcs/layers/cgcs/middleware/fault/recipes-common/fm-common + +#. Create a directory template in the same location as your current bitbake + recipe. The presence of a ``centos`` directory will identify packages to be + compiled for STX on CentOS. + + :: + + mkdir -p centos + mkdir -p centos/files + +#. The makefile requires an ``install`` build target. However, bitbake will try + to use ``install`` if it is introduced when it wasn't previously present, so + we'll use ``install_non_bb`` instead. + + The makefile takes the following parameters: ``DEST_DIR``, ``BIN_DIR``, + ``LIB_DIR``, ``INC_DIR``, ``MAJOR``, ``MINOR``. + + The basic strategy is to construct the directory tree using + ``install -m 755 -d some_dir``, then copy files using + ``install -m 755 from_file some_dir/to_file`` + + For versioned libraries, you must create non- or lesser-versioned symlinks, + for example: + + :: + + ln -s my_lib.so.1.0 some_dir/my_lib.so.1 + + Typically, you do not need the ``.so`` installed on the target (it's + generally only needed for building against). If you do, then it would be + linked as ``ln -s my_lib.so.1.0 some_dir/my_lib.so`` and would usually be + part of a ``-dev`` package. Don't forget tabs!!! + +:: + + vi sources/Makefile + install_non_bb: + install -m 755 -d $(DEST_DIR)$(BIN_DIR) + install -m 755 -d $(DEST_DIR)$(LIB_DIR) + install -m 755 -d $(DEST_DIR)$(INC_DIR) + install -m 755 fmClientCli $(DEST_DIR)$(BIN_DIR) + install -m 644 fmDbAPI.h $(DEST_DIR)$(INC_DIR) + install -m 644 fmAPI.h $(DEST_DIR)$(INC_DIR) + install -m 644 fmThread.h $(DEST_DIR)$(INC_DIR) + install -m 644 fmAlarm.h $(DEST_DIR)$(INC_DIR) + install -m 644 $(LIBFMCOMMON_SO).$(MAJOR).$(MINOR) $(DEST_DIR)$(LIB_DIR) + ln -s $(LIBFMCOMMON_SO).$(MAJOR).$(MINOR) $(DEST_DIR)$(LIB_DIR)/$(LIBFMCOMMON_SO).$(MAJOR) + ln -s $(LIBFMCOMMON_SO).$(MAJOR).$(MINOR) $(DEST_DIR)$(LIB_DIR)/$(LIBFMCOMMON_SO) + +*********************** +Create an RPM spec file +*********************** + +Put the RPM spec file under the ``centos`` directory. This is the rpm version +of a bitbake recipe. + +:: + + vi centos/.spec + +RPM spec files support macros and variable. Reference the macro with the +``%{macro_name}`` syntax. Many macros are already defined to help you, such as, +``%{version}`` refers to the ``Version:`` entry in the description section. You +can also define your own macros, for example ``%define local_dir /usr/local`` +creates the macro ``local_dir``. Fill in the following sections: + +:: + + # A short description of the packaged software + summary: + + # Defines what the package will actually be called + Name: + + # Should be set to the version of the software being packaged + Version: + + # A number that is used to represent the number of times the software, at the present version, has been packaged + Release: + + # Give a list of the source files found in the $BUILD_DIR/SOURCES subdirectory + # If git managed, usually just one, a tarball that we will create via build script e.g. Source0: %{name}-%{version}.tar.gz + # Alternatively name the tarball that is brought in via COPY_LIST from $STX_BASE/downloads directory. + # Many source files can be specified... list any additional files in $BUILD_DIR/SOURCES (likely placed there via COPY_LIST) + Source0: %{name}-%{version}.tar.gz + Source1: %{name}.conf + Source2: %(name}.init + + # List of build requirements + BuildRequires: + + # List of runtime requirements + Requires: + + # Describe the package + %description + + # Describes how to unpack the compressed packages (the setup macro will do it for you) + %prep + %setup + + # invoke 'make' + %build + + # invoke 'make install' + %install + + # Perhaps call 'make clean' or other cleanup scripts + %clean + + # List of files to include in the rpm + %files + + # Apply these permission/ownership overrides and the files that follow + %defattr(-,root,root,-) + + # Send this file to the standard path for documentation + %doc some_file + + # Create a directory when the rpm is installed + %dir some_directory + + # Install this file on this path + %some_file_path + + +One spec file can create multiple related rpm files. One common usage is to +place the ``*.so`` file (but not the ``*.so.*`` files) for a shared library and +its ``.h`` interface files in a ``-dev`` or ``-devel`` package. The Bitbake +naming convention is ``-dev``, while CentOS uses ``-devel``. Most of the +StarlingX packages use the ``-dev`` naming convention. + +You can create additional packages with ``%package -n package_name``, or +``%package suffix`` which creates a package named ``first_package_name-suffix``. + +Following ``%package``, add a unique ``Summary:``, and override any values from the +first package. These additional packages also require a ``%description, %files`` +sections, and may require ``%prep, %setup, %build, %install, %clean`` sections. All +these extra sections use the same ``-n package_name`` or ``suffix`` arguments to +define which package they apply to. Refer to the example below, which uses +``fm-common-dev``. + +:: + + %package -n fm-common-dev Summary: STX Platform Fault Management + Common Package - Development files Group: devel Requires: fm-common = + %{version}-%{release} ... %description -n fm-common-dev ... %files -n + fm-common-dev ... + +:: + + vi centos/fm-common.spec + %define local_dir /usr/local + %define local_bindir %{local_dir}/bin + + Summary: STX Platform Fault Management Common Package + Name: fm-common + Version: 1.0 + Release: r26.0 + License: Apache-2.0 + Group: base + URL: unknown + Source0: %{name}-%{version}.tar.gz + BuildRequires: util-linux + BuildRequires: postgresql-devel + BuildRequires: libuuid-devel + Requires: postgresql + + %package -n fm-common-dev + Summary: STX Platform Fault Management Common Package - Development files + Group: devel + Requires: fm-common = %{version}-%{release} + + %description + STX platform Fault Management Client Library that provides APIs for + applications to raise/clear/update active alarms. + + %description -n fm-common-dev + STX platform Fault Management Client Library that provides APIs for + applications to raise/clear/update active alarms. This package contains + symbolic links, header files, and related items necessary for software + development. + + %prep + %setup + %build + VER=%{version} + MAJOR=`echo $VER | awk -F . '{print $1}'` + MINOR=`echo $VER | awk -F . '{print $2}'` + make MAJOR=$MAJOR MINOR=$MINOR %{?_smp_mflags} + + %install + rm -rf $RPM_BUILD_ROOT + VER=%{version} + MAJOR=`echo $VER | awk -F . '{print $1}'` + MINOR=`echo $VER | awk -F . '{print $2}'` + make DEST_DIR=$RPM_BUILD_ROOT BIN_DIR=%{local_bindir} LIB_DIR=%{_libdir} INC_DIR=%{_includedir} MAJOR=$MAJOR MINOR=$MINOR install_non_bb + + %clean + rm -rf $RPM_BUILD_ROOT + + %files + %defattr(-,root,root,-) + %doc LICENSE + %dir %{local_dir} + %dir %{local_bindir} + %{local_bindir}/* + + %files -n fm-common-dev + %defattr(-,root,root,-) + %{_includedir}/* + %{_libdir}/* + +************************ +Set up srpm build script +************************ + +This section describes two options: you can choose to use the default srpm build +script or create your own srpm build script. + +#. Use the default srpm build script, and just provide a few data definitions, + in bash format. + + :: + + vi centos/build_srpm.data + Variables you can define. All paths are relative to PKG_BASE (see below) unless prefixed by another environment variable, eg. STX_BASE + SRC_DIR=my_src_dir + # Tar everything found in this subdirectory. Define this if source need to be collected into a tarball in $BUILD_DIR/SOURCES. + # Tar file name and version are derived from your .spec file and/or PKG-INFO file. Alternatively you may define TAR_NAME and VERSION in your 'build_srpm.data' file + + COPY_LIST="$STX_BASE/downloads/my_tar.tar.gz my_extra_files_dir my_script_dir/my_script" + # A Space separated list of paths to copy. In the build directory they will by copied into the $BUILD_DIR/SOURCES directory alongside any tarball you may have created via SRC_DIR. + + EXCLUDE_LIST_FROM_TAR=my_omit_dir my_script_dir/my_omit_script" + # Omit these paths under SRC_DIR from the tar + + TAR_NAME=nova + VERSION=1.1 + # The name and version of the package. Assuming SRC_DIR is specified, a tarball with the name "$TAR_NAME-$VERSION.tar.gz" will be created from from the contents of $SRC_DIR. + # NOTE: These values are pulled automatically from your .spec ("%global service" or "Name:" and "Version:") or PKG-INFO ("Name:" and "Version:"). You can override the automatic valuation by supplying your own values. + + COPY_LIST_TO_TAR=my_extra_files_dir my_script_dir/my_script" + # A Space separated list of paths to copy. These are added to the tarball itself. Try to avoid using this... we prefer that tarballs of 3rd party origin remain unaltered. + + TIS_BASE_SRCREV=9af04d8480da4359f766e59c45ac23f199b138b0 + # Last git commit prior to start of TC content + + TIS_PATCH_VER=GITREVCOUNT+3 + # Version is passed into .spec file as rpmmacro to modify package release string. + # Can contain 'GITREVCOUNT', the count of commits since TIS_BASE_SRCREV + + BUILD_IS_BIG=6 + # An estimate of the disk requirements in GB. This package won't build on a tmpfs based build environment small than this value. + # If a build fails on a tmpfs based node due to disk space exhaustion, then at minimum this value must be greater than the tpmfs size + # as seen in the "MOCKCHAIN_RESOURCE_ALLOCATION=0:10:10:5" log. + + BUILD_IS_SLOW5 + # An estimate of the build time on disk in minutes. + # A larger value will tell the build system to schedule this job sooner + # rather than later, to maximize parallelism. + +#. Create your own srpm build script. The goal of the script is to use the + rpmbuild tool to create one or more ``.src.rpm`` files in the ``$BUILD_DIR/SRPMS`` + directory. The directory itself will be created by rpmbuild. + + :: + + vi centos/build_srpm + + A sample build script might look like this: + + :: + + source "$SRC_BASE/build-tools/spec-utils" + + SRC_DIR=$STX_BASE/git/libvirt + + if [ -f PKG-INFO ]: then + VERSION=$(grep '^Version:' PKG-INFO | awk -F ': ' '{print $2}' | sed -e 's/^[[:space:]]*//') + TAR_NAME=$(grep '^Name:' PKG-INFO | awk -F ': ' '{print $2}' | sed -e 's/^[[:space:]]*//') + else + SPEC_PATH=$(ls $BUILD_DIR/SPECS/*.spec) + VERSION=$(spec_evaluate '%{version}' "$SPEC_PATH" 2>> /dev/null) + NAME=$(spec_evaluate '%{name} "$SPEC_PATH" 2>> /dev/null) + fi + + BUILD_DIR="$RPMBUILD_BASE" + EXTRA_FILES="libvirt-1.2.12/libvirt.logrotate " + EXTRA_FILES+="libvirt-1.2.12/libvirt.lxc " + EXTRA_FILES+="libvirt-1.2.12/libvirt.qemu " + EXTRA_FILES+="libvirt-1.2.12/libvirt.uml " + + mkdir -p $BUILD_DIR/SRPMS + + TAR="$TAR_NAME-$VERSION.tar.gz" + TAR_PATH="$BUILD_DIR/SOURCES/$TAR" + + TAR_NEEDED=0 + if [ -f $TAR_PATH ]; then + n=`find . -cnewer $TAR_PATH -and ! -path './.git*' \ + -and ! -path './build/*' \ + -and ! -path './.pc/*' \ + -and ! -path './patches/*' \ + -and ! -path './$DISTRO/*' \ + -and ! -path './pbr-*.egg/*' \ + | wc -l` + if [ $n -gt 0 ]; then + TAR_NEEDED=1 + fi + else + TAR_NEEDED=1 + fi + + if [ $TAR_NEEDED -gt 0 ]; then + tar czvf $TAR_PATH $EXTRA_FILES \ + -C $(dirname $SRC_DIR) $(basename $SRC_DIR) \ + --exclude '.git/' \ + --exclude '.git*' \ + --transform "s,^libvirt-1.2.12,extra," \ + --transform "s,^$(basename $SRC_DIR),$TAR_NAME-$VERSION," + fi + + + for SPEC in `ls $BUILD_DIR/SPECS`; do + SPEC_PATH="$BUILD_DIR/SPECS/$SPEC" + RELEASE=$(grep '^Release:' $SPEC_PATH | awk -F ': ' '{print $2}' | sed -e 's/^[[:space:]]*//') + NAME=`echo $SPEC | sed 's/.spec$//'` + SRPM="$NAME-$VERSION-$RELEASE.src.rpm" + SRPM_PATH="$BUILD_DIR/SRPMS/$SRPM" + + BUILD_NEEDED=0 + if [ -f $SRPM_PATH ]; then + n=`find . -cnewer $SRPM_PATH | wc -l` + if [ $n -gt 0 ]; then + BUILD_NEEDED=1 + fi + else + BUILD_NEEDED=1 + fi + + if [ $BUILD_NEEDED -gt 0 ]; then + rpmbuild -bs $SPEC_PATH --define="%_topdir $BUILD_DIR" + fi + done + +The idea is to tar up any source from git into a tarball into +``$BUILD_DIR/SOURCES`` and/or copy tarballs from a downloads directory. Copy any +supporting files into ``$BUILD_DIR/SOURCES`` also. Finally, use rpmbuild to +create a ``.src.rpm``. DO NOT try to compile the binary ``.rpm``. + +*************************** +Details for build-srpm.data +*************************** + +This section describes the contents of the ``build-srpm.data`` file, which +customizes the setup when you build :abbr:`SRPM (Source RPM)` files. + +**Pre-defined path variables** + +You may use any of the following: + +:: + + SRC_BASE # Usually the same as $MY_REPO + + STX_BASE # $MY_REPO/stx + + PKG_BASE # Base dir for the package. Listed in centos_pkg_dir. + # Directory in which CentOS directory is found. + + PATCHES_BASE # Directory where source patches for the package can be found, typically: $PKG_BASE/$DISTRO/patches + + FILE_BASE # Directory where supplemental files for the package can be found, typically: $PKG_BASE/$DISTRO/files + # Files that can be copied into $BUILD_DIR/SOURCES prior to assembling the .src.rpm + + CGCS_BASE # same as $STX_BASE, being phased out in favour of PKG_BASE + # May be removed in a future release, do not use. + +**User-defined variables** + +You may define any of the following variables: + +:: + + SRC_DIR=my_src_dir + # Tar everything found in this subdirectory. Define this if source need to be collected into a tarball in $BUILD_DIR/SOURCES. + # Tar file name and version are derived from your .spec file and/or PKG-INFO file. Alternatively you may define TAR_NAME and VERSION in your 'build_srpm.data' file + + COPY_LIST="$STX_BASE/downloads/my_tar.tar.gz my_extra_files_dir my_script_dir/my_script" + # A Space separated list of paths to copy. In the build directory they will by copied into the $BUILD_DIR/SOURCES directory alongside any tarball you may have created via SRC_DIR. + + EXCLUDE_LIST_FROM_TAR=my_omit_dir my_script_dir/my_omit_script" + # Omit these paths under SRC_DIR from the tar + + TAR_NAME=nova + VERSION=1.1 + # The name and version of the package. Assuming SRC_DIR is specified, a tarball with the name "$TAR_NAME-$VERSION.tar.gz" will be created from from the contents of $SRC_DIR. + # NOTE: These values are pulled automatically from your .spec ("%global service" or "Name:" and "Version:") or PKG-INFO ("Name:" and "Version:"). You can override the automatic valuation by supplying your own values. + + COPY_LIST_TO_TAR=my_extra_files_dir my_script_dir/my_script" + # A Space separated list of paths to copy. These are added to the tarball itself. Try to avoid using this... we prefer that tarballs of 3rd party origin remain unaltered. + + BUILD_IS_BIG=6 + # An estimate of the disk requirements in GB. This package won't build on a tmpfs based build environment small than this value. + # If a build fails on a tmpfs based node due to disk space exhaustion, then at minimum this value must be greater than the tpmfs size + # as seen in the "MOCKCHAIN_RESOURCE_ALLOCATION=0:10:10:5" log. + + BUILD_IS_SLOW=5 + # An estimate of the build time on disk in minutes. + # A larger value will tell the build system to schedule this job sooner rather than later, to maximize parallelism. + + TIS_PATCH_VER= + # An integer, or one of the supported + # variables listed below, or the sum of + # variables and integers. + # e.g. + # TIS_PATCH_VER=PKG_GITREVCOUNT+SRC_GITREVCOUNT+5 + + PKG_GITREVCOUNT # Count git revisions relative to PKG_BASE. + # Optionally only count from PKG_BASE_SRCREV + + SRC_GITREVCOUNT # Count git revisions relative to SRC_DIR. + # Optionally only count from SRC_BASE_SRCREV + + GITREVCOUNT # Deprecated, please use SRC_GITREVCOUNT instead. + # Count git revisions relative to SRC_DIR. + # Optionally only count from TIS_BASE_SRCREV + + OTHER_GITREVCOUNT # count git revisions from all sources excluding + # PKG_BASE and SRC_DIR + # Optionally only count from + # BASE_SRCREV_FOR_PATH[] + + PKG_BASE_SRCREV= # Limit PKG_GITREVCOUNT revision count to + # commits since + + SRC_BASE_SRCREV= # Limit SRC_GITREVCOUNT revision count to + # commits since + + TIS_BASE_SRCREV= # Deprecated, please use SRC_BASE_SRCREV + # instead + # Limit GITREVCOUNT revision count to commits + # since + + BASE_SRCREV_FOR_PATH[]=[|OTHER_PKG_BASE_SRCREV] + # Limit OTHER_GITREVCOUNT revision count for + # commits under to commits since . + # If is the PKG_BASE of another package + # (not the current package) then the keyword + # 'OTHER_PKG_BASE_SRCREV' can be used to extract + # the 'PKG_BASE_SRCREV' value of the other + # package. + # + # The can reference variables like + # $STX_BASE and $GIT_BASE. + + OPT_DEP_LIST= # Add a space separated list of paths that + # don't contribute to the content of a src.rpm + # but do contribute to triggering a rebuild, + # and possibly modifying the TIS_PATCH_VER via + # use of OTHER_GITREVCOUNT. + + OPT_DEP_LIST_FOR_BUILD_TYPE[]= + # For a specific build type only, add a space + # separated list of paths that don't + # contribute to the content of src.rpm, + # but do contribute to triggering a + # rebuild, and possibly modifying the + # TIS_PATCH_VER via use of OTHER_GITREVCOUNT. + + +************************************* +Add your package to package list file +************************************* + +The file name is ``centos_pkg_dirs``. There is a separate package list file for +each git repo. When adding your package, use the relative path from the root of +the git to the desired ``PKG_BASE``. + +Using ``package libvirt`` as an example: + +* Spec file: ``$MY_REPO/stx/integ/virt/libvirt/centos/libvirt.spec`` + +* ``PKG_BASE``: ``%BLUE%$MY_REPO/stx%ENDCOLOR%/%RED%integ/virt/libvirt%ENDCOLOR%`` + +* Root of its git tree: ``$MY_REPO/stx`` + +* ``centos_pkg_dirs`` file: ``%BLUE%$MY_REPO/stx%ENDCOLOR%/centos_pkg_dirs`` + +The new entry needs to be: ``%RED%integ/virt/libvirt%ENDCOLOR% +echo "virt/libvirt" >> "$MY_REPO/stx/integ/centos_pkg_dirs"`` + +****************** +Build your package +****************** + +Complete instructions can be found in the +:ref:`Create StarlingX packages section of the Build Guide `. + +:: + + build-rpms fm-common + +******************* +Commit your changes +******************* + +:: + + git add centos/files/* + git add centos/fm-common.spec + git add centos/build_srpm* + + # If you added PKG-INFO + git add PKG-INFO + + git add sources/Makefile + git commit + +-------------------------- +Package without a makefile +-------------------------- + +In this case, the process is generally similar to the above instructions, but +the ``%build`` section has alternative commands or may be omitted altogether. +The install phase is done directly in the RPM spec file. + +For example, the ``collector`` package has no makefile. Its spec file is at +``stx/utilities/tools/collector/centos/collector.spec``. There is no "build" +phase, because the files are scripts. However, the files must be unpacked and +installed into the appropriate locations. The relevant bits look like this: + +:: + + Source0: %{name}-%{version}.tar.gz + + %prep + %setup + + %install + mkdir -p %{buildroot} + + install -d 755 -d %{buildroot}%{_sysconfdir}/collect.d + install -d 755 -d %{buildroot}%{_sysconfdir}/collect + install -d 755 -d %{buildroot}/usr/local/sbin + install -d 755 -d %{buildroot}/usr/local/bin + install -d 755 -d %{buildroot}%{_sbindir} + + install -m 755 collect %{buildroot}/usr/local/sbin/collect + install -m 755 collect_host %{buildroot}/usr/local/sbin/collect_host + install -m 755 collect_date %{buildroot}/usr/local/sbin/collect_date + install -m 755 collect_utils %{buildroot}/usr/local/sbin/collect_utils + install -m 755 collect_parms %{buildroot}/usr/local/sbin/collect_parms + install -m 755 collect_mask_passwords %{buildroot}/usr/local/sbin/collect_mask_passwords + install -m 755 expect_done %{buildroot}/usr/local/sbin/expect_done + + install -m 755 collect_sysinv.sh %{buildroot}%{_sysconfdir}/collect.d/collect_sysinv + install -m 755 collect_psqldb.sh %{buildroot}%{_sysconfdir}/collect.d/collect_psqldb + install -m 755 collect_openstack.sh %{buildroot}%{_sysconfdir}/collect.d/collect_openstack + install -m 755 collect_networking.sh %{buildroot}%{_sysconfdir}/collect.d/collect_networking + install -m 755 collect_ceph.sh %{buildroot}%{_sysconfdir}/collect.d/collect_ceph + install -m 755 collect_sm.sh %{buildroot}%{_sysconfdir}/collect.d/collect_sm + install -m 755 collect_tc.sh %{buildroot}%{_sysconfdir}/collect.d/collect_tc + install -m 755 collect_nfv_vim.sh %{buildroot}%{_sysconfdir}/collect.d/collect_nfv_vim + install -m 755 collect_ovs.sh %{buildroot}%{_sysconfdir}/collect.d/collect_ovs + install -m 755 collect_patching.sh %{buildroot}%{_sysconfdir}/collect.d/collect_patching + install -m 755 collect_coredump.sh %{buildroot}%{_sysconfdir}/collect.d/collect_coredump + install -m 755 collect_crash.sh %{buildroot}%{_sysconfdir}/collect.d/collect_crash + install -m 755 collect_ima.sh %{buildroot}%{_sysconfdir}/collect.d/collect_ima + install -m 755 collect_fm.sh %{buildroot}%{_sysconfdir}/collect.d/collect_fm + install -m 755 collect_containerization.sh %{buildroot}%{_sysconfdir}/collect.d/collect_containerization + install -m 755 collect_dc.sh %{buildroot}%{_sysconfdir}/collect.d/collect_dc + + install -m 755 etc.exclude %{buildroot}%{_sysconfdir}/collect/etc.exclude + install -m 755 run.exclude %{buildroot}%{_sysconfdir}/collect/run.exclude + + ln -sf /usr/local/sbin/collect %{buildroot}/usr/local/bin/collect + ln -sf /usr/local/sbin/collect %{buildroot}%{_sbindir}/collect + +Either the ``setup`` or ``autosetup`` macro can be used to unpack the Source0 +tarball in ``%{_builddir}``. Next, a number of files are explicitly installed +into ``%{buildroot}``. Most of these come from the unpacked tarball. One file +comes from the original source directory, since it wasn't moved over to +``%{_builddir}`` in the prep phase. All the other sections in the spec file are +treated the same way as the above package. + +----------------------------- +OpenStack and Python packages +----------------------------- + +These packages are similar to the above as far as requirements, dependencies, +etc. The build phase is a bit different since there is no compilation step +involved. + +:: + + Source0: %{name}-%{version}.tar.gz + + %prep + %setup -q + + %build + %{__python2} setup.py build + + %install + %{__python2} setup.py install -O1 --skip-build --root %{buildroot} + + mkdir -p %{buildroot}%{_sysconfdir}/bash_completion.d + install -pm 644 tools/nova.bash_completion \ + %{buildroot}%{_sysconfdir}/bash_completion.d/nova + +In this case, the ``setup`` macro unpacks the Source0 tarball in the prep +phase. Next the ``setup.py`` that is part of the Python package handles +the actual process of building and installing the Python code. During the +install phase, a separate file is installed which isn't handled by the Python +installer. + +.. _centos_pkg: + +------------------------------------ +CentOS package with appended patches +------------------------------------ + +This example uses the ``parted`` package from CentOS and appends a few +patches of our own. + +#. Assuming this package has never been modified by StarlingX previously, find + a home for the package. This example uses + ``$MY_REPO/stx/integ/filesystem/parted``. + + :: + + MY_GIT_ROOT=$MY_REPO/stx/integ + MY_PKG_ROOT=$MY_GIT_ROOT/filesystem/parted + mkdir -p $MY_PKG_ROOT + cd $MY_PKG_ROOT + + # You must also add the new package directory to your local centos_pkg_dirs file if not already present + echo filesystem/parted >> $MY_GIT_ROOT/centos_pkg_dirs + +#. Create a directory skeleton. The ``patches`` directory contains patches + applied to the tarball inside the ``src.rpm``. The ``meta_patches`` + directory contains patches applied to the rpmbuild directory of the + ``.src.rpm`` and are used to modify the ``SPECS/*.spec`` file, or + the ``SOURCES/*`` files. + + :: + + mkdir -p centos/meta_patches + mkdir -p centos/patches + touch centos/meta_patches/PATCH_ORDER + echo TIS_PATCH_VER=1 > centos/build_srpm.data + +#. Tell ``build-srpms`` where to find the ``src.rpm`` in the ``srpm_path`` + file. Two locations are supported for source RPMS: the + ``$MY_REPO/cgcs-centos-repo`` directory is for source RPMS provided by + CentOS. Tell the build system to search for a source RPM using + the ``mirror:`` prefix when you specify the path to the source RPM. + + :: + + find -L $MY_REPO/cgcs-centos-repo/ -name 'parted*.src.rpm' + /localdisk//designer/test/cgcs-root/cgcs-centos-repo/Source/parted-3.1-23.el7.src.rpm + + echo "mirror:Source/parted-3.1-23.el7.src.rpm" > centos/srpm_path + + The other location supported by ``build-srpms`` is the downloads subgit of + your layers (found in ``$MY_REPO/stx/downloads`` for CGCS, for example). + This should be used for packages that CentOS does not provide. In this case, + place the source RPM you downloaded in the directory, and use the ``repo:`` + prefix when creating your ``srpm_path`` file. The base path for ``repo:`` + is ``$MY_REPO``, so specify paths from that point. + + :: + + cp ~/Downloads/somepackage-1.2-3.src.rpm $MY_REPO/stx/downloads + echo "repo:stx/downloads/somepackage-1.2-3.src.rpm" > centos/srpm_path + +#. (Optional) Set up a git environment to create your patch. The SRPM will be + extracted, then the source tarball will be extracted and patched. + + :: + + # clean any prior edit environment that might exist + # + build-srpms --edit --clean parted + + # + # Create a working edit environment + # + build-srpms --edit parted + ... + ===== 'parted' has been extracted to for editing. ===== + ===== Metadata can be found at: /localdisk/loadbuild//test/std/srpm_work/parted/rpmbuild + ===== Source code can be found at: /localdisk/loadbuild//test/std/srpm_work/parted/gits/parted.spec/parted-3.1 + + # + # Create you patch + # + cd $MY_WORKSPACE/std/srpm_work/parted/gits/parted.spec/parted-3.1 + + edit + + # create a patch + git add + git commit -m 'foo bar' + git format-patch -n HEAD^ + 0001-foo-bar.patch + + # Copy it to the repo... probabbly best to drop the missleading 0001 prefix + mv 0001-foo-bar.patch $MY_PKG_ROOT/centos/patches/foo-bar.patch + + # undo the commit, if patch failed testing and needs more work + git reset --soft HEAD~ + + # + # Now create a meta_patch to add your patch to the spec file + # + cd $MY_WORKSPACE/std/srpm_work/parted/rpmbuild + + # modify Release to include tis patch version, add our patch to the end of the patch list + vi SPECS/parted.spec + .... + Release: 23.el7%{?_tis_dist}.%{tis_patch_ver} + .... + Patch34: 0034-tests-Use-wait_for_dev_to_-functions.patch + + # WRS + Patch35: syscalls.patch + Patch36: foo-bar.patch + ... + # if the %prep/%setup section does not use 'git am %{patches}' which automatically applies all patches, + # then it should contain a list of %patch macros (one per patch) and you will have to append your patch to the end of the list. + # %patch macros are basically just invocations of the 'patch' command to apply your patches. e.g. like this + %patch35 -p1 + %patch36 -p1 + + + git add SPECS/parted.spec + + # Optionally edit and add files in SOURCES/ + git commit -m 'meta foo bar' + git format-patch -n HEAD^ + 0001-meta-foo-bar.patch + + # Copy it to the repo... probabbly best to drop the missleading 0001 prefix + mv 0001-meta-foo-bar.patch $MY_PKG_ROOT/centos/meta_patches/meta-foo-bar.patch + + # undo the commit, if patch failed testing and needs more work + git reset --soft HEAD~ + + # + # Finally add the meta patch to the patch order file... so that the patches vs the spec file apply in the correct order + # + echo meta-foo-bar.patch >> $MY_PKG_ROOT/centos/meta_patches/PATCH_ORDER + +#. (Optional) Create a ``build_srpm.data`` file and add a ``COPY_LIST`` which + identifies additional files to copy into SOURCES before finalizing the srpm. + + :: + + vi $MY_PKG_ROOT/centos/build_srpm.data + COPY_LIST="files/resizepart.sh" + + + .. note:: + + The order is SRPM extracted first, then copy ``centos/patches/*`` + into SOURCES, then apply meta patches, then copy anything named in + ``COPY_LIST`` into SOURCES. ``COPY_LIST`` items are not available + for meta patching. Just edit them directly. + +#. Build the final ``src.rpm`` with your new changes inserted. + + :: + + build-srpms --clean parted + build-srpms parted + + +#. Build the rpm. + + :: + + build-rpms --clean parted + build-rpms parted + Verify contents of rpm: + build-rpms --no-descendants parted + cd $MY_WORKSPACE/rpmbuild + mkdir TMP; cd TMP + rpm2cpio parted-3.1-23.el7.tis.1.x86_64.rpm | cpio -ivmd + +#. Test. If it fails, go back to step 4. + +#. Commit. + + :: + + cd $MY_PKG_ROOT + git add meta_patches/PATCH_ORDER meta_patches/meta-foo-bar.patch patches/foo-bar.patch + # add these as required + git add centos/srpm_path + git add centos/build_srpm.data + git commit -F + ... rebase/push... + +#. Discard the working directory and its temporary gits created in step 4. + + :: + + build-srpms --clean --edit parted + +------------------------------------------------- +Up-version a CentOS package with appended patches +------------------------------------------------- + +Suppose you have a patched srpm ``resource-agents-3.9.5-54.el7_2.8.src.rpm`` and +you want to migrate to a newer srpm, for example, +``resource-agents-3.9.5-54.el7_2.8.src.rpm``. + +First question: How do I know if there is a newer version available? If the +local CentOS mirror has been updated, you can scan it for new srpms that have +local WRS patches using: + +:: + + find_patched_srpms_needing_upgrade + /localdisk/designer//test/cgcs-root/stx/recipes-cgl/cluster-resource-agents/centos/srpm_path: resource-agents-3.9.5-54.el7_2.8.src.rpm ==> resource-agents-3.9.5-54.el7_2.9.src.rpm + +This tells you that there are patches for +``resource-agents-3.9.5-54.el7_2.8.src.rpm``, but a newer version is available +(``resource-agents-3.9.5-54.el7_2.9.src.rpm``). You should probably migrate the +patches to the new ``resource-agents-3.9.5-54.el7_2.9.src.rpm``. No output +means no migrations are required at this time. + +#. Check out the old version with our patches. + + :: + + build-srpms resource-agents --edit --clean + build-srpms resource-agents --edit + +#. Point the ``srpm_path`` at the new source rpm. + + + :: + + vi $MY_REPO/cgcs-root/stx/recipes-cgl/cluster-resource-agents/centos/srpm_path + mirror:CentOS/vault.centos.org/7.2.1511/updates/Source/SPackages/resource-agents-3.9.5-54.el7_2.9.src.rpm + +#. Check out the new version without our patches. + + :: + + build-srpms resource-agents --edit --no-meta-patch + ... + ===== 'resource-agents' has been extracted for editing. ===== + ===== Metedata can be found at: /localdisk/loadbuild//test/std/srpm_work/resource-agents/rpmbuild + ===== Source code can be found at: /localdisk/loadbuild//teststd//srpm_work/resource-agents/gits/resource-agents.spec/ClusterLabs-resource-agents-5434e96 + +#. You now have two directories, each a git tree with two branches, one based + on the old srpm, one on the new srpm. + + :: + + cd $MY_WORKSPACE/std/srpm_work/resource-agents/rpmbuild + + git branch --all + master + resource-agents-3.9.5-54.el7_2.8 + * resource-agents-3.9.5-54.el7_2.9 + + cd $MY_WORKSPACE/std/srpm_work/resource-agents/gits/resource-agents.spec/ClusterLabs-resource-agents-5434e96 + git branch --all + master + resource-agents-3.9.5-54.el7_2.8 + * resource-agents-3.9.5-54.el7_2.9 + +#. Show the commit histories of the two branches to identify the work to do. + + :: + + cd $MY_WORKSPACE/std/srpm_work/resource-agents/gits/resource-agents.spec/ClusterLabs-resource-agents-5434e96 + + git log resource-agents-3.9.5-54.el7_2.8 --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ci) %C(bold blue)<%an>%Creset' --abbrev-commit + * be18338 - (HEAD, resource-agents-3.9.5-54.el7_2.8) WRS: Patch99: exportfs_accept_ipv6.patch (2016-04-29 01:11:03 -0400) + * 70308b7 - WRS: Patch98: pgsql.patch (2016-04-29 01:11:02 -0400) + * 802a93a - WRS: Patch97: lvm_vg_activation.patch (2016-04-29 01:11:00 -0400) + * 96acac3 - WRS: Patch96: umount-in-namespace.patch (2016-04-29 01:11:00 -0400) + * 24b1bb1 - WRS: Patch95: copyright.patch (2016-04-29 01:10:59 -0400) + * cb5c3a9 - WRS: Patch94: ipaddr2_check_if_state.patch (2016-04-29 01:10:58 -0400) + * 600cda6 - WRS: Patch93: new_ocf_return_codes.patch (2016-04-29 01:10:57 -0400) + * 5f40f0b - WRS: Patch92: filesystem_rmon.patch (2016-04-29 01:10:56 -0400) + * facf036 - (tag: pre_wrs_resource-agents-3.9.5-54.el7_2.8) Patch91: bz1316633-backup-and-restore-rabbitmq-users-during-resource-re.patch (2016-04-29 01:10:32 -0400) + * 48cbdac - Patch90: bz1311180-rabbitmq-cluster-forget-stopped-cluster-nodes.patch (2016-04-29 01:10:31 -0400) + + + git log resource-agents-3.9.5-54.el7_2.9 --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ci) %C(bold blue)<%an>%Creset' --abbrev-commit + * 746eb3d - (HEAD, tag: pre_wrs_resource-agents-3.9.5-54.el7_2.9, resource-agents-3.9.5-54.el7_2.9) Patch94: bz1318744-galera-no-grastate.patch (2016-04-29 01:12:16 -0400) + * f6fc3f0 - Patch93: bz1318744-galera-heuristic-recovered.patch (2016-04-29 01:12:15 -0400) + * dc76b27 - Patch92: bz1318744-galera-crash-recovery.patch (2016-04-29 01:12:14 -0400) + * facf036 - (tag: pre_wrs_resource-agents-3.9.5-54.el7_2.8) Patch91: bz1316633-backup-and-restore-rabbitmq-users-during-resource-re.patch (2016-04-29 01:10:32 -0400) + * 48cbdac - Patch90: bz1311180-rabbitmq-cluster-forget-stopped-cluster-nodes.patch (2016-04-29 01:10:31 -0400) + + The image below shows the color-coded results of the comparison. + + * The patches in green with ``WRS:`` in the patch name must be + ported. + + * The commit in orange noted with ``tag:`` was the last common commit. + + * The patches in blue are new patches from upstream that may interfere with + our patches. + + +.. figure:: figures/pkging_patch_comp.png + :scale: 55% + :alt: Patch comparison + + *Figure 1: Patch comparison* + + +-------------------------------- +Package providing an init script +-------------------------------- + +The packages/recipes that provide an init script (found under ``/etc/init.d/`` +and corresponding ``/etc/rc.d/``) must be converted to systemd services. +Within STX there are two kinds of services: + +* Services that must be started on boot. + +* Services that are monitored by pmond (and automatically restarted in case of + failure). In this case, we don't want systemd to restart a process in case + of failure. + +The general idea about converting those services is to still keep the script +file installed under ``/etc/init.d/`` in the short term and wrap it in a +systemd service. This is needed so that service dependencies can be evaluated by +systemd and start them in the right sequence on boot. Re-using the same init +script at the moment is more convenient for supporting the same code base for +wrlinux and CentOS packaging (no need to support multiple version of the same +script). + +Given an example init script ``/etc/init.d/helloworld``, create a corresponding +``helloworld.service`` file: + +:: + + [Unit] + Description=Helloworld service + + # Configures requirement dependencies on other services. If this service gets activated, the + # services listed here will be activated as well. If one of the other services gets deactivated or + # its activation fails, this service will be deactivated. + Requires= + + # A weaker version of Requires. Services listed in this option will be started if the configuring + # unit is. However, if the listed services fail to start, this has no impact on the current service. + Wants= + + # The next two directives are important for specifying the services dependancies. This will indicate + # to systemd in which order services should be started. This does not imply a dependency + # relationship ('Requires' or 'Wants') and must be used in conjunction with one of the above + # directives if this is desired. + + # The services listed in this directive will be started before starting the current service. + After=syslog.target network.target + + # The services listed in this directive will not be started until the current service is marked as + # started if they are activated at the same time. + Before= + + [Service] + # Usual types are 'oneshot', 'simple' and 'forking'. + # oneshot: The process is not a daemon running in the background. Systemd will wait that the process + # exit before continuing. + # simple: Systemd will fork the process. + # forking: The process will call fork(). It is recommended to use 'PIDfile' in this case so that + # systemd can identify the process. + Type=oneshot + + # Commands with their arguments that are executed when this service is started + ExecStart=/etc/init.d/helloworld start + + # Additional commands that are executed before command in ExecStart + ExecStartPre= + + # Additional commands that are executed after command in ExecStart + ExecStartPost= + + # Commands to execute to stop the service + ExecStop=/etc/init.d/helloworld stop + + # Additional commands that are executed after the service is stopped + ExecStopPost= + + # Commands to execute to trigger a configuration reload in the service + ExecReload= + + # Only useful when 'Type' is 'forking'. PID file is important if the process is monitored by pmond. + PIDFile=/var/run/helloworld.pid + + # Configures whether the service shall be restarted when the service process exits. + # Should be 'always' is systemd should monitor the process. + # Should be 'no' (default) if process is monitored by pmond. + Restart= + + [Install] + # This enables to service to be started on boot. It is equivalent of init runlevel (see below for equivalence). This + # means that the current service will be started when the listed unit is started. All the other services that are + # also dependent on this target will also get started, the order will depends on the 'After' and 'Before' options + # specified above. + WantedBy=multi-user.target + +Once the systemd service file is defined, it needs to be packaged in the rpm. +The ``helloworld.service`` file must be installed in the ``/etc/systemd/system/`` +directory (recommended for STX services) by the rpm spec. It's important to set +file permissions to 664. The systemd services must be enabled on install +and disabled on uninstalled. This is achieved by using the systemd command +systemctl enable (and disable). However, it is recommended to use the macros +already defined by rpm. For example: + +:: + + %install + install -d -m 755 %{buildroot}/etc/systemd/system/ + install -p -D -m 664 helloworld.service %{buildroot}/etc/systemd/system/helloworld.service + + # Enable the service and start it. + %post + %systemd_post helloworld.service + + # Disable the service and stop it. + %preun + %systemd_preun helloworld.service + + # Try to restart the service. Usefull on upgrades. + %postun + %systemd_postun_with_restart helloworld.service + +Systemd searches these directories for services (in order of precedence, the +first item has higher precedence than the one following): + +* ``/etc/systemd/system/`` Recommended and reserved location for system + administrator customized services +* ``/run/systemd/system/`` Mainly used by CentOS. Don't pollute this + directory. +* ``/usr/lib/systemd/system/`` + +CentOS is distributed with a number of predefined targets that are more or less +similar to the standard set of runlevels. Use the following comparison table for +specifying your WantedBy target. + +* runlevel0.target -> poweroff.target +* runlevel1.target -> rescue.target +* runlevel2.target -> multi-user.target +* runlevel3.target -> multi-user.target +* runlevel4.target -> multi-user.target +* runlevel5.target -> graphical.target +* runlevel6.target -> reboot.target + +Convert to systemd service (without intermediate init script): + +* The exact PID file name that is used by pmond can be found by looking on an + installed system under ``/etc/pmon.d/``. Look for ``pidfile=`` in the + corresponding pmond configuration file for the service. + +* Some of the init scripts are using start-stop-daemon to manage processes. + The start-stop-package has been ported to CentOS (it is not supported by + CentOS). Make sure the init script is providing the right ``--pidfile`` + argument that matches the pmond service configuration. A process that is + started by start-stop-daemon with the ``--daemon`` or ``-d`` options + indicates that the processes will be forked, in which case the systemd + service Type should be forking. Else if the script or process doesn't fork, + the Type should be simple which will tell systemd to fork it. + +* Hints for defining service startup order (Before and After): + + * Systemd determines when a service should start using the ``After=`` + and ``Before=`` values found in the ``[Unit]`` section of the ``service`` + file. These values take a space-separated list of other services or + *targets*, where a target is effectively a collection of services. For + example, the log management service has the following values: + + :: + + [Unit] + Description=StarlingX Log Management + After=network.target syslog-ng.service iscsid.service sw-patch.service + Before=config.service pmon.service + + In this example, the log management service can't start until software + is patched, and a network, a disk and the syslog-ng service are all up + and running. + + * The init script might contain some specific information about the order. + Look for Required-Start and Required-Stop in it. + +Troubleshooting (at runtime): + +* Enable a service: ``systemctl enable`` +* Disable a service: ``systemctl disable`` +* Start a service: ``systemctl start`` +* Stop a service: ``systemctl stop`` +* Get service status: ``systemctl status`` +* Get list of running units ordered by time to init: ``systemd-analyze blame`` +* Show systemd logging: ``journalctl /usr/lib/systemd/systemd`` +* Show logging of a specific service: ``journalctl _SYSTEMD_UNIT=`` + +-------------------------------- +After you've converted a package +-------------------------------- + +Each repo has a ``centos_iso_image.inc`` file, which contains the list of +packages to be included in the installation iso relevant to the repo. The +``build-iso`` step merges the individual ``centos_iso_image.inc`` files to +generate the complete list. +