detached f9de495

feat(images): move the job image to Ubuntu 26.04 LTS

commit
f9de49595665597646c61ff4acd15fbf2a001d4d
author
brice · · 2026-10-18 20:41 UTC
parent
3ad0272
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
7 files · +18 -17
M README.md +1 -1
@@ -60,7 +60,7 @@ CGO_ENABLED=0 go build -trimpath -o ermite-runner .
6060 sudo install -m 0600 /dev/stdin /etc/ermite-runner/env <<'ENV'
6161 ERMITE_RUNNER_URL=https://ermite.example.com
6262 ERMITE_RUNNER_NAME=runner-1
63- ERMITE_RUNNER_LABELS=ubuntu-latest,ubuntu-24.04
63+ ERMITE_RUNNER_LABELS=ubuntu-latest,ubuntu-26.04
6464 ERMITE_RUNNER_LOG_FORMAT=json
6565 ENV
6666 ```
@@ -60,7 +60,7 @@ CGO_ENABLED=0 go build -trimpath -o ermite-runner .
60 sudo install -m 0600 /dev/stdin /etc/ermite-runner/env <<'ENV'60 sudo install -m 0600 /dev/stdin /etc/ermite-runner/env <<'ENV'
61 ERMITE_RUNNER_URL=https://ermite.example.com61 ERMITE_RUNNER_URL=https://ermite.example.com
62 ERMITE_RUNNER_NAME=runner-162 ERMITE_RUNNER_NAME=runner-1
63- ERMITE_RUNNER_LABELS=ubuntu-latest,ubuntu-24.0463+ ERMITE_RUNNER_LABELS=ubuntu-latest,ubuntu-26.04
64 ERMITE_RUNNER_LOG_FORMAT=json64 ERMITE_RUNNER_LOG_FORMAT=json
65 ENV65 ENV
66 ```66 ```
M docs/development.md +3 -3
@@ -43,7 +43,7 @@ sudo env GOWORK=off ERMITE_RUNNER_IT_VM=1 ERMITE_RUNNER_ISOLATION=vm \
4343 ### Container
4444
4545 ```sh
46-sudo env GOWORK=off ERMITE_RUNNER_IT_CONTAINER=1 ERMITE_RUNNER_IMAGE=ermite-runner-ubuntu-24.04:latest \
46+sudo env GOWORK=off ERMITE_RUNNER_IT_CONTAINER=1 ERMITE_RUNNER_IMAGE=ermite-runner-ubuntu-26.04:latest \
4747 DOCKER_HOST=unix:///var/run/docker.sock "$(command -v go)" test -count=1 -v ./internal/sandbox/integration -run Container
4848 ```
4949
@@ -52,8 +52,8 @@ sudo env GOWORK=off ERMITE_RUNNER_IT_CONTAINER=1 ERMITE_RUNNER_IMAGE=ermite-runn
5252 The real executor runs in the real image, started by the container driver. It also works with a rootless Docker daemon, where `mount` and `umount` are replaced by stand-ins.
5353
5454 ```sh
55-IMAGE_TAG=ermite-runner-ubuntu-24.04:dev scripts/build-image.sh tmp/image
56-ERMITE_RUNNER_IT_E2E=1 ERMITE_RUNNER_TEST_IMAGE=ermite-runner-ubuntu-24.04:dev GOWORK=off go test -race -count=1 ./internal/e2e
55+IMAGE_TAG=ermite-runner-ubuntu-26.04:dev scripts/build-image.sh tmp/image
56+ERMITE_RUNNER_IT_E2E=1 ERMITE_RUNNER_TEST_IMAGE=ermite-runner-ubuntu-26.04:dev GOWORK=off go test -race -count=1 ./internal/e2e
5757 ```
5858
5959 - `TestChainCorpus` runs jobs of the ermite-conformance corpus through a fake server and compares the result with recordings made on github.com. It reads `ERMITE_CONFORMANCE_DIR` (default: a sibling checkout of ermite-conformance) and never writes to it.
@@ -43,7 +43,7 @@ sudo env GOWORK=off ERMITE_RUNNER_IT_VM=1 ERMITE_RUNNER_ISOLATION=vm \
43 ### Container43 ### Container
44 44
45 ```sh45 ```sh
46-sudo env GOWORK=off ERMITE_RUNNER_IT_CONTAINER=1 ERMITE_RUNNER_IMAGE=ermite-runner-ubuntu-24.04:latest \46+sudo env GOWORK=off ERMITE_RUNNER_IT_CONTAINER=1 ERMITE_RUNNER_IMAGE=ermite-runner-ubuntu-26.04:latest \
47 DOCKER_HOST=unix:///var/run/docker.sock "$(command -v go)" test -count=1 -v ./internal/sandbox/integration -run Container47 DOCKER_HOST=unix:///var/run/docker.sock "$(command -v go)" test -count=1 -v ./internal/sandbox/integration -run Container
48 ```48 ```
49 49
@@ -52,8 +52,8 @@ sudo env GOWORK=off ERMITE_RUNNER_IT_CONTAINER=1 ERMITE_RUNNER_IMAGE=ermite-runn
52 The real executor runs in the real image, started by the container driver. It also works with a rootless Docker daemon, where `mount` and `umount` are replaced by stand-ins.52 The real executor runs in the real image, started by the container driver. It also works with a rootless Docker daemon, where `mount` and `umount` are replaced by stand-ins.
53 53
54 ```sh54 ```sh
55-IMAGE_TAG=ermite-runner-ubuntu-24.04:dev scripts/build-image.sh tmp/image55+IMAGE_TAG=ermite-runner-ubuntu-26.04:dev scripts/build-image.sh tmp/image
56-ERMITE_RUNNER_IT_E2E=1 ERMITE_RUNNER_TEST_IMAGE=ermite-runner-ubuntu-24.04:dev GOWORK=off go test -race -count=1 ./internal/e2e56+ERMITE_RUNNER_IT_E2E=1 ERMITE_RUNNER_TEST_IMAGE=ermite-runner-ubuntu-26.04:dev GOWORK=off go test -race -count=1 ./internal/e2e
57 ```57 ```
58 58
59 - `TestChainCorpus` runs jobs of the ermite-conformance corpus through a fake server and compares the result with recordings made on github.com. It reads `ERMITE_CONFORMANCE_DIR` (default: a sibling checkout of ermite-conformance) and never writes to it.59 - `TestChainCorpus` runs jobs of the ermite-conformance corpus through a fake server and compares the result with recordings made on github.com. It reads `ERMITE_CONFORMANCE_DIR` (default: a sibling checkout of ermite-conformance) and never writes to it.
M docs/images.md +3 -3
@@ -4,10 +4,10 @@ A job runs in the image named by `ERMITE_RUNNER_IMAGE`.
44
55 | Mode | Value | Contents |
66 | --- | --- | --- |
7-| `container` | OCI reference | Default `ermite-runner-ubuntu-24.04:latest` |
7+| `container` | OCI reference | Default `ermite-runner-ubuntu-26.04:latest` |
88 | `vm` | Directory | `vmlinux` (`Image` on arm64) and `base.ext4`. Default `<state dir>/image` |
99
10-Both come from `images/ubuntu-24.04/Dockerfile`. The runner executable and Node.js are attached by the host. They are never part of the image.
10+Both come from `images/ubuntu-26.04/Dockerfile` (Ubuntu 26.04 LTS). The runner executable and Node.js are attached by the host. They are never part of the image.
1111
1212 ## Build
1313
@@ -18,7 +18,7 @@ scripts/build-image.sh tmp/image # builds the OCI image and tmp/image/base.ex
1818
1919 - `build-kernel.sh` downloads Linux 6.18 LTS from kernel.org and checks the tarball against the published sha256 sums. It needs `bc`, `flex`, `bison`, `pahole`, libelf and openssl headers.
2020 - `build-image.sh` needs Docker or Podman (rootless is fine) and e2fsprogs 1.47.1 or newer. No root is needed.
21-- The OCI image is tagged `ermite-runner-ubuntu-24.04:latest`. Set `IMAGE_TAG` to change it.
21+- The OCI image is tagged `ermite-runner-ubuntu-26.04:latest`. Set `IMAGE_TAG` to change it.
2222 - The kernel config is `images/kernel/config-6.18` plus per-architecture fragments. The build fails if a listed option does not survive `olddefconfig`.
2323 - arm64 builds with `ARCH_NAME=arm64`.
2424 - `CONFIG_BINFMT_MISC` is built in and mounted by the guest init, so `docker/setup-qemu-action` can run foreign-architecture containers.
@@ -4,10 +4,10 @@ A job runs in the image named by `ERMITE_RUNNER_IMAGE`.
4 4
5 | Mode | Value | Contents |5 | Mode | Value | Contents |
6 | --- | --- | --- |6 | --- | --- | --- |
7-| `container` | OCI reference | Default `ermite-runner-ubuntu-24.04:latest` |7+| `container` | OCI reference | Default `ermite-runner-ubuntu-26.04:latest` |
8 | `vm` | Directory | `vmlinux` (`Image` on arm64) and `base.ext4`. Default `<state dir>/image` |8 | `vm` | Directory | `vmlinux` (`Image` on arm64) and `base.ext4`. Default `<state dir>/image` |
9 9
10-Both come from `images/ubuntu-24.04/Dockerfile`. The runner executable and Node.js are attached by the host. They are never part of the image.10+Both come from `images/ubuntu-26.04/Dockerfile` (Ubuntu 26.04 LTS). The runner executable and Node.js are attached by the host. They are never part of the image.
11 11
12 ## Build12 ## Build
13 13
@@ -18,7 +18,7 @@ scripts/build-image.sh tmp/image # builds the OCI image and tmp/image/base.ex
18 18
19 - `build-kernel.sh` downloads Linux 6.18 LTS from kernel.org and checks the tarball against the published sha256 sums. It needs `bc`, `flex`, `bison`, `pahole`, libelf and openssl headers.19 - `build-kernel.sh` downloads Linux 6.18 LTS from kernel.org and checks the tarball against the published sha256 sums. It needs `bc`, `flex`, `bison`, `pahole`, libelf and openssl headers.
20 - `build-image.sh` needs Docker or Podman (rootless is fine) and e2fsprogs 1.47.1 or newer. No root is needed.20 - `build-image.sh` needs Docker or Podman (rootless is fine) and e2fsprogs 1.47.1 or newer. No root is needed.
21-- The OCI image is tagged `ermite-runner-ubuntu-24.04:latest`. Set `IMAGE_TAG` to change it.21+- The OCI image is tagged `ermite-runner-ubuntu-26.04:latest`. Set `IMAGE_TAG` to change it.
22 - The kernel config is `images/kernel/config-6.18` plus per-architecture fragments. The build fails if a listed option does not survive `olddefconfig`.22 - The kernel config is `images/kernel/config-6.18` plus per-architecture fragments. The build fails if a listed option does not survive `olddefconfig`.
23 - arm64 builds with `ARCH_NAME=arm64`.23 - arm64 builds with `ARCH_NAME=arm64`.
24 - `CONFIG_BINFMT_MISC` is built in and mounted by the guest init, so `docker/setup-qemu-action` can run foreign-architecture containers.24 - `CONFIG_BINFMT_MISC` is built in and mounted by the guest init, so `docker/setup-qemu-action` can run foreign-architecture containers.
R images/ubuntu-24.04/Dockerfile → images/ubuntu-26.04/Dockerfile +5 -4 renamed, 96% similar
@@ -1,11 +1,11 @@
11 # SPDX-License-Identifier: MIT
22 #
3-# ermite-runner-ubuntu-24.04: the minimal CI-1 runner image. The same
3+# ermite-runner-ubuntu-26.04: the minimal CI-1 runner image. The same
44 # filesystem is used as an OCI image (container isolation) and exported to an
55 # ext4 base image (vm isolation) by scripts/build-image.sh. It holds the OS
66 # only: the runner executable is attached by the host at start (never baked
77 # in), so a runner upgrade does not need an image rebuild.
8-FROM ubuntu:24.04
8+FROM ubuntu:26.04
99
1010 ARG DEBIAN_FRONTEND=noninteractive
1111
@@ -16,7 +16,8 @@ RUN apt-get update \
1616 && rm -rf /var/lib/apt/lists/*
1717
1818 # The command-line tools of GitHub's ubuntu-24.04 image that workflows call
19-# directly (runner-images, images/ubuntu/toolsets/toolset-2404.json:
19+# directly (runner-images, images/ubuntu/toolsets/toolset-2404.json, the
20+# latest published toolset:
2021 # apt.vital_packages and apt.cmd_packages), minus the daemons and services
2122 # (haveged, pollinate, sphinxsearch, systemd-coredump). parallel pulls in
2223 # sysstat, whose collection units are masked: a job image runs no services.
@@ -33,7 +34,7 @@ RUN apt-get update \
3334 RUN install -m 0755 -d /etc/apt/keyrings \
3435 && curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc \
3536 && chmod a+r /etc/apt/keyrings/docker.asc \
36- && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu noble stable" \
37+ && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu resolute stable" \
3738 > /etc/apt/sources.list.d/docker.list \
3839 && apt-get update \
3940 && apt-get install -y --no-install-recommends \
@@ -1,11 +1,11 @@
1 # SPDX-License-Identifier: MIT1 # SPDX-License-Identifier: MIT
2 #2 #
3-# ermite-runner-ubuntu-24.04: the minimal CI-1 runner image. The same3+# ermite-runner-ubuntu-26.04: the minimal CI-1 runner image. The same
4 # filesystem is used as an OCI image (container isolation) and exported to an4 # filesystem is used as an OCI image (container isolation) and exported to an
5 # ext4 base image (vm isolation) by scripts/build-image.sh. It holds the OS5 # ext4 base image (vm isolation) by scripts/build-image.sh. It holds the OS
6 # only: the runner executable is attached by the host at start (never baked6 # only: the runner executable is attached by the host at start (never baked
7 # in), so a runner upgrade does not need an image rebuild.7 # in), so a runner upgrade does not need an image rebuild.
8-FROM ubuntu:24.048+FROM ubuntu:26.04
9 9
10 ARG DEBIAN_FRONTEND=noninteractive10 ARG DEBIAN_FRONTEND=noninteractive
11 11
@@ -16,7 +16,8 @@ RUN apt-get update \
16 && rm -rf /var/lib/apt/lists/*16 && rm -rf /var/lib/apt/lists/*
17 17
18 # The command-line tools of GitHub's ubuntu-24.04 image that workflows call18 # The command-line tools of GitHub's ubuntu-24.04 image that workflows call
19-# directly (runner-images, images/ubuntu/toolsets/toolset-2404.json:19+# directly (runner-images, images/ubuntu/toolsets/toolset-2404.json, the
20+# latest published toolset:
20 # apt.vital_packages and apt.cmd_packages), minus the daemons and services21 # apt.vital_packages and apt.cmd_packages), minus the daemons and services
21 # (haveged, pollinate, sphinxsearch, systemd-coredump). parallel pulls in22 # (haveged, pollinate, sphinxsearch, systemd-coredump). parallel pulls in
22 # sysstat, whose collection units are masked: a job image runs no services.23 # sysstat, whose collection units are masked: a job image runs no services.
@@ -33,7 +34,7 @@ RUN apt-get update \
33 RUN install -m 0755 -d /etc/apt/keyrings \34 RUN install -m 0755 -d /etc/apt/keyrings \
34 && curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc \35 && curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc \
35 && chmod a+r /etc/apt/keyrings/docker.asc \36 && chmod a+r /etc/apt/keyrings/docker.asc \
36- && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu noble stable" \37+ && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu resolute stable" \
37 > /etc/apt/sources.list.d/docker.list \38 > /etc/apt/sources.list.d/docker.list \
38 && apt-get update \39 && apt-get update \
39 && apt-get install -y --no-install-recommends \40 && apt-get install -y --no-install-recommends \
M internal/e2e/e2e_test.go +1 -1
@@ -3,7 +3,7 @@
33 // Package e2e runs jobs through the real executor in a real sandbox. The tests
44 // are opt-in because they need Docker (and, for the VM, KVM and Firecracker):
55 //
6-// ERMITE_RUNNER_IT_E2E=1 ERMITE_RUNNER_TEST_IMAGE=ermite-runner-ubuntu-24.04:dev go test ./internal/e2e
6+// ERMITE_RUNNER_IT_E2E=1 ERMITE_RUNNER_TEST_IMAGE=ermite-runner-ubuntu-26.04:dev go test ./internal/e2e
77 //
88 // On a workstation with a rootless Docker daemon the container driver is used
99 // with UnsafeAllowRootlessForTests (a test-only option): the jobs run as in production except
@@ -3,7 +3,7 @@
3 // Package e2e runs jobs through the real executor in a real sandbox. The tests3 // Package e2e runs jobs through the real executor in a real sandbox. The tests
4 // are opt-in because they need Docker (and, for the VM, KVM and Firecracker):4 // are opt-in because they need Docker (and, for the VM, KVM and Firecracker):
5 //5 //
6-// ERMITE_RUNNER_IT_E2E=1 ERMITE_RUNNER_TEST_IMAGE=ermite-runner-ubuntu-24.04:dev go test ./internal/e2e6+// ERMITE_RUNNER_IT_E2E=1 ERMITE_RUNNER_TEST_IMAGE=ermite-runner-ubuntu-26.04:dev go test ./internal/e2e
7 //7 //
8 // On a workstation with a rootless Docker daemon the container driver is used8 // On a workstation with a rootless Docker daemon the container driver is used
9 // with UnsafeAllowRootlessForTests (a test-only option): the jobs run as in production except9 // with UnsafeAllowRootlessForTests (a test-only option): the jobs run as in production except
M internal/sandbox/config.go +1 -1
@@ -46,7 +46,7 @@ const (
4646 // Defaults.
4747 const (
4848 DefaultStateDir = "/var/lib/ermite-runner"
49- DefaultOCIImage = "ermite-runner-ubuntu-24.04:latest"
49+ DefaultOCIImage = "ermite-runner-ubuntu-26.04:latest"
5050 DefaultUIDBase = 900000
5151 DefaultNetwork = "10.200.0.0/16"
5252 DefaultCPUs = 2
@@ -46,7 +46,7 @@ const (
46 // Defaults.46 // Defaults.
47 const (47 const (
48 DefaultStateDir = "/var/lib/ermite-runner"48 DefaultStateDir = "/var/lib/ermite-runner"
49- DefaultOCIImage = "ermite-runner-ubuntu-24.04:latest"49+ DefaultOCIImage = "ermite-runner-ubuntu-26.04:latest"
50 DefaultUIDBase = 90000050 DefaultUIDBase = 900000
51 DefaultNetwork = "10.200.0.0/16"51 DefaultNetwork = "10.200.0.0/16"
52 DefaultCPUs = 252 DefaultCPUs = 2
M scripts/build-image.sh +4 -4
@@ -1,7 +1,7 @@
11 #!/usr/bin/env bash
22 # SPDX-License-Identifier: MIT
33 #
4-# Build the ermite-runner-ubuntu-24.04 image as an OCI image (container
4+# Build the ermite-runner-ubuntu-26.04 image as an OCI image (container
55 # isolation) and as a sparse ext4 base image (vm isolation). No root needed:
66 # the OCI build uses docker or podman (rootless is fine), the ext4 image is
77 # written by `mkfs.ext4 -d` from the exported rootfs tarball.
@@ -10,7 +10,7 @@
1010 #
1111 # Environment:
1212 # ENGINE docker or podman (default: first found)
13-# IMAGE_TAG OCI tag (default ermite-runner-ubuntu-24.04:latest, the
13+# IMAGE_TAG OCI tag (default ermite-runner-ubuntu-26.04:latest, the
1414 # default of ERMITE_RUNNER_IMAGE in container mode)
1515 # EXT4_SLACK free space added to the base image in MiB (default 512)
1616 #
@@ -20,7 +20,7 @@ set -euo pipefail
2020
2121 root=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
2222 out=${1:-$root/tmp/image}
23-tag=${IMAGE_TAG:-ermite-runner-ubuntu-24.04:latest}
23+tag=${IMAGE_TAG:-ermite-runner-ubuntu-26.04:latest}
2424 slack=${EXT4_SLACK:-512}
2525 engine=${ENGINE:-}
2626
@@ -43,7 +43,7 @@ fi
4343
4444 mkdir -p "$out"
4545 out=$(cd "$out" && pwd)
46-"$engine" build -t "$tag" "$root/images/ubuntu-24.04"
46+"$engine" build -t "$tag" "$root/images/ubuntu-26.04"
4747
4848 cid=$("$engine" create "$tag")
4949 tmp=$(mktemp -d)
@@ -1,7 +1,7 @@
1 #!/usr/bin/env bash1 #!/usr/bin/env bash
2 # SPDX-License-Identifier: MIT2 # SPDX-License-Identifier: MIT
3 #3 #
4-# Build the ermite-runner-ubuntu-24.04 image as an OCI image (container4+# Build the ermite-runner-ubuntu-26.04 image as an OCI image (container
5 # isolation) and as a sparse ext4 base image (vm isolation). No root needed:5 # isolation) and as a sparse ext4 base image (vm isolation). No root needed:
6 # the OCI build uses docker or podman (rootless is fine), the ext4 image is6 # the OCI build uses docker or podman (rootless is fine), the ext4 image is
7 # written by `mkfs.ext4 -d` from the exported rootfs tarball.7 # written by `mkfs.ext4 -d` from the exported rootfs tarball.
@@ -10,7 +10,7 @@
10 #10 #
11 # Environment:11 # Environment:
12 # ENGINE docker or podman (default: first found)12 # ENGINE docker or podman (default: first found)
13-# IMAGE_TAG OCI tag (default ermite-runner-ubuntu-24.04:latest, the13+# IMAGE_TAG OCI tag (default ermite-runner-ubuntu-26.04:latest, the
14 # default of ERMITE_RUNNER_IMAGE in container mode)14 # default of ERMITE_RUNNER_IMAGE in container mode)
15 # EXT4_SLACK free space added to the base image in MiB (default 512)15 # EXT4_SLACK free space added to the base image in MiB (default 512)
16 #16 #
@@ -20,7 +20,7 @@ set -euo pipefail
20 20
21 root=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)21 root=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
22 out=${1:-$root/tmp/image}22 out=${1:-$root/tmp/image}
23-tag=${IMAGE_TAG:-ermite-runner-ubuntu-24.04:latest}23+tag=${IMAGE_TAG:-ermite-runner-ubuntu-26.04:latest}
24 slack=${EXT4_SLACK:-512}24 slack=${EXT4_SLACK:-512}
25 engine=${ENGINE:-}25 engine=${ENGINE:-}
26 26
@@ -43,7 +43,7 @@ fi
43 43
44 mkdir -p "$out"44 mkdir -p "$out"
45 out=$(cd "$out" && pwd)45 out=$(cd "$out" && pwd)
46-"$engine" build -t "$tag" "$root/images/ubuntu-24.04"46+"$engine" build -t "$tag" "$root/images/ubuntu-26.04"
47 47
48 cid=$("$engine" create "$tag")48 cid=$("$engine" create "$tag")
49 tmp=$(mktemp -d)49 tmp=$(mktemp -d)

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 4

Tags 11

↑↓ moveenter openesc close