<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.softwareheritage.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=NicolasDandrimont</id>
	<title>Software Heritage Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.softwareheritage.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=NicolasDandrimont"/>
	<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/wiki/Special:Contributions/NicolasDandrimont"/>
	<updated>2026-04-20T08:02:59Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Debian_packaging&amp;diff=1608</id>
		<title>Debian packaging</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Debian_packaging&amp;diff=1608"/>
		<updated>2021-09-01T12:21:11Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: Drop the dirty chroot suggestion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Package repository ==&lt;br /&gt;
&lt;br /&gt;
A package repository is available on https://debian.softwareheritage.org/.&lt;br /&gt;
&lt;br /&gt;
Unstable / Testing :&lt;br /&gt;
  deb [trusted=yes] https://debian.softwareheritage.org/ unstable main&lt;br /&gt;
&lt;br /&gt;
Stable / Buster :&lt;br /&gt;
  deb [trusted=yes] https://debian.softwareheritage.org/ buster-swh main&lt;br /&gt;
&lt;br /&gt;
Oldstable / Stretch :&lt;br /&gt;
  deb [trusted=yes] https://debian.softwareheritage.org/ stretch-swh main&lt;br /&gt;
&lt;br /&gt;
This package repository is handled via reprepro on pergamon.internal.softwareheritage.org (base directory : /srv/softwareheritage/repository).&lt;br /&gt;
&lt;br /&gt;
=== Uploading packages ===&lt;br /&gt;
&lt;br /&gt;
Packages are added to the repository using &amp;lt;tt&amp;gt;reprepro -vb /srv/softwareheritage/repository processincoming incoming&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For packages to be accepted, they need to be :&lt;br /&gt;
# A changes file uploaded to &amp;lt;tt&amp;gt;/srv/softwareheritage/repository/incoming&amp;lt;/tt&amp;gt;&lt;br /&gt;
# Targetted at one of the supported distributions (unstable, unstable-swh, stretch, stretch-backports, stretch-backports-swh), jessie, jessie-backports, jessie-backports-swh)&lt;br /&gt;
# Signed by one of the keys listed in /srv/softwareheritage/repository/conf/uploaders&lt;br /&gt;
&lt;br /&gt;
== Git repositories for Debian packages ==&lt;br /&gt;
&lt;br /&gt;
Our git repository structure for Debian packages is compatible with &amp;lt;tt&amp;gt;git-buildpackage&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We have two different ways of handling repositories for Debian packages:&lt;br /&gt;
* Packages of python modules where *we* are upstream&lt;br /&gt;
* Packages of dependencies from another upstream (this also encompasses upstream Debian packages that we wish to backport for deployment)&lt;br /&gt;
&lt;br /&gt;
For these classes of packages, we have two sets of (identical) Jenkins jobs to handle building and uploading these packages to our package repository. The structure of the packaging branches for both classes is pretty much the same, the repositories only differ on how we handle upstream commits:&lt;br /&gt;
* Our own modules are merged with the upstream repository&lt;br /&gt;
* External dependencies ignore the upstream repository and only have packaging branches.&lt;br /&gt;
&lt;br /&gt;
=== Branch and tags structure ===&lt;br /&gt;
&lt;br /&gt;
Our debian packaging Jenkins jobs expect the following branches, which are pretty close to what https://dep-team.pages.debian.net/deps/dep14/ mandates:&lt;br /&gt;
* debian/upstream (history of unpacked upstream releases)&lt;br /&gt;
* debian/&amp;lt;suite&amp;gt; (history of the packaging of the given suite, e.g. unstable-swh, buster-swh)&lt;br /&gt;
* pristine-tar (data to regenerate upstream tarballs from a git export)&lt;br /&gt;
&lt;br /&gt;
The name of the debian/upstream branch doesn't matter ''as long as it's properly configured in the &amp;lt;tt&amp;gt;debian/gbp.conf&amp;lt;/tt&amp;gt; file''. It's only really used by &amp;lt;tt&amp;gt;gbp import-orig&amp;lt;/tt&amp;gt; when importing a new release.&lt;br /&gt;
&lt;br /&gt;
The tags marking upstream releases imported from tarballs for Debian packaging purposes are named &amp;lt;tt&amp;gt;debian/upstream/''&amp;lt;upstream version number&amp;gt;''&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Our Jenkins jobs are triggered on incoming tags named &amp;lt;tt&amp;gt;debian/''&amp;lt;version&amp;gt;''&amp;lt;/tt&amp;gt;. To generate the proper tags, use &amp;lt;tt&amp;gt;gbp buildpackage --git-tag-only&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The git-buildpackage configuration, &amp;lt;tt&amp;gt;debian/gbp.conf&amp;lt;/tt&amp;gt;, should be the following:&lt;br /&gt;
 [DEFAULT]&lt;br /&gt;
 upstream-branch=debian/upstream&lt;br /&gt;
 upstream-tag=debian/upstream/%(version)s&lt;br /&gt;
 debian-branch=debian/''&amp;lt;current suite&amp;gt;''&lt;br /&gt;
 pristine-tar=True&lt;br /&gt;
&lt;br /&gt;
==== Automatic packaging for swh python modules ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;swh.*&amp;lt;/tt&amp;gt; python modules have an extra jenkins job that updates the packaging automatically when we do an upstream release. This job only runs &amp;lt;tt&amp;gt;gbp import-orig&amp;lt;/tt&amp;gt; with the tarball we release to PyPI, and the right options to merge the upstream history.&lt;br /&gt;
&lt;br /&gt;
To merge changes from the upstream history, we add the following option to &amp;lt;tt&amp;gt;gbp.conf&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 upstream-vcs-tag=v%(version)s&lt;br /&gt;
&lt;br /&gt;
=== Bootstrapping a dependency packaging repository ===&lt;br /&gt;
&lt;br /&gt;
Bootstrapping the packaging repository for a dependency is analoguous to regular Debian practices:&lt;br /&gt;
&lt;br /&gt;
Download the upstream tarball. For PyPI, use the redirector at http://pypi.debian.net/&amp;lt;pkgname&amp;gt;/&lt;br /&gt;
 wget http://pypi.debian.net/pytest-postgresql/pytest-postgresql-1.3.4.tar.gz&lt;br /&gt;
&lt;br /&gt;
Create a new git repository&lt;br /&gt;
 git init pytest-postgresql&lt;br /&gt;
 cd pytest-postgresql&lt;br /&gt;
&lt;br /&gt;
Import the original upstream version&lt;br /&gt;
 git checkout -b debian/unstable-swh&lt;br /&gt;
 gbp import-orig --pristine-tar --upstream-branch=debian/upstream --upstream-tag=debian/upstream/%(version)s --debian-branch=debian/unstable-swh ../pytest-postgresql-1.3.4.tar.gz&lt;br /&gt;
 # What will be the source package name? [pytest-postgresql] &lt;br /&gt;
 # What is the upstream version? [1.3.4] &lt;br /&gt;
 # gbp:info: Importing '../pytest-postgresql-1.3.4.tar.gz' to branch 'debian/upstream'...&lt;br /&gt;
 # gbp:info: Source package is pytest-postgresql&lt;br /&gt;
 # gbp:info: Upstream version is 1.3.4&lt;br /&gt;
 # gbp:info: Successfully imported version 1.3.4 of ../pytest-postgresql-1.3.4.tar.gz&lt;br /&gt;
&lt;br /&gt;
Bootstrap the debian directory&lt;br /&gt;
 mkdir -p debian/source&lt;br /&gt;
 echo '3.0 (quilt)' &amp;gt; debian/source/format&lt;br /&gt;
 echo 9 &amp;gt; debian/compat&lt;br /&gt;
 cat &amp;gt; debian/gbp.conf &amp;lt;&amp;lt; EOF&lt;br /&gt;
 [DEFAULT]&lt;br /&gt;
 upstream-branch=debian/upstream&lt;br /&gt;
 upstream-tag=debian/upstream/%(version)s&lt;br /&gt;
 debian-branch=debian/unstable-swh&lt;br /&gt;
 pristine-tar=True&lt;br /&gt;
 EOF&lt;br /&gt;
 cp /usr/share/doc/debhelper/examples/rules.tiny debian/rules&lt;br /&gt;
 vim debian/control&lt;br /&gt;
 # [...] adapt debian/control from another package&lt;br /&gt;
 dch --create --package pytest-postgresql --newversion 1.3.4-1+swh1 --distribution unstable-swh&lt;br /&gt;
 vim debian/copyright&lt;br /&gt;
 # [...] adapt debian/copyright from another package&lt;br /&gt;
 git add debian&lt;br /&gt;
 git commit -m &amp;quot;Initial packaging for pytest-postgresql&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You can then go on to try building the package.&lt;br /&gt;
 gbp buildpackage --git-builder='sbuild -As'&lt;br /&gt;
&lt;br /&gt;
Once the package builds, if you want to check your package's conformance to Debian policy, you can run &amp;lt;tt&amp;gt;lintian&amp;lt;/tt&amp;gt; on the changes:&lt;br /&gt;
 lintian -EI ../pytest-postgresql_1.3.4-1+swh1_amd64.changes&lt;br /&gt;
&lt;br /&gt;
Note that you have to ignore warnings about unknown distributions, as we're building specifically for our repository&lt;br /&gt;
&lt;br /&gt;
We need to use a &amp;lt;tt&amp;gt;+swh1&amp;lt;/tt&amp;gt; version suffix to avoid clashing with potential upstream Debian package versions.&lt;br /&gt;
&lt;br /&gt;
==== Bootstrapping the backport branches ====&lt;br /&gt;
&lt;br /&gt;
During most of the operation, backports should happen automatically as we have a Jenkins job that generates backports on successful builds. However, when creating a packaging repository, we need to bootstrap the branches once, before Jenkins is able to do the work automatically.&lt;br /&gt;
&lt;br /&gt;
The backport branches should (ideally) be bootstrapped from a debian tag that has successfully built on Jenkins.&lt;br /&gt;
&lt;br /&gt;
Checkout the new branch&lt;br /&gt;
 git checkout debian/&amp;lt;version number&amp;gt;&lt;br /&gt;
 git checkout -b debian/buster-swh&lt;br /&gt;
&lt;br /&gt;
Update the gbp config to match the branch&lt;br /&gt;
 sed -i s/unstable-swh/buster-swh/ debian/gbp.conf&lt;br /&gt;
&lt;br /&gt;
Generate the initial backports entry. Use the current Debian version number (9 for stretch, 10 for buster, ...)&lt;br /&gt;
 dch -l &amp;quot;~bpo10&amp;quot; -D buster-swh --force-distribution 'Rebuild for buster-swh'&lt;br /&gt;
&lt;br /&gt;
You should then be able to try a local package build, and if that succeeds, to push the tag for Jenkins to autobuild.&lt;br /&gt;
&lt;br /&gt;
==== Setting up the repository on Phabricator ====&lt;br /&gt;
&lt;br /&gt;
The repository on Phabricator needs the following settings:&lt;br /&gt;
* Callsign: non-empty (prefix should be P according to https://wiki.softwareheritage.org/wiki/Phabricator_callsign_naming_convention)&lt;br /&gt;
* Short name: non-empty (used to make pretty git clone URLs; ideally matching the source package name)&lt;br /&gt;
* Repository tags: &amp;quot;Has debian packaging branches&amp;quot; (allows Jenkins to push on the debian/* branches)&lt;br /&gt;
* Policy&lt;br /&gt;
** View: Public (no login required)&lt;br /&gt;
** Edit: Developers&lt;br /&gt;
** Push: All users (actual restrictions are handled by Herald rules)&lt;br /&gt;
* Activate the repository&lt;br /&gt;
* Look up the path to the repository on the storage tab&lt;br /&gt;
&lt;br /&gt;
You need to setup the post-receive hook for Jenkins to be able to trigger on tag pushes&lt;br /&gt;
 ssh -p 2222 -t tate.internal.softwareheritage.org phabricator-setup-hook /srv/phabricator/repos/&amp;lt;repo-id&amp;gt; &amp;lt;post-receive-hook&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
&lt;br /&gt;
* there exists 2 types of &amp;lt;post-receive-hook&amp;gt;:&lt;br /&gt;
** ''post-receive-swh-modules'' for swh modules developed by the team&lt;br /&gt;
** ''post-receive-debian-deps'' for external modules packaged by the team&lt;br /&gt;
* remember that access to tate is on port 2222.&lt;br /&gt;
&lt;br /&gt;
The repo ID can be found on the repo's &amp;quot;storage&amp;quot; property page on phabricator, typically &lt;br /&gt;
 https://forge.softwareheritage.org/source/swh-SHORTNAME/manage/storage/&lt;br /&gt;
&lt;br /&gt;
==== Setting up the Jenkins jobs ====&lt;br /&gt;
&lt;br /&gt;
The Jenkins jobs are accessible through the ui: https://jenkins.softwareheritage.org/view/Debian%20dependency%20packages/&lt;br /&gt;
They are declared in the repository: https://forge.softwareheritage.org/source/swh-jenkins-jobs&lt;br /&gt;
&lt;br /&gt;
Jobs for dependency packages are configured in &amp;lt;tt&amp;gt;jobs/dependency-packages.yaml&amp;lt;/tt&amp;gt;. You can add a section as follows:&lt;br /&gt;
&lt;br /&gt;
 - project:&lt;br /&gt;
     name: &amp;lt;Callsign&amp;gt;&lt;br /&gt;
     display-name: &amp;lt;short-name&amp;gt;&lt;br /&gt;
     pkg: &amp;lt;source-name&amp;gt;&lt;br /&gt;
     python_module: &amp;lt;python-module&amp;gt;&lt;br /&gt;
     jobs:&lt;br /&gt;
       - 'dependency-jobs-{name}'&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
  - project:&lt;br /&gt;
      name: DLDBASE&lt;br /&gt;
      display-name: swh-loader-core&lt;br /&gt;
      repo_name: swh-loader-core&lt;br /&gt;
      pkg: loader.core&lt;br /&gt;
      python_module: swh.loader.core&lt;br /&gt;
      jobs:&lt;br /&gt;
        - 'swh-jobs-{name}'&lt;br /&gt;
 &lt;br /&gt;
Other samples can be found in the dedicated repository.&lt;br /&gt;
* usual swh package: [https://forge.softwareheritage.org/source/swh-jenkins-jobs/browse/master/jobs/swh-packages.yaml$15-22 swh.core]&lt;br /&gt;
* peculiar swh package (with name divergences): [https://forge.softwareheritage.org/source/swh-jenkins-jobs/browse/master/jobs/swh-packages.yaml$51-58 swh.icinga_plugins]&lt;br /&gt;
&lt;br /&gt;
Use the regular review process to land your changes.&lt;br /&gt;
Once your changes are pushed, a dedicated Jenkins job will generate the jobs from the configuration.&lt;br /&gt;
&lt;br /&gt;
If your package needs extra repositories to build, you can add them as comma-separated values to the &amp;lt;tt&amp;gt;deb-extra-repositories&amp;lt;/tt&amp;gt; setting, with the following notes:&lt;br /&gt;
* When building packages for the &amp;quot;*-swh&amp;quot; suites, the Software Heritage Debian repository is automatically enabled.&lt;br /&gt;
* When building packages for backports suites, the backports repository is automatically enabled.&lt;br /&gt;
&lt;br /&gt;
=== Updating a dependency packaging repository ===&lt;br /&gt;
&lt;br /&gt;
Place yourself on the debian/unstable-swh branch and &amp;quot;gbp import-origin&amp;quot; a more&lt;br /&gt;
recent upstream release tarballs.&lt;br /&gt;
&lt;br /&gt;
For example (current version on 0.0.5, upstream bumped to 0.0.7):&lt;br /&gt;
 gbp import-origin https://files.pythonhosted.org/packages/7a/bb/cf8fec6009e7d0cec52dc179d09b28c4c70d158e79b565e8aab7606e1717/attrs-strict-0.0.7.tar.gz&lt;br /&gt;
&lt;br /&gt;
This will update the following branches:&lt;br /&gt;
* debian/upstream&lt;br /&gt;
* pristine-tar&lt;br /&gt;
* debian/unstable-swh&lt;br /&gt;
&lt;br /&gt;
This also includes the necessary tags (`debian/upstream/0.0.7` here).&lt;br /&gt;
&lt;br /&gt;
You then need to push all branches/tags to the repository:&lt;br /&gt;
 git push origin --all --follow-tags&lt;br /&gt;
&lt;br /&gt;
Ensure the [https://wiki.softwareheritage.org/wiki/Debian_packaging#Local_package_building update builds fine] &lt;br /&gt;
And [https://wiki.softwareheritage.org/wiki/Debian_packaging#Remote_package_building tags accordingly the debian/unstable-swh branch when ok]. &lt;br /&gt;
Jenkins will then keep up on building the package.&lt;br /&gt;
&lt;br /&gt;
=== Local package building ===&lt;br /&gt;
&lt;br /&gt;
To locally test a package build, go on the appropriate debian packaging branch, and run&lt;br /&gt;
 gbp buildpackage --git-builder=sbuild -As --no-clean-source&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;gbp buildpackage&amp;lt;/tt&amp;gt; passes all options not starting with &amp;lt;tt&amp;gt;--git-&amp;lt;/tt&amp;gt; to the builder. Some useful options are the following:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;--git-ignore-new&amp;lt;/tt&amp;gt; builds from the working tree, with all the uncommitted changes. Useful for quick iteration when something *just* *doesn't* *work*.&lt;br /&gt;
* &amp;lt;tt&amp;gt;--no-clean-source&amp;lt;/tt&amp;gt; doesn't run debian/rules clean outside of the chroot, so you don't have to clutter your dev machine with all build dependencies&lt;br /&gt;
* &amp;lt;tt&amp;gt;--extra-repository=&amp;quot;'''repository specification'''&amp;quot;&amp;lt;/tt&amp;gt; adds the given repository in the chroot before building.&lt;br /&gt;
* &amp;lt;tt&amp;gt;--extra-repository-key='''repository signing key'''&amp;lt;/tt&amp;gt; adds the given key as a trusted gpg key for package sources&lt;br /&gt;
* &amp;lt;tt&amp;gt;--extra-package='''&amp;lt;.deb file or directory&amp;gt;'''&amp;lt;/tt&amp;gt; makes the given package (or all .deb packages in the given directory) available for dependency resolution. Useful when testing builds with a dependency chain.&lt;br /&gt;
* &amp;lt;tt&amp;gt;--force-orig-source&amp;lt;/tt&amp;gt; forces addition of the &amp;lt;tt&amp;gt;.orig.tar.gz&amp;lt;/tt&amp;gt; file in the &amp;lt;tt&amp;gt;.changes&amp;lt;/tt&amp;gt; file (useful when trying to upload a backport)&lt;br /&gt;
&lt;br /&gt;
See &amp;lt;tt&amp;gt;gbp help buildpackage&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;man sbuild&amp;lt;/tt&amp;gt; for a full description of all options&lt;br /&gt;
&lt;br /&gt;
for example:&lt;br /&gt;
 gbp buildpackage --git-builder=sbuild -As --no-clean-source --force-orig-source \&lt;br /&gt;
 --extra-repository='deb [trusted=yes] https://debian.softwareheritage.org/ buster-swh main'&lt;br /&gt;
&lt;br /&gt;
or if you need some third-party repository, say for cassandra:&lt;br /&gt;
 gbp buildpackage --git-builder=sbuild -As --no-clean-source --force-orig-source \&lt;br /&gt;
 --extra-repository='deb [trusted=yes] https://debian.softwareheritage.org/ buster-swh main' \&lt;br /&gt;
 --extra-repository='deb [arch=amd64 trusted=yes] https://downloads.apache.org/cassandra/debian 40x main'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(TODO: rewrite bin/make-package as bin/swh-gbp-buildpackage wrapping &amp;lt;tt&amp;gt;gbp buildpackage&amp;lt;/tt&amp;gt; with the most common options)&lt;br /&gt;
&lt;br /&gt;
=== Remote package building ===&lt;br /&gt;
&lt;br /&gt;
Jenkins builds packages when the repository receives a tag.&lt;br /&gt;
&lt;br /&gt;
Once the local build succeeds, tag the package with:&lt;br /&gt;
 gbp buildpackage --git-tag-only --git-sign-tags&lt;br /&gt;
&lt;br /&gt;
Alternatively, you can add the &amp;lt;tt&amp;gt;--git-tag&amp;lt;/tt&amp;gt; option to your &amp;lt;tt&amp;gt;gbp buildpackage&amp;lt;/tt&amp;gt; command so the tag happens automatically on a successful build.&lt;br /&gt;
&lt;br /&gt;
Then, push your tag, and Jenkins jobs should get triggered&lt;br /&gt;
 git push --tags&lt;br /&gt;
&lt;br /&gt;
== Build Environment setup ==&lt;br /&gt;
&lt;br /&gt;
Our automated packaging setup uses sbuild, which is also used by the Debian build daemons themselves. This section shows how to set it up for local use.&lt;br /&gt;
&lt;br /&gt;
=== sbuild setup ===&lt;br /&gt;
&lt;br /&gt;
 # Install the package&lt;br /&gt;
 sudo apt-get install sbuild&lt;br /&gt;
 &lt;br /&gt;
 # Add your user to the sbuild group, to allow him to use the sbuild commands&lt;br /&gt;
 sudo sbuild-adduser $USER&lt;br /&gt;
 # You have to logout and log back in&lt;br /&gt;
 &lt;br /&gt;
 # Prepare chroots&lt;br /&gt;
 sudo mkdir /srv/chroots&lt;br /&gt;
 sudo mkdir /srv/chroots/var&lt;br /&gt;
 &lt;br /&gt;
 # Optionally create a separate filesystem for /srv/chroots and move the sbuild/schroot data to that partition&lt;br /&gt;
 sudo rsync -avz --delete /var/lib/schroot/ /srv/chroots/var/schroot/&lt;br /&gt;
 sudo rm -r /var/lib/schroot&lt;br /&gt;
 sudo ln -sf /srv/chroots/var/schroot /var/lib/schroot&lt;br /&gt;
 &lt;br /&gt;
 sudo rsync -avz --delete /var/lib/sbuild/ /srv/chroots/var/sbuild/&lt;br /&gt;
 sudo rm -r /var/lib/sbuild&lt;br /&gt;
 sudo ln -sf /srv/chroots/var/sbuild /var/lib/sbuild&lt;br /&gt;
 # end optionally&lt;br /&gt;
 &lt;br /&gt;
 # Create unstable/sid chroot&lt;br /&gt;
 sudo sbuild-createchroot --include apt-transport-https,ca-certificates sid /srv/chroots/sid http://deb.debian.org/debian/&lt;br /&gt;
 &lt;br /&gt;
 # Create buster chroot&lt;br /&gt;
 sudo sbuild-createchroot --include apt-transport-https,ca-certificates buster /srv/chroots/buster http://deb.debian.org/debian/&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 # If you use /etc/hosts to resolve *.internal.softwareheritage.org hosts&lt;br /&gt;
 echo hosts &amp;gt;&amp;gt; /etc/schroot/sbuild/nssdatabases&lt;br /&gt;
&lt;br /&gt;
=== schroot setup ===&lt;br /&gt;
&lt;br /&gt;
Now that the sbuild base setup is done. You now need to configure schroot to use an overlay filesystem, which will avoid copying the chroots at each build.&lt;br /&gt;
&lt;br /&gt;
You need to update the configuration (in &amp;lt;tt&amp;gt;/etc/schroot/chroot.d/*-sbuild-*&amp;lt;/tt&amp;gt;) with the following directives:&lt;br /&gt;
&lt;br /&gt;
 source-groups=root,sbuild&lt;br /&gt;
 source-root-groups=root,sbuild&lt;br /&gt;
 union-type=overlay&lt;br /&gt;
&lt;br /&gt;
This allows the sbuild group to edit the contents of the source chroot (for instance to update it) and sets up the overlay.&lt;br /&gt;
&lt;br /&gt;
You should also use this opportunity to add &amp;quot;aliases&amp;quot; to your chroot, so that sbuild will directly support the distributions we're using (unstable-swh, jessie-backports-swh):&lt;br /&gt;
&lt;br /&gt;
For unstable:&lt;br /&gt;
 aliases=unstable-amd64-sbuild,UNRELEASED-amd64-sbuild,unstable-swh-amd64-sbuild&lt;br /&gt;
&lt;br /&gt;
For buster:&lt;br /&gt;
 aliases=buster-swh-amd64-sbuild,buster-backports-amd64-sbuild,buster-backports-swh-amd64-sbuild&lt;br /&gt;
&lt;br /&gt;
==== dependencies cache ====&lt;br /&gt;
&lt;br /&gt;
Add the following line to schroot's fstab /etc/schroot/sbuild/fstab&lt;br /&gt;
to permit reuse of existing fetched dependencies:&lt;br /&gt;
&lt;br /&gt;
 /var/cache/apt/archives /var/cache/apt/archives none rw,bind 0 0&lt;br /&gt;
&lt;br /&gt;
You can also run apt-cacher-ng, which will avoid locking issues when several chroots try to access the package cache at once. You then need to add the proxy configuration to apt by adding a file in &amp;lt;tt&amp;gt;/etc/apt/apt.conf.d&amp;lt;/tt&amp;gt; on each chroot&lt;br /&gt;
&lt;br /&gt;
=== schroot update ===&lt;br /&gt;
&lt;br /&gt;
You should update your chroot environments once in a while (to avoid repeating over and over the same step during your package build):&lt;br /&gt;
&lt;br /&gt;
  sudo sbuild-update -udcar sid; sudo sbuild-update -udcar buster&lt;br /&gt;
&lt;br /&gt;
=== environment setup ===&lt;br /&gt;
&lt;br /&gt;
The Debian tools use a few variables to preset your name and email. Add this to your &amp;lt;tt&amp;gt;.&amp;lt;shell&amp;gt;rc&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 export DEBFULLNAME=&amp;quot;Debra Hacker&amp;quot;&lt;br /&gt;
 export DEBEMAIL=debra.hacker@example.com&lt;br /&gt;
&lt;br /&gt;
Make sure this data matches an uid for your GPG key. Else, you can use the &amp;lt;tt&amp;gt;DEBSIGN_KEYID=&amp;lt;yourfullkeyid&amp;gt;&amp;lt;/tt&amp;gt; variable.&lt;br /&gt;
(Future version of gpg2, e.g. 2.2.5 can refuse to sign with the short key id).&lt;br /&gt;
&lt;br /&gt;
=== overlay in tmpfs for faster builds ===&lt;br /&gt;
&lt;br /&gt;
You can add this to your fstab to put the overlay hierarchy in RAM:&lt;br /&gt;
&lt;br /&gt;
  tmpfs /var/lib/schroot/union/overlay tmpfs uid=root,gid=root,mode=0750,nr_inodes=0  0  0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Software development]]&lt;br /&gt;
[[Category:System administration]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=A_practical_approach_to_efficiently_store_100_billions_small_objects_in_Ceph&amp;diff=1590</id>
		<title>A practical approach to efficiently store 100 billions small objects in Ceph</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=A_practical_approach_to_efficiently_store_100_billions_small_objects_in_Ceph&amp;diff=1590"/>
		<updated>2021-07-06T14:23:35Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: /* Proposed object storage design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [https://en.wikipedia.org/wiki/Software_Heritage Software Heritage] project mission is to collect, preserve and share all software that is available in source code form, with the goal of building a common, shared infrastructure at the service of industry, research, culture and society as a whole. As of February 2021 it contains 10 billions unique source code files (or “objects”, in the following) totaling ~750TB of (uncompressed) data and grows by 50TB every month. 75% of these objects have a size smaller than 16KB and 50% have a size smaller than 4KB. But these small objects only account for ~5% of the 750TB: 25% of the objects have a size &amp;amp;gt; 16KB and occupy ~700TB.&lt;br /&gt;
&lt;br /&gt;
The desired performances for '''10PB''' and '''100 billions objects''' are as follows:&lt;br /&gt;
&lt;br /&gt;
* The clients aggregated together can write at least 3,000 objects/s and at least 100MB/s.&lt;br /&gt;
* The clients aggregated together can read at least 3,000 objects/s and at least 100MB/s.&lt;br /&gt;
* There is no space amplification for small objects.&lt;br /&gt;
* Getting the first byte of any object never takes longer than 100ms.&lt;br /&gt;
* Objects can be enumerated in bulk, at least one million at a time.&lt;br /&gt;
* Mirroring the content of the Software Heritage archive can be done in bulk, at least one million objects at a time.&lt;br /&gt;
&lt;br /&gt;
Using an off-the-shelf object storage such as the [https://docs.ceph.com/en/latest/radosgw/ Ceph Object Gateway] or [https://min.io/ MinIO] does not meet the requirements:&lt;br /&gt;
&lt;br /&gt;
* There is a significant space amplification for small objects: at least 25%, depending on the object storage (see “How does packing Objects save space?” below for details)&lt;br /&gt;
* Mirroring the content of the archive can only be done one object at a time and not in bulk which takes at least 10 times longer (see “How does packing Objects help with enumeration?” for details)&lt;br /&gt;
&lt;br /&gt;
A new solution must be implemented by re-using existing components and made available for system administrators to conveniently deploy and maintain in production. There are three ways to do that:&lt;br /&gt;
&lt;br /&gt;
* Contribute packaging and stable releases to a codebase such as [https://github.com/linkedin/ambry Ambry].&lt;br /&gt;
* Modify an object storage such as MinIO to support object packing.&lt;br /&gt;
* Get inspiration from an object storage design such as [https://eos-web.web.cern.ch/eos-web/ EOS] and implement something from scratch.&lt;br /&gt;
&lt;br /&gt;
For reasons explained below (see “Storage solutions and TCO”), it was decided to design a new object storage and implement it from scratch.&lt;br /&gt;
&lt;br /&gt;
= Proposed object storage design =&lt;br /&gt;
&lt;br /&gt;
In a nutshell, objects are written to databases running on a fixed number of machines (the Write Storage) that can vary to control the write throughput. When a threshold is reached (e.g. 100GB) all objects are put together in container (a Shard), and moved to a readonly storage that keeps expanding over time. After a successful write, a unique identifier (the Object ID) is returned to the client. It can be used to read the object back from the readonly storage. Reads scale out because the unique identifiers of the objects embed the name of the container (the Shard UUID). Writes also scales out because the Database is chosen randomly. This is the Layer 0.&lt;br /&gt;
&lt;br /&gt;
Clients that cannot keep track of the name of the container can rely on an API that relies on an index mapping all known objects signatures (the Object HASH below) to the name of the container where they can be found. Although this index prevents scaling out writes, the readonly storage can still scale out by multiplying copies of the index as needed. This is the Layer 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                      Layer 0 scales out&lt;br /&gt;
&lt;br /&gt;
      +--- write op ----+               +--- read  op ----+&lt;br /&gt;
      v                 ^               v                 ^&lt;br /&gt;
   Object &amp;amp;             |               |                 |&lt;br /&gt;
   Object HASH     Object ID         Object ID         Object&lt;br /&gt;
      |            Object HASH          |                 |&lt;br /&gt;
      v            Shard UUID           v                 ^&lt;br /&gt;
      |                 |               |                 |&lt;br /&gt;
      v                 ^               v                 ^&lt;br /&gt;
    +---- Write Storage --------+  +---- Read Storage --------+&lt;br /&gt;
    |                           |  |                          |&lt;br /&gt;
    | +----------+              |  | +-------+      +-------+ |&lt;br /&gt;
    | | Database |-&amp;gt;--Packing-&amp;gt;----&amp;gt; | Shard |      | Shard | |&lt;br /&gt;
    | +----------+              |  | +-------+      +-------+ |&lt;br /&gt;
    | +----------++----------+  |  | +-------+      +-------+ |&lt;br /&gt;
    | | Database || Database |  |  | | Shard |      | Shard | |&lt;br /&gt;
    | +----------++----------+  |  | +-------+      +-------+ |&lt;br /&gt;
    |                           |  | +-------+      +-------+ |&lt;br /&gt;
    +---------------------------+  | | Shard |      | Shard | |&lt;br /&gt;
                                   | +-------+      +-------+ |&lt;br /&gt;
                                   |            ...           |&lt;br /&gt;
                                   +--------------------------+&lt;br /&gt;
&lt;br /&gt;
                      Layer 1 reads scale out&lt;br /&gt;
&lt;br /&gt;
    +---- Write Storage --------+  +---- Read Storage ---------+&lt;br /&gt;
    |                           |  |                           |&lt;br /&gt;
    |+-------------------------+|  |+-------------------------+|&lt;br /&gt;
    ||Object HASH to Shard UUID||  ||Object HASH to Shard UUID||&lt;br /&gt;
    ||        index            |&amp;gt;&amp;gt;&amp;gt;&amp;gt;|        index            ||&lt;br /&gt;
    |+-------------------------+|  |+-------------------------+|&lt;br /&gt;
    +---------------------------+  |+-------------------------+|&lt;br /&gt;
       |                 |         ||Object HASH to Shard UUID||&lt;br /&gt;
       ^                 v         ||        index            ||&lt;br /&gt;
       |                 |         |+-------------------------+|&lt;br /&gt;
       ^                 v         |          ...              |&lt;br /&gt;
     Object              |         +---------------------------+&lt;br /&gt;
   Object HASH           v                |                 |&lt;br /&gt;
       |                 |                ^                 v&lt;br /&gt;
       ^                 v                |                 |&lt;br /&gt;
       |                 |            Object HASH        Object&lt;br /&gt;
       ^                 v                |                 |&lt;br /&gt;
       |                 |                ^                 v&lt;br /&gt;
       +--- write op ----+                +--- read  op ----+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Ceph-objstorage-sw-architecture.svg]]&lt;br /&gt;
&lt;br /&gt;
== Glossary ==&lt;br /&gt;
&lt;br /&gt;
* Object: an opaque sequence of bytes.&lt;br /&gt;
* Object HASH: the hash of an Object, e.g., the checksum part of a [https://docs.softwareheritage.org/devel/swh-model/persistent-identifiers.html#core-identifiers SWHID].&lt;br /&gt;
* Shard: a group of Objects, used to partition the full set of objects into manageable subsets.&lt;br /&gt;
* Shard UUID: the unique identifier of a Shard, as a [https://en.wikipedia.org/wiki/Universally_unique_identifier UUID].&lt;br /&gt;
* Object ID: a pair made of the Object HASH and the Shard UUID containing the object.&lt;br /&gt;
* Global Index: a table mapping the Object HASH to the Shard UUID that contains the Object.&lt;br /&gt;
* Read Storage: the unlimited size storage from which clients can only read Objects. It only contains Objects up to a given point in time.&lt;br /&gt;
* Write Storage: the fixed size storage from which clients can read or write. If an Object is not found in the Write storage, it must be retrieved from the Read Storage.&lt;br /&gt;
* Object Storage: the content of the Write Storage and the Read Storage combined.&lt;br /&gt;
* Database: [https://en.wikipedia.org/wiki/PostgreSQL PostgreSQL], [https://en.wikipedia.org/wiki/Apache_Cassandra Cassandra], etc.&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Ceph_(software) Ceph]: a self-healing distributed storage.&lt;br /&gt;
* [https://docs.ceph.com/en/latest/rbd/ RBD] image: a Ceph block storage that can either be used via the librbd library or as a block device from /dev/rbd.&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Total_cost_of_ownership TCO]: Total Cost of Ownership&lt;br /&gt;
&lt;br /&gt;
The key concepts are:&lt;br /&gt;
&lt;br /&gt;
* Packing millions of Objects together in Shards to:&lt;br /&gt;
** save space and,&lt;br /&gt;
** efficiently perform bulk actions such as mirroring or enumerations.&lt;br /&gt;
* Two different storage:&lt;br /&gt;
** Read Storage that takes advantage of the fact that Objects are immutable and never deleted and,&lt;br /&gt;
** Write Storage from which Shards are created and moved to the Read Storage.&lt;br /&gt;
* Identifying an object by its Object HASH and the Shard UUID that contains it so that its location can be determined from the Object ID.&lt;br /&gt;
&lt;br /&gt;
While the architecture based on these concepts scales out for writing and reading, it cannot be used to address Objects with their Object HASH alone which is inconvenient for a number of use cases. An index mapping the Object HASH to the Shard UUID must be added to provide this feature, but it does not scale out writes.&lt;br /&gt;
&lt;br /&gt;
The content of the Object Storage (i.e., the Write Storage and the Read Storage combined) is '''strongly/strictly consistent'''. As soon as an Object is written (i.e., the write operation returns to the client), a reader can get the Object content from the Object Storage (with the caveat that it may require looking up the object from both the Write Storage and Read Storage).&lt;br /&gt;
&lt;br /&gt;
The Read Storage is '''eventually consistent'''. It does not contain the latest Objects inserted in the Write Storage but it will, eventually. It contains all objects inserted in the Object Storage, up to a given point in time.&lt;br /&gt;
&lt;br /&gt;
== Layer 0 (Object lookup require a complete Object ID) ==&lt;br /&gt;
&lt;br /&gt;
=== Architecture ===&lt;br /&gt;
&lt;br /&gt;
* Write Storage:&lt;br /&gt;
** A fixed number of Databases&lt;br /&gt;
* Read Storage:&lt;br /&gt;
** Shards implemented as Ceph RBD images named after their Shard UUID&lt;br /&gt;
** The content of the Shard uses a format that allows retrieving an Object in O(1) given the Object HASH&lt;br /&gt;
&lt;br /&gt;
=== Writing ===&lt;br /&gt;
&lt;br /&gt;
The Object is stored in one of the Databases from the Write Storage. The Database is chosen at random. A database is associated with a unique Shard UUID, chosen at random. All Objects written to a Database will be stored in the same Shard.&lt;br /&gt;
&lt;br /&gt;
A successful Object write returns the Object ID. Writing the same object twice may return different Object IDs. The Object HASH will be the same because it is based on the content of the Object. But the Shard in which the Object is stored may be different since it is chosen at random.&lt;br /&gt;
&lt;br /&gt;
=== Packing ===&lt;br /&gt;
&lt;br /&gt;
When a Database grows bigger than a threshold (for instance 100GB), it stops accepting writes. A Shard is created in the Read Storage and Objects in the Database are sorted and copied to it. When the Shard is complete, the Database is deleted. Another Database is created, a new Shard UUID is allocated and it starts accepting writes.&lt;br /&gt;
&lt;br /&gt;
=== Reading ===&lt;br /&gt;
&lt;br /&gt;
The Shard UUID is extracted from the Object ID. If a Shard exists in the Read Storage, the Object HASH is used to lookup the content of the Object. Otherwise the Database that owns the Shard UUID is looked up in the Write Storage and the Object HASH is used to lookup the content of the Object. If the reader is not interested in the most up to date content, it can limit its search to the Read Storage.&lt;br /&gt;
&lt;br /&gt;
== Layer 1 (Objects can be looked up using the Object HASH alone) ==&lt;br /&gt;
&lt;br /&gt;
A Global Index mapping the Object HASH of all known Objects to the Shard UUID is used to:&lt;br /&gt;
&lt;br /&gt;
* allow clients to fetch Objects using their Object HASH only instead of their Object ID.&lt;br /&gt;
* deduplicate identical Objects based on their Object HASH&lt;br /&gt;
&lt;br /&gt;
=== Architecture ===&lt;br /&gt;
&lt;br /&gt;
* Write Storage:&lt;br /&gt;
** Read/write Global Index of all known Objects in the Write Storage and the Read Storage&lt;br /&gt;
* Read Storage:&lt;br /&gt;
** Read/write Global Index of all known Objects in the Read Storage&lt;br /&gt;
** Multiple readonly replicas of the Global Index of all known Objects in the Read Storage&lt;br /&gt;
&lt;br /&gt;
=== Writing ===&lt;br /&gt;
&lt;br /&gt;
If the Object HASH exists in the Read Storage Global Index, do nothing. Otherwise perform the write and add the Object ID to the Write Storage Global Index. There may be duplicate Objects in the Write Storage. It is expected that they race to be inserted in the Write Storage Global Index.&lt;br /&gt;
&lt;br /&gt;
=== Packing ===&lt;br /&gt;
&lt;br /&gt;
During packing, each Object HASH is looked up in the Read Storage Global Index. If it exists, the object is discarded. Otherwise its Object ID is added to the Read Storage Global Index. When packing is complete:&lt;br /&gt;
&lt;br /&gt;
* Readonly replicas of the Read Storage Global Index are updated with the newly added Object IDs.&lt;br /&gt;
* Object HASH that were found to be duplicate are updated in the Write Storage Global Index. The Object HASH is mapped to the Shard UUID retrieved from the Read Storage Global Index.&lt;br /&gt;
&lt;br /&gt;
=== Reading ===&lt;br /&gt;
&lt;br /&gt;
If the Object HASH is found in the Read Storage Global Index, use the Shard UUID to read the Object content from the Shard found in the Read Storage. Otherwise lookup the Object HASH from the Write Storage Global Index and read the content of the Object from the Database that owns the Shard UUID.&lt;br /&gt;
&lt;br /&gt;
= How does packing Objects save space? =&lt;br /&gt;
&lt;br /&gt;
The short answer is: it does not when Objects are big enough, but it does when there are a lot of small Objects.&lt;br /&gt;
&lt;br /&gt;
If there are billions of objects (i.e., less than one billion is not a lot) and 50% of them have a size smaller than 4KB and 75% of them have a size smaller than 16KB (i.e., bigger than 16KB is not small), then packing will save space.&lt;br /&gt;
&lt;br /&gt;
In the simplest method of packing (i.e., appending each Object after another in a file) and since the Object HASH has a fixed size, the only overhead for each object is the size of the Object (8 bytes). Assuming the Shard containing the Objects is handled as a single 100GB Ceph RBD Image, it adds R bytes. If the underlying Ceph pool is erasure coded k=4,m=2 an additional 50% must be added.&lt;br /&gt;
&lt;br /&gt;
Retrieving an Object from a Shard would be O(n) in this case because there is no index. It is more efficient to [https://en.wikipedia.org/wiki/Perfect_hash_function add a minimal hash table] to the Shard so that finding an object is O(1) instead. That optimization requires an additional 8 bytes per Object to store their offset, i.e. a total of 16 bytes per object.&lt;br /&gt;
&lt;br /&gt;
If Objects are not packed together, each of them requires at least B bytes, which is the minimum space overhead imposed by the underlying storage system. And an additional 50% for durability. The space used by Objects that are smaller than a given threshold will be amplified, depending on the underlying storage. For instance all objects in Ceph have a minimum size of 4KB, therefore the size of a 1KB Object will be amplified to 4KB which translates to a [https://forge.softwareheritage.org/T3052#58864 35% space amplification]. Another example is MinIO with [https://github.com/minio/minio/issues/7395#issuecomment-475161144 over 200% space amplification] or [https://wiki.openstack.org/wiki/Swift/ideas/small_files#Challenges Swift] for which [https://www.ovh.com/blog/dealing-with-small-files-with-openstack-swift-part-2/ packing small files was recently proposed].&lt;br /&gt;
&lt;br /&gt;
To summarize, the overhead of storing M Objects totaling S bytes with M=100 billions and S=10PB is:&lt;br /&gt;
&lt;br /&gt;
* '''packed:''' ~15.5PB&lt;br /&gt;
** (S / 100GB) * R == (10PB / 100GB) * R bytes = 10,000 * R bytes&lt;br /&gt;
** (M * 24) = 100G Objects * 24 bytes = 2.4TB&lt;br /&gt;
** 50% for durability = 10PB * 0.5 = 5PB&lt;br /&gt;
* '''not packed:''' ~17.5PB based on the optimistic assumption that the storage system has a 25% space overhead for small files&lt;br /&gt;
** 25% for space amplification = 10PB * 0.25 = 2.5PB&lt;br /&gt;
** 50% for durability = 10PB * 0.5 = 5PB&lt;br /&gt;
&lt;br /&gt;
= How does packing Objects help with enumeration? =&lt;br /&gt;
&lt;br /&gt;
For mirroring or running an algorithm on all objects, they must be enumerated. If they are not packed together in any way, which is the case with MinIO or Swift, they must be looked up individually. When they are packed together (one million or more), the reader can download an entire Shard instead, saving the accumulated delay imposed by millions of individual lookup.&lt;br /&gt;
&lt;br /&gt;
If looking up an individual Object takes 10 milliseconds and Shards can be read at 100MB/s:&lt;br /&gt;
&lt;br /&gt;
* Getting 1 billion objects requires 10 millions seconds which is over 100 days.&lt;br /&gt;
* One billion objects is 1/10 of the current content of Software Heritage, i.e. ~75TB which can be transferred by reading the Shards in less than 10 days&lt;br /&gt;
&lt;br /&gt;
= Storage solutions and TCO =&lt;br /&gt;
&lt;br /&gt;
When looking for off-the-shelf solutions all options were considered, [https://forge.softwareheritage.org/T3107 including distributed file systems such as IPFs and more] and most of them were discarded because they had at least one blocker that could not be fixed (e.g. no feature to guarantee the durability of an object). In the end a few remained, either including the following features or with the possibility for a third party to contribute them back to the project:&lt;br /&gt;
&lt;br /&gt;
* '''Scale''' to 100 billions objects&lt;br /&gt;
* Provide object '''packing'''&lt;br /&gt;
* Provide detailed '''documentation''' and community support for system administrators operating the storage&lt;br /&gt;
* Be thoroughly '''tested''' before a stable release is published&lt;br /&gt;
* Be '''packaged''' for at least one well known distribution&lt;br /&gt;
* Have '''stable releases''' maintained for at least two years&lt;br /&gt;
* A sound approach to address '''security''' problems (CVE etc.)&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Name&lt;br /&gt;
! RGW&lt;br /&gt;
! EOS&lt;br /&gt;
! SeaweedFS&lt;br /&gt;
! MinIO&lt;br /&gt;
! Swift&lt;br /&gt;
! Ambry&lt;br /&gt;
|-&lt;br /&gt;
| Scaling&lt;br /&gt;
| Yes&lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| Packing&lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| No&lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| Documentation&lt;br /&gt;
| Good&lt;br /&gt;
| Average&lt;br /&gt;
| Terse&lt;br /&gt;
| Good&lt;br /&gt;
| Good&lt;br /&gt;
| Terse&lt;br /&gt;
|-&lt;br /&gt;
| Tests&lt;br /&gt;
| Good&lt;br /&gt;
| Few&lt;br /&gt;
| Few&lt;br /&gt;
| Average&lt;br /&gt;
| Good&lt;br /&gt;
| Few&lt;br /&gt;
|-&lt;br /&gt;
| Packages&lt;br /&gt;
| Yes&lt;br /&gt;
| No&lt;br /&gt;
| No&lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| Stable releases&lt;br /&gt;
| Yes&lt;br /&gt;
| No&lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| Security&lt;br /&gt;
| Yes&lt;br /&gt;
| No&lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Does not have stable releases and testing ==&lt;br /&gt;
&lt;br /&gt;
The performance goals, size distribution and the number of objects in Software Heritage are similar to what is described in the 2010 article “[https://www.usenix.org/legacy/event/osdi10/tech/full_papers/Beaver.pdf Finding a needle in Haystack: Facebook’s photo storage]” that motivated the implementation of [https://github.com/chrislusf/seaweedfs SeaweedFS] in 2013 or [https://github.com/linkedin/ambry Ambry], the object storage published in 2017 by LinkedIn to store and serve trillions of media objects in web companies.&lt;br /&gt;
&lt;br /&gt;
Contributing to SeaweedFS or Ambry so they can be deployed and maintained would require:&lt;br /&gt;
&lt;br /&gt;
* Creating packages for the target Operating System (e.g. Debian GNU/Linux), maintaining a repository to distribute them, upload them to the official distribution repository so that they are available in the next stable release (about two years from now)&lt;br /&gt;
* Creating Ansible roles or Puppet modules for deployment on multiple machines&lt;br /&gt;
* Improving the documentation with a configuration and architecture guide to deploy at scale&lt;br /&gt;
* Discuss with upstream to create stable releases, define their lifecycle and organize release management&lt;br /&gt;
* Establish a security team in charge of handling the CVE&lt;br /&gt;
* Setup and infrastructure and create the software for integration testing to be run before a stable release is published to reduce the risk of regressions or data loss. This is specially important because a significant part of the software is dedicated to data storage and replication: bugs can lead to data loss or corruption.&lt;br /&gt;
&lt;br /&gt;
== Does not provide object packing ==&lt;br /&gt;
&lt;br /&gt;
[https://min.io/ MinIO] and [https://docs.openstack.org/swift/latest/ Swift] suffer from a space amplification problem and they do not provide object packing. Although [https://docs.ceph.com/en/latest/radosgw/ Ceph Object Gateway] (also known as RGW) stores objects in RocksDB instead of files, it also suffers from a space amplification problem and does not provide object packing.&lt;br /&gt;
&lt;br /&gt;
Contributing to RGW, MinIO or Swift to add object packing would require:&lt;br /&gt;
&lt;br /&gt;
* Creating a blueprint to modify the internals to add object packing&lt;br /&gt;
* Discuss with upstream to validate the blueprint&lt;br /&gt;
* Implement the blueprint and the associated tests&lt;br /&gt;
&lt;br /&gt;
== Does not scale ==&lt;br /&gt;
&lt;br /&gt;
[https://eos-web.web.cern.ch/eos-web/ EOS] is based on Ceph and architectured for packing large objects in [https://docs.ceph.com/en/latest/rbd/ RBD]. However, it is not designed to scale over a few billion objects. Contrary to Ambry, Swift and other similar solutions, it delegates storage to Ceph which make it easier to modify and release without risking data loss or corruption. Instead of modifying EOS to scale to 100 billions objects, it is more practical to:&lt;br /&gt;
&lt;br /&gt;
* Write an EOS alternative from scratch, using the same ideas and adding the desired scalability&lt;br /&gt;
* Package&lt;br /&gt;
* Document&lt;br /&gt;
* Test&lt;br /&gt;
* Publish stable releases&lt;br /&gt;
* Define a security policy&lt;br /&gt;
&lt;br /&gt;
== Estimating the TCO ==&lt;br /&gt;
&lt;br /&gt;
Since no solution can be used as is, some work must be done in each case and the effort it requires should be compared. It is however difficult because the nature of the effort is different. The following factors were considered and aggregated in a TCO estimate.&lt;br /&gt;
&lt;br /&gt;
* '''Data loss risk:''' if a bug in the work done implies the risk of losing data, it makes the work significantly more complicated. It is the case if packing must be implemented in the internals of an existing object storage such as Swift. It is also the case if an object storage does not have integration testing to verify upgrading to a newer version won’t lead to a regression, which is the case with Ambry. It is likely that the Ambry upstream has extensive integration testing but they are not published.&lt;br /&gt;
* '''Large codebase:''' a large codebase means modifying it (to implement packing) or distributing it (packaging and documentation) is more difficult&lt;br /&gt;
* '''Language:''' if the language and its environment is familiar to the developers and the system administrators, the work is less difficult&lt;br /&gt;
* '''Skills:''' if the work requires highly specialized skills (such as an intimate understanding of how a distributed storage system guarantees a strict consistency of the data, or running integration tests that require a cluster of machines) it is more difficult&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!&lt;br /&gt;
! RGW&lt;br /&gt;
! EOS&lt;br /&gt;
! SeaweedFS&lt;br /&gt;
! MinIO&lt;br /&gt;
! Swift&lt;br /&gt;
! Ambry&lt;br /&gt;
|-&lt;br /&gt;
| Data loss risk&lt;br /&gt;
| Yes&lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| Large codebase&lt;br /&gt;
| Yes&lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| Language&lt;br /&gt;
| C++&lt;br /&gt;
| Python&lt;br /&gt;
| Go&lt;br /&gt;
| Go&lt;br /&gt;
| Python&lt;br /&gt;
| Java&lt;br /&gt;
|-&lt;br /&gt;
| Skills&lt;br /&gt;
| High&lt;br /&gt;
| Medium&lt;br /&gt;
| High&lt;br /&gt;
| High&lt;br /&gt;
| High&lt;br /&gt;
| High&lt;br /&gt;
|-&lt;br /&gt;
| TCO estimate&lt;br /&gt;
| High&lt;br /&gt;
| Medium&lt;br /&gt;
| High&lt;br /&gt;
| High&lt;br /&gt;
| High&lt;br /&gt;
| High&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In a nutshell, implementing an alternative to EOS from scratch has the lowest TCO estimate, primarily because it is independent of the underlying distributed storage.&lt;br /&gt;
&lt;br /&gt;
[[Category:Software development]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=File:Ceph-objstorage-sw-architecture.svg&amp;diff=1589</id>
		<title>File:Ceph-objstorage-sw-architecture.svg</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=File:Ceph-objstorage-sw-architecture.svg&amp;diff=1589"/>
		<updated>2021-07-06T14:22:32Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=File:Nm_openvpn_base.png&amp;diff=1582</id>
		<title>File:Nm openvpn base.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=File:Nm_openvpn_base.png&amp;diff=1582"/>
		<updated>2021-06-23T15:22:58Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: NicolasDandrimont uploaded a new version of File:Nm openvpn base.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=VPN&amp;diff=1581</id>
		<title>VPN</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=VPN&amp;diff=1581"/>
		<updated>2021-06-23T15:19:27Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [[Software Heritage]] server and the VMs running on it are severely firewalled.&lt;br /&gt;
To get onto their network unrestricted, a VPN based on [https://openvpn.net/ OpenVPN] is available.&lt;br /&gt;
&lt;br /&gt;
The setup is client-server, with per-client certificates.&lt;br /&gt;
&lt;br /&gt;
== OpenVPN client configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Raw OpenVPN ===&lt;br /&gt;
&lt;br /&gt;
Sample configuration file, e.g., /etc/openvpn/swh.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remote vpn.softwareheritage.org&lt;br /&gt;
ns-cert-type server &lt;br /&gt;
comp-lzo &lt;br /&gt;
nobind&lt;br /&gt;
dev tun&lt;br /&gt;
proto udp &lt;br /&gt;
port 1194 &lt;br /&gt;
log /var/log/openvpn.log&lt;br /&gt;
up-restart &lt;br /&gt;
persist-key &lt;br /&gt;
persist-tun &lt;br /&gt;
client &lt;br /&gt;
ca /etc/openvpn/keys/softwareheritage-ca.crt&lt;br /&gt;
cert /etc/openvpn/keys/softwareheritage.crt&lt;br /&gt;
key /etc/openvpn/keys/softwareheritage.key&lt;br /&gt;
user nobody&lt;br /&gt;
group nogroup&lt;br /&gt;
&lt;br /&gt;
# If you are using resolvconf, add this:&lt;br /&gt;
# Make sure you add louvre to /etc/hosts to avoid issues in using the vpn-provided DNS server.&lt;br /&gt;
script-security 2&lt;br /&gt;
up /etc/openvpn/update-resolv-conf&lt;br /&gt;
down /etc/openvpn/update-resolv-conf&lt;br /&gt;
&lt;br /&gt;
# If you want the connection to persist when your network fails, add this:&lt;br /&gt;
ping-restart 10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition to the above configuration file, you will need to install the following 3 files under /etc/openvpn/keys (matching the paths within the sample above):&lt;br /&gt;
&lt;br /&gt;
* '''[[softwareheritage-ca.crt]]''': ''public'' certificate for the Software Heritage certification authority (CA)&lt;br /&gt;
* '''[https://wiki.softwareheritage.org/index.php?title=VPN#For_admins softwareheritage.crt]''': ''public'', client-specific (certificate signed by the admin, see below)&lt;br /&gt;
* '''[https://wiki.softwareheritage.org/wiki/VPN#For_users softwareheritage.key]''': ''private'', client-specific key (generated by the user, see below)&lt;br /&gt;
&lt;br /&gt;
Activate the openvpn server&lt;br /&gt;
&lt;br /&gt;
as root, run&lt;br /&gt;
&lt;br /&gt;
   systemctl enable openvpn@swh.service&lt;br /&gt;
   systemctl start openvpn@swh.service&lt;br /&gt;
   systemctl status openvpn@swh.service&lt;br /&gt;
&lt;br /&gt;
Note: Internally, the `swh` must match the /etc/openvpn/swh.conf filename.&lt;br /&gt;
&lt;br /&gt;
Excerpt of a successful start:&lt;br /&gt;
&lt;br /&gt;
  root@machine:~# systemctl status openvpn@swh.service&lt;br /&gt;
  openvpn@swh.service - OpenVPN connection to swh&lt;br /&gt;
   Loaded: loaded (/lib/systemd/system/openvpn@.service; indirect; vendor preset: enabled)&lt;br /&gt;
   Active: active (running) since Thu 2020-12-17 19:03:29 IST; 22min ago&lt;br /&gt;
     Docs: man:openvpn(8)&lt;br /&gt;
           https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage&lt;br /&gt;
           https://community.openvpn.net/openvpn/wiki/HOWTO&lt;br /&gt;
 Main PID: 12302 (openvpn)&lt;br /&gt;
   Status: &amp;quot;Initialization Sequence Completed&amp;quot;&lt;br /&gt;
    Tasks: 1 (limit: 4915)&lt;br /&gt;
   CGroup: /system.slice/system-openvpn.slice/openvpn@swh.service&lt;br /&gt;
           └─12302 /usr/sbin/openvpn --daemon ovpn-swh --status /run/openvpn/swh.status 10 --cd /etc/openvpn --script-security 2 --config /etc/openvpn/swh.conf --writepid /run/openvpn/swh.pid&lt;br /&gt;
&lt;br /&gt;
Dec 17 19:03:29 machine systemd[1]: Starting OpenVPN connection to swh...&lt;br /&gt;
Dec 17 19:03:29 machine systemd[1]: Started OpenVPN connection to swh.&lt;br /&gt;
&lt;br /&gt;
=== Network Manager GUI ===&lt;br /&gt;
&lt;br /&gt;
You need network-manager-openvpn and network-manager-openvpn-gnome for the configuration gui.&lt;br /&gt;
&lt;br /&gt;
[[File:nm_openvpn_base.png]]&lt;br /&gt;
[[File:nm_openvpn_routes.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_general.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_security.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_tls_auth.png]]&lt;br /&gt;
&lt;br /&gt;
== Obtaining a client certificate ==&lt;br /&gt;
&lt;br /&gt;
=== For users ===&lt;br /&gt;
&lt;br /&gt;
Generate a keypair (key + certificate signing request) using the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openssl req -new -newkey rsa:2048 -nodes -keyout openvpn.key -out openvpn.csr -subj &amp;quot;/CN=&amp;lt;your username&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please replace &amp;lt;your username&amp;gt; with something that uniquely identifies the certificate.&lt;br /&gt;
&lt;br /&gt;
Make sure openvpn.key is stored in a safe place (it's your private key, which will allow anyone to connect to the VPN).&lt;br /&gt;
&lt;br /&gt;
Provide the CSR file to a sysadmin through a reasonably authenticated medium.&lt;br /&gt;
&lt;br /&gt;
=== For admins ===&lt;br /&gt;
&lt;br /&gt;
On louvre:&lt;br /&gt;
&lt;br /&gt;
Fetch the CSR file provided by the user, for instance with &amp;lt;tt&amp;gt;scp USERNAME.csr louvre:&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, as root on louvre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@louvre:~# cd /etc/openvpn/keys&lt;br /&gt;
root@louvre:/etc/openvpn/keys# ./easyrsa import-req ~ADMIN/USERNAME.csr USERNAME&lt;br /&gt;
root@louvre:/etc/openvpn/keys# ./easyrsa sign-req client USERNAME&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first command imports the csr into the EasyRSA PKI. The second command lets you review and sign it.&lt;br /&gt;
&lt;br /&gt;
Send the signed certificate, &amp;lt;tt&amp;gt;/etc/openvpn/keys/pki/issued/USERNAME.crt&amp;lt;/tt&amp;gt;, to the user. That file only contains public key material.&lt;br /&gt;
&lt;br /&gt;
Add the DNS entry for the new host to hiera and do a puppet run on pergamon.&lt;br /&gt;
&lt;br /&gt;
== Revoking a client certificate ==&lt;br /&gt;
&lt;br /&gt;
On louvre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@louvre:~# cd /etc/openvpn/keys&lt;br /&gt;
root@louvre:/etc/openvpn/keys# ./easyrsa revoke USERNAME&lt;br /&gt;
[ say yes ]&lt;br /&gt;
root@louvre:/etc/openvpn/keys# ./easyrsa gen-crl; chmod a+r pki/crl.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OpenVPN re-reads the CRL at each connection (which is why we need the CRL to be world-readable), so once the cert is revoked, there's nothing more to do. If you want to make sure the client is disconnected, you need to restart OpenVPN (which will make all clients reconnect).&lt;br /&gt;
&lt;br /&gt;
== /etc/hosts entries ==&lt;br /&gt;
&lt;br /&gt;
Once the Vpn is setup on your machine, you can access Software Heritage hosts via their private IP addresses; see [[Network configuration]].&lt;br /&gt;
&lt;br /&gt;
OpenVPN now pushes the address of our DNS server (192.168.100.29, pergamon).&lt;br /&gt;
&lt;br /&gt;
You might want to add louvre.softwareheritage.org in your /etc/hosts to avoid a bootstrap problem if the &amp;quot;on-vpn&amp;quot; DNS server is in your resolv.conf.&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastructure]]&lt;br /&gt;
[[Category:System administration]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Matrix&amp;diff=1578</id>
		<title>Matrix</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Matrix&amp;diff=1578"/>
		<updated>2021-06-15T15:53:24Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: /* IRC authentication */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== IRC channels ==&lt;br /&gt;
&lt;br /&gt;
The following channels have been registered on the [https://libera.chat/ libera.chat] IRC network for [[Software Heritage]] usage.&lt;br /&gt;
&lt;br /&gt;
* [https://app.element.io/#/room/#swh-devel:matrix.org '''#swh-devel''']: public development discussions&lt;br /&gt;
* [https://app.element.io/#/room/#swh-sysadm:matrix.org '''#swh-sysadm''']: operations team discussions/bots&lt;br /&gt;
* [https://app.element.io/#/room/#swh-offtopic:matrix.org '''#swh-offtopic''']: Off-topic discussions&lt;br /&gt;
* [https://app.element.io/#/room/#swh-team:matrix.org '''#swh-team''']: private discussions of the core team&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you use IRC, consider joining the channels.&lt;br /&gt;
&lt;br /&gt;
If you don't use IRC ''directly'', you can still join our chat channels from your web browser via a [https://matrix.org/ Matrix] bridge by clicking on the channel names in the list above. You will be asked to create a [https://element.io/ Element] account if you don't have one yet.&lt;br /&gt;
&lt;br /&gt;
== IRC authentication ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Libera.chat defaults to blocking private messages from unauthentified users! All users should register their nicknames to be able to message one another privately, by following the instructions below.&amp;lt;/b&amp;gt; If you're really unable to register, you should ask your correspondent to [https://libera.chat/guides/usermodes consider setting usermode &amp;lt;tt&amp;gt;-R&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;+g&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
To register an account with NickServ, please follow [https://libera.chat/guides/registration the registration instructions provided by libera.chat staff].&lt;br /&gt;
&lt;br /&gt;
You will then receive an e-mail containing a link to activate you account. After doing so, you need to configure your client to auto-authenticate. The recommended way of doing that is using [https://libera.chat/guides/sasl SASL authentication].&lt;br /&gt;
&lt;br /&gt;
For matrix, the relevant docs is here: https://github.com/matrix-org/matrix-appservice-irc/wiki/End-user-FAQ#how-do-i-registeridentify-to-nickserv&lt;br /&gt;
&lt;br /&gt;
libera.chat also supports authentication via [https://libera.chat/guides/certfp TLS client certificates (using SASL EXTERNAL)].&lt;br /&gt;
&lt;br /&gt;
=== Matrix bridge ===&lt;br /&gt;
&lt;br /&gt;
For registering an account through the Matrix bridge ([https://github.com/matrix-org/matrix-appservice-irc/wiki/End-user-FAQ#how-do-i-registeridentify-to-nickserv relevant docs here]), please follow these instructions:&lt;br /&gt;
&lt;br /&gt;
1. Choose a short nickname (the default nickname picked by the matrix bridge has a [m] and can be quite long, as it defaults to the full local part of your matrix handle)&lt;br /&gt;
&lt;br /&gt;
 /msg @appservice:libera.chat !nick &amp;lt;USERNAME&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Send this command to NickServ to register your account:&lt;br /&gt;
&lt;br /&gt;
 /msg @NickServ:libera.chat register &amp;lt;PASSWORD&amp;gt; &amp;lt;EMAIL&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Once you receive the confirmation email with a token, activate your account by using:&lt;br /&gt;
&lt;br /&gt;
 /msg @NickServ:libera.chat VERIFY REGISTER &amp;lt;USERNAME&amp;gt; &amp;lt;TOKEN RECEIVED BY EMAIL&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Give the Matrix bridge appservice your password so that you get identified automatically when matrix reconnects you to IRC:&lt;br /&gt;
&lt;br /&gt;
 /msg @appservice:libera.chat !username &amp;lt;USERNAME&amp;gt;&lt;br /&gt;
 /msg @appservice:libera.chat !storepass &amp;lt;PASSWORD&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IRC access list ==&lt;br /&gt;
&lt;br /&gt;
To auto-voice people with a registered nick (only doable by people with +fA access modes will be able to do it), add them to the team channel access list:&lt;br /&gt;
&lt;br /&gt;
 /msg chanserv flags #swh-team add &amp;lt;nickname&amp;gt; Staff&lt;br /&gt;
&lt;br /&gt;
Other channels pick their ACLs from that of the #swh-team channel.&lt;br /&gt;
&lt;br /&gt;
If you already have the right (+o ChanServ flag), you can make yourself an operator, with:&lt;br /&gt;
&lt;br /&gt;
 /msg chanserv OP #swh-devel&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastructure]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Matrix&amp;diff=1577</id>
		<title>Matrix</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Matrix&amp;diff=1577"/>
		<updated>2021-06-15T15:52:47Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: /* IRC authentication */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== IRC channels ==&lt;br /&gt;
&lt;br /&gt;
The following channels have been registered on the [https://libera.chat/ libera.chat] IRC network for [[Software Heritage]] usage.&lt;br /&gt;
&lt;br /&gt;
* [https://app.element.io/#/room/#swh-devel:matrix.org '''#swh-devel''']: public development discussions&lt;br /&gt;
* [https://app.element.io/#/room/#swh-sysadm:matrix.org '''#swh-sysadm''']: operations team discussions/bots&lt;br /&gt;
* [https://app.element.io/#/room/#swh-offtopic:matrix.org '''#swh-offtopic''']: Off-topic discussions&lt;br /&gt;
* [https://app.element.io/#/room/#swh-team:matrix.org '''#swh-team''']: private discussions of the core team&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you use IRC, consider joining the channels.&lt;br /&gt;
&lt;br /&gt;
If you don't use IRC ''directly'', you can still join our chat channels from your web browser via a [https://matrix.org/ Matrix] bridge by clicking on the channel names in the list above. You will be asked to create a [https://element.io/ Element] account if you don't have one yet.&lt;br /&gt;
&lt;br /&gt;
== IRC authentication ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Libera.chat defaults to blocking private messages from unauthentified users! All users should register their nicknames to be able to message one another privately, by following the instructions below.&amp;lt;/b&amp;gt; If you're really unable to register, you should ask your correspondent to [https://libera.chat/guides/usermodes consider setting usermode &amp;lt;tt&amp;gt;-R&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;+g&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
You should register your nickname with NickServ following [https://libera.chat/guides/registration the registration instructions provided by libera.chat staff].&lt;br /&gt;
&lt;br /&gt;
You will then receive an e-mail containing a link to activate you account. After doing so, you need to configure your client to auto-authenticate. The recommended way of doing that is using [https://libera.chat/guides/sasl SASL authentication].&lt;br /&gt;
&lt;br /&gt;
For matrix, the relevant docs is here: https://github.com/matrix-org/matrix-appservice-irc/wiki/End-user-FAQ#how-do-i-registeridentify-to-nickserv&lt;br /&gt;
&lt;br /&gt;
libera.chat also supports authentication via [https://libera.chat/guides/certfp TLS client certificates (using SASL EXTERNAL)].&lt;br /&gt;
&lt;br /&gt;
=== Matrix bridge ===&lt;br /&gt;
&lt;br /&gt;
For registering an account through the Matrix bridge ([https://github.com/matrix-org/matrix-appservice-irc/wiki/End-user-FAQ#how-do-i-registeridentify-to-nickserv relevant docs here]), please follow these instructions:&lt;br /&gt;
&lt;br /&gt;
1. Choose a short nickname (the default nickname picked by the matrix bridge has a [m] and can be quite long, as it defaults to the full local part of your matrix handle)&lt;br /&gt;
&lt;br /&gt;
 /msg @appservice:libera.chat !nick &amp;lt;USERNAME&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Send this command to NickServ to register your account:&lt;br /&gt;
&lt;br /&gt;
 /msg @NickServ:libera.chat register &amp;lt;PASSWORD&amp;gt; &amp;lt;EMAIL&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Once you receive the confirmation email with a token, activate your account by using:&lt;br /&gt;
&lt;br /&gt;
 /msg @NickServ:libera.chat VERIFY REGISTER &amp;lt;USERNAME&amp;gt; &amp;lt;TOKEN RECEIVED BY EMAIL&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Give the Matrix bridge appservice your password so that you get identified automatically when matrix reconnects you to IRC:&lt;br /&gt;
&lt;br /&gt;
 /msg @appservice:libera.chat !username &amp;lt;USERNAME&amp;gt;&lt;br /&gt;
 /msg @appservice:libera.chat !storepass &amp;lt;PASSWORD&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IRC access list ==&lt;br /&gt;
&lt;br /&gt;
To auto-voice people with a registered nick (only doable by people with +fA access modes will be able to do it), add them to the team channel access list:&lt;br /&gt;
&lt;br /&gt;
 /msg chanserv flags #swh-team add &amp;lt;nickname&amp;gt; Staff&lt;br /&gt;
&lt;br /&gt;
Other channels pick their ACLs from that of the #swh-team channel.&lt;br /&gt;
&lt;br /&gt;
If you already have the right (+o ChanServ flag), you can make yourself an operator, with:&lt;br /&gt;
&lt;br /&gt;
 /msg chanserv OP #swh-devel&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastructure]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Matrix&amp;diff=1570</id>
		<title>Matrix</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Matrix&amp;diff=1570"/>
		<updated>2021-06-08T16:03:42Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: Update instructions for libera.chat and new matrix rooms.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== IRC channels ==&lt;br /&gt;
&lt;br /&gt;
The following channels have been registered on the [https://libera.chat/ libera.chat] IRC network for [[Software Heritage]] usage.&lt;br /&gt;
&lt;br /&gt;
* [https://app.element.io/#/room/#swh-devel:matrix.org '''#swh-devel''']: public development discussions&lt;br /&gt;
* [https://app.element.io/#/room/#swh-sysadm:matrix.org '''#swh-sysadm''']: operations team discussions/bots&lt;br /&gt;
* [https://app.element.io/#/room/#swh-offtopic:matrix.org '''#swh-offtopic''']: Off-topic discussions&lt;br /&gt;
* [https://app.element.io/#/room/#swh-team:matrix.org '''#swh-team''']: private discussions of the core team&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you use IRC, consider joining the channels.&lt;br /&gt;
&lt;br /&gt;
If you don't use IRC ''directly'', you can still join our chat channels from your web browser via a [https://matrix.org/ Matrix] bridge by clicking on the channel names in the list above. You will be asked to create a [https://element.io/ Element] account if you don't have one yet.&lt;br /&gt;
&lt;br /&gt;
== IRC authentication ==&lt;br /&gt;
&lt;br /&gt;
You should register your nickname with NickServ following [https://libera.chat/guides/registration the registration instructions provided by libera.chat staff].&lt;br /&gt;
&lt;br /&gt;
You will then receive an e-mail containing a link to activate you account. After doing so, you need to configure your client to auto-authenticate. The recommended way of doing that is using [https://libera.chat/guides/sasl SASL authentication].&lt;br /&gt;
&lt;br /&gt;
For matrix, the relevant docs is here: https://github.com/matrix-org/matrix-appservice-irc/wiki/End-user-FAQ#how-do-i-registeridentify-to-nickserv&lt;br /&gt;
&lt;br /&gt;
libera.chat also supports authentication via [https://libera.chat/guides/certfp TLS client certificates (using SASL EXTERNAL)].&lt;br /&gt;
&lt;br /&gt;
=== Matrix bridge ===&lt;br /&gt;
&lt;br /&gt;
For registering an account through the Matrix bridge ([https://github.com/matrix-org/matrix-appservice-irc/wiki/End-user-FAQ#how-do-i-registeridentify-to-nickserv relevant docs here]), please follow these instructions:&lt;br /&gt;
&lt;br /&gt;
1. Choose a short nickname (the default nickname picked by the matrix bridge has a [m] and can be quite long, as it defaults to the full local part of your matrix handle)&lt;br /&gt;
&lt;br /&gt;
 /msg @appservice:libera.chat !nick &amp;lt;USERNAME&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Send this command to NickServ to register your account:&lt;br /&gt;
&lt;br /&gt;
 /msg @NickServ:libera.chat register &amp;lt;PASSWORD&amp;gt; &amp;lt;EMAIL&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Once you receive the confirmation email with a token, activate your account by using:&lt;br /&gt;
&lt;br /&gt;
 /msg @NickServ:libera.chat VERIFY REGISTER &amp;lt;USERNAME&amp;gt; &amp;lt;TOKEN RECEIVED BY EMAIL&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Give the Matrix bridge appservice your password so that you get identified automatically when matrix reconnects you to IRC:&lt;br /&gt;
&lt;br /&gt;
 /msg @appservice:libera.chat !username &amp;lt;USERNAME&amp;gt;&lt;br /&gt;
 /msg @appservice:libera.chat !storepass &amp;lt;PASSWORD&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IRC access list ==&lt;br /&gt;
&lt;br /&gt;
To auto-voice people with a registered nick (only doable by people with +fA access modes will be able to do it), add them to the team channel access list:&lt;br /&gt;
&lt;br /&gt;
 /msg chanserv flags #swh-team add &amp;lt;nickname&amp;gt; Staff&lt;br /&gt;
&lt;br /&gt;
Other channels pick their ACLs from that of the #swh-team channel.&lt;br /&gt;
&lt;br /&gt;
If you already have the right (+o ChanServ flag), you can make yourself an operator, with:&lt;br /&gt;
&lt;br /&gt;
 /msg chanserv OP #swh-devel&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastructure]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Arcanist_setup&amp;diff=1546</id>
		<title>Arcanist setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Arcanist_setup&amp;diff=1546"/>
		<updated>2021-03-22T11:12:51Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: Redirect to swhdocs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[swhdocs:devel/contributing/phabricator.html#arcanist-configuration]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Software development]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Code_review&amp;diff=1545</id>
		<title>Code review</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Code_review&amp;diff=1545"/>
		<updated>2021-03-22T11:12:15Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: Redirect to swhdocs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[swhdocs:devel/contributing/code-review.html#code-review]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Software development]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Code_review_in_Phabricator&amp;diff=1544</id>
		<title>Code review in Phabricator</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Code_review_in_Phabricator&amp;diff=1544"/>
		<updated>2021-03-22T11:11:37Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: Redirect to swhdocs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[swhdocs:devel/contributing/code-review.html#code-review]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Software development]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Python_style_guide&amp;diff=1543</id>
		<title>Python style guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Python_style_guide&amp;diff=1543"/>
		<updated>2021-03-22T11:10:56Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: Redirect to swhdocs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[swhdocs:devel/contributing/python-style-guide.html]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Guidelines]]&lt;br /&gt;
[[Category:Software development]]&lt;br /&gt;
[[Category:Python]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Git_style_guide&amp;diff=1542</id>
		<title>Git style guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Git_style_guide&amp;diff=1542"/>
		<updated>2021-03-22T11:06:36Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: Use interwiki redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[swhdocs:devel/contributing/git-style-guide.html]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=HedgeDoc&amp;diff=1441</id>
		<title>HedgeDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=HedgeDoc&amp;diff=1441"/>
		<updated>2021-02-03T14:18:23Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: Create a basic hedgedoc documentation page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= HedgeDoc =&lt;br /&gt;
&lt;br /&gt;
[https://hedgedoc.org/ HedgeDoc] (formerly known as CodiMD, formerly known as HackMD) is a collaborative, web-based markdown editor (a.k.a a &amp;quot;pad&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Software Heritage hosts an instance of HedgeDoc on https://hedgedoc.softwareheritage.org/&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
A list of the HedgeDoc features is available as a [https://hedgedoc.softwareheritage.org/features?both self-hosted document on the instance]. Most notably, compared to other pads, as the owner of a note (after you're logged in), you can configure whether guests can read or edit the note, or whether other logged in users can read or edit the note.&lt;br /&gt;
&lt;br /&gt;
== Access ==&lt;br /&gt;
&lt;br /&gt;
Hedgedoc is accessible to the public; Guests can (at least currently) create notes as well. Authentication is wired to the Software Heritage SSO service.&lt;br /&gt;
&lt;br /&gt;
== Sysadmin information ==&lt;br /&gt;
&lt;br /&gt;
Hedgedoc is hosted on [https://inventory.internal.softwareheritage.org/virtualization/virtual-machines/91/ bardo] (with its postgresql database backend as well as storage for uploaded files). Web access is going through a public access [https://inventory.internal.softwareheritage.org/virtualization/virtual-machines/98/ reverse proxy].&lt;br /&gt;
&lt;br /&gt;
It is deployed using the &amp;lt;tt&amp;gt;profile::hedgedoc&amp;lt;/tt&amp;gt; puppet manifest.&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=File:Nm_openvpn_routes.png&amp;diff=1321</id>
		<title>File:Nm openvpn routes.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=File:Nm_openvpn_routes.png&amp;diff=1321"/>
		<updated>2020-07-17T08:50:52Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=File:Nm_openvpn_base.png&amp;diff=1320</id>
		<title>File:Nm openvpn base.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=File:Nm_openvpn_base.png&amp;diff=1320"/>
		<updated>2020-07-17T08:50:38Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=File:Nm_openvpn_advanced_tls_auth.png&amp;diff=1319</id>
		<title>File:Nm openvpn advanced tls auth.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=File:Nm_openvpn_advanced_tls_auth.png&amp;diff=1319"/>
		<updated>2020-07-17T08:48:31Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=File:Nm_openvpn_advanced_security.png&amp;diff=1318</id>
		<title>File:Nm openvpn advanced security.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=File:Nm_openvpn_advanced_security.png&amp;diff=1318"/>
		<updated>2020-07-17T08:48:15Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=File:Nm_openvpn_advanced_general.png&amp;diff=1317</id>
		<title>File:Nm openvpn advanced general.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=File:Nm_openvpn_advanced_general.png&amp;diff=1317"/>
		<updated>2020-07-17T08:48:00Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Softwareheritage-ca.crt&amp;diff=1316</id>
		<title>Softwareheritage-ca.crt</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Softwareheritage-ca.crt&amp;diff=1316"/>
		<updated>2020-07-17T08:44:12Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: 3 revisions imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Public certificate for the [[Software Heritage]] certification authority (CA) installed on louvre.softwareheritage.org:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-----BEGIN CERTIFICATE-----&lt;br /&gt;
MIIEqjCCA5KgAwIBAgIJAJjv4lm3AwjgMA0GCSqGSIb3DQEBCwUAMIGUMQswCQYD&lt;br /&gt;
VQQGEwJGUjEOMAwGA1UEBxMFUGFyaXMxGjAYBgNVBAoTEVNvZnR3YXJlIEhlcml0&lt;br /&gt;
YWdlMR0wGwYDVQQDExRTb2Z0d2FyZSBIZXJpdGFnZSBDQTEQMA4GA1UEKRMHRWFz&lt;br /&gt;
eVJTQTEoMCYGCSqGSIb3DQEJARYZaW5mb0Bzb2Z0d2FyZWhlcml0YWdlLm9yZzAe&lt;br /&gt;
Fw0xNTA3MTcwOTA0MTBaFw0yNTA3MTQwOTA0MTBaMIGUMQswCQYDVQQGEwJGUjEO&lt;br /&gt;
MAwGA1UEBxMFUGFyaXMxGjAYBgNVBAoTEVNvZnR3YXJlIEhlcml0YWdlMR0wGwYD&lt;br /&gt;
VQQDExRTb2Z0d2FyZSBIZXJpdGFnZSBDQTEQMA4GA1UEKRMHRWFzeVJTQTEoMCYG&lt;br /&gt;
CSqGSIb3DQEJARYZaW5mb0Bzb2Z0d2FyZWhlcml0YWdlLm9yZzCCASIwDQYJKoZI&lt;br /&gt;
hvcNAQEBBQADggEPADCCAQoCggEBAL9yJKQaRh3kqTXqzwtw6Kiugs1ZQV7UejUI&lt;br /&gt;
i9K4lXqLF1seIIq8beJPYMsBcHK6fi3oXJ51ejqCG1sBo4zI6i6hCrk4QOduF5x7&lt;br /&gt;
xK173La8q6K5S+lcevYqROLPRh96MqhMwQvWhy/Y/Q2VeuxfNZxNUs5BB7Y6DWFw&lt;br /&gt;
S36v0xntWzEH/0FQQ2phebY3tKMaA9ftPlSSVNkH39b10x1QMrRKE8T+RIuOnbjm&lt;br /&gt;
RbYm6WXZetMIDP9TNdBQpJ4VDTHNobFScAFW4qzeCW4q0gB94jK+lyOOKzRuRIn2&lt;br /&gt;
3oPUXIahhO4HAkmfA8++UzwX8Wigu1+8dGL84y14cy6YE3E38DkCAwEAAaOB/DCB&lt;br /&gt;
+TAdBgNVHQ4EFgQUkyOIziKlJuhVuVcu1VNpBaL9+mwwgckGA1UdIwSBwTCBvoAU&lt;br /&gt;
kyOIziKlJuhVuVcu1VNpBaL9+myhgZqkgZcwgZQxCzAJBgNVBAYTAkZSMQ4wDAYD&lt;br /&gt;
VQQHEwVQYXJpczEaMBgGA1UEChMRU29mdHdhcmUgSGVyaXRhZ2UxHTAbBgNVBAMT&lt;br /&gt;
FFNvZnR3YXJlIEhlcml0YWdlIENBMRAwDgYDVQQpEwdFYXN5UlNBMSgwJgYJKoZI&lt;br /&gt;
hvcNAQkBFhlpbmZvQHNvZnR3YXJlaGVyaXRhZ2Uub3JnggkAmO/iWbcDCOAwDAYD&lt;br /&gt;
VR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAg8bd3vOwqtdJ423ON3CDAnlC&lt;br /&gt;
DUm3Lq+iyD8YLyeueXvvI7tvrl2uxLc0KXzOksEi1PvXimAqtFoy9CtpfQGywP7V&lt;br /&gt;
DMXc6hom6ddXD08vUknVfgRr6XRL0veDqGC3evTVKXjiDCQhUO2NuFYuaMGufSFx&lt;br /&gt;
eCjx1h3huxv7Z4g3n1zkkpBGVIHYO+9r09/8ufTImYMZ9BF5ZQaotstcGvCV6TgV&lt;br /&gt;
kLn4o2DOLhGeDpVQUDKNNxRpQCXC0bLBaDVBkP/2pp/QmHHgrJOydpK/TaLGYT2f&lt;br /&gt;
eEdfH3QKmPR/AyH2qQTuSxKPPnCzWBYyjLHcKAgjL4023ObDV1YUlSbf08QVcA==&lt;br /&gt;
-----END CERTIFICATE-----&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Services that use the certificate ==&lt;br /&gt;
&lt;br /&gt;
* [[Openvpn]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastructure]]&lt;br /&gt;
[[Category:System administration]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=VPN&amp;diff=1312</id>
		<title>VPN</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=VPN&amp;diff=1312"/>
		<updated>2020-07-17T08:44:12Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: 23 revisions imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [[Software Heritage]] server and the VMs running on it are severely firewalled.&lt;br /&gt;
To get onto their network unrestricted, a VPN based on [https://openvpn.net/ OpenVPN] is available.&lt;br /&gt;
&lt;br /&gt;
The setup is client-server, with per-client certificates.&lt;br /&gt;
&lt;br /&gt;
== OpenVPN client configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Raw OpenVPN ===&lt;br /&gt;
&lt;br /&gt;
Sample configuration file, e.g., /etc/openvpn/softwareheritage.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remote louvre.softwareheritage.org&lt;br /&gt;
ns-cert-type server &lt;br /&gt;
comp-lzo &lt;br /&gt;
nobind&lt;br /&gt;
dev tun&lt;br /&gt;
proto udp &lt;br /&gt;
port 1194 &lt;br /&gt;
log /var/log/openvpn.log&lt;br /&gt;
up-restart &lt;br /&gt;
persist-key &lt;br /&gt;
persist-tun &lt;br /&gt;
client &lt;br /&gt;
ca /etc/openvpn/keys/softwareheritage-ca.crt&lt;br /&gt;
cert /etc/openvpn/keys/softwareheritage.crt&lt;br /&gt;
key /etc/openvpn/keys/softwareheritage.key&lt;br /&gt;
user nobody&lt;br /&gt;
group nogroup&lt;br /&gt;
&lt;br /&gt;
# If you are using resolvconf, add this:&lt;br /&gt;
# Make sure you add louvre to /etc/hosts to avoid issues in using the vpn-provided DNS server.&lt;br /&gt;
script-security 2&lt;br /&gt;
up /etc/openvpn/update-resolv-conf&lt;br /&gt;
down /etc/openvpn/update-resolv-conf&lt;br /&gt;
&lt;br /&gt;
# If you want the connection to persist when your network fails, add this:&lt;br /&gt;
ping-restart 10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition to the above configuration file, you will need to install the following 3 files under /etc/openvpn/keys:&lt;br /&gt;
&lt;br /&gt;
* '''[[softwareheritage-ca.crt]]''': ''public'' certificate for the Software Heritage certification authority (CA)&lt;br /&gt;
* '''softwareheritage.crt''': ''public'', client-specific certificate (see below)&lt;br /&gt;
* '''softwareheritage.key''': ''private'', client-specific key (see below)&lt;br /&gt;
&lt;br /&gt;
=== Network Manager GUI ===&lt;br /&gt;
&lt;br /&gt;
You need network-manager-openvpn and network-manager-openvpn-gnome for the configuration gui.&lt;br /&gt;
&lt;br /&gt;
[[File:nm_openvpn_base.png]]&lt;br /&gt;
[[File:nm_openvpn_routes.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_general.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_security.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_tls_auth.png]]&lt;br /&gt;
&lt;br /&gt;
== Obtaining a client certificate ==&lt;br /&gt;
&lt;br /&gt;
=== For users ===&lt;br /&gt;
&lt;br /&gt;
Generate a keypair (key + certificate signing request) using the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openssl req -new -newkey rsa:2048 -nodes -keyout openvpn.key -out openvpn.csr -subj &amp;quot;/CN=&amp;lt;your username&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please replace &amp;lt;your username&amp;gt; with something that uniquely identifies the certificate.&lt;br /&gt;
&lt;br /&gt;
Make sure openvpn.key is stored in a safe place (it's your private key, which will allow anyone to connect to the VPN).&lt;br /&gt;
&lt;br /&gt;
Provide the CSR file to a sysadmin through a reasonably authenticated medium.&lt;br /&gt;
&lt;br /&gt;
=== For admins ===&lt;br /&gt;
&lt;br /&gt;
On louvre:&lt;br /&gt;
&lt;br /&gt;
Fetch the CSR file provided by the user, for instance with &amp;lt;tt&amp;gt;scp USERNAME.csr louvre:&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, as root on louvre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@louvre:~# cd /etc/openvpn/keys&lt;br /&gt;
root@louvre:/etc/openvpn/keys# ./easyrsa import-req ~ADMIN/USERNAME.csr USERNAME&lt;br /&gt;
root@louvre:/etc/openvpn/keys# ./easyrsa sign-req client USERNAME&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first command imports the csr into the EasyRSA PKI. The second command lets you review and sign it.&lt;br /&gt;
&lt;br /&gt;
Send the signed certificate, &amp;lt;tt&amp;gt;/etc/openvpn/keys/pki/issued/USERNAME.crt&amp;lt;/tt&amp;gt;, to the user. That file only contains public key material.&lt;br /&gt;
&lt;br /&gt;
Add the DNS entry for the new host to hiera and do a puppet run on pergamon.&lt;br /&gt;
&lt;br /&gt;
== Revoking a client certificate ==&lt;br /&gt;
&lt;br /&gt;
On louvre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@louvre:~# cd /etc/openvpn/keys&lt;br /&gt;
root@louvre:/etc/openvpn/keys# ./easyrsa revoke USERNAME&lt;br /&gt;
[ say yes ]&lt;br /&gt;
root@louvre:/etc/openvpn/keys# ./easyrsa gen-crl; chmod a+r pki/crl.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OpenVPN re-reads the CRL at each connection (which is why we need the CRL to be world-readable), so once the cert is revoked, there's nothing more to do. If you want to make sure the client is disconnected, you need to restart OpenVPN (which will make all clients reconnect).&lt;br /&gt;
&lt;br /&gt;
== /etc/hosts entries ==&lt;br /&gt;
&lt;br /&gt;
Once the Vpn is setup on your machine, you can access Software Heritage hosts via their private IP addresses; see [[Network configuration]].&lt;br /&gt;
&lt;br /&gt;
OpenVPN now pushes the address of our DNS server (192.168.100.29, pergamon).&lt;br /&gt;
&lt;br /&gt;
You might want to add louvre.softwareheritage.org in your /etc/hosts to avoid a bootstrap problem if the &amp;quot;on-vpn&amp;quot; DNS server is in your resolv.conf.&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastructure]]&lt;br /&gt;
[[Category:System administration]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=VPN&amp;diff=1311</id>
		<title>VPN</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=VPN&amp;diff=1311"/>
		<updated>2019-12-04T17:41:51Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: /* Obtaining a client certificate */ Improve instructions to avoid key material transfers.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [[Software Heritage]] server and the VMs running on it are severely firewalled.&lt;br /&gt;
To get onto their network unrestricted, a VPN based on [https://openvpn.net/ OpenVPN] is available.&lt;br /&gt;
&lt;br /&gt;
The setup is client-server, with per-client certificates.&lt;br /&gt;
&lt;br /&gt;
== OpenVPN client configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Raw OpenVPN ===&lt;br /&gt;
&lt;br /&gt;
Sample configuration file, e.g., /etc/openvpn/softwareheritage.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remote louvre.softwareheritage.org&lt;br /&gt;
ns-cert-type server &lt;br /&gt;
comp-lzo &lt;br /&gt;
nobind&lt;br /&gt;
dev tun&lt;br /&gt;
proto udp &lt;br /&gt;
port 1194 &lt;br /&gt;
log /var/log/openvpn.log&lt;br /&gt;
up-restart &lt;br /&gt;
persist-key &lt;br /&gt;
persist-tun &lt;br /&gt;
client &lt;br /&gt;
ca /etc/openvpn/keys/softwareheritage-ca.crt&lt;br /&gt;
cert /etc/openvpn/keys/softwareheritage.crt&lt;br /&gt;
key /etc/openvpn/keys/softwareheritage.key&lt;br /&gt;
user nobody&lt;br /&gt;
group nogroup&lt;br /&gt;
&lt;br /&gt;
# If you are using resolvconf, add this:&lt;br /&gt;
# Make sure you add louvre to /etc/hosts to avoid issues in using the vpn-provided DNS server.&lt;br /&gt;
script-security 2&lt;br /&gt;
up /etc/openvpn/update-resolv-conf&lt;br /&gt;
down /etc/openvpn/update-resolv-conf&lt;br /&gt;
&lt;br /&gt;
# If you want the connection to persist when your network fails, add this:&lt;br /&gt;
ping-restart 10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition to the above configuration file, you will need to install the following 3 files under /etc/openvpn/keys:&lt;br /&gt;
&lt;br /&gt;
* '''[[softwareheritage-ca.crt]]''': ''public'' certificate for the Software Heritage certification authority (CA)&lt;br /&gt;
* '''softwareheritage.crt''': ''public'', client-specific certificate (see below)&lt;br /&gt;
* '''softwareheritage.key''': ''private'', client-specific key (see below)&lt;br /&gt;
&lt;br /&gt;
=== Network Manager GUI ===&lt;br /&gt;
&lt;br /&gt;
You need network-manager-openvpn and network-manager-openvpn-gnome for the configuration gui.&lt;br /&gt;
&lt;br /&gt;
[[File:nm_openvpn_base.png]]&lt;br /&gt;
[[File:nm_openvpn_routes.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_general.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_security.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_tls_auth.png]]&lt;br /&gt;
&lt;br /&gt;
== Obtaining a client certificate ==&lt;br /&gt;
&lt;br /&gt;
=== For users ===&lt;br /&gt;
&lt;br /&gt;
Generate a keypair (key + certificate signing request) using the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openssl req -new -newkey rsa:2048 -nodes -keyout openvpn.key -out openvpn.csr -subj &amp;quot;/CN=&amp;lt;your username&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please replace &amp;lt;your username&amp;gt; with something that uniquely identifies the certificate.&lt;br /&gt;
&lt;br /&gt;
Make sure openvpn.key is stored in a safe place (it's your private key, which will allow anyone to connect to the VPN).&lt;br /&gt;
&lt;br /&gt;
Provide the CSR file to a sysadmin through a reasonably authenticated medium.&lt;br /&gt;
&lt;br /&gt;
=== For admins ===&lt;br /&gt;
&lt;br /&gt;
On louvre:&lt;br /&gt;
&lt;br /&gt;
Fetch the CSR file provided by the user, for instance with &amp;lt;tt&amp;gt;scp USERNAME.csr louvre:&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, as root on louvre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@louvre:~# cd /etc/openvpn/keys&lt;br /&gt;
root@louvre:/etc/openvpn/keys# ./easyrsa import-req ~ADMIN/USERNAME.csr USERNAME&lt;br /&gt;
root@louvre:/etc/openvpn/keys# ./easyrsa sign-req client USERNAME&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first command imports the csr into the EasyRSA PKI. The second command lets you review and sign it.&lt;br /&gt;
&lt;br /&gt;
Send the signed certificate, &amp;lt;tt&amp;gt;/etc/openvpn/keys/pki/issued/USERNAME.crt&amp;lt;/tt&amp;gt;, to the user. That file only contains public key material.&lt;br /&gt;
&lt;br /&gt;
Add the DNS entry for the new host to hiera and do a puppet run on pergamon.&lt;br /&gt;
&lt;br /&gt;
== Revoking a client certificate ==&lt;br /&gt;
&lt;br /&gt;
On louvre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@louvre:~# cd /etc/openvpn/keys&lt;br /&gt;
root@louvre:/etc/openvpn/keys# ./easyrsa revoke USERNAME&lt;br /&gt;
[ say yes ]&lt;br /&gt;
root@louvre:/etc/openvpn/keys# ./easyrsa gen-crl; chmod a+r pki/crl.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OpenVPN re-reads the CRL at each connection (which is why we need the CRL to be world-readable), so once the cert is revoked, there's nothing more to do. If you want to make sure the client is disconnected, you need to restart OpenVPN (which will make all clients reconnect).&lt;br /&gt;
&lt;br /&gt;
== /etc/hosts entries ==&lt;br /&gt;
&lt;br /&gt;
Once the Vpn is setup on your machine, you can access Software Heritage hosts via their private IP addresses; see [[Network configuration]].&lt;br /&gt;
&lt;br /&gt;
OpenVPN now pushes the address of our DNS server (192.168.100.29, pergamon).&lt;br /&gt;
&lt;br /&gt;
You might want to add louvre.softwareheritage.org in your /etc/hosts to avoid a bootstrap problem if the &amp;quot;on-vpn&amp;quot; DNS server is in your resolv.conf.&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastructure]]&lt;br /&gt;
[[Category:System administration]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=VPN&amp;diff=1310</id>
		<title>VPN</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=VPN&amp;diff=1310"/>
		<updated>2019-12-04T17:33:48Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: /* For users */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [[Software Heritage]] server and the VMs running on it are severely firewalled.&lt;br /&gt;
To get onto their network unrestricted, a VPN based on [https://openvpn.net/ OpenVPN] is available.&lt;br /&gt;
&lt;br /&gt;
The setup is client-server, with per-client certificates.&lt;br /&gt;
&lt;br /&gt;
== OpenVPN client configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Raw OpenVPN ===&lt;br /&gt;
&lt;br /&gt;
Sample configuration file, e.g., /etc/openvpn/softwareheritage.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remote louvre.softwareheritage.org&lt;br /&gt;
ns-cert-type server &lt;br /&gt;
comp-lzo &lt;br /&gt;
nobind&lt;br /&gt;
dev tun&lt;br /&gt;
proto udp &lt;br /&gt;
port 1194 &lt;br /&gt;
log /var/log/openvpn.log&lt;br /&gt;
up-restart &lt;br /&gt;
persist-key &lt;br /&gt;
persist-tun &lt;br /&gt;
client &lt;br /&gt;
ca /etc/openvpn/keys/softwareheritage-ca.crt&lt;br /&gt;
cert /etc/openvpn/keys/softwareheritage.crt&lt;br /&gt;
key /etc/openvpn/keys/softwareheritage.key&lt;br /&gt;
user nobody&lt;br /&gt;
group nogroup&lt;br /&gt;
&lt;br /&gt;
# If you are using resolvconf, add this:&lt;br /&gt;
# Make sure you add louvre to /etc/hosts to avoid issues in using the vpn-provided DNS server.&lt;br /&gt;
script-security 2&lt;br /&gt;
up /etc/openvpn/update-resolv-conf&lt;br /&gt;
down /etc/openvpn/update-resolv-conf&lt;br /&gt;
&lt;br /&gt;
# If you want the connection to persist when your network fails, add this:&lt;br /&gt;
ping-restart 10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition to the above configuration file, you will need to install the following 3 files under /etc/openvpn/keys:&lt;br /&gt;
&lt;br /&gt;
* '''[[softwareheritage-ca.crt]]''': ''public'' certificate for the Software Heritage certification authority (CA)&lt;br /&gt;
* '''softwareheritage.crt''': ''public'', client-specific certificate (see below)&lt;br /&gt;
* '''softwareheritage.key''': ''private'', client-specific key (see below)&lt;br /&gt;
&lt;br /&gt;
=== Network Manager GUI ===&lt;br /&gt;
&lt;br /&gt;
You need network-manager-openvpn and network-manager-openvpn-gnome for the configuration gui.&lt;br /&gt;
&lt;br /&gt;
[[File:nm_openvpn_base.png]]&lt;br /&gt;
[[File:nm_openvpn_routes.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_general.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_security.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_tls_auth.png]]&lt;br /&gt;
&lt;br /&gt;
== Obtaining a client certificate ==&lt;br /&gt;
&lt;br /&gt;
=== For users ===&lt;br /&gt;
&lt;br /&gt;
Generate a keypair (key + certificate signing request) using the following command:&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
openssl req -new -newkey rsa:2048 -nodes -keyout openvpn.key -out openvpn.csr -subj &amp;quot;/CN=&amp;lt;your username&amp;gt;&amp;quot;&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Make sure openvpn.key is stored in a safe place (it's your private key, which will allow anyone to connect to the VPN).&lt;br /&gt;
&lt;br /&gt;
Provide the CSR file to a sysadmin.&lt;br /&gt;
&lt;br /&gt;
=== For admins ===&lt;br /&gt;
&lt;br /&gt;
On louvre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@louvre:~# cd /etc/openvpn/keys&lt;br /&gt;
root@louvre:/etc/openvpn/keys# ./easyrsa build-client-full USERNAME nopass&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At the end of the process certificate and key will be in /etc/openvpn/keys/pki/issued/USERNAME.crt and /etc/openvpn/keys/pki/private/USERNAME.key.&lt;br /&gt;
Send them to USERNAME (securely).&lt;br /&gt;
&lt;br /&gt;
Add the DNS entry for the new host to hiera and do a puppet run on pergamon.&lt;br /&gt;
&lt;br /&gt;
== Revoking a client certificate ==&lt;br /&gt;
&lt;br /&gt;
On louvre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@louvre:~# cd /etc/openvpn/keys&lt;br /&gt;
root@louvre:/etc/openvpn/keys# ./easyrsa revoke USERNAME&lt;br /&gt;
[ say yes ]&lt;br /&gt;
root@louvre:/etc/openvpn/keys# ./easyrsa gen-crl; chmod a+r pki/crl.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OpenVPN re-reads the CRL at each connection (which is why we need the CRL to be world-readable), so once the cert is revoked, there's nothing more to do. If you want to make sure the client is disconnected, you need to restart OpenVPN (which will make all clients reconnect).&lt;br /&gt;
&lt;br /&gt;
== /etc/hosts entries ==&lt;br /&gt;
&lt;br /&gt;
Once the Vpn is setup on your machine, you can access Software Heritage hosts via their private IP addresses; see [[Network configuration]].&lt;br /&gt;
&lt;br /&gt;
OpenVPN now pushes the address of our DNS server (192.168.100.29, pergamon).&lt;br /&gt;
&lt;br /&gt;
You might want to add louvre.softwareheritage.org in your /etc/hosts to avoid a bootstrap problem if the &amp;quot;on-vpn&amp;quot; DNS server is in your resolv.conf.&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastructure]]&lt;br /&gt;
[[Category:System administration]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=VPN&amp;diff=1309</id>
		<title>VPN</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=VPN&amp;diff=1309"/>
		<updated>2019-12-04T17:32:00Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: /* Revoking a client certificate */ update CRL instructions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [[Software Heritage]] server and the VMs running on it are severely firewalled.&lt;br /&gt;
To get onto their network unrestricted, a VPN based on [https://openvpn.net/ OpenVPN] is available.&lt;br /&gt;
&lt;br /&gt;
The setup is client-server, with per-client certificates.&lt;br /&gt;
&lt;br /&gt;
== OpenVPN client configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Raw OpenVPN ===&lt;br /&gt;
&lt;br /&gt;
Sample configuration file, e.g., /etc/openvpn/softwareheritage.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remote louvre.softwareheritage.org&lt;br /&gt;
ns-cert-type server &lt;br /&gt;
comp-lzo &lt;br /&gt;
nobind&lt;br /&gt;
dev tun&lt;br /&gt;
proto udp &lt;br /&gt;
port 1194 &lt;br /&gt;
log /var/log/openvpn.log&lt;br /&gt;
up-restart &lt;br /&gt;
persist-key &lt;br /&gt;
persist-tun &lt;br /&gt;
client &lt;br /&gt;
ca /etc/openvpn/keys/softwareheritage-ca.crt&lt;br /&gt;
cert /etc/openvpn/keys/softwareheritage.crt&lt;br /&gt;
key /etc/openvpn/keys/softwareheritage.key&lt;br /&gt;
user nobody&lt;br /&gt;
group nogroup&lt;br /&gt;
&lt;br /&gt;
# If you are using resolvconf, add this:&lt;br /&gt;
# Make sure you add louvre to /etc/hosts to avoid issues in using the vpn-provided DNS server.&lt;br /&gt;
script-security 2&lt;br /&gt;
up /etc/openvpn/update-resolv-conf&lt;br /&gt;
down /etc/openvpn/update-resolv-conf&lt;br /&gt;
&lt;br /&gt;
# If you want the connection to persist when your network fails, add this:&lt;br /&gt;
ping-restart 10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition to the above configuration file, you will need to install the following 3 files under /etc/openvpn/keys:&lt;br /&gt;
&lt;br /&gt;
* '''[[softwareheritage-ca.crt]]''': ''public'' certificate for the Software Heritage certification authority (CA)&lt;br /&gt;
* '''softwareheritage.crt''': ''public'', client-specific certificate (see below)&lt;br /&gt;
* '''softwareheritage.key''': ''private'', client-specific key (see below)&lt;br /&gt;
&lt;br /&gt;
=== Network Manager GUI ===&lt;br /&gt;
&lt;br /&gt;
You need network-manager-openvpn and network-manager-openvpn-gnome for the configuration gui.&lt;br /&gt;
&lt;br /&gt;
[[File:nm_openvpn_base.png]]&lt;br /&gt;
[[File:nm_openvpn_routes.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_general.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_security.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_tls_auth.png]]&lt;br /&gt;
&lt;br /&gt;
== Obtaining a client certificate ==&lt;br /&gt;
&lt;br /&gt;
=== For users ===&lt;br /&gt;
&lt;br /&gt;
Ask an admin to produce a pair of client-specific certificate/key for you.&lt;br /&gt;
&lt;br /&gt;
Please ensure there is a way to send you the certificate and the key securely (e.g., GPG).&lt;br /&gt;
&lt;br /&gt;
=== For admins ===&lt;br /&gt;
&lt;br /&gt;
On louvre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@louvre:~# cd /etc/openvpn/keys&lt;br /&gt;
root@louvre:/etc/openvpn/keys# ./easyrsa build-client-full USERNAME nopass&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At the end of the process certificate and key will be in /etc/openvpn/keys/pki/issued/USERNAME.crt and /etc/openvpn/keys/pki/private/USERNAME.key.&lt;br /&gt;
Send them to USERNAME (securely).&lt;br /&gt;
&lt;br /&gt;
Add the DNS entry for the new host to hiera and do a puppet run on pergamon.&lt;br /&gt;
&lt;br /&gt;
== Revoking a client certificate ==&lt;br /&gt;
&lt;br /&gt;
On louvre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@louvre:~# cd /etc/openvpn/keys&lt;br /&gt;
root@louvre:/etc/openvpn/keys# ./easyrsa revoke USERNAME&lt;br /&gt;
[ say yes ]&lt;br /&gt;
root@louvre:/etc/openvpn/keys# ./easyrsa gen-crl; chmod a+r pki/crl.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OpenVPN re-reads the CRL at each connection (which is why we need the CRL to be world-readable), so once the cert is revoked, there's nothing more to do. If you want to make sure the client is disconnected, you need to restart OpenVPN (which will make all clients reconnect).&lt;br /&gt;
&lt;br /&gt;
== /etc/hosts entries ==&lt;br /&gt;
&lt;br /&gt;
Once the Vpn is setup on your machine, you can access Software Heritage hosts via their private IP addresses; see [[Network configuration]].&lt;br /&gt;
&lt;br /&gt;
OpenVPN now pushes the address of our DNS server (192.168.100.29, pergamon).&lt;br /&gt;
&lt;br /&gt;
You might want to add louvre.softwareheritage.org in your /etc/hosts to avoid a bootstrap problem if the &amp;quot;on-vpn&amp;quot; DNS server is in your resolv.conf.&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastructure]]&lt;br /&gt;
[[Category:System administration]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=VPN&amp;diff=1308</id>
		<title>VPN</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=VPN&amp;diff=1308"/>
		<updated>2019-12-04T17:03:53Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: /* Revoking a client certificate */ Update to easy-rsa 3.x&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [[Software Heritage]] server and the VMs running on it are severely firewalled.&lt;br /&gt;
To get onto their network unrestricted, a VPN based on [https://openvpn.net/ OpenVPN] is available.&lt;br /&gt;
&lt;br /&gt;
The setup is client-server, with per-client certificates.&lt;br /&gt;
&lt;br /&gt;
== OpenVPN client configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Raw OpenVPN ===&lt;br /&gt;
&lt;br /&gt;
Sample configuration file, e.g., /etc/openvpn/softwareheritage.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remote louvre.softwareheritage.org&lt;br /&gt;
ns-cert-type server &lt;br /&gt;
comp-lzo &lt;br /&gt;
nobind&lt;br /&gt;
dev tun&lt;br /&gt;
proto udp &lt;br /&gt;
port 1194 &lt;br /&gt;
log /var/log/openvpn.log&lt;br /&gt;
up-restart &lt;br /&gt;
persist-key &lt;br /&gt;
persist-tun &lt;br /&gt;
client &lt;br /&gt;
ca /etc/openvpn/keys/softwareheritage-ca.crt&lt;br /&gt;
cert /etc/openvpn/keys/softwareheritage.crt&lt;br /&gt;
key /etc/openvpn/keys/softwareheritage.key&lt;br /&gt;
user nobody&lt;br /&gt;
group nogroup&lt;br /&gt;
&lt;br /&gt;
# If you are using resolvconf, add this:&lt;br /&gt;
# Make sure you add louvre to /etc/hosts to avoid issues in using the vpn-provided DNS server.&lt;br /&gt;
script-security 2&lt;br /&gt;
up /etc/openvpn/update-resolv-conf&lt;br /&gt;
down /etc/openvpn/update-resolv-conf&lt;br /&gt;
&lt;br /&gt;
# If you want the connection to persist when your network fails, add this:&lt;br /&gt;
ping-restart 10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition to the above configuration file, you will need to install the following 3 files under /etc/openvpn/keys:&lt;br /&gt;
&lt;br /&gt;
* '''[[softwareheritage-ca.crt]]''': ''public'' certificate for the Software Heritage certification authority (CA)&lt;br /&gt;
* '''softwareheritage.crt''': ''public'', client-specific certificate (see below)&lt;br /&gt;
* '''softwareheritage.key''': ''private'', client-specific key (see below)&lt;br /&gt;
&lt;br /&gt;
=== Network Manager GUI ===&lt;br /&gt;
&lt;br /&gt;
You need network-manager-openvpn and network-manager-openvpn-gnome for the configuration gui.&lt;br /&gt;
&lt;br /&gt;
[[File:nm_openvpn_base.png]]&lt;br /&gt;
[[File:nm_openvpn_routes.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_general.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_security.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_tls_auth.png]]&lt;br /&gt;
&lt;br /&gt;
== Obtaining a client certificate ==&lt;br /&gt;
&lt;br /&gt;
=== For users ===&lt;br /&gt;
&lt;br /&gt;
Ask an admin to produce a pair of client-specific certificate/key for you.&lt;br /&gt;
&lt;br /&gt;
Please ensure there is a way to send you the certificate and the key securely (e.g., GPG).&lt;br /&gt;
&lt;br /&gt;
=== For admins ===&lt;br /&gt;
&lt;br /&gt;
On louvre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@louvre:~# cd /etc/openvpn/keys&lt;br /&gt;
root@louvre:/etc/openvpn/keys# ./easyrsa build-client-full USERNAME nopass&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At the end of the process certificate and key will be in /etc/openvpn/keys/pki/issued/USERNAME.crt and /etc/openvpn/keys/pki/private/USERNAME.key.&lt;br /&gt;
Send them to USERNAME (securely).&lt;br /&gt;
&lt;br /&gt;
Add the DNS entry for the new host to hiera and do a puppet run on pergamon.&lt;br /&gt;
&lt;br /&gt;
== Revoking a client certificate ==&lt;br /&gt;
&lt;br /&gt;
On louvre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@louvre:~# cd /etc/openvpn/keys&lt;br /&gt;
root@louvre:/etc/openvpn/keys# ./easyrsa revoke USERNAME&lt;br /&gt;
[ say yes ]&lt;br /&gt;
root@louvre:/etc/openvpn/keys# ./easyrsa gen-crl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OpenVPN re-reads the CRL at each connection, so once the cert is revoked, there's nothing more to do. You can restart openvpn to make sure the client is disconnected.&lt;br /&gt;
&lt;br /&gt;
== /etc/hosts entries ==&lt;br /&gt;
&lt;br /&gt;
Once the Vpn is setup on your machine, you can access Software Heritage hosts via their private IP addresses; see [[Network configuration]].&lt;br /&gt;
&lt;br /&gt;
OpenVPN now pushes the address of our DNS server (192.168.100.29, pergamon).&lt;br /&gt;
&lt;br /&gt;
You might want to add louvre.softwareheritage.org in your /etc/hosts to avoid a bootstrap problem if the &amp;quot;on-vpn&amp;quot; DNS server is in your resolv.conf.&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastructure]]&lt;br /&gt;
[[Category:System administration]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=VPN&amp;diff=1307</id>
		<title>VPN</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=VPN&amp;diff=1307"/>
		<updated>2019-12-04T17:03:07Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: /* For admins */ Migrate to easyrsa 3.x&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [[Software Heritage]] server and the VMs running on it are severely firewalled.&lt;br /&gt;
To get onto their network unrestricted, a VPN based on [https://openvpn.net/ OpenVPN] is available.&lt;br /&gt;
&lt;br /&gt;
The setup is client-server, with per-client certificates.&lt;br /&gt;
&lt;br /&gt;
== OpenVPN client configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Raw OpenVPN ===&lt;br /&gt;
&lt;br /&gt;
Sample configuration file, e.g., /etc/openvpn/softwareheritage.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remote louvre.softwareheritage.org&lt;br /&gt;
ns-cert-type server &lt;br /&gt;
comp-lzo &lt;br /&gt;
nobind&lt;br /&gt;
dev tun&lt;br /&gt;
proto udp &lt;br /&gt;
port 1194 &lt;br /&gt;
log /var/log/openvpn.log&lt;br /&gt;
up-restart &lt;br /&gt;
persist-key &lt;br /&gt;
persist-tun &lt;br /&gt;
client &lt;br /&gt;
ca /etc/openvpn/keys/softwareheritage-ca.crt&lt;br /&gt;
cert /etc/openvpn/keys/softwareheritage.crt&lt;br /&gt;
key /etc/openvpn/keys/softwareheritage.key&lt;br /&gt;
user nobody&lt;br /&gt;
group nogroup&lt;br /&gt;
&lt;br /&gt;
# If you are using resolvconf, add this:&lt;br /&gt;
# Make sure you add louvre to /etc/hosts to avoid issues in using the vpn-provided DNS server.&lt;br /&gt;
script-security 2&lt;br /&gt;
up /etc/openvpn/update-resolv-conf&lt;br /&gt;
down /etc/openvpn/update-resolv-conf&lt;br /&gt;
&lt;br /&gt;
# If you want the connection to persist when your network fails, add this:&lt;br /&gt;
ping-restart 10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition to the above configuration file, you will need to install the following 3 files under /etc/openvpn/keys:&lt;br /&gt;
&lt;br /&gt;
* '''[[softwareheritage-ca.crt]]''': ''public'' certificate for the Software Heritage certification authority (CA)&lt;br /&gt;
* '''softwareheritage.crt''': ''public'', client-specific certificate (see below)&lt;br /&gt;
* '''softwareheritage.key''': ''private'', client-specific key (see below)&lt;br /&gt;
&lt;br /&gt;
=== Network Manager GUI ===&lt;br /&gt;
&lt;br /&gt;
You need network-manager-openvpn and network-manager-openvpn-gnome for the configuration gui.&lt;br /&gt;
&lt;br /&gt;
[[File:nm_openvpn_base.png]]&lt;br /&gt;
[[File:nm_openvpn_routes.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_general.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_security.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_tls_auth.png]]&lt;br /&gt;
&lt;br /&gt;
== Obtaining a client certificate ==&lt;br /&gt;
&lt;br /&gt;
=== For users ===&lt;br /&gt;
&lt;br /&gt;
Ask an admin to produce a pair of client-specific certificate/key for you.&lt;br /&gt;
&lt;br /&gt;
Please ensure there is a way to send you the certificate and the key securely (e.g., GPG).&lt;br /&gt;
&lt;br /&gt;
=== For admins ===&lt;br /&gt;
&lt;br /&gt;
On louvre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@louvre:~# cd /etc/openvpn/keys&lt;br /&gt;
root@louvre:/etc/openvpn/keys# ./easyrsa build-client-full USERNAME nopass&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At the end of the process certificate and key will be in /etc/openvpn/keys/pki/issued/USERNAME.crt and /etc/openvpn/keys/pki/private/USERNAME.key.&lt;br /&gt;
Send them to USERNAME (securely).&lt;br /&gt;
&lt;br /&gt;
Add the DNS entry for the new host to hiera and do a puppet run on pergamon.&lt;br /&gt;
&lt;br /&gt;
== Revoking a client certificate ==&lt;br /&gt;
&lt;br /&gt;
On louvre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@louvre:~# cd /etc/openvpn/easy-rsa/&lt;br /&gt;
root@louvre:/etc/openvpn/easy-rsa# . vars &lt;br /&gt;
root@louvre:/etc/openvpn/easy-rsa# ./revoke-full USERNAME&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OpenVPN re-reads the CRL at each connection, so once the cert is revoked, there's nothing more to do. You can restart openvpn to make sure the client is disconnected.&lt;br /&gt;
&lt;br /&gt;
== /etc/hosts entries ==&lt;br /&gt;
&lt;br /&gt;
Once the Vpn is setup on your machine, you can access Software Heritage hosts via their private IP addresses; see [[Network configuration]].&lt;br /&gt;
&lt;br /&gt;
OpenVPN now pushes the address of our DNS server (192.168.100.29, pergamon).&lt;br /&gt;
&lt;br /&gt;
You might want to add louvre.softwareheritage.org in your /etc/hosts to avoid a bootstrap problem if the &amp;quot;on-vpn&amp;quot; DNS server is in your resolv.conf.&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastructure]]&lt;br /&gt;
[[Category:System administration]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Code_review_in_Phabricator&amp;diff=1060</id>
		<title>Code review in Phabricator</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Code_review_in_Phabricator&amp;diff=1060"/>
		<updated>2019-06-18T13:55:07Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: /* VCS password for pushes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We use the [[Differential]] application of [[Phabricator]] to perform [[code review|code reviews]] in the context of [[Software Heritage]].&lt;br /&gt;
&lt;br /&gt;
* we use Git and history.immutable=true (but beware as that is partly a Phabricator misnomer, read on)&lt;br /&gt;
* when code reviews are required, developers will be allowed to push directly to master once an accepted Differential diff exists&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Arcanist configuration ===&lt;br /&gt;
&lt;br /&gt;
When using git, [[Arcanist]] by default mess with the local history, rewriting commits at the time of first submission.&amp;lt;br /&amp;gt;&lt;br /&gt;
To avoid that we use so called [https://secure.phabricator.com/book/phabricator/article/arcanist_new_project/#history-mutability-git history immutability].&lt;br /&gt;
&lt;br /&gt;
To that end, you shall configure your &amp;lt;tt&amp;gt;arc&amp;lt;/tt&amp;gt; accordingly:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arc set-config history.immutable true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this does ''not'' mean that you are forbidden to rewrite your local branches (e.g., with &amp;lt;tt&amp;gt;git rebase&amp;lt;/tt&amp;gt;).&lt;br /&gt;
Quite the contrary: you are encouraged to locally rewrite branches before pushing to ensure that commits are logically separated and your commit history easy to bisect.&lt;br /&gt;
The above setting just means that ''arc'' will not rewrite commit history under your nose.&lt;br /&gt;
&lt;br /&gt;
=== Enabling &amp;lt;tt&amp;gt;git push&amp;lt;/tt&amp;gt; to our forge ===&lt;br /&gt;
&lt;br /&gt;
The way we've configured our review setup for continuous integration needs you to configure git to allow pushes to our forge. There's two ways you can do this : setting a ssh key to push over ssh, or setting a specific password for git pushes over https.&lt;br /&gt;
&lt;br /&gt;
==== SSH key for pushes ====&lt;br /&gt;
&lt;br /&gt;
In your forge User settings page (On the top right, click on your avatar, then click ''Settings''), you have access to a ''Authentication'' &amp;gt; ''SSH Public Keys'' section (Direct link: &amp;lt;tt&amp;gt;hxxps://forge.softwareheritage.org/settings/user/'''&amp;lt;your username&amp;gt;'''/page/ssh/&amp;lt;/tt&amp;gt;). You then have the option to upload a SSH public key, which will authenticate your pushes.&lt;br /&gt;
&lt;br /&gt;
You then need to configure ssh/git to use that key pair, for instance by editing the &amp;lt;tt&amp;gt;~/.ssh/config&amp;lt;/tt&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
Finally, you should configure git to push over ssh when pushing to https://forge.softwareheritage.org, by running the following command:&lt;br /&gt;
 git config --global url.git@forge.softwareheritage.org:.pushInsteadOf https://forge.softwareheritage.org&lt;br /&gt;
&lt;br /&gt;
This lets git know that it should use &amp;lt;tt&amp;gt;git@forge.softwareheritage.org:&amp;lt;/tt&amp;gt; as a base url when pushing repositories cloned from forge.softwareheritage.org over https.&lt;br /&gt;
&lt;br /&gt;
==== VCS password for pushes ====&lt;br /&gt;
&lt;br /&gt;
If you're not comfortable setting up SSH to upload your changes, you have the option of setting a VCS password. This password, ''separate from your account password'', allows Phabricator to authenticate your uploads over HTTPS.&lt;br /&gt;
&lt;br /&gt;
In your forge User settings page (On the top right, click on your avatar, then click ''Settings''), you need to use the ''Authentication'' &amp;gt; ''VCS Password'' section to set your VCS password (Direct link: &amp;lt;tt&amp;gt;hxxps://forge.softwareheritage.org/settings/user/'''&amp;lt;your username&amp;gt;'''/page/vcspassword/&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
If you still get a 403 error on push, this means you need a forge administrator to enable HTTPS pushes for the repository (which wasn't done by default in historical repositories). Please drop by on IRC and let us know!&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
&lt;br /&gt;
* work in a feature branch: &amp;lt;tt&amp;gt;git checkout -b my-feat&amp;lt;/tt&amp;gt;&lt;br /&gt;
* initial review request: hack/commit/hack/commit ; &amp;lt;tt&amp;gt;arc diff origin/master&amp;lt;/tt&amp;gt;&lt;br /&gt;
* react to change requests: hack/commit/hack/commit ; &amp;lt;tt&amp;gt;arc diff --update Dxx origin/master&amp;lt;/tt&amp;gt;&lt;br /&gt;
* landing change: &amp;lt;tt&amp;gt;git checkout master ; git merge my-feat ; git push&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Starting a new feature and submit it for review ===&lt;br /&gt;
&lt;br /&gt;
Use a '''one branch per feature''' workflow, with well-separated ''logical commits'' ([https://wiki.softwareheritage.org/wiki/Git_style_guide following those conventions])&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout -b my-shiny-feature&lt;br /&gt;
... hack hack hack ...&lt;br /&gt;
git commit -m 'architecture skeleton for my-shiny-feature'&lt;br /&gt;
... hack hack hack ...&lt;br /&gt;
git commit -m 'my-shiny-feature: implement module foo'&lt;br /&gt;
... etc ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please, follow the &lt;br /&gt;
To '''submit your code for review''' the first time:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arc diff origin/master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
arc will prompt for a '''code review message'''. Provide the following information:&lt;br /&gt;
* first line: ''short description'' of the overall work (i.e., the feature you're working on). This will become the title of the review&lt;br /&gt;
* ''Summary'' field (optional): ''long description'' of the overall work; the field can continue in subsequent lines, up to the next field. This will become the &amp;quot;Summary&amp;quot; section of the review&lt;br /&gt;
* ''Test Plan'' field (optional): write here if something special is needed to test your change&lt;br /&gt;
* ''Reviewers'' field (optional): the (Phabricator) name(s) of desired reviewers. If you don't specify one (recommended) the default reviewers will be chosen&lt;br /&gt;
* ''Subscribers'' field (optional): the (Phabricator) name(s) of people that will be notified about changes to this review request. In most cases it should be left empty&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mercurial loader&lt;br /&gt;
&lt;br /&gt;
Summary: first stab at a mercurial loader (T329)&lt;br /&gt;
&lt;br /&gt;
The implementation follows the plan detailed in F2F discussion with @foo.&lt;br /&gt;
&lt;br /&gt;
Performances seem decent enough for a first trial (XXX seconds for YYY repository&lt;br /&gt;
that contains ZZZ patches).&lt;br /&gt;
&lt;br /&gt;
Test plan: &lt;br /&gt;
&lt;br /&gt;
Reviewers: &lt;br /&gt;
&lt;br /&gt;
Subscribers: foo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After completing the message arc will submit the review request and tell you its number and URL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
Created a new Differential revision:&lt;br /&gt;
        Revision URI: https://forge.softwareheritage.org/Dxx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Updating your branch to reflect requested changes ===&lt;br /&gt;
&lt;br /&gt;
Your feature might get accepted as is, YAY!&lt;br /&gt;
Or, reviewers might request changes; no big deal!&lt;br /&gt;
&lt;br /&gt;
Use the Differential web UI to follow-up to received comments, if needed.&lt;br /&gt;
&lt;br /&gt;
To implement requested changes in the code, hack on your branch as usual by:&lt;br /&gt;
&lt;br /&gt;
* adding new commits, and/or&lt;br /&gt;
* rewriting old commits with git rebase (to preserve a nice, easy to bisect history)&lt;br /&gt;
&lt;br /&gt;
When you're ready to '''update your review request''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arc diff --update Dxx origin/master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arc will prompt you for a message: describe what you've changed w.r.t. the previous review request, free form.&lt;br /&gt;
Your message will become the changelog entry in Differential for this new version of the diff.&lt;br /&gt;
&lt;br /&gt;
Differential only care about the code diff, and not about the commits or their order.&lt;br /&gt;
Therefore each &amp;quot;update&amp;quot; can be a completely different series of commits, possibly rewritten from the previous submission.&lt;br /&gt;
&lt;br /&gt;
=== Landing your change onto master ===&lt;br /&gt;
&lt;br /&gt;
Once your change has been approved in Differential, you will be able to land it onto the master branch.&lt;br /&gt;
&lt;br /&gt;
Before doing so, you're encouraged to '''clean up your git commit history''', reordering/splitting/merging commits as needed to have separate logical commits and an easy to bisect history.&lt;br /&gt;
Update the diff [https://wiki.softwareheritage.org/wiki/Code_review_in_Phabricator#Updating_your_branch_to_reflect_requested_changes following the prior section].&lt;br /&gt;
(It'd be good to let the ci build finish to make sure everything is still green).&lt;br /&gt;
&lt;br /&gt;
Once you're happy you can '''push to origin/master''' directly, e.g.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout master&lt;br /&gt;
git merge my-shiny-feature&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionally you can then delete your local feature branch:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git branch -d my-shiny-feature&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reviewing locally / landing someone else's changes ===&lt;br /&gt;
&lt;br /&gt;
You can do local reviews of code with arc patch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arc patch Dxyz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a branch '''arcpatch-Dxyz''' containing the changes on your local checkout.&lt;br /&gt;
&lt;br /&gt;
You can then merge those changes upstream with&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout master&lt;br /&gt;
git merge --ff arcpatch-Dxyz&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or, alternatively:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arc land --squash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Code review]] for guidelines on how code is reviewed when developing for Software Heritage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Software development]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Google_Season_of_Docs_2019&amp;diff=1027</id>
		<title>Google Season of Docs 2019</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Google_Season_of_Docs_2019&amp;diff=1027"/>
		<updated>2019-05-13T12:23:59Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: fix Season of Docs timeline&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:GSoDLogo.png|800px]]&lt;br /&gt;
&lt;br /&gt;
== General information ==&lt;br /&gt;
&lt;br /&gt;
This page is the central point of information for [[Software Heritage]] participation into the [https://developers.google.com/season-of-docs/ Google Season of Docs] program.&lt;br /&gt;
&lt;br /&gt;
Google Summer of Code is a program where Google pays technical writers stipends to work on free software projects such as Software Heritage. Each writer works with mentors from the community to complete a documentation project.&lt;br /&gt;
&lt;br /&gt;
== I want to participate as a technical writer ==&lt;br /&gt;
&lt;br /&gt;
Great!, we are very glad for your interest in contributing to Software Heritage and we are looking forward to work together.&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
&lt;br /&gt;
The following prerequisites apply to Software Heritage GSoD projects:&lt;br /&gt;
&lt;br /&gt;
* [http://www.sphinx-doc.org/ Sphinx] is our documentation system of choice, you should be familiar with it to apply. In particular, we generally use reStructuredText markup and (for API references) Python docstrings with the [https://www.sphinx-doc.org/en/master/usage/extensions/napoleon.html Napoleon style]&lt;br /&gt;
* [https://git-scm.com Git] is our version control system of choice, you should be familiar with it to apply&lt;br /&gt;
* additional prerequisites depend on the project you will work on; check project descriptions for details&lt;br /&gt;
&lt;br /&gt;
=== Before you apply ===&lt;br /&gt;
&lt;br /&gt;
Here are the steps you should follow before applying, to make sure you have a general idea of the current state of Software Heritage technical documentation:&lt;br /&gt;
&lt;br /&gt;
* Learn about our project via our [https://www.softwareheritage.org/ main website] and the actual [https://archive.softwareheritage.org/ source code archive]&lt;br /&gt;
* Check out the index of our [https://www.softwareheritage.org/community/developers/ resources for developers]&lt;br /&gt;
* In particular make sure to have a look at:&lt;br /&gt;
** our [https://wiki.softwareheritage.org/ public wiki]&lt;br /&gt;
** our [https://docs.softwareheritage.org/devel/ documentation index]&lt;br /&gt;
* Technical setup:&lt;br /&gt;
** Create an account on our [https://forge.softwareheritage.org development forge]&lt;br /&gt;
** Familiarize yourself with our [[Code review in Phabricator|code review workflow]]&lt;br /&gt;
** Make a simple change to the documentation of any one of our [https://docs.softwareheritage.org/devel/ software components] and submit it as a [https://forge.softwareheritage.org/differential/ diff] for code review, following the above workflow. Feel free to submit any patch you think it might be useful.&lt;br /&gt;
&lt;br /&gt;
=== What to include in your application ===&lt;br /&gt;
&lt;br /&gt;
Make sure that your application includes the following information:&lt;br /&gt;
&lt;br /&gt;
* Describe the '''specific project''' you want to work on. What do you want to achieve? Why is it important? Why is it useful for Software Heritage? The project might be one of the project ideas that we have prepared below, or something else entirely that you want to contribute to Software Heritage. Your pet peeve, surprise us!&lt;br /&gt;
* Detail your '''work plan''': a brief description of how you plan to go about your project, including a list of  ''deliverables'' and a ''timeline'' of when do you expect them to be available.&lt;br /&gt;
* Include a reference to '''the diff''' you submitted before applying (see the &amp;quot;Before you apply&amp;quot; section above).&lt;br /&gt;
&lt;br /&gt;
== Ideas list ==&lt;br /&gt;
&lt;br /&gt;
Below you can find a list of project ideas that are good options for a&lt;br /&gt;
reasonably sized GSoD project.  They are just suggestion though, don't feel&lt;br /&gt;
obliged to pick one of them if there is nothing that fits your taste and&lt;br /&gt;
abilities.  Feel free to propose something else that you are excited about and&lt;br /&gt;
that contributes to improve the Software Heritage documentation: we will be&lt;br /&gt;
happy to consider it!&lt;br /&gt;
&lt;br /&gt;
=== Reorganize developer documentation as tutorials/how-to/discussions/references ===&lt;br /&gt;
&lt;br /&gt;
Our [https://docs.softwareheritage.org/devel/ developer documentation] is not particularly structured, making it hard to use it properly.&lt;br /&gt;
We would like to reorganize it following the [https://www.youtube.com/watch?v=t4vKPhjcMZg tutorials/how-to/discussions/references taxonomy], or something equally sensible.&lt;br /&gt;
&lt;br /&gt;
This project will require discussing the intended use cases of this page, conceptually structure the future version of it, implement it, and (re)write suitable language to introduce the various parts.&lt;br /&gt;
&lt;br /&gt;
=== Write a high-level technical overview of the project, data model, and data flow ===&lt;br /&gt;
&lt;br /&gt;
We have described the data model and archival data flow of Software Heritage in [https://upsilon.cc/~zack/research/publications/ipres-2018-doi.pdf various] [https://upsilon.cc/~zack/research/publications/cacm-2018-software-heritage.pdf scientific] [https://upsilon.cc/~zack/research/publications/msr-2019-swh.pdf papers], but haven't really worked on a general, high-level, technical presentation of it that targets developers.&lt;br /&gt;
The current [https://docs.softwareheritage.org/devel/swh-model/data-model.html#data-model data model documentation] has been copy-pasted from scientific papers.&lt;br /&gt;
We want to revisit it, to make sure the language description is suitable for a more general technical public, possibly complementing it with more abstract data-structure descriptions and cross-references to the code implementing the model and the workflow in the actual implementation.&lt;br /&gt;
&lt;br /&gt;
=== Design and document consistent writing conventions for Python docstrings ===&lt;br /&gt;
&lt;br /&gt;
The docstrings of the [https://docs.softwareheritage.org/devel/#components various software components] in the Software Heritage stack are not very consistent.&lt;br /&gt;
They have been written by a number of different developers, with varying degrees of English proficiency.&lt;br /&gt;
&lt;br /&gt;
We would like to document, as a set of writing guidelines, how to write them to the benefits of current and future developers.&lt;br /&gt;
The guidelines should include what to write in docstrings and whatnot, writing styles and guidance, examples of good and bad content for them, etc.&lt;br /&gt;
&lt;br /&gt;
To the extent it is possible, this project will also explore automating checks for guidelines conformance, in the form of basic structural (e.g., are all function parameters documented? is the function name correct? etc.) and writing checks (e.g., spellchecking, grammar checking, etc.).&lt;br /&gt;
&lt;br /&gt;
=== Revamp new (code) contributor tutorial ===&lt;br /&gt;
&lt;br /&gt;
The current [https://docs.softwareheritage.org/devel/#getting-started getting started documentation] include two overlapping documents: one about how to ''run'' a local instance of the full Software Heritage stack, another about how to create a local setup for current and future project ''developers''.&lt;br /&gt;
We would like to review those documents for consistency and, more generally, revamp documentation that will help wannabe code contributors to quickly get started and submit patches.&lt;br /&gt;
&lt;br /&gt;
As part of this project we might also want to revamp glossary, data model and other cross-cutting documents that help newcomers understand where-is-what in the code base and how to practically prepare and send us patches.&lt;br /&gt;
&lt;br /&gt;
=== Restructure wiki landing page as main community entry point ===&lt;br /&gt;
&lt;br /&gt;
Our [[Main_Page|public wiki landing page]] is, well, a mess.&lt;br /&gt;
It has grown inorganically by accumulating links to pages used more as working drafts than reasonably structured documents.&lt;br /&gt;
We would like to restructure it to cater for various use cases (users, developers, students, curators, scientists, etc.) in the attempt of making it the primary entry point into Software Heritage for all community members.&lt;br /&gt;
&lt;br /&gt;
This project will require discussing the various uses cases, design a suitable page layout, implement it in the wiki, write the introductory parts for each path into the wiki.&lt;br /&gt;
A related task, if time permits, will be to reorganize the wiki [[Special:Categories|category taxonomy]] and document when/how to use the available categories in the future.&lt;br /&gt;
&lt;br /&gt;
Working on this project will require familiarity with [https://www.mediawiki.org/wiki/MediaWiki Mediawiki] and its markup language.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
&lt;br /&gt;
GSoD applicants are encouraged to get in touch with the Software Heritage community using the standard development communication channels, i.e.:&lt;br /&gt;
&lt;br /&gt;
* the #swh-devel IRC channel on [https://freenode.net Freenode]&lt;br /&gt;
* the [https://sympa.inria.fr/sympa/info/swh-devel swh-devel mailing list]&lt;br /&gt;
&lt;br /&gt;
See our [https://www.softwareheritage.org/community/developers/ development information page] for more details.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
&lt;br /&gt;
See the official [https://developers.google.com/season-of-docs/docs/timeline Google Season of Docs timeline].&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Debian_packaging&amp;diff=968</id>
		<title>Debian packaging</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Debian_packaging&amp;diff=968"/>
		<updated>2019-02-08T15:28:08Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Package repository ==&lt;br /&gt;
&lt;br /&gt;
A package repository is available on https://debian.softwareheritage.org/.&lt;br /&gt;
&lt;br /&gt;
Unstable / Testing :&lt;br /&gt;
  deb [trusted=yes] https://debian.softwareheritage.org/ unstable main&lt;br /&gt;
&lt;br /&gt;
Stable / Stretch :&lt;br /&gt;
  deb [trusted=yes] https://debian.softwareheritage.org/ stretch-swh main&lt;br /&gt;
&lt;br /&gt;
This package repository is handled via reprepro on pergamon.internal.softwareheritage.org (base directory : /srv/softwareheritage/repository).&lt;br /&gt;
&lt;br /&gt;
=== Uploading packages ===&lt;br /&gt;
&lt;br /&gt;
Packages are added to the repository using &amp;lt;tt&amp;gt;reprepro -vb /srv/softwareheritage/repository processincoming incoming&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For packages to be accepted, they need to be :&lt;br /&gt;
# A changes file uploaded to &amp;lt;tt&amp;gt;/srv/softwareheritage/repository/incoming&amp;lt;/tt&amp;gt;&lt;br /&gt;
# Targetted at one of the supported distributions (unstable, unstable-swh, stretch, stretch-backports, stretch-backports-swh), jessie, jessie-backports, jessie-backports-swh)&lt;br /&gt;
# Signed by one of the keys listed in /srv/softwareheritage/repository/conf/uploaders&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Git repositories for Debian packages ==&lt;br /&gt;
&lt;br /&gt;
Our git repository structure for Debian packages is compatible with &amp;lt;tt&amp;gt;git-buildpackage&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We have two different ways of handling repositories for Debian packages:&lt;br /&gt;
* Packages of python modules where *we* are upstream&lt;br /&gt;
* Packages of dependencies from another upstream (this also encompasses upstream Debian packages that we wish to backport for deployment)&lt;br /&gt;
&lt;br /&gt;
For these classes of packages, we have two sets of (identical) Jenkins jobs to handle building and uploading these packages to our package repository. The structure of the packaging branches for both classes is pretty much the same, the repositories only differ on how we handle upstream commits:&lt;br /&gt;
* Our own modules are merged with the upstream repository&lt;br /&gt;
* External dependencies ignore the upstream repository and only have packaging branches.&lt;br /&gt;
&lt;br /&gt;
=== Branch and tags structure ===&lt;br /&gt;
&lt;br /&gt;
Our debian packaging Jenkins jobs expect the following branches, which are pretty close to what https://dep-team.pages.debian.net/deps/dep14/ mandates:&lt;br /&gt;
* debian/upstream (history of unpacked upstream releases)&lt;br /&gt;
* debian/&amp;lt;suite&amp;gt; (history of the packaging of the given suite, e.g. unstable-swh, stretch-swh)&lt;br /&gt;
* pristine-tar (data to regenerate upstream tarballs from a git export)&lt;br /&gt;
&lt;br /&gt;
The name of the debian/upstream branch doesn't matter ''as long as it's properly configured in the &amp;lt;tt&amp;gt;debian/gbp.conf&amp;lt;/tt&amp;gt; file''. It's only really used by &amp;lt;tt&amp;gt;gbp import-orig&amp;lt;/tt&amp;gt; when importing a new release.&lt;br /&gt;
&lt;br /&gt;
The tags marking upstream releases imported from tarballs for Debian packaging purposes are named &amp;lt;tt&amp;gt;debian/upstream/''&amp;lt;upstream version number&amp;gt;''&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Our Jenkins jobs are triggered on incoming tags named &amp;lt;tt&amp;gt;debian/''&amp;lt;version&amp;gt;''&amp;lt;/tt&amp;gt;. To generate the proper tags, use &amp;lt;tt&amp;gt;gbp buildpackage --git-tag-only&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The git-buildpackage configuration, &amp;lt;tt&amp;gt;debian/gbp.conf&amp;lt;/tt&amp;gt;, should be the following:&lt;br /&gt;
 [DEFAULT]&lt;br /&gt;
 upstream-branch=debian/upstream&lt;br /&gt;
 upstream-tag=debian/upstream/%(version)s&lt;br /&gt;
 debian-branch=debian/''&amp;lt;current suite&amp;gt;''&lt;br /&gt;
 pristine-tar=True&lt;br /&gt;
&lt;br /&gt;
==== Automatic packaging for swh python modules ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;swh.*&amp;lt;/tt&amp;gt; python modules have an extra jenkins job that updates the packaging automatically when we do an upstream release. This job only runs &amp;lt;tt&amp;gt;gbp import-orig&amp;lt;/tt&amp;gt; with the tarball we release to PyPI, and the right options to merge the upstream history.&lt;br /&gt;
&lt;br /&gt;
To merge changes from the upstream history, we add the following option to &amp;lt;tt&amp;gt;gbp.conf&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 upstream-vcs-tag=v%(version)s&lt;br /&gt;
&lt;br /&gt;
=== Bootstrapping a dependency packaging repository ===&lt;br /&gt;
&lt;br /&gt;
Bootstrapping the packaging repository for a dependency is analoguous to regular Debian practices:&lt;br /&gt;
&lt;br /&gt;
Download the upstream tarball. For PyPI, use the redirector at http://pypi.debian.net/&amp;lt;pkgname&amp;gt;/&lt;br /&gt;
 wget http://pypi.debian.net/pytest-postgresql/pytest-postgresql-1.3.4.tar.gz&lt;br /&gt;
&lt;br /&gt;
Create a new git repository&lt;br /&gt;
 mkdir pytest-postgresql&lt;br /&gt;
 cd pytest-postgresql&lt;br /&gt;
 git init&lt;br /&gt;
&lt;br /&gt;
Import the original upstream version&lt;br /&gt;
 git checkout -b debian/unstable-swh&lt;br /&gt;
 gbp import-orig --pristine-tar --upstream-branch=debian/upstream --upstream-tag=debian/upstream/%(version)s --debian-branch=debian/unstable-swh ../pytest-postgresql-1.3.4.tar.gz&lt;br /&gt;
 # What will be the source package name? [pytest-postgresql] &lt;br /&gt;
 # What is the upstream version? [1.3.4] &lt;br /&gt;
 # gbp:info: Importing '../pytest-postgresql-1.3.4.tar.gz' to branch 'debian/upstream'...&lt;br /&gt;
 # gbp:info: Source package is pytest-postgresql&lt;br /&gt;
 # gbp:info: Upstream version is 1.3.4&lt;br /&gt;
 # gbp:info: Successfully imported version 1.3.4 of ../pytest-postgresql-1.3.4.tar.gz&lt;br /&gt;
&lt;br /&gt;
Bootstrap the debian directory&lt;br /&gt;
 mkdir debian&lt;br /&gt;
 mkdir debian/source&lt;br /&gt;
 echo '3.0 (quilt)' &amp;gt; debian/source/format&lt;br /&gt;
 cat &amp;gt; debian/gbp.conf &amp;lt;&amp;lt; EOF&lt;br /&gt;
 [DEFAULT]&lt;br /&gt;
 upstream-branch=debian/upstream&lt;br /&gt;
 upstream-tag=debian/upstream/%(version)s&lt;br /&gt;
 debian-branch=debian/unstable-swh&lt;br /&gt;
 pristine-tar=True&lt;br /&gt;
 EOF&lt;br /&gt;
 cp /usr/share/doc/debhelper/examples/rules.tiny debian/rules&lt;br /&gt;
 vim debian/control&lt;br /&gt;
 # [...] adapt debian/control from another package&lt;br /&gt;
 dch --create --package pytest-postgresql --newversion 1.3.4-1+swh1&lt;br /&gt;
 vim debian/copyright&lt;br /&gt;
 # [...] adapt debian/copyright from another package&lt;br /&gt;
 git add debian&lt;br /&gt;
 git commit -m &amp;quot;Initial packaging for pytest-postgresql&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You can then go on to try building the package. Once the package builds, if you want to check your package's conformance to Debian policy, you can run &amp;lt;tt&amp;gt;lintian&amp;lt;/tt&amp;gt; on the changes:&lt;br /&gt;
 lintian -EI ../pytest-postgresql_1.3.4-1+swh1_amd64.changes&lt;br /&gt;
&lt;br /&gt;
Note that you have to ignore warnings about unknown distributions, as we're building specifically for our repository&lt;br /&gt;
&lt;br /&gt;
We need to use a &amp;lt;tt&amp;gt;+swh1&amp;lt;/tt&amp;gt; version suffix to avoid clashing with potential upstream Debian package versions.&lt;br /&gt;
&lt;br /&gt;
==== Bootstrapping the backport branches ====&lt;br /&gt;
&lt;br /&gt;
During most of the operation, backports should happen automatically as we have a Jenkins job that generates backports on successful builds. However, when creating a packaging repository, we need to bootstrap the branches once, before Jenkins is able to do the work automatically.&lt;br /&gt;
&lt;br /&gt;
The backport branches should (ideally) be bootstrapped from a debian tag that has successfully built on Jenkins.&lt;br /&gt;
&lt;br /&gt;
Checkout the new branch&lt;br /&gt;
 git checkout debian/&amp;lt;version number&amp;gt;&lt;br /&gt;
 git checkout -b debian/stretch-swh&lt;br /&gt;
&lt;br /&gt;
Update the gbp config to match the branch&lt;br /&gt;
 sed -i s/unstable-swh/stretch-swh/ debian/gbp.conf&lt;br /&gt;
&lt;br /&gt;
Generate the initial backports entry. Use the current Debian version number (9 for stretch, 10 for buster, ...)&lt;br /&gt;
 dch -l ~bpo9 -D stretch-swh --force-distribution 'Rebuild for stretch-swh'&lt;br /&gt;
&lt;br /&gt;
You should then be able to try a local package build, and if that succeeds, to push the tag for Jenkins to autobuild.&lt;br /&gt;
&lt;br /&gt;
==== Setting up the repository on Phabricator ====&lt;br /&gt;
&lt;br /&gt;
The repository on Phabricator needs the following settings:&lt;br /&gt;
* Callsign: non-empty (prefix should be P according to https://wiki.softwareheritage.org/wiki/Phabricator_callsign_naming_convention)&lt;br /&gt;
* Short name: non-empty (used to make pretty git clone URLs; ideally matching the source package name)&lt;br /&gt;
* Repository tags: &amp;quot;Has debian packaging branches&amp;quot; (allows Jenkins to push on the debian/* branches)&lt;br /&gt;
* Policy&lt;br /&gt;
** View: Public (no login required)&lt;br /&gt;
** Push: All users (actual restrictions are handled by Herald rules)&lt;br /&gt;
** Edit: Developers&lt;br /&gt;
* Activate the repository&lt;br /&gt;
* Look up the path to the repository on the storage tab&lt;br /&gt;
&lt;br /&gt;
You need to setup the post-receive hook for Jenkins to be able to trigger on tag pushes.&lt;br /&gt;
 ssh -t tate.internal.softwareheritage.org phabricator-setup-hook &amp;lt;repository-path&amp;gt; post-receive-debian-deps&lt;br /&gt;
&lt;br /&gt;
==== Setting up the Jenkins jobs ====&lt;br /&gt;
&lt;br /&gt;
The Jenkins jobs are accessible through the ui: https://jenkins.softwareheritage.org/view/Debian%20dependency%20packages/&lt;br /&gt;
They are declared in the repository: https://forge.softwareheritage.org/source/swh-jenkins-jobs&lt;br /&gt;
&lt;br /&gt;
Jobs for dependency packages are configured in &amp;lt;tt&amp;gt;jobs/dependency-packages.yaml&amp;lt;/tt&amp;gt;. You can add a section as follows:&lt;br /&gt;
&lt;br /&gt;
 - project:&lt;br /&gt;
     name: &amp;lt;Callsign&amp;gt;&lt;br /&gt;
     display-name: &amp;lt;short-name&amp;gt;&lt;br /&gt;
     pkg: &amp;lt;source-name&amp;gt;&lt;br /&gt;
     jobs:&lt;br /&gt;
       - 'dependency-jobs-{name}'&lt;br /&gt;
&lt;br /&gt;
Use the regular review process to land your changes.&lt;br /&gt;
Once your changes are pushed, a dedicated Jenkins job will generate the jobs from the configuration.&lt;br /&gt;
&lt;br /&gt;
If your package needs extra repositories to build, you can add them as comma-separated values to the &amp;lt;tt&amp;gt;deb-extra-repositories&amp;lt;/tt&amp;gt; setting, with the following notes:&lt;br /&gt;
* When building packages for the &amp;quot;*-swh&amp;quot; suites, the Software Heritage Debian repository is automatically enabled.&lt;br /&gt;
* When building packages for backports suites, the backports repository is automatically enabled.&lt;br /&gt;
&lt;br /&gt;
=== Local package building ===&lt;br /&gt;
&lt;br /&gt;
To locally test a package build, go on the appropriate debian packaging branch, and run&lt;br /&gt;
 gbp buildpackage --git-builder=sbuild -As --no-clean-source&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;gbp buildpackage&amp;lt;/tt&amp;gt; passes all options not starting with &amp;lt;tt&amp;gt;--git-&amp;lt;/tt&amp;gt; to the builder. Some useful options are the following:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;--git-ignore-new&amp;lt;/tt&amp;gt; builds from the working tree, with all the uncommitted changes. Useful for quick iteration when something *just* *doesn't* *work*.&lt;br /&gt;
* &amp;lt;tt&amp;gt;--no-clean-source&amp;lt;/tt&amp;gt; doesn't run debian/rules clean outside of the chroot, so you don't have to clutter your dev machine with all build dependencies&lt;br /&gt;
* &amp;lt;tt&amp;gt;--extra-repository=&amp;quot;'''repository specification'''&amp;quot;&amp;lt;/tt&amp;gt; adds the given repository in the chroot before building.&lt;br /&gt;
* &amp;lt;tt&amp;gt;--extra-repository-key='''repository signing key'''&amp;lt;/tt&amp;gt; adds the given key as a trusted gpg key for package sources&lt;br /&gt;
* &amp;lt;tt&amp;gt;--extra-package='''&amp;lt;.deb file or directory&amp;gt;'''&amp;lt;/tt&amp;gt; makes the given package (or all .deb packages in the given directory) available for dependency resolution. Useful when testing builds with a dependency chain.&lt;br /&gt;
* &amp;lt;tt&amp;gt;--force-orig-source&amp;lt;/tt&amp;gt; forces addition of the &amp;lt;tt&amp;gt;.orig.tar.gz&amp;lt;/tt&amp;gt; file in the &amp;lt;tt&amp;gt;.changes&amp;lt;/tt&amp;gt; file (useful when trying to upload a backport)&lt;br /&gt;
&lt;br /&gt;
See &amp;lt;tt&amp;gt;gbp help buildpackage&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;man sbuild&amp;lt;/tt&amp;gt; for a full description of all options&lt;br /&gt;
&lt;br /&gt;
for example:&lt;br /&gt;
 gbp buildpackage --git-builder=sbuild -As --force-orig-source --extra-repository='deb [trusted=yes] https://debian.softwareheritage.org/ stretch-swh main'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(TODO: rewrite bin/make-package as bin/swh-gbp-buildpackage wrapping &amp;lt;tt&amp;gt;gbp buildpackage&amp;lt;/tt&amp;gt; with the most common options)&lt;br /&gt;
&lt;br /&gt;
=== Remote package building ===&lt;br /&gt;
&lt;br /&gt;
Jenkins builds packages when the repository receives a tag.&lt;br /&gt;
&lt;br /&gt;
Once the local build succeeds, tag the package with:&lt;br /&gt;
 gbp buildpackage --git-tag-only --git-sign-tags&lt;br /&gt;
&lt;br /&gt;
Alternatively, you can add the &amp;lt;tt&amp;gt;--git-tag&amp;lt;/tt&amp;gt; option to your &amp;lt;tt&amp;gt;gbp buildpackage&amp;lt;/tt&amp;gt; command so the tag happens automatically on a successful build.&lt;br /&gt;
&lt;br /&gt;
Then, push your tag, and Jenkins jobs should get triggered&lt;br /&gt;
 git push --tags&lt;br /&gt;
&lt;br /&gt;
== Build Environment setup ==&lt;br /&gt;
&lt;br /&gt;
Our automated packaging setup uses sbuild, which is also used by the Debian build daemons themselves. This section shows how to set it up for local use.&lt;br /&gt;
&lt;br /&gt;
=== sbuild setup ===&lt;br /&gt;
&lt;br /&gt;
 # Install the package&lt;br /&gt;
 sudo apt-get install sbuild&lt;br /&gt;
 &lt;br /&gt;
 # Add your user to the sbuild group, to allow him to use the sbuild commands&lt;br /&gt;
 sudo sbuild-adduser $USER&lt;br /&gt;
 # You have to logout and log back in&lt;br /&gt;
 &lt;br /&gt;
 # Prepare chroots&lt;br /&gt;
 sudo mkdir /srv/chroots&lt;br /&gt;
 sudo mkdir /srv/chroots/var&lt;br /&gt;
 &lt;br /&gt;
 # Optionally create a separate filesystem for /srv/chroots and move the sbuild/schroot data to that partition&lt;br /&gt;
 sudo rsync -avz --delete /var/lib/schroot/ /srv/chroots/var/schroot/&lt;br /&gt;
 sudo rm -r /var/lib/schroot&lt;br /&gt;
 sudo ln -sf /srv/chroots/var/schroot /var/lib/schroot&lt;br /&gt;
 &lt;br /&gt;
 sudo rsync -avz --delete /var/lib/sbuild/ /srv/chroots/var/sbuild/&lt;br /&gt;
 sudo rm -r /var/lib/sbuild&lt;br /&gt;
 sudo ln -sf /srv/chroots/var/sbuild /var/lib/sbuild&lt;br /&gt;
 # end optionally&lt;br /&gt;
 &lt;br /&gt;
 # Create unstable/sid chroot&lt;br /&gt;
 sudo sbuild-createchroot --include apt-transport-https,ca-certificates sid /srv/chroots/sid http://deb.debian.org/debian/&lt;br /&gt;
 &lt;br /&gt;
 # Create stretch chroot&lt;br /&gt;
 sudo sbuild-createchroot --include apt-transport-https,ca-certificates stretch /srv/chroots/stretch http://deb.debian.org/debian/&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 # If you use /etc/hosts to resolve *.internal.softwareheritage.org hosts&lt;br /&gt;
 echo hosts &amp;gt;&amp;gt; /etc/schroot/sbuild/nssdatabases&lt;br /&gt;
&lt;br /&gt;
=== schroot setup ===&lt;br /&gt;
&lt;br /&gt;
Now that the sbuild base setup is done. You now need to configure schroot to use an overlay filesystem, which will avoid copying the chroots at each build.&lt;br /&gt;
&lt;br /&gt;
You need to update the configuration (in &amp;lt;tt&amp;gt;/etc/schroot/chroot.d/*-sbuild-*&amp;lt;/tt&amp;gt;) with the following directives:&lt;br /&gt;
&lt;br /&gt;
 source-groups=root,sbuild&lt;br /&gt;
 source-root-groups=root,sbuild&lt;br /&gt;
 union-type=overlay&lt;br /&gt;
&lt;br /&gt;
This allows the sbuild group to edit the contents of the source chroot (for instance to update it) and sets up the overlay.&lt;br /&gt;
&lt;br /&gt;
You should also use this opportunity to add &amp;quot;aliases&amp;quot; to your chroot, so that sbuild will directly support the distributions we're using (unstable-swh, jessie-backports-swh):&lt;br /&gt;
&lt;br /&gt;
For unstable:&lt;br /&gt;
 aliases=unstable-amd64-sbuild,UNRELEASED-amd64-sbuild,unstable-swh-amd64-sbuild&lt;br /&gt;
&lt;br /&gt;
For stretch:&lt;br /&gt;
 aliases=stable-amd64-sbuild,stable-backports-amd64-sbuild,stretch-swh-amd64-sbuild,stretch-backports-amd64-sbuild,stretch-backports-swh-amd64-sbuild&lt;br /&gt;
&lt;br /&gt;
==== dependencies cache ====&lt;br /&gt;
&lt;br /&gt;
Add the following line to schroot's fstab /etc/schroot/sbuild/fstab&lt;br /&gt;
to permit reuse of existing fetched dependencies:&lt;br /&gt;
&lt;br /&gt;
 /var/cache/apt/archives /var/cache/apt/archives none rw,bind 0 0&lt;br /&gt;
&lt;br /&gt;
You can also run apt-cacher-ng, which will avoid locking issues when several chroots try to access the package cache at once. You then need to add the proxy configuration to apt by adding a file in &amp;lt;tt&amp;gt;/etc/apt/apt.conf.d&amp;lt;/tt&amp;gt; on each chroot&lt;br /&gt;
&lt;br /&gt;
=== schroot update ===&lt;br /&gt;
&lt;br /&gt;
You should update your chroot environments once in a while (to avoid repeating over and over the same step during your package build):&lt;br /&gt;
&lt;br /&gt;
  sudo sbuild-update -udcar sid; sudo sbuild-update -udcar stretch; sudo sbuild-update -ud jessie &lt;br /&gt;
&lt;br /&gt;
=== environment setup ===&lt;br /&gt;
&lt;br /&gt;
The Debian tools use a few variables to preset your name and email. Add this to your &amp;lt;tt&amp;gt;.&amp;lt;shell&amp;gt;rc&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 export DEBFULLNAME=&amp;quot;Debra Hacker&amp;quot;&lt;br /&gt;
 export DEBEMAIL=debra.hacker@example.com&lt;br /&gt;
&lt;br /&gt;
Make sure this data matches an uid for your GPG key. Else, you can use the &amp;lt;tt&amp;gt;DEBSIGN_KEYID=&amp;lt;yourfullkeyid&amp;gt;&amp;lt;/tt&amp;gt; variable.&lt;br /&gt;
(Future version of gpg2, e.g. 2.2.5 can refuse to sign with the short key id).&lt;br /&gt;
&lt;br /&gt;
=== overlay in tmpfs for faster builds ===&lt;br /&gt;
&lt;br /&gt;
You can add this to your fstab to put the overlay hierarchy in RAM:&lt;br /&gt;
&lt;br /&gt;
  tmpfs /var/lib/schroot/union/overlay tmpfs uid=root,gid=root,mode=0750,nr_inodes=0  0  0&lt;br /&gt;
&lt;br /&gt;
=== Base packages ===&lt;br /&gt;
&lt;br /&gt;
In order not to reinstall the same packages every time, it is also reasonable to install debhelper, python3 and python3-all in the chroot.&lt;br /&gt;
&lt;br /&gt;
'''If you do so, do not use these chroots to upload to Debian itself!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Software development]]&lt;br /&gt;
[[Category:System administration]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Debian_packaging&amp;diff=967</id>
		<title>Debian packaging</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Debian_packaging&amp;diff=967"/>
		<updated>2019-02-08T15:27:59Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: Overhaul packaging docs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki page https://wiki.softwareheritage.org/index.php?title=Debian_packaging&amp;amp;action=edit&lt;br /&gt;
&lt;br /&gt;
== Package repository ==&lt;br /&gt;
&lt;br /&gt;
A package repository is available on https://debian.softwareheritage.org/.&lt;br /&gt;
&lt;br /&gt;
Unstable / Testing :&lt;br /&gt;
  deb [trusted=yes] https://debian.softwareheritage.org/ unstable main&lt;br /&gt;
&lt;br /&gt;
Stable / Stretch :&lt;br /&gt;
  deb [trusted=yes] https://debian.softwareheritage.org/ stretch-swh main&lt;br /&gt;
&lt;br /&gt;
This package repository is handled via reprepro on pergamon.internal.softwareheritage.org (base directory : /srv/softwareheritage/repository).&lt;br /&gt;
&lt;br /&gt;
=== Uploading packages ===&lt;br /&gt;
&lt;br /&gt;
Packages are added to the repository using &amp;lt;tt&amp;gt;reprepro -vb /srv/softwareheritage/repository processincoming incoming&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For packages to be accepted, they need to be :&lt;br /&gt;
# A changes file uploaded to &amp;lt;tt&amp;gt;/srv/softwareheritage/repository/incoming&amp;lt;/tt&amp;gt;&lt;br /&gt;
# Targetted at one of the supported distributions (unstable, unstable-swh, stretch, stretch-backports, stretch-backports-swh), jessie, jessie-backports, jessie-backports-swh)&lt;br /&gt;
# Signed by one of the keys listed in /srv/softwareheritage/repository/conf/uploaders&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Git repositories for Debian packages ==&lt;br /&gt;
&lt;br /&gt;
Our git repository structure for Debian packages is compatible with &amp;lt;tt&amp;gt;git-buildpackage&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We have two different ways of handling repositories for Debian packages:&lt;br /&gt;
* Packages of python modules where *we* are upstream&lt;br /&gt;
* Packages of dependencies from another upstream (this also encompasses upstream Debian packages that we wish to backport for deployment)&lt;br /&gt;
&lt;br /&gt;
For these classes of packages, we have two sets of (identical) Jenkins jobs to handle building and uploading these packages to our package repository. The structure of the packaging branches for both classes is pretty much the same, the repositories only differ on how we handle upstream commits:&lt;br /&gt;
* Our own modules are merged with the upstream repository&lt;br /&gt;
* External dependencies ignore the upstream repository and only have packaging branches.&lt;br /&gt;
&lt;br /&gt;
=== Branch and tags structure ===&lt;br /&gt;
&lt;br /&gt;
Our debian packaging Jenkins jobs expect the following branches, which are pretty close to what https://dep-team.pages.debian.net/deps/dep14/ mandates:&lt;br /&gt;
* debian/upstream (history of unpacked upstream releases)&lt;br /&gt;
* debian/&amp;lt;suite&amp;gt; (history of the packaging of the given suite, e.g. unstable-swh, stretch-swh)&lt;br /&gt;
* pristine-tar (data to regenerate upstream tarballs from a git export)&lt;br /&gt;
&lt;br /&gt;
The name of the debian/upstream branch doesn't matter ''as long as it's properly configured in the &amp;lt;tt&amp;gt;debian/gbp.conf&amp;lt;/tt&amp;gt; file''. It's only really used by &amp;lt;tt&amp;gt;gbp import-orig&amp;lt;/tt&amp;gt; when importing a new release.&lt;br /&gt;
&lt;br /&gt;
The tags marking upstream releases imported from tarballs for Debian packaging purposes are named &amp;lt;tt&amp;gt;debian/upstream/''&amp;lt;upstream version number&amp;gt;''&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Our Jenkins jobs are triggered on incoming tags named &amp;lt;tt&amp;gt;debian/''&amp;lt;version&amp;gt;''&amp;lt;/tt&amp;gt;. To generate the proper tags, use &amp;lt;tt&amp;gt;gbp buildpackage --git-tag-only&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The git-buildpackage configuration, &amp;lt;tt&amp;gt;debian/gbp.conf&amp;lt;/tt&amp;gt;, should be the following:&lt;br /&gt;
 [DEFAULT]&lt;br /&gt;
 upstream-branch=debian/upstream&lt;br /&gt;
 upstream-tag=debian/upstream/%(version)s&lt;br /&gt;
 debian-branch=debian/''&amp;lt;current suite&amp;gt;''&lt;br /&gt;
 pristine-tar=True&lt;br /&gt;
&lt;br /&gt;
==== Automatic packaging for swh python modules ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;swh.*&amp;lt;/tt&amp;gt; python modules have an extra jenkins job that updates the packaging automatically when we do an upstream release. This job only runs &amp;lt;tt&amp;gt;gbp import-orig&amp;lt;/tt&amp;gt; with the tarball we release to PyPI, and the right options to merge the upstream history.&lt;br /&gt;
&lt;br /&gt;
To merge changes from the upstream history, we add the following option to &amp;lt;tt&amp;gt;gbp.conf&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 upstream-vcs-tag=v%(version)s&lt;br /&gt;
&lt;br /&gt;
=== Bootstrapping a dependency packaging repository ===&lt;br /&gt;
&lt;br /&gt;
Bootstrapping the packaging repository for a dependency is analoguous to regular Debian practices:&lt;br /&gt;
&lt;br /&gt;
Download the upstream tarball. For PyPI, use the redirector at http://pypi.debian.net/&amp;lt;pkgname&amp;gt;/&lt;br /&gt;
 wget http://pypi.debian.net/pytest-postgresql/pytest-postgresql-1.3.4.tar.gz&lt;br /&gt;
&lt;br /&gt;
Create a new git repository&lt;br /&gt;
 mkdir pytest-postgresql&lt;br /&gt;
 cd pytest-postgresql&lt;br /&gt;
 git init&lt;br /&gt;
&lt;br /&gt;
Import the original upstream version&lt;br /&gt;
 git checkout -b debian/unstable-swh&lt;br /&gt;
 gbp import-orig --pristine-tar --upstream-branch=debian/upstream --upstream-tag=debian/upstream/%(version)s --debian-branch=debian/unstable-swh ../pytest-postgresql-1.3.4.tar.gz&lt;br /&gt;
 # What will be the source package name? [pytest-postgresql] &lt;br /&gt;
 # What is the upstream version? [1.3.4] &lt;br /&gt;
 # gbp:info: Importing '../pytest-postgresql-1.3.4.tar.gz' to branch 'debian/upstream'...&lt;br /&gt;
 # gbp:info: Source package is pytest-postgresql&lt;br /&gt;
 # gbp:info: Upstream version is 1.3.4&lt;br /&gt;
 # gbp:info: Successfully imported version 1.3.4 of ../pytest-postgresql-1.3.4.tar.gz&lt;br /&gt;
&lt;br /&gt;
Bootstrap the debian directory&lt;br /&gt;
 mkdir debian&lt;br /&gt;
 mkdir debian/source&lt;br /&gt;
 echo '3.0 (quilt)' &amp;gt; debian/source/format&lt;br /&gt;
 cat &amp;gt; debian/gbp.conf &amp;lt;&amp;lt; EOF&lt;br /&gt;
 [DEFAULT]&lt;br /&gt;
 upstream-branch=debian/upstream&lt;br /&gt;
 upstream-tag=debian/upstream/%(version)s&lt;br /&gt;
 debian-branch=debian/unstable-swh&lt;br /&gt;
 pristine-tar=True&lt;br /&gt;
 EOF&lt;br /&gt;
 cp /usr/share/doc/debhelper/examples/rules.tiny debian/rules&lt;br /&gt;
 vim debian/control&lt;br /&gt;
 # [...] adapt debian/control from another package&lt;br /&gt;
 dch --create --package pytest-postgresql --newversion 1.3.4-1+swh1&lt;br /&gt;
 vim debian/copyright&lt;br /&gt;
 # [...] adapt debian/copyright from another package&lt;br /&gt;
 git add debian&lt;br /&gt;
 git commit -m &amp;quot;Initial packaging for pytest-postgresql&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You can then go on to try building the package. Once the package builds, if you want to check your package's conformance to Debian policy, you can run &amp;lt;tt&amp;gt;lintian&amp;lt;/tt&amp;gt; on the changes:&lt;br /&gt;
 lintian -EI ../pytest-postgresql_1.3.4-1+swh1_amd64.changes&lt;br /&gt;
&lt;br /&gt;
Note that you have to ignore warnings about unknown distributions, as we're building specifically for our repository&lt;br /&gt;
&lt;br /&gt;
We need to use a &amp;lt;tt&amp;gt;+swh1&amp;lt;/tt&amp;gt; version suffix to avoid clashing with potential upstream Debian package versions.&lt;br /&gt;
&lt;br /&gt;
==== Bootstrapping the backport branches ====&lt;br /&gt;
&lt;br /&gt;
During most of the operation, backports should happen automatically as we have a Jenkins job that generates backports on successful builds. However, when creating a packaging repository, we need to bootstrap the branches once, before Jenkins is able to do the work automatically.&lt;br /&gt;
&lt;br /&gt;
The backport branches should (ideally) be bootstrapped from a debian tag that has successfully built on Jenkins.&lt;br /&gt;
&lt;br /&gt;
Checkout the new branch&lt;br /&gt;
 git checkout debian/&amp;lt;version number&amp;gt;&lt;br /&gt;
 git checkout -b debian/stretch-swh&lt;br /&gt;
&lt;br /&gt;
Update the gbp config to match the branch&lt;br /&gt;
 sed -i s/unstable-swh/stretch-swh/ debian/gbp.conf&lt;br /&gt;
&lt;br /&gt;
Generate the initial backports entry. Use the current Debian version number (9 for stretch, 10 for buster, ...)&lt;br /&gt;
 dch -l ~bpo9 -D stretch-swh --force-distribution 'Rebuild for stretch-swh'&lt;br /&gt;
&lt;br /&gt;
You should then be able to try a local package build, and if that succeeds, to push the tag for Jenkins to autobuild.&lt;br /&gt;
&lt;br /&gt;
==== Setting up the repository on Phabricator ====&lt;br /&gt;
&lt;br /&gt;
The repository on Phabricator needs the following settings:&lt;br /&gt;
* Callsign: non-empty (prefix should be P according to https://wiki.softwareheritage.org/wiki/Phabricator_callsign_naming_convention)&lt;br /&gt;
* Short name: non-empty (used to make pretty git clone URLs; ideally matching the source package name)&lt;br /&gt;
* Repository tags: &amp;quot;Has debian packaging branches&amp;quot; (allows Jenkins to push on the debian/* branches)&lt;br /&gt;
* Policy&lt;br /&gt;
** View: Public (no login required)&lt;br /&gt;
** Push: All users (actual restrictions are handled by Herald rules)&lt;br /&gt;
** Edit: Developers&lt;br /&gt;
* Activate the repository&lt;br /&gt;
* Look up the path to the repository on the storage tab&lt;br /&gt;
&lt;br /&gt;
You need to setup the post-receive hook for Jenkins to be able to trigger on tag pushes.&lt;br /&gt;
 ssh -t tate.internal.softwareheritage.org phabricator-setup-hook &amp;lt;repository-path&amp;gt; post-receive-debian-deps&lt;br /&gt;
&lt;br /&gt;
==== Setting up the Jenkins jobs ====&lt;br /&gt;
&lt;br /&gt;
The Jenkins jobs are accessible through the ui: https://jenkins.softwareheritage.org/view/Debian%20dependency%20packages/&lt;br /&gt;
They are declared in the repository: https://forge.softwareheritage.org/source/swh-jenkins-jobs&lt;br /&gt;
&lt;br /&gt;
Jobs for dependency packages are configured in &amp;lt;tt&amp;gt;jobs/dependency-packages.yaml&amp;lt;/tt&amp;gt;. You can add a section as follows:&lt;br /&gt;
&lt;br /&gt;
 - project:&lt;br /&gt;
     name: &amp;lt;Callsign&amp;gt;&lt;br /&gt;
     display-name: &amp;lt;short-name&amp;gt;&lt;br /&gt;
     pkg: &amp;lt;source-name&amp;gt;&lt;br /&gt;
     jobs:&lt;br /&gt;
       - 'dependency-jobs-{name}'&lt;br /&gt;
&lt;br /&gt;
Use the regular review process to land your changes.&lt;br /&gt;
Once your changes are pushed, a dedicated Jenkins job will generate the jobs from the configuration.&lt;br /&gt;
&lt;br /&gt;
If your package needs extra repositories to build, you can add them as comma-separated values to the &amp;lt;tt&amp;gt;deb-extra-repositories&amp;lt;/tt&amp;gt; setting, with the following notes:&lt;br /&gt;
* When building packages for the &amp;quot;*-swh&amp;quot; suites, the Software Heritage Debian repository is automatically enabled.&lt;br /&gt;
* When building packages for backports suites, the backports repository is automatically enabled.&lt;br /&gt;
&lt;br /&gt;
=== Local package building ===&lt;br /&gt;
&lt;br /&gt;
To locally test a package build, go on the appropriate debian packaging branch, and run&lt;br /&gt;
 gbp buildpackage --git-builder=sbuild -As --no-clean-source&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;gbp buildpackage&amp;lt;/tt&amp;gt; passes all options not starting with &amp;lt;tt&amp;gt;--git-&amp;lt;/tt&amp;gt; to the builder. Some useful options are the following:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;--git-ignore-new&amp;lt;/tt&amp;gt; builds from the working tree, with all the uncommitted changes. Useful for quick iteration when something *just* *doesn't* *work*.&lt;br /&gt;
* &amp;lt;tt&amp;gt;--no-clean-source&amp;lt;/tt&amp;gt; doesn't run debian/rules clean outside of the chroot, so you don't have to clutter your dev machine with all build dependencies&lt;br /&gt;
* &amp;lt;tt&amp;gt;--extra-repository=&amp;quot;'''repository specification'''&amp;quot;&amp;lt;/tt&amp;gt; adds the given repository in the chroot before building.&lt;br /&gt;
* &amp;lt;tt&amp;gt;--extra-repository-key='''repository signing key'''&amp;lt;/tt&amp;gt; adds the given key as a trusted gpg key for package sources&lt;br /&gt;
* &amp;lt;tt&amp;gt;--extra-package='''&amp;lt;.deb file or directory&amp;gt;'''&amp;lt;/tt&amp;gt; makes the given package (or all .deb packages in the given directory) available for dependency resolution. Useful when testing builds with a dependency chain.&lt;br /&gt;
* &amp;lt;tt&amp;gt;--force-orig-source&amp;lt;/tt&amp;gt; forces addition of the &amp;lt;tt&amp;gt;.orig.tar.gz&amp;lt;/tt&amp;gt; file in the &amp;lt;tt&amp;gt;.changes&amp;lt;/tt&amp;gt; file (useful when trying to upload a backport)&lt;br /&gt;
&lt;br /&gt;
See &amp;lt;tt&amp;gt;gbp help buildpackage&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;man sbuild&amp;lt;/tt&amp;gt; for a full description of all options&lt;br /&gt;
&lt;br /&gt;
for example:&lt;br /&gt;
 gbp buildpackage --git-builder=sbuild -As --force-orig-source --extra-repository='deb [trusted=yes] https://debian.softwareheritage.org/ stretch-swh main'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(TODO: rewrite bin/make-package as bin/swh-gbp-buildpackage wrapping &amp;lt;tt&amp;gt;gbp buildpackage&amp;lt;/tt&amp;gt; with the most common options)&lt;br /&gt;
&lt;br /&gt;
=== Remote package building ===&lt;br /&gt;
&lt;br /&gt;
Jenkins builds packages when the repository receives a tag.&lt;br /&gt;
&lt;br /&gt;
Once the local build succeeds, tag the package with:&lt;br /&gt;
 gbp buildpackage --git-tag-only --git-sign-tags&lt;br /&gt;
&lt;br /&gt;
Alternatively, you can add the &amp;lt;tt&amp;gt;--git-tag&amp;lt;/tt&amp;gt; option to your &amp;lt;tt&amp;gt;gbp buildpackage&amp;lt;/tt&amp;gt; command so the tag happens automatically on a successful build.&lt;br /&gt;
&lt;br /&gt;
Then, push your tag, and Jenkins jobs should get triggered&lt;br /&gt;
 git push --tags&lt;br /&gt;
&lt;br /&gt;
== Build Environment setup ==&lt;br /&gt;
&lt;br /&gt;
Our automated packaging setup uses sbuild, which is also used by the Debian build daemons themselves. This section shows how to set it up for local use.&lt;br /&gt;
&lt;br /&gt;
=== sbuild setup ===&lt;br /&gt;
&lt;br /&gt;
 # Install the package&lt;br /&gt;
 sudo apt-get install sbuild&lt;br /&gt;
 &lt;br /&gt;
 # Add your user to the sbuild group, to allow him to use the sbuild commands&lt;br /&gt;
 sudo sbuild-adduser $USER&lt;br /&gt;
 # You have to logout and log back in&lt;br /&gt;
 &lt;br /&gt;
 # Prepare chroots&lt;br /&gt;
 sudo mkdir /srv/chroots&lt;br /&gt;
 sudo mkdir /srv/chroots/var&lt;br /&gt;
 &lt;br /&gt;
 # Optionally create a separate filesystem for /srv/chroots and move the sbuild/schroot data to that partition&lt;br /&gt;
 sudo rsync -avz --delete /var/lib/schroot/ /srv/chroots/var/schroot/&lt;br /&gt;
 sudo rm -r /var/lib/schroot&lt;br /&gt;
 sudo ln -sf /srv/chroots/var/schroot /var/lib/schroot&lt;br /&gt;
 &lt;br /&gt;
 sudo rsync -avz --delete /var/lib/sbuild/ /srv/chroots/var/sbuild/&lt;br /&gt;
 sudo rm -r /var/lib/sbuild&lt;br /&gt;
 sudo ln -sf /srv/chroots/var/sbuild /var/lib/sbuild&lt;br /&gt;
 # end optionally&lt;br /&gt;
 &lt;br /&gt;
 # Create unstable/sid chroot&lt;br /&gt;
 sudo sbuild-createchroot --include apt-transport-https,ca-certificates sid /srv/chroots/sid http://deb.debian.org/debian/&lt;br /&gt;
 &lt;br /&gt;
 # Create stretch chroot&lt;br /&gt;
 sudo sbuild-createchroot --include apt-transport-https,ca-certificates stretch /srv/chroots/stretch http://deb.debian.org/debian/&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 # If you use /etc/hosts to resolve *.internal.softwareheritage.org hosts&lt;br /&gt;
 echo hosts &amp;gt;&amp;gt; /etc/schroot/sbuild/nssdatabases&lt;br /&gt;
&lt;br /&gt;
=== schroot setup ===&lt;br /&gt;
&lt;br /&gt;
Now that the sbuild base setup is done. You now need to configure schroot to use an overlay filesystem, which will avoid copying the chroots at each build.&lt;br /&gt;
&lt;br /&gt;
You need to update the configuration (in &amp;lt;tt&amp;gt;/etc/schroot/chroot.d/*-sbuild-*&amp;lt;/tt&amp;gt;) with the following directives:&lt;br /&gt;
&lt;br /&gt;
 source-groups=root,sbuild&lt;br /&gt;
 source-root-groups=root,sbuild&lt;br /&gt;
 union-type=overlay&lt;br /&gt;
&lt;br /&gt;
This allows the sbuild group to edit the contents of the source chroot (for instance to update it) and sets up the overlay.&lt;br /&gt;
&lt;br /&gt;
You should also use this opportunity to add &amp;quot;aliases&amp;quot; to your chroot, so that sbuild will directly support the distributions we're using (unstable-swh, jessie-backports-swh):&lt;br /&gt;
&lt;br /&gt;
For unstable:&lt;br /&gt;
 aliases=unstable-amd64-sbuild,UNRELEASED-amd64-sbuild,unstable-swh-amd64-sbuild&lt;br /&gt;
&lt;br /&gt;
For stretch:&lt;br /&gt;
 aliases=stable-amd64-sbuild,stable-backports-amd64-sbuild,stretch-swh-amd64-sbuild,stretch-backports-amd64-sbuild,stretch-backports-swh-amd64-sbuild&lt;br /&gt;
&lt;br /&gt;
==== dependencies cache ====&lt;br /&gt;
&lt;br /&gt;
Add the following line to schroot's fstab /etc/schroot/sbuild/fstab&lt;br /&gt;
to permit reuse of existing fetched dependencies:&lt;br /&gt;
&lt;br /&gt;
 /var/cache/apt/archives /var/cache/apt/archives none rw,bind 0 0&lt;br /&gt;
&lt;br /&gt;
You can also run apt-cacher-ng, which will avoid locking issues when several chroots try to access the package cache at once. You then need to add the proxy configuration to apt by adding a file in &amp;lt;tt&amp;gt;/etc/apt/apt.conf.d&amp;lt;/tt&amp;gt; on each chroot&lt;br /&gt;
&lt;br /&gt;
=== schroot update ===&lt;br /&gt;
&lt;br /&gt;
You should update your chroot environments once in a while (to avoid repeating over and over the same step during your package build):&lt;br /&gt;
&lt;br /&gt;
  sudo sbuild-update -udcar sid; sudo sbuild-update -udcar stretch; sudo sbuild-update -ud jessie &lt;br /&gt;
&lt;br /&gt;
=== environment setup ===&lt;br /&gt;
&lt;br /&gt;
The Debian tools use a few variables to preset your name and email. Add this to your &amp;lt;tt&amp;gt;.&amp;lt;shell&amp;gt;rc&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 export DEBFULLNAME=&amp;quot;Debra Hacker&amp;quot;&lt;br /&gt;
 export DEBEMAIL=debra.hacker@example.com&lt;br /&gt;
&lt;br /&gt;
Make sure this data matches an uid for your GPG key. Else, you can use the &amp;lt;tt&amp;gt;DEBSIGN_KEYID=&amp;lt;yourfullkeyid&amp;gt;&amp;lt;/tt&amp;gt; variable.&lt;br /&gt;
(Future version of gpg2, e.g. 2.2.5 can refuse to sign with the short key id).&lt;br /&gt;
&lt;br /&gt;
=== overlay in tmpfs for faster builds ===&lt;br /&gt;
&lt;br /&gt;
You can add this to your fstab to put the overlay hierarchy in RAM:&lt;br /&gt;
&lt;br /&gt;
  tmpfs /var/lib/schroot/union/overlay tmpfs uid=root,gid=root,mode=0750,nr_inodes=0  0  0&lt;br /&gt;
&lt;br /&gt;
=== Base packages ===&lt;br /&gt;
&lt;br /&gt;
In order not to reinstall the same packages every time, it is also reasonable to install debhelper, python3 and python3-all in the chroot.&lt;br /&gt;
&lt;br /&gt;
'''If you do so, do not use these chroots to upload to Debian itself!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Software development]]&lt;br /&gt;
[[Category:System administration]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Code_review_in_Phabricator&amp;diff=964</id>
		<title>Code review in Phabricator</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Code_review_in_Phabricator&amp;diff=964"/>
		<updated>2019-02-08T12:14:10Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: Add documentation to set up git push&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We use the [[Differential]] application of [[Phabricator]] to perform [[code review|code reviews]] in the context of [[Software Heritage]].&lt;br /&gt;
&lt;br /&gt;
* we use Git and history.immutable=true (but beware as that is partly a Phabricator misnomer, read on)&lt;br /&gt;
* when code reviews are required, developers will be allowed to push directly to master once an accepted Differential diff exists&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Arcanist configuration ===&lt;br /&gt;
&lt;br /&gt;
When using git, [[Arcanist]] by default mess with the local history, rewriting commits at the time of first submission.&amp;lt;br /&amp;gt;&lt;br /&gt;
To avoid that we use so called [https://secure.phabricator.com/book/phabricator/article/arcanist_new_project/#history-mutability-git history immutability].&lt;br /&gt;
&lt;br /&gt;
To that end, you shall configure your &amp;lt;tt&amp;gt;arc&amp;lt;/tt&amp;gt; accordingly:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arc set-config history.immutable true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this does ''not'' mean that you are forbidden to rewrite your local branches (e.g., with &amp;lt;tt&amp;gt;git rebase&amp;lt;/tt&amp;gt;).&lt;br /&gt;
Quite the contrary: you are encouraged to locally rewrite branches before pushing to ensure that commits are logically separated and your commit history easy to bisect.&lt;br /&gt;
The above setting just means that ''arc'' will not rewrite commit history under your nose.&lt;br /&gt;
&lt;br /&gt;
=== Enabling &amp;lt;tt&amp;gt;git push&amp;lt;/tt&amp;gt; to our forge ===&lt;br /&gt;
&lt;br /&gt;
The way we've configured our review setup for continuous integration needs you to configure git to allow pushes to our forge. There's two ways you can do this : setting a ssh key to push over ssh, or setting a specific password for git pushes over https.&lt;br /&gt;
&lt;br /&gt;
==== SSH key for pushes ====&lt;br /&gt;
&lt;br /&gt;
In your forge User settings page (On the top right, click on your avatar, then click ''Settings''), you have access to a ''Authentication'' &amp;gt; ''SSH Public Keys'' section (Direct link: &amp;lt;tt&amp;gt;hxxps://forge.softwareheritage.org/settings/user/'''&amp;lt;your username&amp;gt;'''/page/ssh/&amp;lt;/tt&amp;gt;). You then have the option to upload a SSH public key, which will authenticate your pushes.&lt;br /&gt;
&lt;br /&gt;
You then need to configure ssh/git to use that key pair, for instance by editing the &amp;lt;tt&amp;gt;~/.ssh/config&amp;lt;/tt&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
Finally, you should configure git to push over ssh when pushing to https://forge.softwareheritage.org, by running the following command:&lt;br /&gt;
 git config --global url.git@forge.softwareheritage.org:.pushInsteadOf https://forge.softwareheritage.org&lt;br /&gt;
&lt;br /&gt;
This lets git know that it should use &amp;lt;tt&amp;gt;git@forge.softwareheritage.org:&amp;lt;/tt&amp;gt; as a base url when pushing repositories cloned from forge.softwareheritage.org over https.&lt;br /&gt;
&lt;br /&gt;
==== VCS password for pushes ====&lt;br /&gt;
&lt;br /&gt;
If you're not comfortable setting up SSH to upload your changes, you have the option of setting a VCS password. This password, ''separate from your account password'', allows Phabricator to authenticate your uploads over HTTPS.&lt;br /&gt;
&lt;br /&gt;
In your forge User settings page (On the top right, click on your avatar, then click ''Settings''), you need to use the ''Authentication'' &amp;gt; ''VCS Password'' section to set your VCS password (Direct link: &amp;lt;tt&amp;gt;hxxps://forge.softwareheritage.org/settings/user/'''&amp;lt;your username&amp;gt;'''/page/vcspassword/&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
&lt;br /&gt;
'''TL;DR:'''&lt;br /&gt;
* work in a feature branch: &amp;lt;tt&amp;gt;git checkout -b my-feat&amp;lt;/tt&amp;gt;&lt;br /&gt;
* initial review request: hack/commit/hack/commit ; &amp;lt;tt&amp;gt;arc diff origin/master&amp;lt;/tt&amp;gt;&lt;br /&gt;
* react to change requests: hack/commit/hack/commit ; &amp;lt;tt&amp;gt;arc diff --update Dxx origin/master&amp;lt;/tt&amp;gt;&lt;br /&gt;
* landing change: &amp;lt;tt&amp;gt;git checkout master ; git merge my-feat ; git push&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Starting a new feature and submit it for review ===&lt;br /&gt;
&lt;br /&gt;
Use a '''one branch per feature''' workflow, with well-separated ''logical commits'':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout -b my-shiny-feature&lt;br /&gt;
... hack hack hack ...&lt;br /&gt;
git commit -m 'architecture skeleton for my-shiny-feature'&lt;br /&gt;
... hack hack hack ...&lt;br /&gt;
git commit -m 'my-shiny-feature: implement module foo'&lt;br /&gt;
... etc ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To '''submit your code for review''' the first time:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arc diff origin/master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
arc will prompt for a '''code review message'''. Provide the following information:&lt;br /&gt;
* first line: ''short description'' of the overall work (i.e., the feature you're working on). This will become the title of the review&lt;br /&gt;
* ''Summary'' field (optional): ''long description'' of the overall work; the field can continue in subsequent lines, up to the next field. This will become the &amp;quot;Summary&amp;quot; section of the review&lt;br /&gt;
* ''Test Plan'' field (optional): write here if something special is needed to test your change&lt;br /&gt;
* ''Reviewers'' field (optional): the (Phabricator) name(s) of desired reviewers. If you don't specify one (recommended) the default reviewers will be chosen&lt;br /&gt;
* ''Subscribers'' field (optional): the (Phabricator) name(s) of people that will be notified about changes to this review request. In most cases it should be left empty&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mercurial loader&lt;br /&gt;
&lt;br /&gt;
Summary: first stab at a mercurial loader (T329)&lt;br /&gt;
&lt;br /&gt;
The implementation follows the plan detailed in F2F discussion with @foo.&lt;br /&gt;
&lt;br /&gt;
Performances seem decent enough for a first trial (XXX seconds for YYY repository&lt;br /&gt;
that contains ZZZ patches).&lt;br /&gt;
&lt;br /&gt;
Test plan: &lt;br /&gt;
&lt;br /&gt;
Reviewers: &lt;br /&gt;
&lt;br /&gt;
Subscribers: foo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After completing the message arc will submit the review request and tell you its number and URL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
Created a new Differential revision:&lt;br /&gt;
        Revision URI: https://forge.softwareheritage.org/Dxx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Updating your branch to reflect requested changes ===&lt;br /&gt;
&lt;br /&gt;
Your feature might get accepted as is, YAY!&lt;br /&gt;
Or, reviewers might request changes; no big deal!&lt;br /&gt;
&lt;br /&gt;
Use the Differential web UI to follow-up to received comments, if needed.&lt;br /&gt;
&lt;br /&gt;
To implement requested changes in the code, hack on your branch as usual by:&lt;br /&gt;
&lt;br /&gt;
* adding new commits, and/or&lt;br /&gt;
* rewriting old commits with git rebase (to preserve a nice, easy to bisect history)&lt;br /&gt;
&lt;br /&gt;
When you're ready to '''update your review request''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arc diff --update Dxx origin/master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arc will prompt you for a message: describe what you've changed w.r.t. the previous review request, free form.&lt;br /&gt;
Your message will become the changelog entry in Differential for this new version of the diff.&lt;br /&gt;
&lt;br /&gt;
Differential only care about the code diff, and not about the commits or their order.&lt;br /&gt;
Therefore each &amp;quot;update&amp;quot; can be a completely different series of commits, possibly rewritten from the previous submission.&lt;br /&gt;
&lt;br /&gt;
=== Landing your change onto master ===&lt;br /&gt;
&lt;br /&gt;
Once your change has been approved in Differential, you will be able to land it onto the master branch.&lt;br /&gt;
&lt;br /&gt;
Before doing so, you're encouraged to '''clean up your git commit history''', reordering/splitting/merging commits as needed to have separate logical commits and an easy to bisect history.&lt;br /&gt;
The correspondence between the accepted review and pushed code is checked by looking only at the code diff, so commit fiddling will not impact your ability to push to master.&lt;br /&gt;
&lt;br /&gt;
Once you're happy you can '''push to origin/master''' directly, e.g.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout master&lt;br /&gt;
git merge my-shiny-feature&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionally you can then delete your local feature branch:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git branch -d my-shiny-feature&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reviewing locally / landing someone else's changes ===&lt;br /&gt;
&lt;br /&gt;
You can do local reviews of code with arc patch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arc patch Dxyz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a branch '''arcpatch-Dxyz''' containing the changes on your local checkout.&lt;br /&gt;
&lt;br /&gt;
You can then merge those changes upstream with&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout master&lt;br /&gt;
git merge --ff arcpatch-Dxyz&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Code review]] for guidelines on how code is reviewed when developing for Software Heritage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Software development]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Puppet_setup&amp;diff=852</id>
		<title>Puppet setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Puppet_setup&amp;diff=852"/>
		<updated>2018-06-15T13:57:54Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: Expand puppet documentation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Multiple repository setup ==&lt;br /&gt;
&lt;br /&gt;
Our puppet environment is split into multiple repos (one repo per module), plus one &amp;quot;root&amp;quot; repository for multi-repository management.&lt;br /&gt;
&lt;br /&gt;
First, clone the base repository, containing the configuration file for myrepos and a README file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git clone ssh://git@forge.softwareheritage.org/diffusion/SENV/puppet-environment.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, use that configuration to clone all the repositories :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd puppet-environment&lt;br /&gt;
$ readlink -f .mrconfig &amp;gt;&amp;gt; ~/.mrtrust&lt;br /&gt;
$ mr up&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(the mr command is in the myrepos Debian package).&lt;br /&gt;
&lt;br /&gt;
All the swh-specific repositories are in ''swh-''-prefixed repositories. The other repositories come from other sources and have an ''upstream'' remote allowing updates (the ''origin'' remote is always on the swh git server).&lt;br /&gt;
&lt;br /&gt;
Our puppet workflow is documented in [https://forge.softwareheritage.org/diffusion/SENV/browse/master/README.md the README.md file in the puppet-environment repository].&lt;br /&gt;
&lt;br /&gt;
== Local puppet manifest diffing with octocatalog-diff ==&lt;br /&gt;
&lt;br /&gt;
''puppet-environment'' contains the whole scaffolding to be able to use [https://github.com/github/octocatalog-diff &amp;lt;code&amp;gt;octocatalog-diff&amp;lt;/code&amp;gt;] on our manifests. This allows for quick(er) local iterations while developing complex puppet manifests.&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
You need the following packages installed on your machine:&lt;br /&gt;
 r10k octocatalog-diff puppet&lt;br /&gt;
&lt;br /&gt;
=== Running ===&lt;br /&gt;
The &amp;lt;code&amp;gt;bin/octocatalog-diff&amp;lt;/code&amp;gt; script allows diffing the manifests between two environments (that is, between two branches of the ''swh-site'' repository. By default it diffs between &amp;lt;code&amp;gt;production&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;staging&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Default usage:&lt;br /&gt;
 bin/octocatalog-diff pergamon&lt;br /&gt;
&lt;br /&gt;
=== Limitations ===&lt;br /&gt;
Our setup for octocatalog-diff doesn't support exported resources, so you won't see your fancy icinga checks there.&lt;br /&gt;
&lt;br /&gt;
== Integration of third party puppet modules ==&lt;br /&gt;
&lt;br /&gt;
We mirror external repositories to our own forge, to avoid having external dependencies in our deployment.&lt;br /&gt;
&lt;br /&gt;
In the ''swh-site'' &amp;lt;code&amp;gt;Puppetfile&amp;lt;/code&amp;gt;, we pin the installation of those modules to the highest version (that works with our current puppet/facter version), by using the '':ref'' specifier.&lt;br /&gt;
&lt;br /&gt;
=== Adding a new external puppet module ===&lt;br /&gt;
&lt;br /&gt;
In the ''puppet-environment'' repository, the &amp;lt;code&amp;gt;bin/import-puppet-module&amp;lt;/code&amp;gt; takes care of the following tasks:&lt;br /&gt;
&lt;br /&gt;
* Getting metadata from the [https://forge.puppetlabs.com/ Puppet forge] for the module (description, upstream git URL)&lt;br /&gt;
* Cloning the repository&lt;br /&gt;
* Creating a mirror repository on the Software Heritage forge, with the proper permissions and metadata (notably the ''Sync to GitHub'' flag)&lt;br /&gt;
* Pushing the clone to the forge&lt;br /&gt;
* Updating the .mrconfig and .gitignore files to know the &lt;br /&gt;
&lt;br /&gt;
To be able to use the script, you need :&lt;br /&gt;
* Be a member of the [https://forge.softwareheritage.org/project/members/7/ System Administrators] Phabricator group&lt;br /&gt;
* Have the [[Arcanist]] API key setup&lt;br /&gt;
* A pair of python dependencies : &amp;lt;code&amp;gt;python3-phabricator&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;python3-requests&amp;lt;/code&amp;gt; (pull them from testing if needed).&lt;br /&gt;
&lt;br /&gt;
Example usage to pull the [https://forge.puppetlabs.com/elastic/elasticsearch elastic/elasticsearch] module&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin/import-module elastic-elasticsearch&lt;br /&gt;
git diff # review changes&lt;br /&gt;
git add .mrconfig .gitignore&lt;br /&gt;
git commit -m &amp;quot;Add the elastic/elasticsearch module&amp;quot;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once the module is added, you need to register it in the ''swh-site'' &amp;lt;code&amp;gt;Puppetfile&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
You should also check in the module metadata whether any dependencies need importing as well, which you should do using the same procedure.&lt;br /&gt;
&lt;br /&gt;
=== Updating external puppet modules ===&lt;br /&gt;
&lt;br /&gt;
There's two sides of this coin:&lt;br /&gt;
&lt;br /&gt;
==== Updating our git clone of external puppet modules ====&lt;br /&gt;
&lt;br /&gt;
The ''puppet-environment'' &amp;lt;code&amp;gt;.mrconfig&amp;lt;/code&amp;gt; file has a &amp;lt;code&amp;gt;pullup&amp;lt;/code&amp;gt; command which does the right thing.&lt;br /&gt;
&lt;br /&gt;
To update all clones:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mr -j4 pullup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Upgrading external puppet modules ====&lt;br /&gt;
&lt;br /&gt;
Upgrading external puppet modules happens manually.&lt;br /&gt;
&lt;br /&gt;
In the ''puppet-environment'' repository, the &amp;lt;code&amp;gt;bin/check-module-updates&amp;lt;/code&amp;gt; script compares the Puppetfile and the local clones and lists the available updates. (depends on &amp;lt;code&amp;gt;ruby r10k&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
On a staging branch of the ''swh-site'' repository, update the &amp;lt;code&amp;gt;:ref&amp;lt;/code&amp;gt; value for the module in the &amp;lt;code&amp;gt;Puppetfile&amp;lt;/code&amp;gt; to the latest tag. You can then run &amp;lt;code&amp;gt;octocatalog-diff&amp;lt;/code&amp;gt; on a few relevant servers and look for changes.&lt;br /&gt;
&lt;br /&gt;
== Deploy work-flow ==&lt;br /&gt;
&lt;br /&gt;
=== Semi-automated ===&lt;br /&gt;
&lt;br /&gt;
# you@localhost$ # ''hack on puppet Git repo''&lt;br /&gt;
# you@localhost$ &amp;lt;tt&amp;gt;rake validate&amp;lt;/tt&amp;gt;&lt;br /&gt;
# you@localhost$ &amp;lt;tt&amp;gt;git commit&amp;lt;/tt&amp;gt;&lt;br /&gt;
# you@localhost$ &amp;lt;tt&amp;gt;git push&amp;lt;/tt&amp;gt;&lt;br /&gt;
# you@localhost$ &amp;lt;tt&amp;gt;cd [https://forge.softwareheritage.org/diffusion/SENV/ puppet-environment]&amp;lt;/tt&amp;gt;&lt;br /&gt;
# you@localhost$ &amp;lt;tt&amp;gt;bin/deploy-on machine1 machine2...&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remember to pass &amp;lt;tt&amp;gt;--apt&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;bin/deploy-on&amp;lt;/tt&amp;gt; if freshly uploaded Software Heritage packages are to be deployed.&lt;br /&gt;
Also, &amp;lt;tt&amp;gt;bin/deploy-on --help&amp;lt;/tt&amp;gt; is your friend.&lt;br /&gt;
&lt;br /&gt;
=== Manual ===&lt;br /&gt;
&lt;br /&gt;
# you@localhost$ # ''hack on puppet Git repo''&lt;br /&gt;
# you@localhost$ &amp;lt;tt&amp;gt;rake validate&amp;lt;/tt&amp;gt;&lt;br /&gt;
# you@localhost$ &amp;lt;tt&amp;gt;git commit&amp;lt;/tt&amp;gt;&lt;br /&gt;
# you@localhost$ &amp;lt;tt&amp;gt;git push&amp;lt;/tt&amp;gt;&lt;br /&gt;
# you@pergamon$ &amp;lt;tt&amp;gt;sudo swh-puppet-master-deploy&amp;lt;/tt&amp;gt;&lt;br /&gt;
# you@machine$ &amp;lt;tt&amp;gt;sudo apt-get update&amp;lt;/tt&amp;gt;  # ''if a new or updated version of a [[Debian packaging|Debian package]] needs deploying''&lt;br /&gt;
# you@machine$ &amp;lt;tt&amp;gt;sudo swh-puppet-test&amp;lt;/tt&amp;gt;  # ''to test/review changes''&lt;br /&gt;
# you@machine$ &amp;lt;tt&amp;gt;sudo swh-puppet-apply&amp;lt;/tt&amp;gt;  # ''to apply&lt;br /&gt;
&lt;br /&gt;
[[Category:System administration]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Arcanist_setup&amp;diff=851</id>
		<title>Arcanist setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Arcanist_setup&amp;diff=851"/>
		<updated>2018-06-15T12:43:40Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: /* Configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://secure.phabricator.com/book/phabricator/article/arcanist/ Arcanist] is a command line interface to [[Phabricator]].&lt;br /&gt;
This page details how to configure it for use with the [[Software Heritage]] forge.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install arcanist&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ arc set-config default https://forge.softwareheritage.org/&lt;br /&gt;
$ arc install-certificate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
arc will prompt you to login into Phabricator via web (which will ask your personal Phabricator credentials).&lt;br /&gt;
You will then have to copy past the API token from the web page to arc, and hit Enter to complete the certificate installation.&lt;br /&gt;
&lt;br /&gt;
'''All done!''' Now have a look at ''arc help'' and start hacking.&lt;br /&gt;
&lt;br /&gt;
=== Configuration file ===&lt;br /&gt;
&lt;br /&gt;
Arcanist configuration is stored in ''~/.arcrc''.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Phabricator/Arcanist#Setup Wikimedia guide to Arcanist setup]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Software development]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Contributor_License_Agreement&amp;diff=824</id>
		<title>Contributor License Agreement</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Contributor_License_Agreement&amp;diff=824"/>
		<updated>2018-06-06T11:26:58Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: Add &amp;lt;hr&amp;gt; to separate references from rest of article.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Software Heritage Contributor License Agreement =&lt;br /&gt;
version 1.0, 2018-06-01&lt;br /&gt;
&lt;br /&gt;
'''Origin and beneficiary of the present contributor license agreement:'''&lt;br /&gt;
&lt;br /&gt;
'''INSTITUT NATIONAL DE RECHERCHE EN INFORMATIQUE ET EN AUTOMATIQUE ''[National Institute for Research in Computing and Automation]'',''' Public Institution of a scientific and technological nature under decree 85-831 of August 2, 1982, Headquartered at Domaine de Voluceau – Rocquencourt – BP 105 – 78153 Le Chesnay cedex represented by its Chairman and CEO, Mr. François Sillion, founder of the Software Heritage project.&lt;br /&gt;
&lt;br /&gt;
== ARTICLE 1 — DEFINITIONS ==&lt;br /&gt;
&lt;br /&gt;
* '''“Software”:''' means any software component collaboratively developed on the Software Heritage forge ([https://forge.softwareheritage.org/ ''https://forge.softwareheritage.org/'']).&lt;br /&gt;
* '''“Contribution:”''' means any original contribution protected by copyright, in particular modifications of existing functionalities or the development of new ones, of which You are the author, and that You intentionally submit for integration into the Software. A Contribution includes its source code, its object code, as well as any specifications and documentation related thereto.&lt;br /&gt;
&lt;br /&gt;
* '''“You”:''' means you, the Contributor, as a physical and individual person, owning copyrights on the Contribution and free from any obligation (in particular regarding to your employer) which may prevent you from developing and submitting the Contribution for integration into the Software.&lt;br /&gt;
&lt;br /&gt;
== ARTICLE 2 — COPYRIGHTS LICENSED ==&lt;br /&gt;
&lt;br /&gt;
# You grant to Inria a worldwide, non-exclusive, transferable, royalty-free, irrevocable license, including the right to sublicense, on the Contribution, for the duration of the corresponding copyright. In particular, you grant for any mean and purpose, the right to use, to reproduce, to modify, to display, to perform with any media or technical mean, and to distribute through any form of communication the Contribution.&lt;br /&gt;
# As a condition to the grant of rights mentioned in article 2.1 above, Inria shall license the Contribution ''only'' under the terms of a license complying with both the free software criteria defined by the Free Software Foundation (FSF)&amp;lt;ref&amp;gt;see [https://www.gnu.org/licenses/license-list.en.html ''https://www.gnu.org/licenses/license-list.en.html''] for a list of free software licenses&amp;lt;/ref&amp;gt; and the Open Source Definition by the Open Source Initiative (OSI).&amp;lt;ref&amp;gt;see [https://opensource.org/licenses ''https://opensource.org/licenses''] for a list of open source licenses&amp;lt;/ref&amp;gt;&lt;br /&gt;
# You will promptly notify Inria via email at ''[mailto:legal@softwareheritage.org legal@softwareheritage.org]'' if You become aware of any facts or circumstances that would make these commitments inaccurate in any way.&lt;br /&gt;
&lt;br /&gt;
== ARTICLE 3 — GUARANTEES ==&lt;br /&gt;
&lt;br /&gt;
# You guarantee that You own copyrights over the Contribution and that You hold, to the best of your knowledge, all of the rights necessary to grant a license on said Contribution to Inria and that You do not infringe third party’s rights.&lt;br /&gt;
# You acknowledge that You hold no patent which could be enforced against any use by Inria of the copyright over the Contribution. In the opposite case, You promise not to enforce the rights granted by these patents against Inria, or any of its licensees, sub-licensees or assignees, for using, exploiting, modifying, distributing your Contribution accordingly with article 2 here above.&lt;br /&gt;
# You declare that You are licensing your Contribution “as is”, without guarantee as to its commercial value, and without guaranteeing that the Contribution is free of errors.&lt;br /&gt;
&lt;br /&gt;
== ARTICLE 4 – MISCELLANEOUS ==&lt;br /&gt;
&lt;br /&gt;
# This contract is subject to French law.&lt;br /&gt;
# Any dispute concerning the interpretation, validity or execution of this contract will be submitted, failing an out-of-court resolution, to the competent French court.&lt;br /&gt;
# The present agreement may be assigned by Inria to any non-profit entity which would become entitled to carry out Software Heritage’s mission.&lt;br /&gt;
# If one or several stipulations of this contract are held to be invalid or declared such in application of a law or regulation, or by reason of a final ruling by a competent court, the others will retain all of their force and scope.&lt;br /&gt;
# You shall be asked to confirm the present agreement periodically, every three (3) years after signing it. Should our contribution policy change before, you will be notified and asked to sign the new contributor license agreement as a condition to submit further Contributions.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:Legal]]&lt;br /&gt;
[[Category:Software development]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Statistics&amp;diff=726</id>
		<title>Statistics</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Statistics&amp;diff=726"/>
		<updated>2017-10-19T15:19:53Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: Add object counts&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Collection of descriptive statistics about the [[Software Heritage archive]].&lt;br /&gt;
&lt;br /&gt;
== Across objects ==&lt;br /&gt;
&lt;br /&gt;
* Object counts: [https://archive.softwareheritage.org/api/1/stat/counters/ live from the API], [https://stats.export.softwareheritage.org/history_counters.json historical data]&lt;br /&gt;
&lt;br /&gt;
== Contents (i.e., blobs) ==&lt;br /&gt;
&lt;br /&gt;
* [[Statistics/Content_size|content size]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Puppet_setup&amp;diff=709</id>
		<title>Puppet setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Puppet_setup&amp;diff=709"/>
		<updated>2017-10-03T14:16:02Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: /* Multiple repository setup */ link to readme.md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Multiple repository setup ==&lt;br /&gt;
&lt;br /&gt;
Our puppet environment is split into multiple repos (one repo per module), plus one &amp;quot;root&amp;quot; repository for multi-repository management.&lt;br /&gt;
&lt;br /&gt;
First, clone the base repository, containing the configuration file for myrepos and a README file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git clone ssh://git@forge.softwareheritage.org/diffusion/SENV/puppet-environment.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, use that configuration to clone all the repositories :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd puppet-environment&lt;br /&gt;
$ readlink -f .mrconfig &amp;gt;&amp;gt; ~/.mrtrust&lt;br /&gt;
$ mr up&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(the mr command is in the myrepos Debian package).&lt;br /&gt;
&lt;br /&gt;
All the swh-specific repositories are in ''swh-''-prefixed repositories. The other repositories come from other sources and have an ''upstream'' remote allowing updates (the ''origin'' remote is always on the swh git server).&lt;br /&gt;
&lt;br /&gt;
Our puppet workflow is documented in [https://forge.softwareheritage.org/diffusion/SENV/browse/master/README.md the README.md file in the puppet-environment repository].&lt;br /&gt;
&lt;br /&gt;
== Deploy work-flow ==&lt;br /&gt;
&lt;br /&gt;
=== Semi-automated ===&lt;br /&gt;
&lt;br /&gt;
# you@localhost$ # ''hack on puppet Git repo''&lt;br /&gt;
# you@localhost$ &amp;lt;tt&amp;gt;rake validate&amp;lt;/tt&amp;gt;&lt;br /&gt;
# you@localhost$ &amp;lt;tt&amp;gt;git commit&amp;lt;/tt&amp;gt;&lt;br /&gt;
# you@localhost$ &amp;lt;tt&amp;gt;git push&amp;lt;/tt&amp;gt;&lt;br /&gt;
# you@localhost$ &amp;lt;tt&amp;gt;cd [https://forge.softwareheritage.org/diffusion/SENV/ puppet-environment]&amp;lt;/tt&amp;gt;&lt;br /&gt;
# you@localhost$ &amp;lt;tt&amp;gt;bin/deploy-on machine1 machine2...&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remember to pass &amp;lt;tt&amp;gt;--apt&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;bin/deploy-on&amp;lt;/tt&amp;gt; if freshly uploaded Software Heritage packages are to be deployed.&lt;br /&gt;
Also, &amp;lt;tt&amp;gt;bin/deploy-on --help&amp;lt;/tt&amp;gt; is your friend.&lt;br /&gt;
&lt;br /&gt;
=== Manual ===&lt;br /&gt;
&lt;br /&gt;
# you@localhost$ # ''hack on puppet Git repo''&lt;br /&gt;
# you@localhost$ &amp;lt;tt&amp;gt;rake validate&amp;lt;/tt&amp;gt;&lt;br /&gt;
# you@localhost$ &amp;lt;tt&amp;gt;git commit&amp;lt;/tt&amp;gt;&lt;br /&gt;
# you@localhost$ &amp;lt;tt&amp;gt;git push&amp;lt;/tt&amp;gt;&lt;br /&gt;
# you@pergamon$ &amp;lt;tt&amp;gt;sudo swh-puppet-master-deploy&amp;lt;/tt&amp;gt;&lt;br /&gt;
# you@machine$ &amp;lt;tt&amp;gt;sudo apt-get update&amp;lt;/tt&amp;gt;  # ''if a new or updated version of a [[Debian packaging|Debian package]] needs deploying''&lt;br /&gt;
# you@machine$ &amp;lt;tt&amp;gt;sudo swh-puppet-test&amp;lt;/tt&amp;gt;  # ''to test/review changes''&lt;br /&gt;
# you@machine$ &amp;lt;tt&amp;gt;sudo swh-puppet-apply&amp;lt;/tt&amp;gt;  # ''to apply&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:System administration]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Talks&amp;diff=708</id>
		<title>Talks</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Talks&amp;diff=708"/>
		<updated>2017-09-29T12:16:39Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: Add Kernel Recipes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this page we keep track of the past and upcoming talks about [[Software Heritage]], in various venues.&lt;br /&gt;
&lt;br /&gt;
Please keep the table ''sorted by reverse date'' (most recent talk first).&lt;br /&gt;
&lt;br /&gt;
== 2017 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Venue&lt;br /&gt;
!Title&lt;br /&gt;
!Speaker&lt;br /&gt;
!Slides&lt;br /&gt;
!Video&lt;br /&gt;
|-&lt;br /&gt;
|27 September 2017&lt;br /&gt;
|[https://kernel-recipes.org/en/2017/ Kernel Recipes 2017]&lt;br /&gt;
|Software Heritage: Our software commons, forever - Challenges in storing the biggest VCS DAG in history&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-09-27-kernel-recipes.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|10 August 2017&lt;br /&gt;
|[https://debconf17.debconf.org/ DebConf 2017]&lt;br /&gt;
|Software Heritage: Our software commons, forever.&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]], [[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-08-10-debconf.pdf PDF]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-08-10-debconf.vp9.webm VP9]&lt;br /&gt;
|-&lt;br /&gt;
|5 July 2017&lt;br /&gt;
|[http://iticse.acm.org/ ITiCSE 2017]&lt;br /&gt;
|Software Heritage: scholarly and educational synergies with preserving our software commons (keynote)&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|6 Jun 2017&lt;br /&gt;
|[https://reseau-loops.github.io/ Café LoOPS]&lt;br /&gt;
|[https://reseau-loops.github.io/2017/06/01/cafe-loops Software Heritage: Construire la bibliothèque d'Alexandrie du logiciel]&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-06-06-loops.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|25 May 2017&lt;br /&gt;
|[http://www.dauin.polito.it/ DAUIN, Politecnico di Torino]&lt;br /&gt;
|Preserving Source Code: Challenges and Opportunities for the Reproductibility of Science&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-05-25-torino-polito.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|24 May 2017&lt;br /&gt;
|[https://nexa.polito.it/lunch-seminars Nexa Lunch Seminar]&lt;br /&gt;
|[https://nexa.polito.it/lunch-51 Software Heritage: Archiving the Software Commons for Fun and Social Benefit]&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-05-24-torino-nexa.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|10 Mar 2017&lt;br /&gt;
|[http://www.incontrodevops.it/events/idi2017/ Incontro DevOps 2017]&lt;br /&gt;
|[http://www.incontrodevops.it/sessions/keynote-idi2017/ Software Heritage: DevOps Challenges to Preserve our Software Commons] (keynote)&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-03-10-devops-italia.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|08 Feb 2017&lt;br /&gt;
|[https://project.inria.fr/epfl-Inria/workshops/workshop-2017/ INRIA-EPFL workshop]&lt;br /&gt;
|[https://project.inria.fr/epfl-Inria/files/2017/01/RobertoDiCosmo-abstract-workshop2017.pdf What would you do with billions of source code files? Challenges and opportunities in software archival]&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-02-07-epfl-billion-files.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|04 Feb 2017&lt;br /&gt;
|[https://fosdem.org/2017/ FOSDEM'17]&lt;br /&gt;
|[https://fosdem.org/2017/schedule/event/software_heritage/ Software Heritage: Preserving the Free Software Commons] (keynote)&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]], [[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-02-04-fosdem-software-heritage-foss-commons.pdf PDF]&lt;br /&gt;
|[https://video.fosdem.org/2017/Janson/software_heritage.vp8.webm VP8]&lt;br /&gt;
|-&lt;br /&gt;
|10 Jan 2017&lt;br /&gt;
|[http://www.congresodelfuturo.cl/ Congreso del Futuro]&lt;br /&gt;
|Software [is our] Heritage: Collecting, preserving and sharing the software source code of Mankind&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-01-10-congresofuturo.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2016 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Venue&lt;br /&gt;
!Title&lt;br /&gt;
!Speaker&lt;br /&gt;
!Slides&lt;br /&gt;
!Video&lt;br /&gt;
|-&lt;br /&gt;
|26 Nov 2016&lt;br /&gt;
|[http://milan2016.codemotionworld.com/ Codemotion Milan 2016]&lt;br /&gt;
|[http://milan2016.codemotionworld.com/talk-detail/?detail=4654 Software Heritage: let's build together the universal archive of our software commons]&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-11-26-codemotion-milan-zack-software-commons-archive.pdf PDF]&lt;br /&gt;
|[https://www.youtube.com/watch?v=gi_HydCumRE YouTube]&lt;br /&gt;
|-&lt;br /&gt;
|9 Nov 2016&lt;br /&gt;
|[http://www.dpconline.org/ Digital Preservation Coalition]&lt;br /&gt;
|Building the Universal Software Archive&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-11-09-webex-rdicosmo-digital-preservation-coalition.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|8 Nov 2016&lt;br /&gt;
|[https://github.com/alegrand/RR_webinars Series of Webinars on Reproducible Research]&lt;br /&gt;
|[https://github.com/alegrand/RR_webinars/blob/master/5_archiving_software_and_data/index.org Preserving Software and Data: Ensuring Availability and Traceability]&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-11-08-grenoble-rdicosmo-reproductibility-preserving-software.pdf PDF]&lt;br /&gt;
|[https://mi2s.imag.fr/preserving-software-ensuring-availability-and-traceability-0 Flowplayer]&lt;br /&gt;
|-&lt;br /&gt;
|18 Oct 2016&lt;br /&gt;
|[http://conferences.oreilly.com/oscon/open-source-eu OSCON Europe 2016]&lt;br /&gt;
|[http://conferences.oreilly.com/oscon/open-source-eu/public/schedule/detail/55989 Why and how Software Heritage is building the universal software archive] (keynote)&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-10-18-oscon-london-rdicosmo-keynote-software-heritage-building-the-universal-software-archive.pdf PDF]&lt;br /&gt;
|[https://www.oreilly.com/ideas/why-and-how-software-heritage-is-building-the-universal-software-archive Excerpt]&lt;br /&gt;
|-&lt;br /&gt;
|14 Oct 2016&lt;br /&gt;
|[http://www.upmc.fr/fr/formations/diplomes/sciences_et_technologies2/masters2/master_informatique_m1/master_science_et_technologie_du_logiciel_m2.html UPMC Master 2 STL]&lt;br /&gt;
|[https://www-apr.lip6.fr/~chaillou/Public/enseignement/2016-2017/conf-STL/ Software Heritage: Preserving the Free Software Commons]&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-10-14-upmc-software-heritage-preserving-the-free-software-commons.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21 Sep 2016&lt;br /&gt;
|[https://www.ow2con.org/bin/view/2016/ OW2con'16]&lt;br /&gt;
|[https://ow2con16.sched.org/event/80KP Beyond OW2: Software Heritage, Building the Universal Software Archive]&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-09-21-ow2con-zack-software-heritage-building-the-universal-software-archive.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|16 Sep 2016&lt;br /&gt;
|[https://www.irif.univ-paris-diderot.fr/ IRIF] [https://www.irif.univ-paris-diderot.fr/seminaires/irif/index seminar series]&lt;br /&gt;
|[https://www.irif.univ-paris-diderot.fr/seminaires/irif/index Preserving Software: challenges and opportunities for the reproductibility of Science ]&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-09-16-irif-science-crisis-software-preservation.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|07 Sep 2016&lt;br /&gt;
|[https://www.meetup.com/git-Paris/events/233368705/?eventId=233368705 Meetup git Paris #3]&lt;br /&gt;
|Software Heritage: une archive mondiale du logiciel libre, inspirée de Git&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]],&amp;lt;br&amp;gt;[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-09-07-paris-olasd+zack-git-meetup.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|04 Sep 2016&lt;br /&gt;
|[https://fsfe.org/community/events/2016/summit/frontpage.en.html FSFE Summit 2016]&lt;br /&gt;
|[https://conf.qtcon.org/en/qtcon/public/events/466 Software Heritage - the Universal Archive of Free Software]&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-09-04-qtcon-fsfe-rdicosmo-software-heritage-building-the-universal-software-archive.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|05 Aug 2016&lt;br /&gt;
|[https://www.emfcamp.org Electromagnetic Field 2016]&lt;br /&gt;
|Software Heritage (lightning talk)&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-08-07-emfcamp-olasd-lightning-talk/2016-08-05_emf.html HTML]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|04 Jul 2016&lt;br /&gt;
|[https://portail.umons.ac.be/FR/universite/admin/aff_etudiant/CultureEtSport/UMONS-culture/Documents_agendas_culture/2015/Research%20Seminar%20on%20Open%20Source%20Software_4-07-2016.pdf Open Source Seminar at UMONS]&lt;br /&gt;
|Software Heritage: Building the Universal Software Archive&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-07-04-umons-rdicosmo-software-heritage-building-the-universal-software-archive.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|04 Jul 2016&lt;br /&gt;
|[https://debconf16.debconf.org DebConf16]&lt;br /&gt;
|[https://debconf16.debconf.org/talks/42/ Software Heritage: Building the Universal Software Archive]&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-07-04-debconf16-olasd-software-heritage-building-the-universal-software-archive.pdf PDF]&lt;br /&gt;
|[http://gensho.acc.umu.se/pub/debian-meetings/2016/debconf16/Software_Heritage_Building_the_Universal_Software_Archive.webm WebM]&lt;br /&gt;
|-&lt;br /&gt;
|21 Jun 2016&lt;br /&gt;
|[http://journees-scientifiques2016.inria.fr/francais-programme/ Journées Scientifiques Inria, Rennes]&lt;br /&gt;
|What would you do with ''billions'' of source code files? Challenges and opportunities in software archival&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-06-21-inriarennes-rdicosmo-what-would-you-do-with-billions-of-source-code-files.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2015 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Venue&lt;br /&gt;
!Title&lt;br /&gt;
!Speaker&lt;br /&gt;
!Slides&lt;br /&gt;
!Video&lt;br /&gt;
|-&lt;br /&gt;
|16 Dec 2015&lt;br /&gt;
|[http://codesource.hypotheses.org/ Seminar &amp;quot;Codes Sources&amp;quot;, UPMC]&lt;br /&gt;
|Large-scale source code archival, publishing, and indexing with Debsources [and Software Heritage]&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2015/2015-12-16-semcodesources-zack-debsources-and-software-heritage.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|04 Dec 2015&lt;br /&gt;
|[http://cristal.univ-lille.fr/evolille2015/ EvoLille 2015]&lt;br /&gt;
|Ten years analysing large code bases: a perspective&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2015/2015-12-04-evolille2015-rdicosmo-ten-years-analysing-large-code-bases-a-perspective.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21 May 2015&lt;br /&gt;
|[http://www.scilabtec.com/ International Scilab Users Conference]&lt;br /&gt;
|[https://www.scilab.org/fr/community/scilabtec/2015/Keynote-Preserving-Software-challenges-and-opportunities-for-reproducibility-of-Science-and-Technology Preserving Software: Challenges and Opportunities for Reproducibility of Science and Technology]&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2015/2015-05-21-scilabtec-rdicosmo-preserving-software-challenges-and-opportunities-for-reproducibility-of-science-and-technology.pdf PDF]&lt;br /&gt;
|[https://vimeo.com/132074333 Vimeo]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2014 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Venue&lt;br /&gt;
!Title&lt;br /&gt;
!Speaker&lt;br /&gt;
!Slides&lt;br /&gt;
!Video&lt;br /&gt;
|-&lt;br /&gt;
|09 Dec 2014&lt;br /&gt;
|Reproductibility Working Group, Inria&lt;br /&gt;
|Preserving Software: Challenges and opportunities for reproductibility&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2014/2014-12-04-inriareprowg-rdicosmo-preserving-software-challenges-and-opportunities-for-reproducibility.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Communication]]&lt;br /&gt;
[[Category:Talks]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Code_review_in_Phabricator&amp;diff=707</id>
		<title>Code review in Phabricator</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Code_review_in_Phabricator&amp;diff=707"/>
		<updated>2017-09-25T12:55:41Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: add local review/merge instructions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We use the [[Differential]] application of [[Phabricator]] to do code reviews in the context of [[Software Heritage]].&lt;br /&gt;
&lt;br /&gt;
* we use Git and history.immutable=true (but beware as that is partly a Phabricator misnomer, read on)&lt;br /&gt;
* when code reviews are required, developers will be allowed to push directly to master once an accepted Differential diff exists&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
When using git, [[Arcanist]] by default mess with the local history, rewriting commits at the time of first submission.&amp;lt;br /&amp;gt;&lt;br /&gt;
To avoid that we use so called [https://secure.phabricator.com/book/phabricator/article/arcanist_new_project/#history-mutability-git history immutability].&lt;br /&gt;
&lt;br /&gt;
To that end, you shall configure your &amp;lt;tt&amp;gt;arc&amp;lt;/tt&amp;gt; accordingly:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arc set-config history.immutable true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this does ''not'' mean that you are forbidden to rewrite your local branches (e.g., with &amp;lt;tt&amp;gt;git rebase&amp;lt;/tt&amp;gt;).&lt;br /&gt;
Quite the contrary: you are encouraged to locally rewrite branches before pushing to ensure that commits are logically separated and your commit history easy to bisect.&lt;br /&gt;
The above setting just means that ''arc'' will not rewrite commit history under your nose.&lt;br /&gt;
&lt;br /&gt;
= Workflow =&lt;br /&gt;
&lt;br /&gt;
'''TL;DR:'''&lt;br /&gt;
* work in a feature branch: &amp;lt;tt&amp;gt;git checkout -b my-feat&amp;lt;/tt&amp;gt;&lt;br /&gt;
* initial review request: hack/commit/hack/commit ; &amp;lt;tt&amp;gt;arc diff origin/master&amp;lt;/tt&amp;gt;&lt;br /&gt;
* react to change requests: hack/commit/hack/commit ; &amp;lt;tt&amp;gt;arc diff --update Dxx origin/master&amp;lt;/tt&amp;gt;&lt;br /&gt;
* landing change: &amp;lt;tt&amp;gt;git checkout master ; git merge my-feat ; git push&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Starting a new feature and submit it for review ==&lt;br /&gt;
&lt;br /&gt;
Use a '''one branch per feature''' workflow, with well-separated ''logical commits'':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout -b my-shiny-feature&lt;br /&gt;
... hack hack hack ...&lt;br /&gt;
git commit -m 'architecture skeleton for my-shiny-feature'&lt;br /&gt;
... hack hack hack ...&lt;br /&gt;
git commit -m 'my-shiny-feature: implement module foo'&lt;br /&gt;
... etc ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To '''submit your code for review''' the first time:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arc diff origin/master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
arc will prompt for a '''code review message'''. Provide the following information:&lt;br /&gt;
* first line: ''short description'' of the overall work (i.e., the feature you're working on). This will become the title of the review&lt;br /&gt;
* ''Summary'' field (optional): ''long description'' of the overall work; the field can continue in subsequent lines, up to the next field. This will become the &amp;quot;Summary&amp;quot; section of the review&lt;br /&gt;
* ''Test Plan'' field (optional): write here if something special is needed to test your change&lt;br /&gt;
* ''Reviewers'' field (optional): the (Phabricator) name(s) of desired reviewers. If you don't specify one (recommended) the default reviewers will be chosen&lt;br /&gt;
* ''Subscribers'' field (optional): the (Phabricator) name(s) of people that will be notified about changes to this review request. In most cases it should be left empty&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mercurial loader&lt;br /&gt;
&lt;br /&gt;
Summary: first stab at a mercurial loader (T329)&lt;br /&gt;
&lt;br /&gt;
The implementation follows the plan detailed in F2F discussion with @foo.&lt;br /&gt;
&lt;br /&gt;
Performances seem decent enough for a first trial (XXX seconds for YYY repository&lt;br /&gt;
that contains ZZZ patches).&lt;br /&gt;
&lt;br /&gt;
Test plan: &lt;br /&gt;
&lt;br /&gt;
Reviewers: &lt;br /&gt;
&lt;br /&gt;
Subscribers: foo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After completing the message arc will submit the review request and tell you its number and URL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
Created a new Differential revision:&lt;br /&gt;
        Revision URI: https://forge.softwareheritage.org/Dxx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating your branch to reflect requested changes ==&lt;br /&gt;
&lt;br /&gt;
Your feature might get accepted as is, YAY!&lt;br /&gt;
Or, reviewers might request changes; no big deal!&lt;br /&gt;
&lt;br /&gt;
Use the Differential web UI to follow-up to received comments, if needed.&lt;br /&gt;
&lt;br /&gt;
To implement requested changes in the code, hack on your branch as usual by:&lt;br /&gt;
&lt;br /&gt;
* adding new commits, and/or&lt;br /&gt;
* rewriting old commits with git rebase (to preserve a nice, easy to bisect history)&lt;br /&gt;
&lt;br /&gt;
When you're ready to '''update your review request''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arc diff --update Dxx origin/master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arc will prompt you for a message: describe what you've changed w.r.t. the previous review request, free form.&lt;br /&gt;
Your message will become the changelog entry in Differential for this new version of the diff.&lt;br /&gt;
&lt;br /&gt;
Differential only care about the code diff, and not about the commits or their order.&lt;br /&gt;
Therefore each &amp;quot;update&amp;quot; can be a completely different series of commits, possibly rewritten from the previous submission.&lt;br /&gt;
&lt;br /&gt;
== Landing your change onto master ==&lt;br /&gt;
&lt;br /&gt;
Once your change has been approved in Differential, you will be able to land it onto the master branch.&lt;br /&gt;
&lt;br /&gt;
Before doing so, you're encouraged to '''clean up your git commit history''', reordering/splitting/merging commits as needed to have separate logical commits and an easy to bisect history.&lt;br /&gt;
The correspondence between the accepted review and pushed code is checked by looking only at the code diff, so commit fiddling will not impact your ability to push to master.&lt;br /&gt;
&lt;br /&gt;
Once you're happy you can '''push to origin/master''' directly, e.g.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout master&lt;br /&gt;
git merge my-shiny-feature&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionally you can then delete your local feature branch:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git branch -d my-shiny-feature&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reviewing locally / landing someone else's changes ==&lt;br /&gt;
&lt;br /&gt;
You can do local reviews of code with arc patch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arc patch Dxyz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a branch '''arcpatch-Dxyz''' containing the changes on your local checkout.&lt;br /&gt;
&lt;br /&gt;
You can then merge those changes upstream with&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout master&lt;br /&gt;
git merge --ff arcpatch-Dxyz&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Software development]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Talks&amp;diff=706</id>
		<title>Talks</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Talks&amp;diff=706"/>
		<updated>2017-09-07T18:25:55Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: /* 2017 */ uniformatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this page we keep track of the past and upcoming talks about [[Software Heritage]], in various venues.&lt;br /&gt;
&lt;br /&gt;
Please keep the table ''sorted by reverse date'' (most recent talk first).&lt;br /&gt;
&lt;br /&gt;
== 2017 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Venue&lt;br /&gt;
!Title&lt;br /&gt;
!Speaker&lt;br /&gt;
!Slides&lt;br /&gt;
!Video&lt;br /&gt;
|-&lt;br /&gt;
|10 August 2017&lt;br /&gt;
|[https://debconf17.debconf.org/ DebConf 2017]&lt;br /&gt;
|Software Heritage: Our software commons, forever.&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]], [[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-08-10-debconf.pdf PDF]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-08-10-debconf.vp9.webm VP9]&lt;br /&gt;
|-&lt;br /&gt;
|5 July 2017&lt;br /&gt;
|[http://iticse.acm.org/ ITiCSE 2017]&lt;br /&gt;
|Software Heritage: scholarly and educational synergies with preserving our software commons (keynote)&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|6 Jun 2017&lt;br /&gt;
|[https://reseau-loops.github.io/ Café LoOPS]&lt;br /&gt;
|[https://reseau-loops.github.io/2017/06/01/cafe-loops Software Heritage: Construire la bibliothèque d'Alexandrie du logiciel]&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-06-06-loops.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|25 May 2017&lt;br /&gt;
|[http://www.dauin.polito.it/ DAUIN, Politecnico di Torino]&lt;br /&gt;
|Preserving Source Code: Challenges and Opportunities for the Reproductibility of Science&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-05-25-torino-polito.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|24 May 2017&lt;br /&gt;
|[https://nexa.polito.it/lunch-seminars Nexa Lunch Seminar]&lt;br /&gt;
|[https://nexa.polito.it/lunch-51 Software Heritage: Archiving the Software Commons for Fun and Social Benefit]&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-05-24-torino-nexa.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|10 Mar 2017&lt;br /&gt;
|[http://www.incontrodevops.it/events/idi2017/ Incontro DevOps 2017]&lt;br /&gt;
|[http://www.incontrodevops.it/sessions/keynote-idi2017/ Software Heritage: DevOps Challenges to Preserve our Software Commons] (keynote)&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-03-10-devops-italia.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|08 Feb 2017&lt;br /&gt;
|[https://project.inria.fr/epfl-Inria/workshops/workshop-2017/ INRIA-EPFL workshop]&lt;br /&gt;
|[https://project.inria.fr/epfl-Inria/files/2017/01/RobertoDiCosmo-abstract-workshop2017.pdf What would you do with billions of source code files? Challenges and opportunities in software archival]&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-02-07-epfl-billion-files.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|04 Feb 2017&lt;br /&gt;
|[https://fosdem.org/2017/ FOSDEM'17]&lt;br /&gt;
|[https://fosdem.org/2017/schedule/event/software_heritage/ Software Heritage: Preserving the Free Software Commons] (keynote)&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]], [[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-02-04-fosdem-software-heritage-foss-commons.pdf PDF]&lt;br /&gt;
|[https://video.fosdem.org/2017/Janson/software_heritage.vp8.webm VP8]&lt;br /&gt;
|-&lt;br /&gt;
|10 Jan 2017&lt;br /&gt;
|[http://www.congresodelfuturo.cl/ Congreso del Futuro]&lt;br /&gt;
|Software [is our] Heritage: Collecting, preserving and sharing the software source code of Mankind&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-01-10-congresofuturo.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2016 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Venue&lt;br /&gt;
!Title&lt;br /&gt;
!Speaker&lt;br /&gt;
!Slides&lt;br /&gt;
!Video&lt;br /&gt;
|-&lt;br /&gt;
|26 Nov 2016&lt;br /&gt;
|[http://milan2016.codemotionworld.com/ Codemotion Milan 2016]&lt;br /&gt;
|[http://milan2016.codemotionworld.com/talk-detail/?detail=4654 Software Heritage: let's build together the universal archive of our software commons]&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-11-26-codemotion-milan-zack-software-commons-archive.pdf PDF]&lt;br /&gt;
|[https://www.youtube.com/watch?v=gi_HydCumRE YouTube]&lt;br /&gt;
|-&lt;br /&gt;
|9 Nov 2016&lt;br /&gt;
|[http://www.dpconline.org/ Digital Preservation Coalition]&lt;br /&gt;
|Building the Universal Software Archive&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-11-09-webex-rdicosmo-digital-preservation-coalition.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|8 Nov 2016&lt;br /&gt;
|[https://github.com/alegrand/RR_webinars Series of Webinars on Reproducible Research]&lt;br /&gt;
|[https://github.com/alegrand/RR_webinars/blob/master/5_archiving_software_and_data/index.org Preserving Software and Data: Ensuring Availability and Traceability]&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-11-08-grenoble-rdicosmo-reproductibility-preserving-software.pdf PDF]&lt;br /&gt;
|[https://mi2s.imag.fr/preserving-software-ensuring-availability-and-traceability-0 Flowplayer]&lt;br /&gt;
|-&lt;br /&gt;
|18 Oct 2016&lt;br /&gt;
|[http://conferences.oreilly.com/oscon/open-source-eu OSCON Europe 2016]&lt;br /&gt;
|[http://conferences.oreilly.com/oscon/open-source-eu/public/schedule/detail/55989 Why and how Software Heritage is building the universal software archive] (keynote)&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-10-18-oscon-london-rdicosmo-keynote-software-heritage-building-the-universal-software-archive.pdf PDF]&lt;br /&gt;
|[https://www.oreilly.com/ideas/why-and-how-software-heritage-is-building-the-universal-software-archive Excerpt]&lt;br /&gt;
|-&lt;br /&gt;
|14 Oct 2016&lt;br /&gt;
|[http://www.upmc.fr/fr/formations/diplomes/sciences_et_technologies2/masters2/master_informatique_m1/master_science_et_technologie_du_logiciel_m2.html UPMC Master 2 STL]&lt;br /&gt;
|[https://www-apr.lip6.fr/~chaillou/Public/enseignement/2016-2017/conf-STL/ Software Heritage: Preserving the Free Software Commons]&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-10-14-upmc-software-heritage-preserving-the-free-software-commons.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21 Sep 2016&lt;br /&gt;
|[https://www.ow2con.org/bin/view/2016/ OW2con'16]&lt;br /&gt;
|[https://ow2con16.sched.org/event/80KP Beyond OW2: Software Heritage, Building the Universal Software Archive]&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-09-21-ow2con-zack-software-heritage-building-the-universal-software-archive.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|16 Sep 2016&lt;br /&gt;
|[https://www.irif.univ-paris-diderot.fr/ IRIF] [https://www.irif.univ-paris-diderot.fr/seminaires/irif/index seminar series]&lt;br /&gt;
|[https://www.irif.univ-paris-diderot.fr/seminaires/irif/index Preserving Software: challenges and opportunities for the reproductibility of Science ]&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-09-16-irif-science-crisis-software-preservation.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|07 Sep 2016&lt;br /&gt;
|[https://www.meetup.com/git-Paris/events/233368705/?eventId=233368705 Meetup git Paris #3]&lt;br /&gt;
|Software Heritage: une archive mondiale du logiciel libre, inspirée de Git&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]],&amp;lt;br&amp;gt;[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-09-07-paris-olasd+zack-git-meetup.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|04 Sep 2016&lt;br /&gt;
|[https://fsfe.org/community/events/2016/summit/frontpage.en.html FSFE Summit 2016]&lt;br /&gt;
|[https://conf.qtcon.org/en/qtcon/public/events/466 Software Heritage - the Universal Archive of Free Software]&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-09-04-qtcon-fsfe-rdicosmo-software-heritage-building-the-universal-software-archive.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|05 Aug 2016&lt;br /&gt;
|[https://www.emfcamp.org Electromagnetic Field 2016]&lt;br /&gt;
|Software Heritage (lightning talk)&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-08-07-emfcamp-olasd-lightning-talk/2016-08-05_emf.html HTML]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|04 Jul 2016&lt;br /&gt;
|[https://portail.umons.ac.be/FR/universite/admin/aff_etudiant/CultureEtSport/UMONS-culture/Documents_agendas_culture/2015/Research%20Seminar%20on%20Open%20Source%20Software_4-07-2016.pdf Open Source Seminar at UMONS]&lt;br /&gt;
|Software Heritage: Building the Universal Software Archive&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-07-04-umons-rdicosmo-software-heritage-building-the-universal-software-archive.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|04 Jul 2016&lt;br /&gt;
|[https://debconf16.debconf.org DebConf16]&lt;br /&gt;
|[https://debconf16.debconf.org/talks/42/ Software Heritage: Building the Universal Software Archive]&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-07-04-debconf16-olasd-software-heritage-building-the-universal-software-archive.pdf PDF]&lt;br /&gt;
|[http://gensho.acc.umu.se/pub/debian-meetings/2016/debconf16/Software_Heritage_Building_the_Universal_Software_Archive.webm WebM]&lt;br /&gt;
|-&lt;br /&gt;
|21 Jun 2016&lt;br /&gt;
|[http://journees-scientifiques2016.inria.fr/francais-programme/ Journées Scientifiques Inria, Rennes]&lt;br /&gt;
|What would you do with ''billions'' of source code files? Challenges and opportunities in software archival&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-06-21-inriarennes-rdicosmo-what-would-you-do-with-billions-of-source-code-files.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2015 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Venue&lt;br /&gt;
!Title&lt;br /&gt;
!Speaker&lt;br /&gt;
!Slides&lt;br /&gt;
!Video&lt;br /&gt;
|-&lt;br /&gt;
|16 Dec 2015&lt;br /&gt;
|[http://codesource.hypotheses.org/ Seminar &amp;quot;Codes Sources&amp;quot;, UPMC]&lt;br /&gt;
|Large-scale source code archival, publishing, and indexing with Debsources [and Software Heritage]&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2015/2015-12-16-semcodesources-zack-debsources-and-software-heritage.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|04 Dec 2015&lt;br /&gt;
|[http://cristal.univ-lille.fr/evolille2015/ EvoLille 2015]&lt;br /&gt;
|Ten years analysing large code bases: a perspective&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2015/2015-12-04-evolille2015-rdicosmo-ten-years-analysing-large-code-bases-a-perspective.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21 May 2015&lt;br /&gt;
|[http://www.scilabtec.com/ International Scilab Users Conference]&lt;br /&gt;
|[https://www.scilab.org/fr/community/scilabtec/2015/Keynote-Preserving-Software-challenges-and-opportunities-for-reproducibility-of-Science-and-Technology Preserving Software: Challenges and Opportunities for Reproducibility of Science and Technology]&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2015/2015-05-21-scilabtec-rdicosmo-preserving-software-challenges-and-opportunities-for-reproducibility-of-science-and-technology.pdf PDF]&lt;br /&gt;
|[https://vimeo.com/132074333 Vimeo]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2014 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Venue&lt;br /&gt;
!Title&lt;br /&gt;
!Speaker&lt;br /&gt;
!Slides&lt;br /&gt;
!Video&lt;br /&gt;
|-&lt;br /&gt;
|09 Dec 2014&lt;br /&gt;
|Reproductibility Working Group, Inria&lt;br /&gt;
|Preserving Software: Challenges and opportunities for reproductibility&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2014/2014-12-04-inriareprowg-rdicosmo-preserving-software-challenges-and-opportunities-for-reproducibility.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Communication]]&lt;br /&gt;
[[Category:Talks]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Talks&amp;diff=705</id>
		<title>Talks</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Talks&amp;diff=705"/>
		<updated>2017-09-07T18:24:51Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: /* 2017 */ add DebConf&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this page we keep track of the past and upcoming talks about [[Software Heritage]], in various venues.&lt;br /&gt;
&lt;br /&gt;
Please keep the table ''sorted by reverse date'' (most recent talk first).&lt;br /&gt;
&lt;br /&gt;
== 2017 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Venue&lt;br /&gt;
!Title&lt;br /&gt;
!Speaker&lt;br /&gt;
!Slides&lt;br /&gt;
!Video&lt;br /&gt;
|-&lt;br /&gt;
|10 August 2017&lt;br /&gt;
|[https://debconf17.debconf.org/ DebConf 2017]&lt;br /&gt;
|Software Heritage: Our software commons, forever.&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]] and [[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-08-10-debconf.pdf PDF]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-08-10-debconf.vp9.webm VP9]&lt;br /&gt;
|-&lt;br /&gt;
|5 July 2017&lt;br /&gt;
|[http://iticse.acm.org/ ITiCSE 2017]&lt;br /&gt;
|Software Heritage: scholarly and educational synergies with preserving our software commons (keynote)&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|6 Jun 2017&lt;br /&gt;
|[https://reseau-loops.github.io/ Café LoOPS]&lt;br /&gt;
|[https://reseau-loops.github.io/2017/06/01/cafe-loops Software Heritage: Construire la bibliothèque d'Alexandrie du logiciel]&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-06-06-loops.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|25 May 2017&lt;br /&gt;
|[http://www.dauin.polito.it/ DAUIN, Politecnico di Torino]&lt;br /&gt;
|Preserving Source Code: Challenges and Opportunities for the Reproductibility of Science&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-05-25-torino-polito.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|24 May 2017&lt;br /&gt;
|[https://nexa.polito.it/lunch-seminars Nexa Lunch Seminar]&lt;br /&gt;
|[https://nexa.polito.it/lunch-51 Software Heritage: Archiving the Software Commons for Fun and Social Benefit]&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-05-24-torino-nexa.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|10 Mar 2017&lt;br /&gt;
|[http://www.incontrodevops.it/events/idi2017/ Incontro DevOps 2017]&lt;br /&gt;
|[http://www.incontrodevops.it/sessions/keynote-idi2017/ Software Heritage: DevOps Challenges to Preserve our Software Commons] (keynote)&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-03-10-devops-italia.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|08 Feb 2017&lt;br /&gt;
|[https://project.inria.fr/epfl-Inria/workshops/workshop-2017/ INRIA-EPFL workshop]&lt;br /&gt;
|[https://project.inria.fr/epfl-Inria/files/2017/01/RobertoDiCosmo-abstract-workshop2017.pdf What would you do with billions of source code files? Challenges and opportunities in software archival]&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-02-07-epfl-billion-files.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|04 Feb 2017&lt;br /&gt;
|[https://fosdem.org/2017/ FOSDEM'17]&lt;br /&gt;
|[https://fosdem.org/2017/schedule/event/software_heritage/ Software Heritage: Preserving the Free Software Commons] (keynote)&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]], [[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-02-04-fosdem-software-heritage-foss-commons.pdf PDF]&lt;br /&gt;
|[https://video.fosdem.org/2017/Janson/software_heritage.vp8.webm VP8]&lt;br /&gt;
|-&lt;br /&gt;
|10 Jan 2017&lt;br /&gt;
|[http://www.congresodelfuturo.cl/ Congreso del Futuro]&lt;br /&gt;
|Software [is our] Heritage: Collecting, preserving and sharing the software source code of Mankind&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-01-10-congresofuturo.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2016 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Venue&lt;br /&gt;
!Title&lt;br /&gt;
!Speaker&lt;br /&gt;
!Slides&lt;br /&gt;
!Video&lt;br /&gt;
|-&lt;br /&gt;
|26 Nov 2016&lt;br /&gt;
|[http://milan2016.codemotionworld.com/ Codemotion Milan 2016]&lt;br /&gt;
|[http://milan2016.codemotionworld.com/talk-detail/?detail=4654 Software Heritage: let's build together the universal archive of our software commons]&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-11-26-codemotion-milan-zack-software-commons-archive.pdf PDF]&lt;br /&gt;
|[https://www.youtube.com/watch?v=gi_HydCumRE YouTube]&lt;br /&gt;
|-&lt;br /&gt;
|9 Nov 2016&lt;br /&gt;
|[http://www.dpconline.org/ Digital Preservation Coalition]&lt;br /&gt;
|Building the Universal Software Archive&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-11-09-webex-rdicosmo-digital-preservation-coalition.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|8 Nov 2016&lt;br /&gt;
|[https://github.com/alegrand/RR_webinars Series of Webinars on Reproducible Research]&lt;br /&gt;
|[https://github.com/alegrand/RR_webinars/blob/master/5_archiving_software_and_data/index.org Preserving Software and Data: Ensuring Availability and Traceability]&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-11-08-grenoble-rdicosmo-reproductibility-preserving-software.pdf PDF]&lt;br /&gt;
|[https://mi2s.imag.fr/preserving-software-ensuring-availability-and-traceability-0 Flowplayer]&lt;br /&gt;
|-&lt;br /&gt;
|18 Oct 2016&lt;br /&gt;
|[http://conferences.oreilly.com/oscon/open-source-eu OSCON Europe 2016]&lt;br /&gt;
|[http://conferences.oreilly.com/oscon/open-source-eu/public/schedule/detail/55989 Why and how Software Heritage is building the universal software archive] (keynote)&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-10-18-oscon-london-rdicosmo-keynote-software-heritage-building-the-universal-software-archive.pdf PDF]&lt;br /&gt;
|[https://www.oreilly.com/ideas/why-and-how-software-heritage-is-building-the-universal-software-archive Excerpt]&lt;br /&gt;
|-&lt;br /&gt;
|14 Oct 2016&lt;br /&gt;
|[http://www.upmc.fr/fr/formations/diplomes/sciences_et_technologies2/masters2/master_informatique_m1/master_science_et_technologie_du_logiciel_m2.html UPMC Master 2 STL]&lt;br /&gt;
|[https://www-apr.lip6.fr/~chaillou/Public/enseignement/2016-2017/conf-STL/ Software Heritage: Preserving the Free Software Commons]&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-10-14-upmc-software-heritage-preserving-the-free-software-commons.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21 Sep 2016&lt;br /&gt;
|[https://www.ow2con.org/bin/view/2016/ OW2con'16]&lt;br /&gt;
|[https://ow2con16.sched.org/event/80KP Beyond OW2: Software Heritage, Building the Universal Software Archive]&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-09-21-ow2con-zack-software-heritage-building-the-universal-software-archive.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|16 Sep 2016&lt;br /&gt;
|[https://www.irif.univ-paris-diderot.fr/ IRIF] [https://www.irif.univ-paris-diderot.fr/seminaires/irif/index seminar series]&lt;br /&gt;
|[https://www.irif.univ-paris-diderot.fr/seminaires/irif/index Preserving Software: challenges and opportunities for the reproductibility of Science ]&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-09-16-irif-science-crisis-software-preservation.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|07 Sep 2016&lt;br /&gt;
|[https://www.meetup.com/git-Paris/events/233368705/?eventId=233368705 Meetup git Paris #3]&lt;br /&gt;
|Software Heritage: une archive mondiale du logiciel libre, inspirée de Git&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]],&amp;lt;br&amp;gt;[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-09-07-paris-olasd+zack-git-meetup.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|04 Sep 2016&lt;br /&gt;
|[https://fsfe.org/community/events/2016/summit/frontpage.en.html FSFE Summit 2016]&lt;br /&gt;
|[https://conf.qtcon.org/en/qtcon/public/events/466 Software Heritage - the Universal Archive of Free Software]&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-09-04-qtcon-fsfe-rdicosmo-software-heritage-building-the-universal-software-archive.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|05 Aug 2016&lt;br /&gt;
|[https://www.emfcamp.org Electromagnetic Field 2016]&lt;br /&gt;
|Software Heritage (lightning talk)&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-08-07-emfcamp-olasd-lightning-talk/2016-08-05_emf.html HTML]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|04 Jul 2016&lt;br /&gt;
|[https://portail.umons.ac.be/FR/universite/admin/aff_etudiant/CultureEtSport/UMONS-culture/Documents_agendas_culture/2015/Research%20Seminar%20on%20Open%20Source%20Software_4-07-2016.pdf Open Source Seminar at UMONS]&lt;br /&gt;
|Software Heritage: Building the Universal Software Archive&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-07-04-umons-rdicosmo-software-heritage-building-the-universal-software-archive.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|04 Jul 2016&lt;br /&gt;
|[https://debconf16.debconf.org DebConf16]&lt;br /&gt;
|[https://debconf16.debconf.org/talks/42/ Software Heritage: Building the Universal Software Archive]&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-07-04-debconf16-olasd-software-heritage-building-the-universal-software-archive.pdf PDF]&lt;br /&gt;
|[http://gensho.acc.umu.se/pub/debian-meetings/2016/debconf16/Software_Heritage_Building_the_Universal_Software_Archive.webm WebM]&lt;br /&gt;
|-&lt;br /&gt;
|21 Jun 2016&lt;br /&gt;
|[http://journees-scientifiques2016.inria.fr/francais-programme/ Journées Scientifiques Inria, Rennes]&lt;br /&gt;
|What would you do with ''billions'' of source code files? Challenges and opportunities in software archival&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-06-21-inriarennes-rdicosmo-what-would-you-do-with-billions-of-source-code-files.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2015 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Venue&lt;br /&gt;
!Title&lt;br /&gt;
!Speaker&lt;br /&gt;
!Slides&lt;br /&gt;
!Video&lt;br /&gt;
|-&lt;br /&gt;
|16 Dec 2015&lt;br /&gt;
|[http://codesource.hypotheses.org/ Seminar &amp;quot;Codes Sources&amp;quot;, UPMC]&lt;br /&gt;
|Large-scale source code archival, publishing, and indexing with Debsources [and Software Heritage]&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2015/2015-12-16-semcodesources-zack-debsources-and-software-heritage.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|04 Dec 2015&lt;br /&gt;
|[http://cristal.univ-lille.fr/evolille2015/ EvoLille 2015]&lt;br /&gt;
|Ten years analysing large code bases: a perspective&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2015/2015-12-04-evolille2015-rdicosmo-ten-years-analysing-large-code-bases-a-perspective.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21 May 2015&lt;br /&gt;
|[http://www.scilabtec.com/ International Scilab Users Conference]&lt;br /&gt;
|[https://www.scilab.org/fr/community/scilabtec/2015/Keynote-Preserving-Software-challenges-and-opportunities-for-reproducibility-of-Science-and-Technology Preserving Software: Challenges and Opportunities for Reproducibility of Science and Technology]&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2015/2015-05-21-scilabtec-rdicosmo-preserving-software-challenges-and-opportunities-for-reproducibility-of-science-and-technology.pdf PDF]&lt;br /&gt;
|[https://vimeo.com/132074333 Vimeo]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2014 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Venue&lt;br /&gt;
!Title&lt;br /&gt;
!Speaker&lt;br /&gt;
!Slides&lt;br /&gt;
!Video&lt;br /&gt;
|-&lt;br /&gt;
|09 Dec 2014&lt;br /&gt;
|Reproductibility Working Group, Inria&lt;br /&gt;
|Preserving Software: Challenges and opportunities for reproductibility&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2014/2014-12-04-inriareprowg-rdicosmo-preserving-software-challenges-and-opportunities-for-reproducibility.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Communication]]&lt;br /&gt;
[[Category:Talks]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Matrix&amp;diff=681</id>
		<title>Matrix</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Matrix&amp;diff=681"/>
		<updated>2017-09-05T13:45:07Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: add CertFP and clarify #swh-sysadm&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== IRC channels ==&lt;br /&gt;
&lt;br /&gt;
The following channels have been registered on the [https://freenode.net/ Freenode] network for [[Software Heritage]] usage.&lt;br /&gt;
&lt;br /&gt;
* '''#softwareheritage''': general discussions about the project (currently unused)&lt;br /&gt;
* '''#swh''': ditto, in case we end up preferring the short version&lt;br /&gt;
* '''#swh-devel''': public development discussions&lt;br /&gt;
* '''#swh-team''': private discussions of the core team&lt;br /&gt;
* '''#swh-sysadm''': operations team discussions/bots&lt;br /&gt;
&lt;br /&gt;
If you do IRC, consider joining the channels.&lt;br /&gt;
&lt;br /&gt;
== IRC authentication ==&lt;br /&gt;
&lt;br /&gt;
You should register their nick with NickServ using:&lt;br /&gt;
&lt;br /&gt;
 /nick &amp;lt;USERNAME&amp;gt;&lt;br /&gt;
 /msg nickserv register &amp;lt;PASSWORD&amp;gt; &amp;lt;EMAIL&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will then receive an e-mail containing a link to activate you account. After doing so, you need to configure your client to auto-authenticate. The recommanded way of doing that is using [https://freenode.net/kb/answer/sasl SASL authentication].&lt;br /&gt;
&lt;br /&gt;
For Weechat:&lt;br /&gt;
&lt;br /&gt;
 /set irc.server.freenode.sasl_username &amp;lt;USERNAME&amp;gt;&lt;br /&gt;
 /set irc.server.freenode.sasl_password &amp;lt;PASSWORD&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Freenode also supports authentication via [https://freenode.net/kb/answer/certfp TLS client certificates].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== IRC access list ==&lt;br /&gt;
&lt;br /&gt;
To auto-voice people with a registered nick (only doable by people with +fA access modes will be able to do it), add them to the channel access list:&lt;br /&gt;
&lt;br /&gt;
 /msg chanserv access #swh-devel add zack +V&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastructure]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Debian_packaging&amp;diff=668</id>
		<title>Debian packaging</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Debian_packaging&amp;diff=668"/>
		<updated>2017-06-19T17:21:36Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: /* Package repository */ add stretch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Creating a package for deployment ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;swh-environment&amp;lt;/tt&amp;gt; contains a script, &amp;lt;tt&amp;gt;bin/make-package&amp;lt;/tt&amp;gt;, which generates a Debian package from a given Git repository, and uploads it to our internal repository targeting suites unstable and jessie-backports.&lt;br /&gt;
&lt;br /&gt;
This assumes that the '''current''' (''HEAD'') revision has been tagged with a version '''v&amp;lt;foo&amp;gt;''' (e.g. v0.0.4), and that the repository contains the debian metadata. (i.e. &amp;lt;tt&amp;gt;debian/{copyright,control,changelog.rules,source/format,compat}&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
  $ git tag -as -m 'version 0.0.42' v0.0.42&lt;br /&gt;
  $ bin/make-package -b -u swh-core&lt;br /&gt;
&lt;br /&gt;
== Package repository ==&lt;br /&gt;
&lt;br /&gt;
A package repository is available on http://debian.internal.softwareheritage.org/.&lt;br /&gt;
&lt;br /&gt;
Unstable / Testing :&lt;br /&gt;
  deb [trusted=yes] http://debian.internal.softwareheritage.org/ unstable main&lt;br /&gt;
&lt;br /&gt;
Stable / Stretch :&lt;br /&gt;
  deb [trusted=yes] http://debian.internal.softwareheritage.org/ stretch-swh main&lt;br /&gt;
&lt;br /&gt;
Oldstable / Jessie :&lt;br /&gt;
  deb [trusted=yes] http://debian.internal.softwareheritage.org/ jessie main&lt;br /&gt;
&lt;br /&gt;
This package repository is handled via reprepro on pergamon.internal.softwareheritage.org (base directory : /srv/softwareheritage/repository).&lt;br /&gt;
&lt;br /&gt;
=== Uploading packages ===&lt;br /&gt;
&lt;br /&gt;
Packages are added to the repository using &amp;lt;tt&amp;gt;reprepro -vb /srv/softwareheritage/repository processincoming incoming&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For packages to be accepted, they need to be :&lt;br /&gt;
# A changes file uploaded to &amp;lt;tt&amp;gt;/srv/softwareheritage/repository/incoming&amp;lt;/tt&amp;gt;&lt;br /&gt;
# Targetted at one of the supported distributions (unstable, unstable-swh, stretch, stretch-backports, stretch-backports-swh), jessie, jessie-backports, jessie-backports-swh)&lt;br /&gt;
# Signed by one of the keys listed in /srv/softwareheritage/repository/conf/uploaders&lt;br /&gt;
&lt;br /&gt;
== Build Environment setup ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;bin/make-package.sh&amp;lt;/tt&amp;gt; uses sbuild for package construction. You therefore need to setup sbuild before being able to use it.&lt;br /&gt;
&lt;br /&gt;
=== sbuild setup ===&lt;br /&gt;
&lt;br /&gt;
 # Install the package&lt;br /&gt;
 sudo apt-get install sbuild&lt;br /&gt;
 &lt;br /&gt;
 # Add your user to the sbuild group, to allow him to use the sbuild commands&lt;br /&gt;
 sudo sbuild-adduser $USER&lt;br /&gt;
 # You have to logout and log back in&lt;br /&gt;
 &lt;br /&gt;
 # Prepare chroots&lt;br /&gt;
 sudo mkdir /srv/chroots&lt;br /&gt;
 sudo mkdir /srv/chroots/var&lt;br /&gt;
 &lt;br /&gt;
 # Optionally create a separate filesystem for /srv/chroots and move the sbuild/schroot data to that partition&lt;br /&gt;
 sudo rsync -avz --delete /var/lib/schroot/ /srv/chroots/var/schroot/&lt;br /&gt;
 sudo rm -r /var/lib/schroot&lt;br /&gt;
 sudo ln -sf /srv/chroots/var/schroot /var/lib/schroot&lt;br /&gt;
 &lt;br /&gt;
 sudo rsync -avz --delete /var/lib/sbuild/ /srv/chroots/var/sbuild/&lt;br /&gt;
 sudo rm -r /var/lib/sbuild&lt;br /&gt;
 sudo ln -sf /srv/chroots/var/sbuild /var/lib/sbuild&lt;br /&gt;
 # end optionally&lt;br /&gt;
 &lt;br /&gt;
 # Create unstable/sid chroot&lt;br /&gt;
 sudo sbuild-createchroot sid /srv/chroots/sid http://deb.debian.org/debian/&lt;br /&gt;
 &lt;br /&gt;
 # Create stretch chroot&lt;br /&gt;
 sudo sbuild-createchroot stretch /srv/chroots/stretch http://deb.debian.org/debian/&lt;br /&gt;
&lt;br /&gt;
 # Create jessie chroot&lt;br /&gt;
 sudo sbuild-createchroot jessie /srv/chroots/jessie http://deb.debian.org/debian/&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 # If you use /etc/hosts to resolve *.internal.softwareheritage.org hosts&lt;br /&gt;
 echo hosts &amp;gt;&amp;gt; /etc/schroot/sbuild/nssdatabases&lt;br /&gt;
&lt;br /&gt;
=== schroot setup ===&lt;br /&gt;
&lt;br /&gt;
Now that the sbuild base setup is done. You now need to configure schroot to use an overlay filesystem, which will avoid copying the chroots at each build.&lt;br /&gt;
&lt;br /&gt;
In recent (&amp;gt;= 1.6) versions of schroot, you need to update the configuration (in &amp;lt;tt&amp;gt;/etc/schroot/chroot.d/*-sbuild-*&amp;lt;/tt&amp;gt;) with the following directives:&lt;br /&gt;
&lt;br /&gt;
 source-groups=root,sbuild&lt;br /&gt;
 source-root-groups=root,sbuild&lt;br /&gt;
 union-type=overlay&lt;br /&gt;
&lt;br /&gt;
You should also use this opportunity to add &amp;quot;aliases&amp;quot; to your chroot, so that sbuild will directly support the distributions we're using (unstable-swh, jessie-backports-swh):&lt;br /&gt;
&lt;br /&gt;
For unstable:&lt;br /&gt;
 aliases=unstable-amd64-sbuild,UNRELEASED-amd64-sbuild,unstable-swh-amd64-sbuild&lt;br /&gt;
&lt;br /&gt;
For stretch:&lt;br /&gt;
 aliases=stable-amd64-sbuild,stable-backports-amd64-sbuild,stretch-backports-amd64-sbuild,stretch-backports-swh-amd64-sbuild&lt;br /&gt;
&lt;br /&gt;
For jessie:&lt;br /&gt;
 aliases=oldstable-amd64-sbuild,oldstable-backports-amd64-sbuild,jessie-backports-amd64-sbuild,jessie-backports-swh-amd64-sbuild&lt;br /&gt;
&lt;br /&gt;
==== dependencies cache ====&lt;br /&gt;
&lt;br /&gt;
Add the following line to schroot's fstab /etc/schroot/sbuild/fstab&lt;br /&gt;
to permit reuse of existing fetched dependencies:&lt;br /&gt;
&lt;br /&gt;
    /var/cache/apt/archives /var/cache/apt/archives none rw,bind 0 0&lt;br /&gt;
&lt;br /&gt;
=== environment setup ===&lt;br /&gt;
&lt;br /&gt;
The Debian tools use a few variables to preset your name and email. Add this to your &amp;lt;tt&amp;gt;.&amp;lt;shell&amp;gt;rc&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 export DEBFULLNAME=&amp;quot;Debra Hacker&amp;quot;&lt;br /&gt;
 export DEBEMAIL=debra.hacker@example.com&lt;br /&gt;
&lt;br /&gt;
Make sure this data matches an uid for your GPG key. Else, you can use the &amp;lt;tt&amp;gt;DEBSIGN_KEYID=&amp;lt;yourkeyid&amp;gt;&amp;lt;/tt&amp;gt; variable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Software development]]&lt;br /&gt;
[[Category:System administration]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Debian_packaging&amp;diff=667</id>
		<title>Debian packaging</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Debian_packaging&amp;diff=667"/>
		<updated>2017-06-19T17:20:09Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: Update packaging for stretch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Creating a package for deployment ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;swh-environment&amp;lt;/tt&amp;gt; contains a script, &amp;lt;tt&amp;gt;bin/make-package&amp;lt;/tt&amp;gt;, which generates a Debian package from a given Git repository, and uploads it to our internal repository targeting suites unstable and jessie-backports.&lt;br /&gt;
&lt;br /&gt;
This assumes that the '''current''' (''HEAD'') revision has been tagged with a version '''v&amp;lt;foo&amp;gt;''' (e.g. v0.0.4), and that the repository contains the debian metadata. (i.e. &amp;lt;tt&amp;gt;debian/{copyright,control,changelog.rules,source/format,compat}&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
  $ git tag -as -m 'version 0.0.42' v0.0.42&lt;br /&gt;
  $ bin/make-package -b -u swh-core&lt;br /&gt;
&lt;br /&gt;
== Package repository ==&lt;br /&gt;
&lt;br /&gt;
A package repository is available on http://debian.internal.softwareheritage.org/.&lt;br /&gt;
&lt;br /&gt;
Unstable / Testing :&lt;br /&gt;
  deb [trusted=yes] http://debian.internal.softwareheritage.org/ unstable main&lt;br /&gt;
&lt;br /&gt;
Stable / Jessie :&lt;br /&gt;
  deb [trusted=yes] http://debian.internal.softwareheritage.org/ jessie main&lt;br /&gt;
&lt;br /&gt;
This package repository is handled via reprepro on pergamon.internal.softwareheritage.org (base directory : /srv/softwareheritage/repository).&lt;br /&gt;
&lt;br /&gt;
=== Uploading packages ===&lt;br /&gt;
&lt;br /&gt;
Packages are added to the repository using &amp;lt;tt&amp;gt;reprepro -vb /srv/softwareheritage/repository processincoming incoming&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For packages to be accepted, they need to be :&lt;br /&gt;
# A changes file uploaded to &amp;lt;tt&amp;gt;/srv/softwareheritage/repository/incoming&amp;lt;/tt&amp;gt;&lt;br /&gt;
# Targetted at one of the supported distributions (unstable, unstable-swh, jessie, jessie-backports, jessie-backports-swh)&lt;br /&gt;
# Signed by one of the keys listed in /srv/softwareheritage/repository/conf/uploaders&lt;br /&gt;
&lt;br /&gt;
== Build Environment setup ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;bin/make-package.sh&amp;lt;/tt&amp;gt; uses sbuild for package construction. You therefore need to setup sbuild before being able to use it.&lt;br /&gt;
&lt;br /&gt;
=== sbuild setup ===&lt;br /&gt;
&lt;br /&gt;
 # Install the package&lt;br /&gt;
 sudo apt-get install sbuild&lt;br /&gt;
 &lt;br /&gt;
 # Add your user to the sbuild group, to allow him to use the sbuild commands&lt;br /&gt;
 sudo sbuild-adduser $USER&lt;br /&gt;
 # You have to logout and log back in&lt;br /&gt;
 &lt;br /&gt;
 # Prepare chroots&lt;br /&gt;
 sudo mkdir /srv/chroots&lt;br /&gt;
 sudo mkdir /srv/chroots/var&lt;br /&gt;
 &lt;br /&gt;
 # Optionally create a separate filesystem for /srv/chroots and move the sbuild/schroot data to that partition&lt;br /&gt;
 sudo rsync -avz --delete /var/lib/schroot/ /srv/chroots/var/schroot/&lt;br /&gt;
 sudo rm -r /var/lib/schroot&lt;br /&gt;
 sudo ln -sf /srv/chroots/var/schroot /var/lib/schroot&lt;br /&gt;
 &lt;br /&gt;
 sudo rsync -avz --delete /var/lib/sbuild/ /srv/chroots/var/sbuild/&lt;br /&gt;
 sudo rm -r /var/lib/sbuild&lt;br /&gt;
 sudo ln -sf /srv/chroots/var/sbuild /var/lib/sbuild&lt;br /&gt;
 # end optionally&lt;br /&gt;
 &lt;br /&gt;
 # Create unstable/sid chroot&lt;br /&gt;
 sudo sbuild-createchroot sid /srv/chroots/sid http://deb.debian.org/debian/&lt;br /&gt;
 &lt;br /&gt;
 # Create stretch chroot&lt;br /&gt;
 sudo sbuild-createchroot stretch /srv/chroots/stretch http://deb.debian.org/debian/&lt;br /&gt;
&lt;br /&gt;
 # Create jessie chroot&lt;br /&gt;
 sudo sbuild-createchroot jessie /srv/chroots/jessie http://deb.debian.org/debian/&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 # If you use /etc/hosts to resolve *.internal.softwareheritage.org hosts&lt;br /&gt;
 echo hosts &amp;gt;&amp;gt; /etc/schroot/sbuild/nssdatabases&lt;br /&gt;
&lt;br /&gt;
=== schroot setup ===&lt;br /&gt;
&lt;br /&gt;
Now that the sbuild base setup is done. You now need to configure schroot to use an overlay filesystem, which will avoid copying the chroots at each build.&lt;br /&gt;
&lt;br /&gt;
In recent (&amp;gt;= 1.6) versions of schroot, you need to update the configuration (in &amp;lt;tt&amp;gt;/etc/schroot/chroot.d/*-sbuild-*&amp;lt;/tt&amp;gt;) with the following directives:&lt;br /&gt;
&lt;br /&gt;
 source-groups=root,sbuild&lt;br /&gt;
 source-root-groups=root,sbuild&lt;br /&gt;
 union-type=overlay&lt;br /&gt;
&lt;br /&gt;
You should also use this opportunity to add &amp;quot;aliases&amp;quot; to your chroot, so that sbuild will directly support the distributions we're using (unstable-swh, jessie-backports-swh):&lt;br /&gt;
&lt;br /&gt;
For unstable:&lt;br /&gt;
 aliases=unstable-amd64-sbuild,UNRELEASED-amd64-sbuild,unstable-swh-amd64-sbuild&lt;br /&gt;
&lt;br /&gt;
For stretch:&lt;br /&gt;
 aliases=stable-amd64-sbuild,stable-backports-amd64-sbuild,stretch-backports-amd64-sbuild,stretch-backports-swh-amd64-sbuild&lt;br /&gt;
&lt;br /&gt;
For jessie:&lt;br /&gt;
 aliases=oldstable-amd64-sbuild,oldstable-backports-amd64-sbuild,jessie-backports-amd64-sbuild,jessie-backports-swh-amd64-sbuild&lt;br /&gt;
&lt;br /&gt;
==== dependencies cache ====&lt;br /&gt;
&lt;br /&gt;
Add the following line to schroot's fstab /etc/schroot/sbuild/fstab&lt;br /&gt;
to permit reuse of existing fetched dependencies:&lt;br /&gt;
&lt;br /&gt;
    /var/cache/apt/archives /var/cache/apt/archives none rw,bind 0 0&lt;br /&gt;
&lt;br /&gt;
=== environment setup ===&lt;br /&gt;
&lt;br /&gt;
The Debian tools use a few variables to preset your name and email. Add this to your &amp;lt;tt&amp;gt;.&amp;lt;shell&amp;gt;rc&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 export DEBFULLNAME=&amp;quot;Debra Hacker&amp;quot;&lt;br /&gt;
 export DEBEMAIL=debra.hacker@example.com&lt;br /&gt;
&lt;br /&gt;
Make sure this data matches an uid for your GPG key. Else, you can use the &amp;lt;tt&amp;gt;DEBSIGN_KEYID=&amp;lt;yourkeyid&amp;gt;&amp;lt;/tt&amp;gt; variable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Software development]]&lt;br /&gt;
[[Category:System administration]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Talks&amp;diff=662</id>
		<title>Talks</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Talks&amp;diff=662"/>
		<updated>2017-06-06T13:28:55Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: /* 2017 */ Add LoOPS talk&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this page we keep track of the past and upcoming talks about [[Software Heritage]], in various venues.&lt;br /&gt;
&lt;br /&gt;
Please keep the table ''sorted by reverse date'' (most recent talk first).&lt;br /&gt;
&lt;br /&gt;
== 2017 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Venue&lt;br /&gt;
!Title&lt;br /&gt;
!Speaker&lt;br /&gt;
!Slides&lt;br /&gt;
!Video&lt;br /&gt;
|-&lt;br /&gt;
|6 Jun 2017&lt;br /&gt;
|[https://reseau-loops.github.io/ Café LoOPS]&lt;br /&gt;
|[https://reseau-loops.github.io/2017/06/01/cafe-loops Software Heritage: Construire la bibliothèque d'Alexandrie du logiciel]&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-06-06-loops.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|10 Mar 2017&lt;br /&gt;
|[http://www.incontrodevops.it/events/idi2017/ Incontro DevOps 2017]&lt;br /&gt;
|[http://www.incontrodevops.it/sessions/keynote-idi2017/ Software Heritage: DevOps Challenges to Preserve our Software Commons]&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-03-10-devops-italia.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|08 Feb 2017&lt;br /&gt;
|[https://project.inria.fr/epfl-Inria/workshops/workshop-2017/ INRIA-EPFL workshop]&lt;br /&gt;
|[https://project.inria.fr/epfl-Inria/files/2017/01/RobertoDiCosmo-abstract-workshop2017.pdf What would you do with billions of source code files? Challenges and opportunities in software archival]&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-02-07-epfl-billion-files.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|04 Feb 2017&lt;br /&gt;
|[https://fosdem.org/2017/ FOSDEM'17]&lt;br /&gt;
|[https://fosdem.org/2017/schedule/event/software_heritage/ Software Heritage: Preserving the Free Software Commons] (keynote)&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]], [[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-02-04-fosdem-software-heritage-foss-commons.pdf PDF]&lt;br /&gt;
|[https://video.fosdem.org/2017/Janson/software_heritage.vp8.webm VP8]&lt;br /&gt;
|-&lt;br /&gt;
|10 Jan 2017&lt;br /&gt;
|[http://www.congresodelfuturo.cl/ Congreso del Futuro]&lt;br /&gt;
|Software [is our] Heritage: Collecting, preserving and sharing the software source code of Mankind&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2017/2017-01-10-congresofuturo.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2016 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Venue&lt;br /&gt;
!Title&lt;br /&gt;
!Speaker&lt;br /&gt;
!Slides&lt;br /&gt;
!Video&lt;br /&gt;
|-&lt;br /&gt;
|26 Nov 2016&lt;br /&gt;
|[http://milan2016.codemotionworld.com/ Codemotion Milan 2016]&lt;br /&gt;
|[http://milan2016.codemotionworld.com/talk-detail/?detail=4654 Software Heritage: let's build together the universal archive of our software commons]&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-11-26-codemotion-milan-zack-software-commons-archive.pdf PDF]&lt;br /&gt;
|[https://www.youtube.com/watch?v=gi_HydCumRE YouTube]&lt;br /&gt;
|-&lt;br /&gt;
|9 Nov 2016&lt;br /&gt;
|[http://www.dpconline.org/ Digital Preservation Coalition]&lt;br /&gt;
|Building the Universal Software Archive&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-11-09-webex-rdicosmo-digital-preservation-coalition.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|8 Nov 2016&lt;br /&gt;
|[https://github.com/alegrand/RR_webinars Series of Webinars on Reproducible Research]&lt;br /&gt;
|[https://github.com/alegrand/RR_webinars/blob/master/5_archiving_software_and_data/index.org Preserving Software and Data: Ensuring Availability and Traceability]&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-11-08-grenoble-rdicosmo-reproductibility-preserving-software.pdf PDF]&lt;br /&gt;
|[https://mi2s.imag.fr/preserving-software-ensuring-availability-and-traceability-0 Flowplayer]&lt;br /&gt;
|-&lt;br /&gt;
|18 Oct 2016&lt;br /&gt;
|[http://conferences.oreilly.com/oscon/open-source-eu OSCON Europe 2016]&lt;br /&gt;
|[http://conferences.oreilly.com/oscon/open-source-eu/public/schedule/detail/55989 Why and how Software Heritage is building the universal software archive] (keynote)&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-10-18-oscon-london-rdicosmo-keynote-software-heritage-building-the-universal-software-archive.pdf PDF]&lt;br /&gt;
|[https://www.oreilly.com/ideas/why-and-how-software-heritage-is-building-the-universal-software-archive Excerpt]&lt;br /&gt;
|-&lt;br /&gt;
|14 Oct 2016&lt;br /&gt;
|[http://www.upmc.fr/fr/formations/diplomes/sciences_et_technologies2/masters2/master_informatique_m1/master_science_et_technologie_du_logiciel_m2.html UPMC Master 2 STL]&lt;br /&gt;
|[https://www-apr.lip6.fr/~chaillou/Public/enseignement/2016-2017/conf-STL/ Software Heritage: Preserving the Free Software Commons]&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-10-14-upmc-software-heritage-preserving-the-free-software-commons.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21 Sep 2016&lt;br /&gt;
|[https://www.ow2con.org/bin/view/2016/ OW2con'16]&lt;br /&gt;
|[https://ow2con16.sched.org/event/80KP Beyond OW2: Software Heritage, Building the Universal Software Archive]&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-09-21-ow2con-zack-software-heritage-building-the-universal-software-archive.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|16 Sep 2016&lt;br /&gt;
|[https://www.irif.univ-paris-diderot.fr/ IRIF] [https://www.irif.univ-paris-diderot.fr/seminaires/irif/index seminar series]&lt;br /&gt;
|[https://www.irif.univ-paris-diderot.fr/seminaires/irif/index Preserving Software: challenges and opportunities for the reproductibility of Science ]&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-09-16-irif-science-crisis-software-preservation.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|07 Sep 2016&lt;br /&gt;
|[https://www.meetup.com/git-Paris/events/233368705/?eventId=233368705 Meetup git Paris #3]&lt;br /&gt;
|Software Heritage: une archive mondiale du logiciel libre, inspirée de Git&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]],&amp;lt;br&amp;gt;[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-09-07-paris-olasd+zack-git-meetup.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|04 Sep 2016&lt;br /&gt;
|[https://fsfe.org/community/events/2016/summit/frontpage.en.html FSFE Summit 2016]&lt;br /&gt;
|[https://conf.qtcon.org/en/qtcon/public/events/466 Software Heritage - the Universal Archive of Free Software]&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-09-04-qtcon-fsfe-rdicosmo-software-heritage-building-the-universal-software-archive.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|05 Aug 2016&lt;br /&gt;
|[https://www.emfcamp.org Electromagnetic Field 2016]&lt;br /&gt;
|Software Heritage (lightning talk)&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-08-07-emfcamp-olasd-lightning-talk/2016-08-05_emf.html HTML]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|04 Jul 2016&lt;br /&gt;
|[https://portail.umons.ac.be/FR/universite/admin/aff_etudiant/CultureEtSport/UMONS-culture/Documents_agendas_culture/2015/Research%20Seminar%20on%20Open%20Source%20Software_4-07-2016.pdf Open Source Seminar at UMONS]&lt;br /&gt;
|Software Heritage: Building the Universal Software Archive&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-07-04-umons-rdicosmo-software-heritage-building-the-universal-software-archive.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|04 Jul 2016&lt;br /&gt;
|[https://debconf16.debconf.org DebConf16]&lt;br /&gt;
|[https://debconf16.debconf.org/talks/42/ Software Heritage: Building the Universal Software Archive]&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-07-04-debconf16-olasd-software-heritage-building-the-universal-software-archive.pdf PDF]&lt;br /&gt;
|[http://gensho.acc.umu.se/pub/debian-meetings/2016/debconf16/Software_Heritage_Building_the_Universal_Software_Archive.webm WebM]&lt;br /&gt;
|-&lt;br /&gt;
|21 Jun 2016&lt;br /&gt;
|[http://journees-scientifiques2016.inria.fr/francais-programme/ Journées Scientifiques Inria, Rennes]&lt;br /&gt;
|What would you do with ''billions'' of source code files? Challenges and opportunities in software archival&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-06-21-inriarennes-rdicosmo-what-would-you-do-with-billions-of-source-code-files.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2015 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Venue&lt;br /&gt;
!Title&lt;br /&gt;
!Speaker&lt;br /&gt;
!Slides&lt;br /&gt;
!Video&lt;br /&gt;
|-&lt;br /&gt;
|16 Dec 2015&lt;br /&gt;
|[http://codesource.hypotheses.org/ Seminar &amp;quot;Codes Sources&amp;quot;, UPMC]&lt;br /&gt;
|Large-scale source code archival, publishing, and indexing with Debsources [and Software Heritage]&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2015/2015-12-16-semcodesources-zack-debsources-and-software-heritage.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|04 Dec 2015&lt;br /&gt;
|[http://cristal.univ-lille.fr/evolille2015/ EvoLille 2015]&lt;br /&gt;
|Ten years analysing large code bases: a perspective&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2015/2015-12-04-evolille2015-rdicosmo-ten-years-analysing-large-code-bases-a-perspective.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21 May 2015&lt;br /&gt;
|[http://www.scilabtec.com/ International Scilab Users Conference]&lt;br /&gt;
|[https://www.scilab.org/fr/community/scilabtec/2015/Keynote-Preserving-Software-challenges-and-opportunities-for-reproducibility-of-Science-and-Technology Preserving Software: Challenges and Opportunities for Reproducibility of Science and Technology]&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2015/2015-05-21-scilabtec-rdicosmo-preserving-software-challenges-and-opportunities-for-reproducibility-of-science-and-technology.pdf PDF]&lt;br /&gt;
|[https://vimeo.com/132074333 Vimeo]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2014 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Venue&lt;br /&gt;
!Title&lt;br /&gt;
!Speaker&lt;br /&gt;
!Slides&lt;br /&gt;
!Video&lt;br /&gt;
|-&lt;br /&gt;
|09 Dec 2014&lt;br /&gt;
|Reproductibility Working Group, Inria&lt;br /&gt;
|Preserving Software: Challenges and opportunities for reproductibility&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2014/2014-12-04-inriareprowg-rdicosmo-preserving-software-challenges-and-opportunities-for-reproducibility.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Communication]]&lt;br /&gt;
[[Category:Talks]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=VPN&amp;diff=1305</id>
		<title>VPN</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=VPN&amp;diff=1305"/>
		<updated>2016-10-10T14:03:58Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: Add revocation instructions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [[Software Heritage]] server and the VMs running on it are severely firewalled.&lt;br /&gt;
To get onto their network unrestricted, a VPN based on [https://openvpn.net/ OpenVPN] is available.&lt;br /&gt;
&lt;br /&gt;
The setup is client-server, with per-client certificates.&lt;br /&gt;
&lt;br /&gt;
== OpenVPN client configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Raw OpenVPN ===&lt;br /&gt;
&lt;br /&gt;
Sample configuration file, e.g., /etc/openvpn/softwareheritage.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remote louvre.softwareheritage.org&lt;br /&gt;
ns-cert-type server &lt;br /&gt;
comp-lzo &lt;br /&gt;
nobind&lt;br /&gt;
dev tun&lt;br /&gt;
proto udp &lt;br /&gt;
port 1194 &lt;br /&gt;
log /var/log/openvpn.log&lt;br /&gt;
up-restart &lt;br /&gt;
persist-key &lt;br /&gt;
persist-tun &lt;br /&gt;
client &lt;br /&gt;
ca /etc/openvpn/keys/softwareheritage-ca.crt&lt;br /&gt;
cert /etc/openvpn/keys/softwareheritage.crt&lt;br /&gt;
key /etc/openvpn/keys/softwareheritage.key&lt;br /&gt;
user nobody&lt;br /&gt;
group nogroup&lt;br /&gt;
&lt;br /&gt;
# If you are using resolvconf, add this:&lt;br /&gt;
# Make sure you add louvre to /etc/hosts to avoid issues in using the vpn-provided DNS server.&lt;br /&gt;
script-security 2&lt;br /&gt;
up /etc/openvpn/update-resolv-conf&lt;br /&gt;
down /etc/openvpn/update-resolv-conf&lt;br /&gt;
&lt;br /&gt;
# If you want the connection to persist when your network fails, add this:&lt;br /&gt;
ping-restart 10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition to the above configuration file, you will need to install the following 3 files under /etc/openvpn/keys:&lt;br /&gt;
&lt;br /&gt;
* '''[[softwareheritage-ca.crt]]''': ''public'' certificate for the Software Heritage certification authority (CA)&lt;br /&gt;
* '''softwareheritage.crt''': ''public'', client-specific certificate (see below)&lt;br /&gt;
* '''softwareheritage.key''': ''private'', client-specific key (see below)&lt;br /&gt;
&lt;br /&gt;
=== Network Manager GUI ===&lt;br /&gt;
&lt;br /&gt;
You need network-manager-openvpn and network-manager-openvpn-gnome for the configuration gui.&lt;br /&gt;
&lt;br /&gt;
[[File:nm_openvpn_base.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_general.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_security.png]]&lt;br /&gt;
[[File:nm_openvpn_advanced_tls_auth.png]]&lt;br /&gt;
&lt;br /&gt;
== Obtaining a client certificate ==&lt;br /&gt;
&lt;br /&gt;
=== For users ===&lt;br /&gt;
&lt;br /&gt;
Ask an admin to produce a pair of client-specific certificate/key for you.&lt;br /&gt;
&lt;br /&gt;
Please ensure there is a way to send you the certificate and the key securely (e.g., GPG).&lt;br /&gt;
&lt;br /&gt;
=== For admins ===&lt;br /&gt;
&lt;br /&gt;
On louvre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@louvre:~# cd /etc/openvpn/easy-rsa/&lt;br /&gt;
root@louvre:/etc/openvpn/easy-rsa# . vars &lt;br /&gt;
root@louvre:/etc/openvpn/easy-rsa# ./build-key USERNAME&lt;br /&gt;
[ accept defaults, they should be OK ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At the end of the process certificate and key will be in /etc/openvpn/keys/USERNAME.{crt,key}.&lt;br /&gt;
Send them to USERNAME (securely).&lt;br /&gt;
&lt;br /&gt;
Add the DNS entry for the new host to hiera and do a puppet run on pergamon.&lt;br /&gt;
&lt;br /&gt;
== Revoking a client certificate ==&lt;br /&gt;
&lt;br /&gt;
On louvre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@louvre:~# cd /etc/openvpn/easy-rsa/&lt;br /&gt;
root@louvre:/etc/openvpn/easy-rsa# . vars &lt;br /&gt;
root@louvre:/etc/openvpn/easy-rsa# ./revoke-full USERNAME&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OpenVPN re-reads the CRL at each connection, so once the cert is revoked, there's nothing more to do. You can restart openvpn to make sure the client is disconnected.&lt;br /&gt;
&lt;br /&gt;
== /etc/hosts entries ==&lt;br /&gt;
&lt;br /&gt;
Once the Vpn is setup on your machine, you can access Software Heritage hosts via their private IP addresses; see [[Network configuration]].&lt;br /&gt;
&lt;br /&gt;
OpenVPN now pushes the address of our DNS server (192.168.100.29, pergamon).&lt;br /&gt;
&lt;br /&gt;
You might want to add louvre.softwareheritage.org in your /etc/hosts to avoid a bootstrap problem if the &amp;quot;on-vpn&amp;quot; DNS server is in your resolv.conf.&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastructure]]&lt;br /&gt;
[[Category:System administration]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=New_machine_setup&amp;diff=509</id>
		<title>New machine setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=New_machine_setup&amp;diff=509"/>
		<updated>2016-09-23T14:11:12Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: add new VM setup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Setting up a new Software Heritage desktop machine =&lt;br /&gt;
&lt;br /&gt;
== Debian install ==&lt;br /&gt;
&lt;br /&gt;
* Stable&lt;br /&gt;
* root w/temporary password; no regular user (after setting up root password, cancel twice and jump forward to clock settings)&lt;br /&gt;
* full disk with LVM; reduce home LV to leave half of the disk free&lt;br /&gt;
* Standard system utilities, ssh server, no desktop environment (puppet will install that)&lt;br /&gt;
&lt;br /&gt;
== Base system setup (from console) ==&lt;br /&gt;
&lt;br /&gt;
* Login as root&lt;br /&gt;
* Enable password root access in ssh (/etc/ssh/sshd_config, PermitRootLogin yes)&lt;br /&gt;
* Write down IP configuration and add the machine to the Gandi DNS&lt;br /&gt;
* Test SSH login as root from your workstation&lt;br /&gt;
* Stay at your desk :)&lt;br /&gt;
&lt;br /&gt;
== Full system setup (from your desk) ==&lt;br /&gt;
&lt;br /&gt;
* SSH login as root&lt;br /&gt;
* Edit sources.list to add testing&lt;br /&gt;
* apt-get update, dist-upgrade, autoremove --purge&lt;br /&gt;
** While you wait, create [[Vpn]] certificates for the new machine&lt;br /&gt;
** add the machine to the puppet configuration, in the swh_desktop role&lt;br /&gt;
* apt-get install puppet openvpn&lt;br /&gt;
* configure openvpn per [[Vpn]]&lt;br /&gt;
** add pergamon IP address to /etc/resolv.conf&lt;br /&gt;
** add louvre.softwareheritage.org to /etc/hosts&lt;br /&gt;
* configure puppet&lt;br /&gt;
** systemctl disable puppet&lt;br /&gt;
** server=pergamon.internal.softwareheritage.org in /etc/puppet/puppet.conf&lt;br /&gt;
** puppet agent --enable&lt;br /&gt;
** puppet agent -t&lt;br /&gt;
** run puppet on pergamon to update munin server config&lt;br /&gt;
* set proper root password, add it to password store&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Setting up a new Virtual Machine (manual process) =&lt;br /&gt;
&lt;br /&gt;
Naming scheme: machine_name.&amp;lt;zone&amp;gt;.&amp;lt;hoster&amp;gt;.internal.softwareheritage.org.&lt;br /&gt;
&lt;br /&gt;
* Provision the virtual machine from a Debian image&lt;br /&gt;
** Set the admin user to something temporary with an ssh key&lt;br /&gt;
** Avoid public IPs if you don't need them&lt;br /&gt;
** Add the machine to the internal dns (swh-site + puppet run on pergamon)&lt;br /&gt;
* Connect to the machine with the temp admin user&lt;br /&gt;
* apt-get update, dist-upgrade, autoremove --purge&lt;br /&gt;
* set a root password (xckdpass, add to password store)&lt;br /&gt;
* allow root ssh password login&lt;br /&gt;
* connect as root&lt;br /&gt;
* remove temporary user&lt;br /&gt;
** deluser foo&lt;br /&gt;
** rm -rf /home/foo&lt;br /&gt;
* set the hostname&lt;br /&gt;
** /etc/hostname: machine.zone.hoster (e.g. worker01.euwest.azure)&lt;br /&gt;
** /etc/hosts: add {{&amp;lt;ip&amp;gt; machine.zone.hoster.internal.softwareheritage.org machine.zone.hoster}}} line&lt;br /&gt;
* reboot to get new hostname&lt;br /&gt;
* install and setup puppet&lt;br /&gt;
** apt-get install puppet&lt;br /&gt;
** systemctl disable puppet&lt;br /&gt;
** server=pergamon.internal.softwareheritage.org in /etc/puppet/puppet.conf&lt;br /&gt;
** puppet agent --enable&lt;br /&gt;
** puppet agent -t&lt;br /&gt;
** run puppet on pergamon to update munin server config&lt;br /&gt;
* reboot to check new services&lt;br /&gt;
* update clustershell configuration on louvre&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastructure]]&lt;br /&gt;
[[Category:System administration]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Talks&amp;diff=499</id>
		<title>Talks</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Talks&amp;diff=499"/>
		<updated>2016-09-08T10:25:50Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: Add EMF slides&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this page we keep track of the past and upcoming talks about [[Software Heritage]], in various venues.&lt;br /&gt;
&lt;br /&gt;
Please keep the table ''sorted by reverse date'' (most recent talk first).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Venue&lt;br /&gt;
!Title&lt;br /&gt;
!Speaker&lt;br /&gt;
!Slides&lt;br /&gt;
!Video&lt;br /&gt;
|-&lt;br /&gt;
|21 Sep 2016&lt;br /&gt;
|[https://www.ow2con.org/bin/view/2016/ OW2con'16]&lt;br /&gt;
|[https://ow2con16.sched.org/event/80KP Beyond OW2: Software Heritage, Building the Universal Software Archive]&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|07 Sep 2016&lt;br /&gt;
|[https://www.meetup.com/git-Paris/events/233368705/?eventId=233368705 Meetup git Paris #3]&lt;br /&gt;
|Software Heritage: une archive mondiale du logiciel libre, inspirée de Git&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]],&amp;lt;br&amp;gt;[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-09-07-paris-olasd+zack-git-meetup.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|04 Sep 2016&lt;br /&gt;
|[https://fsfe.org/community/events/2016/summit/frontpage.en.html FSFE Summit 2016]&lt;br /&gt;
|[https://conf.qtcon.org/en/qtcon/public/events/466 Software Heritage - the Universal Archive of Free Software]&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-09-04-qtcon-fsfe-rdicosmo-software-heritage-building-the-universal-software-archive.pdf PDF]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|05 Aug 2016&lt;br /&gt;
|[https://www.emfcamp.org Electromagnetic Field 2016]&lt;br /&gt;
|&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]]&lt;br /&gt;
|[https://annex.softwareheritage.org/public/talks/2016/2016-08-07-emfcamp-olasd-lightning-talk/2016-08-05_emf.html HTML]&lt;br /&gt;
|''n/a''&lt;br /&gt;
|-&lt;br /&gt;
|04 Jul 2016&lt;br /&gt;
|[https://portail.umons.ac.be/FR/universite/admin/aff_etudiant/CultureEtSport/UMONS-culture/Documents_agendas_culture/2015/Research%20Seminar%20on%20Open%20Source%20Software_4-07-2016.pdf Open Source Seminar at UMONS]&lt;br /&gt;
|Software Heritage: Building the Universal Software Archive&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[http://www.dicosmo.org/share/mons-07-2016.pdf PDF]&lt;br /&gt;
|''n/a''&lt;br /&gt;
|-&lt;br /&gt;
|04 Jul 2016&lt;br /&gt;
|[https://debconf16.debconf.org DebConf16]&lt;br /&gt;
|[https://debconf16.debconf.org/talks/42/ Software Heritage: Building the Universal Software Archive]&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]]&lt;br /&gt;
|[https://annex.debconf.org/debconf-share/debconf16/slides/42-software-heritage-building-the-universal-software-archive.pdf PDF]&lt;br /&gt;
|[http://gensho.acc.umu.se/pub/debian-meetings/2016/debconf16/Software_Heritage_Building_the_Universal_Software_Archive.webm WebM]&lt;br /&gt;
|-&lt;br /&gt;
|21 Jun 2016&lt;br /&gt;
|[http://journees-scientifiques2016.inria.fr/francais-programme/ Journées Scientifiques Inria, Rennes]&lt;br /&gt;
|What would you do with ''billions'' of source code files? Challenges and opportunities in software archival&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[http://www.dicosmo.org/share/journeesscientifiques2016.pdf PDF]&lt;br /&gt;
|''n/a''&lt;br /&gt;
|-&lt;br /&gt;
|16 Dec 2015&lt;br /&gt;
|[http://codesource.hypotheses.org/ Seminar &amp;quot;Codes Sources&amp;quot;, UPMC]&lt;br /&gt;
|Large-scale source code archival, publishing, and indexing with Debsources [and Software Heritage]&lt;br /&gt;
|[[User:StefanoZacchiroli|Stefano Zacchiroli]]&lt;br /&gt;
|[https://upsilon.cc/~zack/talks/2015/20151216-semcodesource-debsources.pdf PDF]&lt;br /&gt;
|''n/a''&lt;br /&gt;
|-&lt;br /&gt;
|04 Dec 2015&lt;br /&gt;
|[http://cristal.univ-lille.fr/evolille2015/ EvoLille 2015]&lt;br /&gt;
|Ten years analysing large code bases: a perspective&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[http://www.dicosmo.org/share/2015-12-04-evolille.handout.pdf PDF]&lt;br /&gt;
|''n/a''&lt;br /&gt;
|-&lt;br /&gt;
|21 May 2015&lt;br /&gt;
|[http://www.scilabtec.com/ International Scilab Users Conference]&lt;br /&gt;
|[https://www.scilab.org/fr/community/scilabtec/2015/Keynote-Preserving-Software-challenges-and-opportunities-for-reproducibility-of-Science-and-Technology Preserving Software: Challenges and Opportunities for Reproducibility of Science and Technology]&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[http://www.dicosmo.org/share/scilabtec2015.pdf PDF]&lt;br /&gt;
|[https://vimeo.com/132074333 Vimeo]&lt;br /&gt;
|-&lt;br /&gt;
|09 Dec 2014&lt;br /&gt;
|Reproductibility Working Group, Inria&lt;br /&gt;
|Preserving Software: Challenges and opportunities for reproductibility&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[http://www.dicosmo.org/share/swh-reproductibility-12-2014.pdf PDF]&lt;br /&gt;
|''n/a''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Communication]]&lt;br /&gt;
[[Category:Talks]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Licensing&amp;diff=381</id>
		<title>Licensing</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Licensing&amp;diff=381"/>
		<updated>2016-07-26T12:42:57Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: /* Licenses of external dependencies */ add kafka-related stuff&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Software developed by [[Software Heritage]] is released under the following licenses:&lt;br /&gt;
&lt;br /&gt;
;default license&lt;br /&gt;
: [http://www.gnu.org/licenses/gpl-3.0.en.html GNU General Public License, version 3] or above ('''GPL3+''') is our default license&lt;br /&gt;
;web applications&lt;br /&gt;
: [http://www.gnu.org/licenses/agpl-3.0.en.html GNU Affero General Public License, version 3] or above ('''AGPL3+''') for Web applications and other software whose main purpose is offer a service via remote network interaction&lt;br /&gt;
;puppet&lt;br /&gt;
: [http://www.apache.org/licenses/LICENSE-2.0 Apache License, version 2] ('''Apache2''') for Puppet recipes&lt;br /&gt;
&lt;br /&gt;
See the license of specific software modules for details.&lt;br /&gt;
&lt;br /&gt;
Below we list our external software dependencies, their licenses, and give pointers to how and why they are compatible with the above license choices.&lt;br /&gt;
&lt;br /&gt;
An external dependency whose license is incompatible with the above license choices '''cannot be used''' in [[Software Heritage]], so please carefully review the relevant licenses before adopting a new external dependency.&lt;br /&gt;
&lt;br /&gt;
== Licenses of external dependencies ==&lt;br /&gt;
&lt;br /&gt;
Our external software dependencies are:&lt;br /&gt;
&lt;br /&gt;
* boto: [https://raw.githubusercontent.com/boto/boto/develop/LICENSE MIT]&lt;br /&gt;
* celery: [https://sources.debian.net/src/celery/latest/debian/copyright/ BSD2/PSF]&lt;br /&gt;
* confluent-kafka-python: [https://github.com/confluentinc/confluent-kafka-python/blob/master/LICENSE Apache2]&lt;br /&gt;
* crcmod: [http://crcmod.sourceforge.net/intro.html#license MIT]&lt;br /&gt;
* cryptojs: [https://code.google.com/archive/p/crypto-js/wikis/License.wiki BSD3]&lt;br /&gt;
* dulwich: [https://sources.debian.net/src/dulwich/latest/debian/copyright/ GPL2+] in progress of being relicensed to [https://github.com/jelmer/dulwich/issues/153 GPL2+/Apache2]&lt;br /&gt;
* flask: [https://sources.debian.net/src/flask/latest/debian/copyright/ BSD3]&lt;br /&gt;
* flask-api: [http://www.flaskapi.org/about/license BSD2]&lt;br /&gt;
* flask-testing: [https://github.com/jarus/flask-testing/blob/master/LICENSE BSD3]&lt;br /&gt;
* flot : [https://raw.githubusercontent.com/flot/flot/master/LICENSE.txt MIT]&lt;br /&gt;
* kafka: [https://git-wip-us.apache.org/repos/asf?p=kafka.git;a=blob;f=LICENSE;hb=HEAD Apache2]&lt;br /&gt;
* kafka-manager [https://github.com/yahoo/kafka-manager/blob/master/LICENCE Apache2]&lt;br /&gt;
* libgit2: [https://github.com/libgit2/libgit2/blob/master/COPYING GPL2 with linking exception]&lt;br /&gt;
* msgpack: [https://sources.debian.net/src/msgpack-python/latest/debian/copyright/ Apache2]&lt;br /&gt;
* psycopg2: [https://sources.debian.net/src/psycopg2/latest/debian/copyright/ LGPL3]&lt;br /&gt;
* pygit2: [https://sources.debian.net/src/python-pygit2/latest/debian/copyright/ GPL2 with linking exception]&lt;br /&gt;
* python (runtime): [https://sources.debian.net/src/python3.4/latest/debian/copyright/ PSF]&lt;br /&gt;
* python-arrow: [https://sources.debian.net/src/python-arrow/latest/debian/copyright/ Apache2 (doc themes GPL3+)]&lt;br /&gt;
* python-click [https://sources.debian.net/src/python-click/latest/debian/copyright/ BSD3]&lt;br /&gt;
* python-dateutil: [https://sources.debian.net/src/python-dateutil/latest/LICENSE/ BSD3]&lt;br /&gt;
* python-requests: [http://docs.python-requests.org/en/latest/user/intro/#apache2 Apache2]&lt;br /&gt;
* python-retrying: [https://sources.debian.net/src/python-retrying/latest/debian/copyright/ Apache2]&lt;br /&gt;
* qless-py: [https://github.com/seomoz/qless-py/blob/master/LICENSE MIT]&lt;br /&gt;
* redis-py: [https://github.com/andymccurdy/redis-py/blob/master/LICENSE MIT]&lt;br /&gt;
* subvertpy: [https://raw.githubusercontent.com/jelmer/subvertpy/python3-branch/COPYING LGPL2.1+]&lt;br /&gt;
* vcversioner: [https://sources.debian.net/src/vcversioner/latest/debian/copyright/ ISC]&lt;br /&gt;
&lt;br /&gt;
When adopting a new external dependency, please add it to the above list, in alphabetical order and with a pointer to evidence of its license.&lt;br /&gt;
&lt;br /&gt;
== License compatibility ==&lt;br /&gt;
&lt;br /&gt;
(non-GPL variants only)&lt;br /&gt;
&lt;br /&gt;
* Apache2: [http://www.gnu.org/licenses/license-list.en.html#apache2 GPL3-compatible]&lt;br /&gt;
* BSD2: [http://www.gnu.org/licenses/license-list.en.html#FreeBSD GPL-compatible]&lt;br /&gt;
* BSD3: [http://www.gnu.org/licenses/license-list.en.html#ModifiedBSD GPL-compatible]&lt;br /&gt;
* ISC: [http://www.gnu.org/licenses/license-list.en.html#ISC GPL-compatible]&lt;br /&gt;
* PSF: [https://www.gnu.org/licenses/license-list.html#Python GPL-compatible]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Software development]]&lt;br /&gt;
[[Category:Legal]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Talks&amp;diff=131</id>
		<title>Talks</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Talks&amp;diff=131"/>
		<updated>2016-07-05T21:40:09Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: Add video of DebConf talk&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this page we keep track of the past and upcoming talks about [[Software Heritage]], in various venues.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Venue&lt;br /&gt;
!Title&lt;br /&gt;
!Speaker&lt;br /&gt;
!Slides URL&lt;br /&gt;
!Video URL&lt;br /&gt;
|-&lt;br /&gt;
|4 July 2016&lt;br /&gt;
|[https://debconf16.debconf.org DebConf16]&lt;br /&gt;
|[https://debconf16.debconf.org/talks/42/ Software Heritage: Building the Universal Software Archive]&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]]&lt;br /&gt;
|[https://annex.debconf.org/debconf-share/debconf16/slides/42-software-heritage-building-the-universal-software-archive.pdf Slides PDF]&lt;br /&gt;
|[http://gensho.acc.umu.se/pub/debian-meetings/2016/debconf16/Software_Heritage_Building_the_Universal_Software_Archive.webm WebM video]&lt;br /&gt;
|-&lt;br /&gt;
|4 July 2016&lt;br /&gt;
|[https://portail.umons.ac.be/FR/universite/admin/aff_etudiant/CultureEtSport/UMONS-culture/Documents_agendas_culture/2015/Research%20Seminar%20on%20Open%20Source%20Software_4-07-2016.pdf Open Source Seminar at UMONS]&lt;br /&gt;
|Software Heritage: Building the Universal Software Archive&lt;br /&gt;
|[[User:RobertoDiCosmo|Roberto Di Cosmo]]&lt;br /&gt;
|[http://www.dicosmo.org/share/mons-07-2016.pdf Slides PDF]&lt;br /&gt;
|''n/a''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Communication]]&lt;br /&gt;
[[Category:Talks]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
	<entry>
		<id>https://wiki.softwareheritage.org/index.php?title=Talks&amp;diff=119</id>
		<title>Talks</title>
		<link rel="alternate" type="text/html" href="https://wiki.softwareheritage.org/index.php?title=Talks&amp;diff=119"/>
		<updated>2016-07-05T08:41:54Z</updated>

		<summary type="html">&lt;p&gt;NicolasDandrimont: Add slides url for DebConf talk&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this page we keep track of the past and upcoming talks about [[Software Heritage]], in various venues.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Venue&lt;br /&gt;
!Title&lt;br /&gt;
!Speaker&lt;br /&gt;
!Slides URL&lt;br /&gt;
!Video URL&lt;br /&gt;
|-&lt;br /&gt;
|4 July 2016&lt;br /&gt;
|[https://debconf16.debconf.org DebConf16]&lt;br /&gt;
|[https://debconf16.debconf.org/talks/42/ Software Heritage: Building the Universal Software Archive]&lt;br /&gt;
|[[User:NicolasDandrimont|Nicolas Dandrimont]]&lt;br /&gt;
|[https://annex.debconf.org/debconf-share/debconf16/slides/42-software-heritage-building-the-universal-software-archive.pdf Slides PDF]&lt;br /&gt;
|''upcoming''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Communication]]&lt;br /&gt;
[[Category:Talks]]&lt;/div&gt;</summary>
		<author><name>NicolasDandrimont</name></author>
	</entry>
</feed>