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

3 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
## Important: migrating from Heptapod 0.8

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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
## 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

Example:

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

All other standard GitLab components (Workhorse, etc) have to be taken
from the canonical upstream locations, at the version specified at the root
of the Rails application sources (`GITLAB_WORKHORSE_VERSION` etc).

### 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.

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

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

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

90 91
Then, we need a special unreleased version of `hg-git`.
Rather to use `pip install hg+https`, which is quite error
92 93 94
prone, the simplest best way looks like this:

```
95 96
hg clone -u $TAG https://mirror.octobus.net/heptapod/hg-git-heptapod hg-git
$PIP install -e hg-git
97 98 99 100
```

Notes:

101
- this repository is small enough that pulling exactly the wanted
102 103 104 105 106
  revision is a needless complication.
- the `-e` flag will make your subsequent updates easier: you'll just have
  to `hg pull -u NEW_TAG`, redo the `pip install -e` to account for package
  metadata changes (notably entry points if any) and restart relevant processes.

107 108 109 110


### Configuration

111 112 113 114 115 116 117 118 119
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

120 121 122
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
123 124
(using the `heptapod` extension, permission policy, etc.)

125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
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.
140 141

A simple way is to create a `heptapod.hgrc` file using the `%include` directive.
142
See the example in `$PY_HEPTAPOD/heptapod.example.hgrc`.
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161

### 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
```

162 163
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`.
164 165 166

Notes:

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

171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
#### 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.


196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
### 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`)