Project

General

Profile

Make a new release » History » Version 77

osmith, 03/27/2019 04:24 PM

1 22 msuraev
{{>toc}}
2
3 2 neels
h1. Make a new release
4 1 neels
5 13 msuraev
The efforts to automate the release process are tracked in https://projects.osmocom.org/issues/1861
6
7 17 msuraev
h2. When to make a new release
8 1 neels
9 16 msuraev
Various Osmocom projects depend on others.
10 1 neels
11 28 msuraev
*Proposed policy:*
12 16 msuraev
* master branch is expected to depend on latest master branches of depended-upon projects
13 24 msuraev
* make release of depended-upon projects if necessary before making non-library project release
14
* make sure that we have correct version dependencies before making non-library project release
15 1 neels
16 41 msuraev
Alternatively/additionally we can make timely releases of non-library projects (and corresponding depended-upon libraries):
17
* once per XX months?
18
* before every OsmoDevCon?
19 46 msuraev
* once YY items accumulated in TODO-RELEASE file(see [[Make_a_new_release#TODO-RELEASE-file-format-and-maintenance|TODO-RELEASE file format]])
20 41 msuraev
* when configuration/db format changes?
21
22 76 osmith
This would help to avoid batching too many changes together and to adhere to RERO better - see "2015-Why-and-HowShould-OpenSource-ProjectsAdopt-Time-Based-Releases.pdf":https://www.researchgate.net/publication/268815678_Why_and_How_Should_Open_Source_Projects_Adopt_Time-Based_Releases
23 20 msuraev
24 61 pespin
h2. Versioning considerations for libraries
25 1 neels
26 62 pespin
Every osmocom library is built using libtool's version-info system. This system format and algorithm to update the versions is documented in "here":https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html#Updating-version-info.
27 1 neels
28 62 pespin
However, debian packaging system follows a different versioning convention, but conveniently the debian versioning system can be deduced from libtool's version-info. More information can be found in "here":https://autotools.io/libtool/version.html.
29 61 pespin
Specially interesting is the warning section:
30
31 62 pespin
> A common mistake is to assume that the three values passed to -version-info map directly into the three numbers at the end of the library name. This is not the case, and indeed, current, revision and age are applied differently depending on the operating system that one is using.
32
> For Linux, for instance, while the last two values map directly from the command-line, the first is calculated by subtracting age from current. On the other hand, on modern FreeBSD, only one component is used in the library version, which corresponds to current. 
33
34
More related information on the version translation procedure can be found here: "[1]":https://github.com/haskell/cabal/issues/4052#issuecomment-258044949 "[2]":https://stackoverflow.com/questions/36734105/how-is-the-version-number-in-library-names-generated
35 52 pespin
36 61 pespin
Summary: For libtool's system @current:revision:age@, it gets translated into version number @major.age.revision@, where @major=current-age@, reflecting the fact that ABIs can be backwards compatible. Debian uses @major@ to generate the package name.
37
38 1 neels
The following command, when run on a shared library, will output the name to be used for the Debian package containing that shared library:
39 71 pespin
<pre>
40 70 pespin
objdump -p library.so \
41
    | sed -n -e's/^[[:space:]]*SONAME[[:space:]]*//p' \
42
    | LC_ALL=C sed -r -e's/([0-9])\.so\./\1-/; s/\.so(\.|$)//; y/_/-/; s/(.*)/\L&/'
43
</pre>
44
45 61 pespin
h2. osmocom-release.mk
46
47
The @osmo-release.mk@ helper (installed by @libosmocore-dev@) available via @make release@ takes care of
48
49 35 msuraev
* version bump
50 57 pespin
* debian/changelog update
51
* commit
52 1 neels
* sign
53 57 pespin
* tag
54 1 neels
55
Feel free to send patches implementing further automation as you see fit.
56
57
You can alternatively run osmo-release.mk directly from your git repo in /foo/bar/libosmocore by using:
58
@PATH="$PATH:/foo/bar/libosmocore" make REL=minor release --include-dir="/foo/bar/libosmocore"@
59
60 61 pespin
h3. Dependencies
61 1 neels
62 61 pespin
The @osmo-release.mk@ requires several extra dependencies. Make sure you have them installed in your system:
63
* bumpversion
64
* git-buildpackage
65
* devscripts
66
67
h3. TODO-RELEASE file format and maintenance
68
69
* all the strings which contain @#@ considered comment and will be ignored
70
* actual entries consists of 3 tab-separated fields:
71
# library - name of the library affected (should correspond to @lib*.pc.in@ file in project's root directory)
72
# what - API or ABI change (used as a guidance to properly bump @*_LIBVERSION@)
73
# description - textual description (will end up in changelog)
74
75
When change affecting library's API/ABI is made then new entry should be added to TODO-RELEASE according to the format above. The file will be claned-up automatically by @make release@ command.
76
77
h2. How to make a new release
78
79
First we outline specific steps for different project types, then common part.
80
81
h3. Extra steps for Libraries
82
83
Some extra previous steps are required if the project installs a public shared library.
84
85 59 pespin
* modify @*_LIBVERSION@ in @src/Makefile.am@ as necessary according to TODO-RELEASE file
86 61 pespin
* if necessary ("current/age" component of @*_LIBVERSION@ was bumped) then rename @debian/lib*.install@ to match the change. See [[Make_a_new_release#Versioning-considerations-for-libraries|Versioning considerations for libraries]].
87 73 pespin
* if necessary (any of @debian/lib*.install@ were renamed) then adjust @debian/control@ accordingly. Specifically look for "Package" and "Depends" attributes.
88 65 pespin
* Some projects (osmo-ggsn) also state the library version in dh_strip lines in @debian/rules@. That one needs to be updated too to match the new library version.
89 32 msuraev
90 30 msuraev
The release helper is trying to be smart about it and prevent making new library release with non-empty TODO-RELEASE file if @*_LIBVERSION@ is not adjusted beforehand.
91
92 61 pespin
h3. Release steps
93 1 neels
94 44 msuraev
By default @make release@ prepares 'patch' release but you can manually specify any of 'major/minor/patch' as necessary - see http://semver.org/ for details.
95
96 77 osmith
* Create a new branch from where you would like to create a new release (master or a previous release) and name it @yourname/release@
97
* If you are not creating a release for master, then push the branch now (so you can use gerrit to submit to that branch later)
98 1 neels
* Make sure all the changes you want in the release commit are staged (@git add@).
99 77 osmith
* Run@make REL=minor release@
100 64 pespin
* an editor will be opened in case you want to reword the release commit. Useful if you want to add any remarks on the actions taken.
101 44 msuraev
* inspect the latest commit which was just created
102 1 neels
* adjust it if necessary and re-sign (see [[Make_a_new_release#How-to-retag-a-new-release|Re-tag new release]])
103 74 pespin
* push commit for review to gerrit and ask somebody to review and merge it quickly (to avoid other commits being merged in between).
104 77 osmith
* Once merged, make sure the merged release commit did not change (due to in-between merges), then push the release tag with @git push gerrit --tags@
105 1 neels
* consider preparing article for https://osmocom.org/news/ and sending announcement to appropriate ML for major release once release commit passed the review
106 64 pespin
107
In case you want to undo the release commit you did locally:
108
* @git tag -d TAG_JUST_CREATED@
109
* @git reset --soft HEAD^@
110
* @git reset HEAD debian/changelog && git checkout debian/changelog@
111
* Do your modifications
112
* Proceed again with the release steps listed above
113 45 msuraev
114
h2. Which new release to make
115
116
Use following guidelines when choosing release type:
117
* major - ?? TBD
118
* minor - ?? TBD
119 43 msuraev
* patch - ?? TBD
120 1 neels
121 43 msuraev
If unsure - ask in corresponding ML.
122
123
h2. Deprecation policy
124
125
Functions/interfaces marked as deprecated for X releases of type Y can be removed in next Z release.
126
127 55 pespin
TBD: what's appropriate value for X? which Y and Z (from major/minor/patch) should we use?
128 43 msuraev
129
h2. How to (re)tag a new release
130
131 47 msuraev
This might be necessary if previous release was made manually with some mistakes which have to be corrected and amended to the release commit.
132
133 36 msuraev
<pre>
134
git tag -s 0.4.0 -f -m "Release v0.4.0 on 2017-08-25."
135
</pre>
136 30 msuraev
137
This will automatically (re)sign the latest commit. You can specify which commit to sign explicitly.
138 3 neels
139 1 neels
Say, for example, the git hash is @012342abcdefg@ and the next open version is 0.1.3:
140 9 neels
<pre>
141 1 neels
git tag -s 0.1.3 012342abcdefg -m "release 0.1.3"
142
</pre>
143 8 neels
144 1 neels
(If @gpg@ complains, see [[Make a new release#GPG-Have-a-matching-user-id|GPG: Have a matching user id]].)
145 4 neels
146 1 neels
Verify that git picks up the new version tag:
147
<pre>
148
$ git describe
149
0.1.3-3-g1f95179
150
</pre>
151 11 neels
152 42 msuraev
N. B: *For your local build, _nothing will change_ until you delete the @.version@ file and completely rebuild:*
153 1 neels
154
<pre>
155 10 neels
rm .version
156
autoreconf -fi
157 1 neels
./configure
158
make
159
cat .version
160
</pre>
161
162
This should show the same as @git describe@.
163
164
When you're convinced that all is in order, push the new tag:
165
166
<pre>
167
git push origin 0.1.3
168
</pre>
169 14 neels
170 1 neels
If anything went wrong, you can delete the tag (locally) by
171 15 msuraev
<pre>
172 42 msuraev
git tag -d 0.1.3
173
</pre>
174
and, if you've already pushed it, by
175
<pre>
176
git push --delete origin 0.1.3
177
</pre>
178 1 neels
179
h2. GPG: Have a matching user id
180
181
By default, @git tag -s@ takes your author information to lookup the secret GPG key to sign a tag with.
182
If the author+email do not exactly match one of the key's @uid@s, you will get this error:
183
184
<pre>
185
gpg: signing failed: secret key not available
186
</pre>
187
188
Verify: say, your author+email info in your git config says "John Doe <john@doe.net>", try
189
<pre>
190
gpg --list-secret-keys "John Doe <john@doe.net>"
191
</pre>
192
If this fails, GPG won't find the right key automatically.
193
194
Ways to resolve:
195
196
* Use @git tag -u <key-id>@
197
* Edit your secret key to add a uid that matches your author information
198
<pre>
199
gpg --edit-key john@doe.net
200
gpg> adduid
201
# enter details to match the git author
202
gpg> save
203
</pre>
204 56 pespin
205
h2. Dependency graph
206
207
This section aims at providing a dependency graph of the osmocom cellular network infrastructure projects in case a cascade of releases is intended:
208
209
{{graphviz_link()
210
digraph G {
211 66 pespin
    libusrp -> {osmo_trx};
212 56 pespin
    libas1nc -> {osmo_iuh, osmo_msc, openbsc};
213
    libsmpp34 -> {osmo_msc, openbsc};
214
    libgtpnl -> {osmo_ggsn};
215 75 pespin
    libosmocore -> {libosmo_abis, libosmo_netif, libosmo_sccp, osmo_iuh, osmo_ggsn, osmo_sgsn, osmo_mgw, osmo_msc, osmo_hlr, osmo_bsc, osmo_bts, osmo_pcu, osmo_trx, openbsc, osmo_sip_connector, osmo_pcap};
216 60 pespin
    libosmo_abis -> {libosmo_netif, osmo_sgsn, osmo_msc, osmo_hlr, osmo_bsc, osmo_bts, openbsc};
217 56 pespin
    libosmo_netif -> {libosmo_sccp, osmo_iuh, osmo_sgsn, osmo_mgw, osmo_msc, osmo_bsc, openbsc};
218
    libosmo_sccp -> {osmo_iuh, osmo_sgsn, osmo_msc, osmo_bsc, openbsc};
219 63 pespin
    osmo_iuh -> {osmo_msc, osmo_sgsn, openbsc};
220 56 pespin
    osmo_ggsn -> {osmo_sgsn};
221
    osmo_mgw -> {osmo_msc, osmo_bsc};
222 69 pespin
    osmo_hlr -> {osmo_msc, osmo_sgsn};
223 56 pespin
}
224
}}
Add picture from clipboard (Maximum size: 48.8 MB)