Diff for "Packaging/SourceBuilds/Recipes"

Not logged in - Log In / Register

Differences between revisions 4 and 5
Revision 4 as of 2010-09-23 18:48:24
Size: 5438
Editor: CPE001e6b233d5b-CM001e6b233d5a
Comment: Use revno in examples to recommend its use.
Revision 5 as of 2011-03-24 11:52:25
Size: 6956
Editor: host217-44-165-42
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
~-[[FrontPage|Launchpad Help]] > [[Packaging]] > [[Packaging/SourceBuilds|Daily builds]] > Recipes -~
Line 2: Line 4:

Line 4: Line 8:
= General information =
A bzr-builder "recipe" is a description of the steps needed to construct a package from the various bzr branches. Its format specifies
 * where to use the code from (trunk branch, beta branch, etc.), where to get the packaging from (separate branch? ubuntu branch?)
 * the correct package version (so users will still be able to upgrade to the stable version of the distro once it gets released)
 * what to modify to make the source build properly
= Overview =

A bzr-builder "recipe" is a description of the steps needed to construct a package from a set of Bazaar branches. Its format specifies:

 * Which branch to use for the source code: trunk branch, beta branch, etc.
 * Which branch to use for the packaging information: separate branch, Ubuntu branch, etc.
 * The correct package version (so people can still upgrade to the new stable version when it's released.
 * What to modify to make the source build properly.
Line 12: Line 19:
The start of the file always looks similar to {{{ Recipes have a simple format.

'''Note:''' you can find a typical example in the [[Packaging/SourceBuilds/GettingStarted|getting started]] guide.

They always start with a line similar to this:

{{{
Line 16: Line 29:
The `# bzr-builder format 0.2` is the same for each, and just specifies the version of the format in use. The current format is `0.2`, and is increased as the format changes. Let's take a look at this in more detail:
Line 18: Line 31:
`deb-version 1.0+{revno}` specifies the version to use for the generated package. `{revno}` here is a substitution variable; more information on those will be given later.  * ```# bzr-builder format 0.2``` specifies which recipe format we're using. The current format is 0.2.
 * ```deb-version 1.0+{revno}``` specifies the version to give the package we're building. ```{revno}``` is a substitution variable; more on which later.
 
== Specifying the branches ==
 
The next line of a recipe specifies which branch to base the package on:
Line 20: Line 38:
The next line specifies the branch to base the package on: {{{ {{{
Line 24: Line 42:
This says that we will use the trunk of the `bzr` project. This says that we will use the trunk of the ```bzr``` project in Launchpad. This could just as easily be any other branch in Launchpad, using the short format that you can find on any branch overview page.
Line 26: Line 44:
Then there is any number of other lines to specify other branches to include. The usual way to do this is to use the `merge` keyword to specify a simple merge of the branch. {{{ Next, you can specify any number of other branches to include. There are two ways to include those branches additional branches:

 * merge: this specifies a simple ```bzr merge``` of the two branches.
 * nest: inserts the content of the second branch into a specific location within the main branch.

=== Merging ===

Most often you'll use the "merge" command:

{{{
Line 30: Line 57:
`fix-build` is the id of the branch within this file, it doesn't have to be the same as any part of the branch URL, but it has to be unique within the file. `lp:~bzr/bzr/fix-build` is again the location of the branch. What we are doing here is merging in a branch that we know we need in order to fix the build, but that hasn't landed
in `lp:bzr` yet.
Here ```fix-build``` is a unique short name that we'll use to refer to this branch throughout the recipe. The short name can be anything you like, so long as it is unique to this branch within this recipe.
Line 33: Line 59:
The other way to include code is to use the `nest` keyword. {{{ ```lp:~bzr/bzr/fix-build``` is the location of the branch.

In this example, the branch ''fix-build'' fixes a problem in the trunk that prevents it from building. This branch could be anything: stand-alone packaging information, some other modification to the branch that's not yet present in the trunk and so on.

=== Nesting ===

Nesting works in a similar way but has more scope:

{{{
Line 37: Line 71:
The `nest` keyword will put the contents of one branch into a specific location in another branch, instead of merging it. In this case we are nesting `lp:pyfoo` in to `lp:bzr`. We are using `pyfoo` to refer to it in the file, and we want it nested in the `foo` directory, so we specify that last. The ```nest``` keyword puts the contents of one branch into a specific location in another branch, instead of merging it.
Line 39: Line 73:
It is possible to act on the nested branch in the same way as with the main branch. Any lines that are indented by two spaces under a `nest` line will act on the nested branch, e.g. {{{ In this case, we are nesting the contents of ```lp:pyfoo``` in a new ```foo``` directory in the ```lp:bzr``` branch. Again, we've given the branch a short name, ```pyfoo```, that we can use to refer to it throughout the recipe.

You can also act on the nested branch in the same way as you can the main branch: you can merge and nest other branches in your nested branch.

Here's how:

{{{
nest pyfoo lp:pyfoo foo
Line 43: Line 84:
would merge the `ubuntu-branding` branch in to `foo`. Any lines that are indented by two spaces, and are directly below your ```nest``` line, will act on the nested branch. In this example, the ```ubuntu-branding``` branch will be merged into ```pyfoo``` before it is nested in your primary branch.
Line 45: Line 86:
The resulting branch needs to already have the `debian` directory in place with the packaging in it, as it can't be auto-generated. Therefore you will often need to merge (or nest) one or more packaging branches: {{{ === Packaging information ===

One of the branches that you include in your recipe must include packaging information in the ```debian``` directory. You can include this from another branch, that includes packaging information only, using a merge or a nest:

{{{
Line 49: Line 94:
In total this recipe would look like {{{
# bzr-builder format 0.2 deb-version 1.0+{revno}+{revno:fix-build}+{revno:pyfoo}+{revno:branding}+{revno:packaging}

== What our recipe looks like ==

Addi
ng up all the lines above, our full recipe would look like this:

{{{
# bzr-builder format 0.2 deb-version 1.0+{revno}
Line 58: Line 108:
=== Specifying revisions ===
Line 60: Line 109:
Sometimes you want to specify a specific revision of a branch to use, rather than the tip. You can do this by including a revision specifier at the end of any branch line, e.g. {{{ == Specifying revisions ==

S
ometimes you want to specify a specific revision of a branch to use, rather than the tip.

You can do this by including a revision specifier at the end of any branch line. For example:

{{{
Line 64: Line 119:
or, for the first branch line {{{
lp:bzr tag:1.0
Similarly for the main branch:

{{{
lp:bzr revno:1234
Line 68: Line 125:
would mean that every time the recipe was used it would use the "1.0" tag from that branch. Bazaar allows you to tag a certain revision with an easily memorable name. You can request a specific tagged revision like this:
Line 70: Line 127:
=== Version numbers and Substitution Variables === {{{
lp:bzr tag:2.0
}}}
Line 72: Line 131:
The `deb-version` specifier allow you to specify a version number for the resulting package, but the version number needs to increase each time the package is built, so debversion supports several substitution variables. Here, the recipe would use the revision that has the tag "2.0".
Line 74: Line 133:
The examples above use `{revno}`. This will be replaced with the revision number of the revision that was used from the primary branch. You can use the revision number of any branch by using `{revno:<branch id>}`. In the examples above, the revnos of all branches are specified. This has the nice property that a new version is generated when any of the branches changes, but not if no branches change. However, it can become unwieldy if many branches are involved. == Version numbers and substitution variables ==
Line 76: Line 135:
You can also use {time} as a substitution variable. This will be replaced when the version number is needed with the current date and time (UTC). This will ensure that later packages get higher version numbers, whether or not their contents have changed. In the first line of the recipe, we specified a version number for the package we want to build, using:
Line 78: Line 137:
You can use as many substitution variables as you like, e.g. {{{ {{{
deb-version 1.0+{revno}
}}}

Rather than specify a fixed version number, we need it to increase every time the package is built. To allow for this, you can use a two substitution variables.

||<tablestyle="border: none;" rowstyle="background-color: #2a2929; font-weight: bold; color: #f6bc05; padding: 2px 5px 2px 5px;">Variable||Purpose||
||{time}||Replaced by the date and time (UTC) when the package was built.||
||{revno}||Replaced by the revision number of the primary branch.||
||{revno:<branch id>}||Replaced by the revision number of the branch you specify, using the short name specified elsewhere in the recipe.||
||{debupstream}||Replaced by the upstream portion of the version number taken from ```debian/changelog``` in the final tree. For example: if the version is ```1.0-1```, this would evaluate to ```1.0```.||

The advantages of using {revno} and/or {time}:

 * '''{revno}:''' if you want to ensure there's a new package version number whenever the contents of the branch has changed. This is particularly useful if you specfiy a {revno} for each branch in your recipe.
 * '''{time}:''' if you want the package version to increase whether or not the contents of one of more of the branches has changed.

You can use as many substitution variables as you like. For example:

{{{
Line 82: Line 160:
''Please note that the `packaging` in `revno:packaging` refers to a branch id.'' Here the ```packaging``` in ```revno:packaging``` refers to the short name we gave the branch we're using for packaging.
Line 84: Line 162:
Which would expand to something like {{{
  deb-version 1.0+4264-0ubuntu0+2145+200907201627
This example would generate a package version something like:

{{{
1.0+4264-0ubuntu0+2145+200907201627
Line 88: Line 168:
 * `{time}` will be substituted with the current date and time, such as 200908191512.
 * `{revno}` will be the revno of the base branch (the first specified).
 * `{revno:<branch id>}` will be substituted with the revno for the branch named <branch name> in the recipe.
 * `{debupstream}` will be replaced by the upstream portion of the versionnumber taken from `debian/changelog` in the final tree. If when the tree is built the top of `debian/changelog` has a version number of "1.0-1" then this would evaluate to "1.0".

= Next steps =

Let's look at [[Packaging/SourceBuilds/BzrBuilder|bzr-builder in more detail]].

||<tablestyle="width: 100%;"> ~-[[Packaging/SourceBuilds/GettingStarted|< Daily builds getting started]] -~ ||<style="text-align: right;"> ~- [[Packaging/SourceBuilds/BzrBuilder|bzr-builder in detail >]] -~ ||

Launchpad Help > Packaging > Daily builds > Recipes

lp-diamond-16.png Source package recipes in Launchpad

Home

Getting Started

Knowledge Base

List of Daily Builds

Overview

A bzr-builder "recipe" is a description of the steps needed to construct a package from a set of Bazaar branches. Its format specifies:

  • Which branch to use for the source code: trunk branch, beta branch, etc.
  • Which branch to use for the packaging information: separate branch, Ubuntu branch, etc.
  • The correct package version (so people can still upgrade to the new stable version when it's released.
  • What to modify to make the source build properly.

Writing a recipe

Recipes have a simple format.

Note: you can find a typical example in the getting started guide.

They always start with a line similar to this:

# bzr-builder format 0.2 deb-version 1.0+{revno}

Let's take a look at this in more detail:

  • # bzr-builder format 0.2 specifies which recipe format we're using. The current format is 0.2.

  • deb-version 1.0+{revno} specifies the version to give the package we're building. {revno} is a substitution variable; more on which later.

Specifying the branches

The next line of a recipe specifies which branch to base the package on:

lp:bzr

This says that we will use the trunk of the bzr project in Launchpad. This could just as easily be any other branch in Launchpad, using the short format that you can find on any branch overview page.

Next, you can specify any number of other branches to include. There are two ways to include those branches additional branches:

  • merge: this specifies a simple bzr merge of the two branches.

  • nest: inserts the content of the second branch into a specific location within the main branch.

Merging

Most often you'll use the "merge" command:

merge fix-build lp:~bzr/bzr/fix-build

Here fix-build is a unique short name that we'll use to refer to this branch throughout the recipe. The short name can be anything you like, so long as it is unique to this branch within this recipe.

lp:~bzr/bzr/fix-build is the location of the branch.

In this example, the branch fix-build fixes a problem in the trunk that prevents it from building. This branch could be anything: stand-alone packaging information, some other modification to the branch that's not yet present in the trunk and so on.

Nesting

Nesting works in a similar way but has more scope:

nest pyfoo lp:pyfoo foo

The nest keyword puts the contents of one branch into a specific location in another branch, instead of merging it.

In this case, we are nesting the contents of lp:pyfoo in a new foo directory in the lp:bzr branch. Again, we've given the branch a short name, pyfoo, that we can use to refer to it throughout the recipe.

You can also act on the nested branch in the same way as you can the main branch: you can merge and nest other branches in your nested branch.

Here's how:

nest pyfoo lp:pyfoo foo
  merge branding lp:~bob/pyfoo/ubuntu-branding

Any lines that are indented by two spaces, and are directly below your nest line, will act on the nested branch. In this example, the ubuntu-branding branch will be merged into pyfoo before it is nested in your primary branch.

Packaging information

One of the branches that you include in your recipe must include packaging information in the debian directory. You can include this from another branch, that includes packaging information only, using a merge or a nest:

merge packaging lp:~bzr/bzr/packaging

What our recipe looks like

Adding up all the lines above, our full recipe would look like this:

# bzr-builder format 0.2 deb-version 1.0+{revno}
lp:bzr
merge fix-build lp:~bzr/bzr/fix-build
nest pyfoo lp:pyfoo foo
  merge branding lp:~bob/pyfoo/ubuntu-branding
merge packaging lp:~bzr/bzr/packaging

Specifying revisions

Sometimes you want to specify a specific revision of a branch to use, rather than the tip.

You can do this by including a revision specifier at the end of any branch line. For example:

merge packaging lp:~bzr/bzr/packaging revno:2355

Similarly for the main branch:

lp:bzr revno:1234

Bazaar allows you to tag a certain revision with an easily memorable name. You can request a specific tagged revision like this:

lp:bzr tag:2.0

Here, the recipe would use the revision that has the tag "2.0".

Version numbers and substitution variables

In the first line of the recipe, we specified a version number for the package we want to build, using:

deb-version 1.0+{revno}

Rather than specify a fixed version number, we need it to increase every time the package is built. To allow for this, you can use a two substitution variables.

Variable

Purpose

{time}

Replaced by the date and time (UTC) when the package was built.

{revno}

Replaced by the revision number of the primary branch.

{revno:<branch id>}

Replaced by the revision number of the branch you specify, using the short name specified elsewhere in the recipe.

{debupstream}

Replaced by the upstream portion of the version number taken from debian/changelog in the final tree. For example: if the version is 1.0-1, this would evaluate to 1.0.

The advantages of using {revno} and/or {time}:

  • {revno}: if you want to ensure there's a new package version number whenever the contents of the branch has changed. This is particularly useful if you specfiy a {revno} for each branch in your recipe.

  • {time}: if you want the package version to increase whether or not the contents of one of more of the branches has changed.

You can use as many substitution variables as you like. For example:

  deb-version 1.0+{revno}-0ubuntu0+{revno:packaging}+{time}

Here the packaging in revno:packaging refers to the short name we gave the branch we're using for packaging.

This example would generate a package version something like:

1.0+4264-0ubuntu0+2145+200907201627

Next steps

Let's look at bzr-builder in more detail.

< Daily builds getting started

bzr-builder in detail >

Packaging/SourceBuilds/Recipes (last edited 2021-06-07 13:41:17 by cjwatson)