INSTALL_HEPTAPOD.md 7.78 KB
Newer Older
1 2
# Heptapod installation guide

3
## Important: migrating from Heptapod 0.8 to 0.12
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

Because Heptapod 0.12 is a jump from GitLab CE 10.5 to 12.2, it is not
possible to upgrade directly, because major GitLab version bump must be done
[one at a time](https://docs.gitlab.com/ce/policy/maintenance.html#upgrade-recommendations).

Instead, the recommended way is to go through a series of Heptapod intermediate
versions that are meant to support the migration only:

- Heptapod 0.9 (GitLab CE 10.8)
- Heptapod 0.10 (GitLab CE 11.0)
- Heptapod 0.11 (Gitlab CE 11.8)

At each step, start the Rails application and wait for the background
migrations to be finished. See GitLab [documentation](https://docs.gitlab.com/ce/update/#checking-for-background-migrations-before-upgrading) for how to check
that.

For source installs, one only needs to update the Rails application for these
intermediate versions, and it's best not even to start the services that handle
connections from clients (Workhorse, SSH).

For Docker installs, we will provide a series of images tailored for the
migration needs.

**WARNING do not use Heptapod 0.9 to 0.11 for anything but data migration.**


30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
## Installing from source

Heptapod installation is similar to GitLab's except that

- some components have to be taken from our Mercurial repositories
- we have an additional component for Mercurial.
- some specific configuration has to be set in place.
- we have more constraints, many of which will be hopefully lifted in
  forthcoming versions

### Limitations

the Rails application, GitLab Shell, Mercurial and the repositories must
be in a single system.

### Fetching the standard GitLab components

We try and maintain a consistent tagging policy across the various Mercurial
repositories. For example, in version 0.8.0rc1, all of them have a
`heptapod-0.8.0rc1` tag.

Please use the mirror URL for initial and repetitive clonings.

- Rails application (replacement for `gitlab`): https://mirror.octobus.net/heptapod/heptapod
- Heptapod Shell (replacement for GitLab Shell): https://mirror.octobus.net/heptapod/heptapod-shell
55
- Optional in Heptapod < 0.13, Heptapod Workhorse (replacement for GitLab Workhorse): https://mirror.octobus.net/heptapod/heptapod-workhorse
56 57 58 59 60 61 62 63 64

Example:

```
  hg clone https://mirror.octobus.net/heptapod/heptapod
  cd heptapod
  hg update heptapod-0.8.0rc1
```

65
All other standard GitLab components (Gitaly, etc) have to be taken
66
from the canonical upstream locations, at the version specified at the root
67
of the Rails application sources (`GITALY_SERVER_VERSION` etc).
68 69 70 71 72 73 74 75 76 77 78 79 80

### Installing the Mercurial component

We need a specific Mercurial version, a WSGI server (usually Gunicorn), and
some additional Python packages from source.

For now, this is Python2 only.

You can install them system-wide if that suits you (Mercurial has very few
dependencies, it's very unlikely it'll clash with system libraries) or with
`pip install --user` or in a virtualenv. What matters for proper operation is
that they are all importable from the final Mercurial executable.

81 82 83 84
Install the Python packages to be taken from pypi.org using the
[requirements file](python/requirements.txt):

```
85
$PIP install -U -r python/requirements.txt
86
```
87

88 89
where `$PIP` is `pip --user` or `some/virtualenv/bin/pip` according to your
choice.
90 91 92

### Configuration

93 94 95 96 97 98 99 100 101
You need to

1. define Mercurial settings, including some necessary paths
2. create an internal service for Mercurial
3. configure GitLab components to use the proper Mercurial with those settings
4. take care of few special cases, depending on the Heptapod version

#### Defining Mercurial settings

102 103 104
The `heptapod` Python project, listed in `requirements.txt`,
ships with a configuration file, `required.hgrc`, that performs most
of the required and default Mercurial settings for Heptapod
105 106
(using the `heptapod` extension, permission policy, etc.)

107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
You'll find it where your `$PIP` has installed `heptapod`, which you can
find out like this:

```
export PY_HEPTAPOD=`$PYTHON -c "import heptapod, os; print(os.path.dirname(heptapod.__file__))"`
```

where `$PYTHON` is the python interpreter that's consistent with `$PIP`. So,
for instance if you're using a virtualenv, and `$PIP` is
`/path/to/virtualenv/bin/pip`, then `$PYTHON` is
`/path/to/virtualenv/bin/python`. If you're using
the global pip, then `$PYTHON` is most likely just `python` or `python2`.

You'll need to use `$PY_HEPTAPOD/required.hgrc` and add your local
installation details.
122 123

A simple way is to create a `heptapod.hgrc` file using the `%include` directive.
124
See the example in `$PY_HEPTAPOD/heptapod.example.hgrc`.
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143

### Internal Mercurial service

Repository content is exposed to GitLab through an internal HTTP service.

Warning: do NOT have it listen to any other interface than the loopback:
its security model is to trust the Rails application blindly.

It also needs to load your hgrc file(s). Here's an example, assuming `gunicorn`
is on the path.

```
  HEPTAPOD_HGRC=/path/to/your/heptapod.hgrc gunicorn -w 5 \
      -b 127.0.0.1:8000 \
      --error-logfile /tmp/gunicorn.log \
      --capture-output \
      heptapod.wsgi:hgserve
```

144 145
Again, this `gunicorn` must be able to load the Heptapod Python packages, so
you should use the one that's been installed with `requirements.txt`.
146 147 148

Notes:

149
- Heptapod is not able yet to use Unix domain sockets in this service
150 151 152
- If you want to use another loopback URL, configure the Rails app
  accordingly, in `config/gitlab.yml`.

153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
#### Using Mercurial in GitLab

Edit the configuration files for the Rails application
(see `config/gitlab.yml.example`) and GitLab Shell (see `config.yml.example`),
to provide the full path to your `heptapod.hgrc` file, and the `hg` executable
in the `mercurial` section.

Note: in those YaML files, `hgrc` must always be a list. This is for separation
in several files with different persistence properties.

#### Special cases

##### Heptapod 0.12: secondary GitLab shell

You need to copy over `config.yml` and `.gitlab_shell_secret`
from GitLab shell to the appropriate `gitlab-shell` subdirectory of the Gitaly
installation. The exact path may depend on your installation. Worst case is
you'll be told about it in Mercurial logs if pushes don't work.

Reason: we're using the Ruby GitLab Shell code shipping with Gitaly
to tell GitLab about
changes in repositories. This is prone to disappear in favour of a more direct
approach in forthcoming Heptapod versions.


178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
### Using Heptapod Workhorse

Heptapod Workhorse is a technology preview in Heptapod 0.12.1 and following,
expected to become the standard in Heptapod 0.13.

Its benefits should be:

- better concurrency support by reducing involvement of the Rails application
  in interaction with Mercurial HTTP clients to the minimum, i.e.,
  permissions assessment.
- better RAM usage, with Mercurial bundles being streamed from the `hgserve`
  service to the HTTP client instead of being loaded in RAM
- no need to up the timeout of the Rails application for longer Mercurial
  operation over HTTP.

To use Heptapod Workhorse:

- fetch it like any other Heptapod component (see "Fetching source" above)
- compile it in the same way as GitLab Workhorse
- set `mercurial:workhorse_enabled` to `true` in `config/gitlab.yml`.

If you're using Heptapod Workhorse, please help us making it the standard by
providing your feedback, thanks!

202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
### Validation with the functional tests

- start from an empty set of data (do not even set the instance root password)
- install tox (Python3)
- grab the functional tests:
  `hg clone https://dev.heptapod.net/heptapod/heptapod-tests`
- run the tests as the same user as the GitLab components, with something
  like:

  ```
  tox -- --heptapod-ssh-port 2222 \
           --heptapod-url http://localhost:3000 \
           --heptapod-source-install \
           --heptapod-repositories-root ~/heptapod/gdk/gl10-5/repositories
  ```

  (for a quicker first test, you can add `-k push_basic`)