Project

General

Profile

Make a new release » History » Version 115

laforge, 12/04/2023 04:27 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 92 pespin
<pre>
59
PATH="$PATH:/foo/bar/libosmocore" make REL=minor release --include-dir="/foo/bar/libosmocore"
60
</pre>
61 1 neels
62 61 pespin
h3. Dependencies
63 1 neels
64 61 pespin
The @osmo-release.mk@ requires several extra dependencies. Make sure you have them installed in your system:
65
* bumpversion
66
* git-buildpackage
67
* devscripts
68
69
h3. TODO-RELEASE file format and maintenance
70
71
* all the strings which contain @#@ considered comment and will be ignored
72
* actual entries consists of 3 tab-separated fields:
73
# library - name of the library affected (should correspond to @lib*.pc.in@ file in project's root directory)
74
# what - API or ABI change (used as a guidance to properly bump @*_LIBVERSION@)
75
# description - textual description (will end up in changelog)
76
77
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.
78
79
h2. How to make a new release
80
81
First we outline specific steps for different project types, then common part.
82 86 pespin
* Grep for @PKG_CHECK_MODULES@ in @configure.ac@, and build with dependencies listed there (check versions after @>=@). If cannot compile, adjust the versions there so compilation works. eg: @osmo-ci.git/scripts/osmo-depcheck.py -w /tmp/depcheck -b -j 8 -u /home/$USER/where-my-local-git-repos-are/ osmo-ggsn@
83 82 pespin
* Adjust dependency versions in @debian/control@ (under @Build-Depends@) to match those of configure.ac
84 93 pespin
* Adjust dependency version in @contrib/*.spec.in@ to match those of configure.ac
85 84 pespin
* Make sure patches under @debian/patches@ still apply correctly.
86 61 pespin
87
h3. Extra steps for Libraries
88
89 1 neels
Some extra previous steps are required if the project installs a public shared library.
90
91 82 pespin
* modify @*_LIBVERSION@ in @src/Makefile.am@ as necessary according to TODO-RELEASE file. Usually the easiest is using @git diff $OLD_RELEASE -- include/foobar/@ to check API/ABI changes, and implementation changes similarly with @git diff $OLD_RELEASE -- src/foobar/@
92
* if necessary ("@major = current - age@" component of @*LIBVERSION@ was bumped, package name changing as a result) then:
93
** Rename @debian/lib*.install@ to match the name change. See [[Make_a_new_release#Versioning-considerations-for-libraries|Versioning considerations for libraries]].
94 97 pespin
** Adjust package names in @contrib/*.spec.in@ accordingly.
95 82 pespin
** Adjust package names in @debian/control@ accordingly. Specifically look for "Package" and "Depends" attributes.
96
** Some projects containing both binaries and libraries (@osmo-ggsn@, @libosmo-sccp@) 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.
97 32 msuraev
98 98 pespin
Upon major libversion change ("old_major" -> "new_major"), the change pattern in general follow this structure:
99
* @"s/${libname}${old_major}/${libname}${new_major}/g"@
100
* @"s/${libname}.so.${old_major}/${libname}.so.${new_major}/g"@
101
102 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.
103
104 61 pespin
h3. Release steps
105 1 neels
106 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.
107
108 99 osmith
* Run @git fetch --tags@ to ensure your local copy of the repository has the latest tags.
109 112 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@
110 83 pespin
* Make sure all the manual changes you want in the release commit are staged (@git add@), (see previous sections about changes needed).
111 78 osmith
* Run @make REL=minor release@
112 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.
113 44 msuraev
* inspect the latest commit which was just created
114 1 neels
* adjust it if necessary and re-sign (see [[Make_a_new_release#How-to-retag-a-new-release|Re-tag new release]])
115
* push commit for review to gerrit and ask somebody to review and merge it quickly (to avoid other commits being merged in between).
116 112 osmith
<pre>
117
$ git push origin HEAD:refs/for/YOURNAME/RELEASE%topic=PROJECT-RELEASE
118
</pre>
119 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@
120 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
121 64 pespin
122
In case you want to undo the release commit you did locally:
123
* @git tag -d TAG_JUST_CREATED@
124
* @git reset --soft HEAD^@
125 94 pespin
* @git restore --staged debian/changelog && git restore debian/changelog@
126 64 pespin
* Do your modifications
127
* Proceed again with the release steps listed above
128 45 msuraev
129 107 osmith
In case there is no @make release@ target (e.g. osmo_dia2gsup):
130
* run @gbp dch@
131
* adjust debian/changelog, at least change UNRELEASED to unstable
132
* commit as "Bump version: 0.1.1" (replace 0.1.1 with new version)
133 108 osmith
* run @git tag -s 0.1.1@, put as title "Release 0.1.1"
134 107 osmith
135 45 msuraev
h2. Which new release to make
136
137
Use following guidelines when choosing release type:
138
* major - ?? TBD
139
* minor - ?? TBD
140 43 msuraev
* patch - ?? TBD
141 1 neels
142 43 msuraev
If unsure - ask in corresponding ML.
143
144
h2. Deprecation policy
145
146
Functions/interfaces marked as deprecated for X releases of type Y can be removed in next Z release.
147
148 55 pespin
TBD: what's appropriate value for X? which Y and Z (from major/minor/patch) should we use?
149 43 msuraev
150
h2. How to (re)tag a new release
151
152 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.
153
154 36 msuraev
<pre>
155
git tag -s 0.4.0 -f -m "Release v0.4.0 on 2017-08-25."
156
</pre>
157 30 msuraev
158
This will automatically (re)sign the latest commit. You can specify which commit to sign explicitly.
159 3 neels
160 1 neels
Say, for example, the git hash is @012342abcdefg@ and the next open version is 0.1.3:
161 9 neels
<pre>
162 1 neels
git tag -s 0.1.3 012342abcdefg -m "release 0.1.3"
163
</pre>
164 8 neels
165 1 neels
(If @gpg@ complains, see [[Make a new release#GPG-Have-a-matching-user-id|GPG: Have a matching user id]].)
166 4 neels
167 1 neels
Verify that git picks up the new version tag:
168
<pre>
169
$ git describe
170
0.1.3-3-g1f95179
171
</pre>
172 11 neels
173 42 msuraev
N. B: *For your local build, _nothing will change_ until you delete the @.version@ file and completely rebuild:*
174 1 neels
175
<pre>
176 10 neels
rm .version
177
autoreconf -fi
178 1 neels
./configure
179
make
180
cat .version
181
</pre>
182
183
This should show the same as @git describe@.
184
185
When you're convinced that all is in order, push the new tag:
186
187
<pre>
188
git push origin 0.1.3
189
</pre>
190 14 neels
191 1 neels
If anything went wrong, you can delete the tag (locally) by
192 15 msuraev
<pre>
193 42 msuraev
git tag -d 0.1.3
194
</pre>
195
and, if you've already pushed it, by
196
<pre>
197
git push --delete origin 0.1.3
198
</pre>
199 1 neels
200
h2. GPG: Have a matching user id
201
202
By default, @git tag -s@ takes your author information to lookup the secret GPG key to sign a tag with.
203
If the author+email do not exactly match one of the key's @uid@s, you will get this error:
204
205
<pre>
206
gpg: signing failed: secret key not available
207
</pre>
208
209
Verify: say, your author+email info in your git config says "John Doe <john@doe.net>", try
210
<pre>
211
gpg --list-secret-keys "John Doe <john@doe.net>"
212
</pre>
213
If this fails, GPG won't find the right key automatically.
214
215
Ways to resolve:
216
217
* Use @git tag -u <key-id>@
218
* Edit your secret key to add a uid that matches your author information
219
<pre>
220
gpg --edit-key john@doe.net
221
gpg> adduid
222
# enter details to match the git author
223
gpg> save
224
</pre>
225 56 pespin
226 106 neels
h2. GPG: failed to sign
227
228
If you are seeing this error:
229
230
<pre>
231
$ git tag ...
232
error: gpg failed to sign the data
233
error: unable to sign the tag
234
</pre>
235
236
you may need to set this in your terminal's environment:
237
238
<pre>
239
export GPG_TTY=$(tty)
240
</pre>
241
242
Furthermore, for headless operation (remote server) it may be necessary to direct the GPG key entry to the terminal.
243
On debian, make sure the curses key entry is installed:
244
<pre>
245
apt-get install pinentry-curses
246
</pre>
247
248
and possibly also uninstall other pinentry alternatives, or otherwise make sure it is not trying to launch a graphical pinentry.
249
250 87 laforge
h1. Creating a patch release
251
252 114 Hoernchen
Sometimes we want to create a patch release to apply an important fix to an older major/minor release. Assuming you're in libosmocore and want to create 1.3.1 off 1.3.0, this works as follows ("gerrit" is the remote name here, this might just be "origin" if pulling from gerrit):
253 87 laforge
254 113 Hoernchen
# %{color:red}warning% : using the final tag name as the temp branch name is a bad idea because it causes annoying problems like
255
<pre>
256
❯ git push -d origin 1.3.1      
257
error: dst refspec 1.3.1 matches more than one</pre>
258
You need to use *git show-ref* or *git ls-remote* to figure out the refspec like refs/heads/1.3.1 to distinguish tag and branch name. Or just use different names!
259 90 pespin
# (Locally checkout 1.3.0 as a new branch called rel-1.3.1)
260 88 laforge
<pre>
261
git checkout -b rel-1.3.1 1.3.0
262
</pre>
263 90 pespin
# Create a rel-1.3.1 branch in gerrit
264 88 laforge
<pre>
265
git push gerrit rel-1.3.1:refs/heads/rel-1.3.1
266
</pre>
267 90 pespin
# Do whatever local modifications such as cherry-picking of fixes, ...
268
# Perform the release process as outlined above, using 'REL=patch'
269 88 laforge
<pre>
270
make REL=patch release
271 1 neels
</pre>
272 90 pespin
# Push the changes for review to the rel-1.3.1 branch
273 88 laforge
<pre>
274 1 neels
git push gerrit HEAD:refs/for/rel-1.3.1
275 88 laforge
</pre>
276 90 pespin
# Perform gerrit review, merge patches in gerrit UI
277
# Do @git fetch gerrit@ and make sure your local branch with your tag points to the remote one (eg @gitk --all@ or @git show@).
278
# Push the tag to the repo, *after the patches were merged* to that branch
279 88 laforge
<pre>
280
git push gerrit 1.3.1
281
</pre>
282 90 pespin
# Remove the temporary branch
283 88 laforge
<pre>
284
git push gerrit :rel-1.3.1
285
</pre>
286 56 pespin
287
h1. Dependency graph
288
289
This section aims at providing a dependency graph of the osmocom cellular network infrastructure projects in case a cascade of releases is intended:
290 66 pespin
291 56 pespin
{{graphviz_link()
292
digraph G {
293
    libusrp -> {osmo_trx};
294 105 pespin
    libas1nc -> {osmo_iuh, osmo_msc, openbsc, osmo_hnodeb, osmo_hnbgw};
295 85 pespin
    libsmpp34 -> {osmo_msc, openbsc};
296 111 fixeria
    libgtpnl -> {osmo_ggsn, osmo_upf};
297
    libosmocore -> {libosmo_abis, libosmo_gprs, libosmo_netif, libosmo_sccp, libosmo_pfcp, 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, osmo_gbproxy, osmo_hnodeb, osmo_hnbgw, osmo_cbc, osmo_smlc, osmo_upf, osmo_uecups};
298 56 pespin
    osmo_gsm_manuals -> {osmo_pcu, osmo_trx, osmo_sip_connector, osmo_hlr, libosmo_sccp, osmo_sgsn, osmo_bsc, osmo_ggsn, osmo_msc, osmo_mgw, osmo_bts};
299 1 neels
    libosmo_abis -> {libosmo_netif, osmo_sgsn, osmo_msc, osmo_hlr, osmo_bsc, osmo_mgw, osmo_bts, openbsc, osmo_hnodeb};
300 110 fixeria
    libosmo_gprs -> {osmo_pcu};
301 105 pespin
    libosmo_netif -> {libosmo_sccp, osmo_iuh, osmo_sgsn, osmo_mgw, osmo_msc, osmo_bsc, openbsc, osmo_hnodeb, osmo_hnbgw, osmo_cbc, osmo_uecups};
302 1 neels
    libosmo_sccp -> {osmo_iuh, osmo_sgsn, osmo_msc, osmo_bsc, openbsc, osmo_hnodeb, osmo_hnbgw, osmo_smlc};
303 111 fixeria
    libosmo_pfcp -> {osmo_hnbgw, osmo_upf};
304 105 pespin
    osmo_iuh -> {osmo_msc, osmo_sgsn, openbsc, osmo_hnodeb, osmo_hnbgw};
305 56 pespin
    osmo_ggsn -> {osmo_sgsn};
306
    osmo_mgw -> {osmo_msc, osmo_bsc};
307 1 neels
    osmo_hlr -> {osmo_msc, osmo_sgsn};
308
}
309
}}
Add picture from clipboard (Maximum size: 48.8 MB)