Scripts

RPM allows to run scripts at various points.

Also see * https://fedoraproject.org/wiki/Packaging:Scriptlets * http://www.rpm.org/max-rpm/s1-rpm-specref-scripts.html#S2-RPM-SPECREF-INSTALL-ERASE-SCRIPTS

Script types

The RPM builder current does support the following script types of RPM:

Type Tag Spec Name Description
Before Transaction <beforeTransaction> %pretrans Run before the transaction
Before Installation <beforeInstallation> %pre Run before the installation of the package
After Installation <afterInstallation> %post Run after the installation of the package
Before Removal <beforeRemoval> %preun Run before the removal of the package
After Removal <afterRemoval> %postun Run after the removal of the package
After Transaction <afterTransaction> %posttrans Run after the transaction

Please note that RPM has a few things you might not expected from your scripts. For example is it possible to have multiple RPMs with the same package name, but different versions, installed. This will still call your “After removal” script, even when there is still one or more other versions of your package left. Please consult the RPM documentation for more information about scripts.

There are also a couple triggers, which are currently not supported by the RPM builder.

**Note: ** In the following examples <script> will be used to represent any script type.

Basic configuration

Scripts are configured using the normal plugin configuration:

<configuration>
  …
    <beforeInstallation>…</beforeInstallation>
    …
    <defaultInterpreter>…</defaultInterpreter> <!-- optional -->
  …
</configuration>

All scripts share the same configuration:

<script>
   <interpreter>/bin/bash</interpreter> <!-- optional interpreter -->
   
   <!-- either one of the following -->
   <script>echo "foo bar"</script> <!-- direct script content -->
   <file>src/main/resources/someScript.sh</file> <!-- script content from file -->
</script>

It is also possible to use a quicker variant with inline script content:

<script>
   echo "foo bar"
</script>

Scripts can either be provided as plain text from inside the Maven configuration or can be read from a file. Specifying both elements (<script> and <file>) is unsupported.

The <interpreter> elements specifies the script interpreter to use. If it is left out, then the RPM builder will peek into the first line of the script in try to evaluate the script from the #! marker. (#!/bin/bash will result in /bin/bash).

The <beforeTransaction> element can not have have dependencies and so must be written in Lua to avoid issues with kickstarting a system. RPM builder will not verify or ensure this and uses its above logic to determine the interpreter, so be sure to specify it.

If this fails, then the value of the <defaultInterpreter> element from the main configuration is used, which defaults to /bin/sh.

Remarks

The RPM builder currently does not support triggers.

If using inline scripts, then the XML formatting might add a few extra whitespaces to your inline script content. Depending on the script language this may be problem. It is possible to use the <![CDATA[…]]> element to work around this. Alternatively you can also use the external file mechanism. However due to the fact that the RPM builder does not know about the different script languages it does not trim, strip or clean up scripts in any way.