Skip to content

Commit 558cc93

Browse files
committed
📝 Add GitLab CI/CD examples
* GitLab Pages * npm deployment with rsync * Multi-Arch-Images with Buildah
1 parent c223126 commit 558cc93

File tree

15 files changed

+322
-124
lines changed

15 files changed

+322
-124
lines changed

docs/productive/envs/uv/cicd.rst

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ CI/CD-Pipelines
66
GitLab CI/CD
77
------------
88

9-
Für :doc:`GitLab CI/CD-Pipelines </productive/git/advanced/gitlab/ci-cd>` gibt
10-
es verschiedene Docker-Images mit vorinstalliertem ``uv``: `Available images
9+
Für :doc:`GitLab CI/CD-Pipelines </productive/git/advanced/gitlab/ci-cd/index>`
10+
gibt es verschiedene Docker-Images mit vorinstalliertem ``uv``: `Available
11+
images
1112
<https://docs.astral.sh/uv/guides/integration/docker/#available-images>`_.
1213

1314
.. code-block:: yaml

docs/productive/git/advanced/gitlab/buildah.rst

Lines changed: 0 additions & 85 deletions
This file was deleted.
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
.. SPDX-FileCopyrightText: 2022–2025 Veit Schiele
2+
..
3+
.. SPDX-License-Identifier: BSD-3-Clause
4+
5+
Multi-Arch-Images mit Buildah
6+
=============================
7+
8+
`Buildah <https://buildah.io>`_ erlaubt euch, Container-Images zu erstellen ohne
9+
dass ihr eine vollständige Container-Runtime benötigt. Buildah ist ein
10+
Open-Source-Tool auf Linux-Basis, das `Docker <https://www.docker.com>`_- und
11+
`Kubernetes <https://kubernetes.io>`_-kompatible Images erstellen kann. Zudem kann Buildah nicht nur funktionierende Container von Grund auf neu erstellen,
12+
sondern auch aus einer bereits vorhandenen Dockerdatei. Schließlich lässt es
13+
sich leicht in Skripte und Build-Pipelines einbinden.
14+
15+
Erste Schritte
16+
--------------
17+
18+
#. Umgebungsvariablen einrichten
19+
20+
``DEPLOY_USER``
21+
Name des Accounts.
22+
``DEPLOY_KEY_FILE``
23+
Pfad zu einem privaten SSH-Schlüssel, der zur Authentifizierung gegenüber
24+
dem Server verwendet werden soll.
25+
``DEPLOY_HOST``
26+
Hostname oder IP-Adresse des Servers, auf den verteilt werden soll.
27+
28+
#. Einrichten der CI/CD-Pipeline
29+
30+
.. code-block:: yaml
31+
:caption: .gitlab-ci.yml
32+
:linenos:
33+
34+
stages:
35+
- build
36+
- deploy
37+
38+
build_docker:
39+
stage: build
40+
variables:
41+
DOCKER_STEM: $CI_REGISTRY_IMAGE
42+
image: quay.io/buildah/stable:v1.27
43+
script:
44+
- apk add --no-cache openssh
45+
- chmod 0600 "$DEPLOY_KEY_FILE"
46+
- ./build.sh
47+
48+
deploy_app:
49+
stage: deploy
50+
image: alpine
51+
environment:
52+
name: app
53+
deployment_tier: staging
54+
when: manual
55+
script:
56+
- apk add --no-cache openssh
57+
- chmod 0600 "$DEPLOY_KEY"
58+
- ./deploy.sh
59+
60+
#. Bauen des Docker-Containers
61+
62+
.. code-block:: sh
63+
:caption: build.sh
64+
:linenos:
65+
:emphasize-lines: 2, 5, 8
66+
67+
# Registry login
68+
echo "$CI_REGISTRY_PASSWORD" | buildah login -u "$CI_REGISTRY_USER" --password-stdin "$CI_REGISTRY"
69+
70+
# Set docker tag
71+
if [ "$CI_COMMIT_BRANCH" == main ]; then export DOCKER_TAG="latest"; else export DOCKER_TAG="${CI_COMMIT_TAG:-$CI_COMMIT_REF_SLUG}"; fi; export DOCKER_TAG_FULL="$DOCKER_STEM:$DOCKER_TAG"; echo "DOCKER_TAG_FULL=$DOCKER_TAG_FULL"
72+
73+
# Build and push
74+
buildah build --isolation chroot --storage-driver vfs --jobs 2 --platform linux/amd64,linux/arm/v7 --manifest "$DOCKER_TAG_FULL" && buildah --storage-driver vfs images && buildah manifest push --storage-driver vfs --format v2s2 --all "$DOCKER_TAG_FULL" "docker://$DOCKER_TAG_FULL"
75+
76+
Zeile 2
77+
meldet sich bei der :doc:`../package-registry` an.
78+
Zeile 5
79+
kennzeichnet die Images anhand ihrer Branch- oder Tag-Namen mit Ausnahme
80+
von ``main``, der mit ``latest`` gekennzeichnet wird.
81+
Zeile 8
82+
baut die Images und stellt sie mit dem `VFS
83+
<https://docs.docker.com/engine/storage/drivers/vfs-driver/>`_-Treiber
84+
bereit.
85+
86+
#. Bereitstellen
87+
88+
.. code-block:: sh
89+
:caption: deploy.sh
90+
:linenos:
91+
92+
# Set docker tag
93+
if [ "$CI_COMMIT_BRANCH" == main ]; then export DOCKER_TAG="latest"; else export DOCKER_TAG="${CI_COMMIT_TAG:-$CI_COMMIT_REF_SLUG}"; fi; export DOCKER_TAG_FULL="$DOCKER_STEM:$DOCKER_TAG"; echo "DOCKER_TAG_FULL=$DOCKER_TAG_FULL"
94+
95+
echo "$CI_REGISTRY $DEPLOY_USER $DEPLOY_PASSWORD MYAPP $DOCKER_TAG" | ssh -o 'BatchMode yes' -o 'StrictHostKeyChecking accept-new' -i "$DEPLOY_KEY" root@$DEPLOY_HOST

docs/productive/git/advanced/gitlab/docker.rst renamed to docs/productive/git/advanced/gitlab/ci-cd/docker.rst

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1+
.. SPDX-FileCopyrightText: 2024–2025 Veit Schiele
2+
..
3+
.. SPDX-License-Identifier: BSD-3-Clause
4+
5+
16
Docker-Container bauen
27
======================
38

4-
Wir verwenden :doc:`ci-cd`, um unsere Python-Docker-Container zu erstellen.
9+
Wir verwenden :doc:`index`, um unsere Python-Docker-Container zu erstellen.
510

611
#. Zunächst definieren wir die Python-Version in unserer
712
:ref:`pyproject-toml`-Datei des Projekts:
File renamed without changes.

docs/productive/git/advanced/gitlab/ci-cd.rst renamed to docs/productive/git/advanced/gitlab/ci-cd/index.rst

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
.. SPDX-FileCopyrightText: 2022 Veit Schiele
1+
.. SPDX-FileCopyrightText: 2022–2025 Veit Schiele
22
..
33
.. SPDX-License-Identifier: BSD-3-Clause
44
@@ -17,11 +17,11 @@ Continuous Integration
1717
führt eine Reihe von Skripten sequentiell oder parallel aus, die eure
1818
Anwendung automatisch erstellt und testet, :abbr:`z.B. (zum Beispiel)` nach
1919
jedem ``git pull`` in einem :doc:`Feature-Branch
20-
<../../workflows/feature-branches>`. Damit soll es weniger wahrscheinlich
20+
<../../../workflows/feature-branches>`. Damit soll es weniger wahrscheinlich
2121
werden, dass ihr Fehler in eure Anwendung einbringt.
2222

2323
Wenn die Überprüfungen wie erwartet funktionieren, könnt ihr einen
24-
:doc:`Merge Request <merge-requests>` stellen; schlagen die Überprüfungen
24+
:doc:`Merge Request <../merge-requests>` stellen; schlagen die Überprüfungen
2525
fehl, könnt ihr die Änderungen :abbr:`ggf. (gegebenenfalls)` zurücknehmen.
2626

2727
.. seealso::
@@ -155,7 +155,7 @@ Pipelines anzeigen
155155

156156
Ihr findet die aktuellen und historischen Pipeline-Runs auf der Seite
157157
:menuselection:`CI/CD --> Pipelines` eures Projekts. Ihr könnt auch auf Pipelines
158-
für einen :doc:`Merge-Request <merge-requests>` zugreifen, indem ihr zu deren
158+
für einen :doc:`Merge-Request <../merge-requests>` zugreifen, indem ihr zu deren
159159
Registerkarte :guilabel:`Pipelines` navigiert. Wählt eine Pipeline aus, um die
160160
Seite *Pipeline-Details* zu öffnen und die *Jobs* anzuzeigen, die für diese
161161
Pipeline ausgeführt wurde. Von hier aus könnt ihr eine laufende Pipeline
@@ -176,3 +176,12 @@ Pipeline löschen.
176176
<https://docs.gitlab.com/ee/ci/variables/index.html>`_
177177
* `GitLab Docs: Predefined variables reference
178178
<https://docs.gitlab.com/ee/ci/variables/predefined_variables.html>`_
179+
180+
.. toctree::
181+
:hidden:
182+
183+
pages
184+
npm
185+
docker
186+
buildah
187+
github-migration
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
.. SPDX-FileCopyrightText: 2025 Veit Schiele
2+
..
3+
.. SPDX-License-Identifier: BSD-3-Clause
4+
5+
npm-Deployment mit rsync
6+
========================
7+
8+
`npm <https://www.npmjs.com>`_ ist ein Paketmanager für die
9+
JavaScript-Laufzeitumgebung `Node.js <https://nodejs.org/en/>`_, und mit `rsync
10+
<https://rsync.samba.org>`_ können die Daten mit dem entfernten Server
11+
synchronisiert werden.
12+
13+
Erste Schritte
14+
--------------
15+
16+
#. Umgebungsvariablen einrichten
17+
18+
``DEPLOY_DIR``
19+
Verzeichnis auf dem entfernten Server, in das verteilt werden soll.
20+
``DEPLOY_HOST``
21+
Hostname oder IP-Adresse des Servers, auf den verteilt werden soll.
22+
``DEPLOY_KEY_FILE``
23+
Pfad zu einem privaten SSH-Schlüssel, der zur Authentifizierung gegenüber
24+
dem Server verwendet werden soll.
25+
``DEPLOY_USER``
26+
Name des SSH-Accounts.
27+
``KNOWN_HOSTS_FILE``
28+
Pfad zu einer Datei mit vordefinierten :file:`known_hosts`-Einträgen, mit
29+
denen die Verbindung überprüft werden soll.
30+
31+
#. Einrichten der CI/CD-Pipeline
32+
33+
.. code-block:: yaml
34+
:caption: .gitlab-ci.yml
35+
:emphasize-lines: 13, 14, 15
36+
37+
stages:
38+
- deploy
39+
40+
deploy-static-assets:
41+
stage: deploy
42+
rules:
43+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
44+
environment:
45+
name: prod
46+
deployment_tier: production
47+
image: node:alpine
48+
script:
49+
- apk add --no-cache git nodejs npm openssh-client-default rsync
50+
- chmod 0600 "$DEPLOY_KEY_FILE"
51+
- ./deploy.sh
52+
53+
Zeile 13
54+
installiert die für das Bauen und Hochladen erforderlichen Pakete
55+
Zeile 14
56+
ändert die Zugriffsberechtigungen für den ssh-Schlüssel
57+
Zeile 15
58+
ruft die :file:`deploy.sh`-Datei auf
59+
60+
#. Verschieben der statischen Dateien auf den Server
61+
62+
.. code-block:: sh
63+
:caption: deploy.sh
64+
:linenos:
65+
:emphasize-lines: 7-13, 18, 19, 24, 25-31
66+
67+
#!/bin/sh
68+
set -e
69+
70+
# Deploy static assets to a server via rsync.
71+
72+
# Create SSH config.
73+
cat >deploy.ssh_config <<-END
74+
Host deploy
75+
HostName $DEPLOY_HOST
76+
User $DEPLOY_USER
77+
IdentityFile $DEPLOY_KEY_FILE
78+
UserKnownHostsFile $KNOWN_HOSTS_FILE
79+
END
80+
81+
82+
# Build the JavaScript application & related files.
83+
cd vite-app
84+
npm ci
85+
npx vite build
86+
87+
# Deploy the application and GeoJSON data.
88+
rsync \
89+
-rtlv \
90+
--rsh 'ssh -F ../deploy.ssh_config' \
91+
--rsync-path "mkdir -p \"$DEPLOY_DIR\" && rsync" \
92+
../data/cusy.geojson \
93+
cusy.html \
94+
dist/cusy-map.css \
95+
dist/cusy-map.js \
96+
dist/cusy-map.js.map \
97+
"deploy:$DEPLOY_DIR"
98+
99+
Zeile 7–13
100+
erstellt die ssh-Konfigurationsdatei
101+
102+
Zeile 18
103+
installiert die Abhängigkeiten des Projekts aus der
104+
:file:`vite-app/package.json`-Datei
105+
106+
.. seealso::
107+
`npm-ci <https://docs.npmjs.com/cli/v9/commands/npm-ci>`_
108+
109+
Zeile 19
110+
erstellt das `vite <https://vite.dev>`_-Projekt für die Produktion.
111+
112+
Zeile 24
113+
verschiebt die ssh-Konfiguration auf den Server
114+
115+
Zeile 25–31
116+
verschiebt die Anwendung und GeoJSON-Daten auf den Server

0 commit comments

Comments
 (0)