Pages

Tuesday, July 31, 2018

Solaris 11: High-Level Steps to Create an IPS Package

Keywords: Solaris package IPS+Repository pkg


1Work on Directory Structure


Start with organizing the package contents (files) into the same directory structure that you want on the installed system.

In the following example the directory was organized in such a manner that when the package was installed, it results in software being copied to /opt/myutils directory.

eg.,

# tree opt

opt
`-- myutils
    |-- docs
    |   |-- README.txt
    |   `-- util_description.html
    |-- mylib.py
    |-- util1.sh
    |-- util2.sh
    `-- util3.sh

Create a directory to hold the software in the desired layout. Let us call this "workingdir", and this directory will be specified in subsequent steps to generate the package manifest and finally the package itself. Move the top level software directory to the "workingdir".

# mkdir workingdir
# mv opt workingdir

# tree -fai workingdir/
workingdir
workingdir/opt
workingdir/opt/myutils
workingdir/opt/myutils/docs
workingdir/opt/myutils/docs/README.txt
workingdir/opt/myutils/docs/util_description.html
workingdir/opt/myutils/mylib.py
workingdir/opt/myutils/util1.sh
workingdir/opt/myutils/util2.sh
workingdir/opt/myutils/util3.sh

2Generate Package Manifest


Package manifest provides metadata such as package name, description, version, classification & category along with the files and directories included, and the dependencies, if any, need to be installed for the target package.

The manifest for an existing package can be examined with the help of pkg contents subcommand.

pkgsend generate command generates the manifest. It takes "workingdir" as input. Piping the output through pkgfmt makes the manifest readable.

# pkgsend generate workingdir | pkgfmt > myutilspkg.p5m.1

# cat myutilspkg.p5m.1


3Add Metadata to Package Manifest


Note that the package manifest is currently missing attributes such as name and description (metadata). Those attributes can be added directly to the generated manifest. However the recommended approach is to rely on pkgmogrify utility to make changes to an existing manifest.

Create a text file with the missing package attributes.

eg.,
# cat mypkg_attr
set name=pkg.fmri value=myutils@3.0,5.11-0
set name=pkg.summary value="Utilities package"
set name=pkg.description value="Utilities package"
set name=variant.arch value=sparc
set name=variant.opensolaris.zone value=global

set name=variant.opensolaris.zone value=global action restricts the package installation to global zone. To make the package installable in both global and non-global zones, either specify set name=variant.opensolaris.zone value=global value=nonglobal action in the package manifest, or do not have any references to variant.opensolaris.zone variant at all in the manifest.

Now merge the metadata with the manifest generated in previous step.

# pkgmogrify myutilspkg.p5m.1 mypkg_attr | pkgfmt > myutilspkg.p5m.2

# cat myutilspkg.p5m.2


4Evaluate & Generate Dependencies


Generate the dependencies so they will be part of the manifest. It is recommended to rely on pkgdepend utility for this task rather than declaring depend actions manually to minimize inaccuracies.

eg.,
# pkgdepend generate -md workingdir myutilspkg.p5m.2 | pkgfmt > myutilspkg.p5m.3

At this point, ensure that the manifest has all the dependencies listed. If not, declare the missing dependencies manually.


5Resolve Package Dependencies


This step might take a while to complete.

eg.,
# pkgdepend resolve -m myutilspkg.p5m.3

6Verify the Package


By this time the package manifest should pretty much be complete. Check and validate it manually or using pkglint utility (recommended) for consistency and any possible errors.

# pkglint myutilspkg.p5m.3.res

7Publish the Package


For the purpose of demonstration let's go with the simplest option to publish the package, local file-based repository.

Create the local file based repository using pkgrepo command, and set the default publisher for the newly created repository.

# pkgrepo create my-repository
# pkgrepo -s my-repository set publisher/prefix=mypublisher

Finally publish the target package with the help of pkgsend command.

# pkgsend -s my-repository publish -d workingdir myutilspkg.p5m.3.res
pkg://mypublisher/myutils@3.0,5.11-0:20180704T014157Z
PUBLISHED

# pkgrepo info -s my-repository
PUBLISHER   PACKAGES STATUS           UPDATED
mypublisher 1        online           2018-07-04T01:41:57.414014Z

8Validate the Package


Finally validate whether the published package has been packaged properly by test installing it.

# pkg set-publisher -p my-repository
# pkg publisher
# pkg install myutils

# pkg info myutils
             Name: myutils
          Summary: Utilities package
      Description: Utilities package
            State: Installed
        Publisher: mypublisher
          Version: 3.0
    Build Release: 5.11
           Branch: 0
   Packaging Date: Wed Jul 04 01:41:57 2018
Last Install Time: Wed Jul 04 01:45:05 2018
             Size: 49.00 B
             FMRI: pkg://mypublisher/myutils@3.0,5.11-0:20180704T014157Z

No comments:

Post a Comment