Comment installer Concourse CI sur Ubuntu 16.04

introduction

Concourse CI est un système d’intégration continue moderne et évolutif, conçu pour automatiser les pipelines de test avec une syntaxe déclarable composable. S’appuyant sur le succès des systèmes CI précédents, Concourse vise à simplifier la gestion des pipelines et à éliminer les serveurs «flocon» afin que le serveur de test soit aussi bien réglementé que le code qu’il traite.

Dans ce tutoriel, nous allons montrer comment installer Concourse CI sur un serveur Ubuntu 16.04. Nous allons configurer une base de données PostgreSQL pour l’utiliser comme serveur principal, télécharger et installer les fichiers binaires Concourse, puis configurer les processus Web et de travail qui nous permettent de créer et d’exécuter des pipelines d’intégration continue.

Conditions préalables

Pour compléter ce guide, vous aurez besoin d’un serveur Ubuntu 16.04 avec au moins * 1 Go de RAM *. Configurez un utilisateur + sudo + non-root et un pare-feu comme décrit dans la configuration initiale du serveur https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04-Ubuntu 16.04 guide] avant de continuer.

Installer et configurer PostgreSQL

Avant de télécharger les fichiers binaires Concourse CI, nous devons configurer une instance PostgreSQL sur notre serveur. Concourse utilisera la base de données PostgreSQL pour stocker ses données de pipeline.

Commencez par mettre à jour l’index de package local pour actualiser la vue locale des fichiers disponibles. Ensuite, installez les paquets + postgresql + et + postgresql-contrib + à partir des dépôts par défaut d’Ubuntu:

sudo apt-get update
sudo apt-get install postgresql postgresql-contrib

Une fois le logiciel de base de données installé, nous allons créer un utilisateur PostgreSQL dédié nommé + concourse + pour gérer les actifs de Concourse au sein du système de base de données. Pour créer cet utilisateur, nous allons utiliser + sudo + pour agir en tant qu’utilisateur système + postgres +, qui dispose d’un accès administrateur au système de base de données:

sudo -u postgres createuser concourse

Par défaut, Concourse tente de se connecter à une base de données appelée + atc +. Concourse appelle son principal hub Web et API le terme "ATC", qui signifie "contrôle du trafic aérien". Nous pouvons créer cette base de données et attribuer un droit de propriété à l’utilisateur de la base de données + concourse + afin de fournir un accès approprié:

sudo -u postgres createdb --owner=concourse atc

Avec notre base de données en place, nous sommes maintenant prêts à télécharger et installer les fichiers binaires Concourse CI.

Téléchargez et installez les exécutables Concourse CI

Concourse fournit des liens vers les exécutables compilés pour la plate-forme Linux sur leur site Web et sur GitHub.

Le meilleur endroit pour les trouver est sur la page de téléchargement Concourse CI. Dans la section * Téléchargements *, sous la section * Concours Binaries *, cliquez avec le bouton droit de la souris et copiez l’emplacement du lien pour le téléchargement de la plate-forme * Linux *. Laissez cette page ouverte, car nous y reviendrons dans un instant.

Sur votre serveur, basculez vers le répertoire + / tmp + puis utilisez + curl + pour télécharger le lien que vous avez copié:

cd /tmp
curl -LO

Ensuite, nous allons télécharger le dernier client en ligne de commande + fly +. Retour sur la Concourse CI page de téléchargement, dans la section * Téléchargements *, sous la section * Fly Binaries *, cliquez à droite et copiez l’emplacement du lien pour le * Linux * téléchargement de la plateforme.

Sur votre serveur, téléchargez à nouveau le lien copié dans + / tmp + avec + curl +:

cd /tmp
curl -LO

Si la demande de téléchargement entraînait une erreur, les fichiers contiendraient un message d’erreur HTTP au lieu d’un programme binaire. Vérifiez que les fichiers sont réellement des exécutables binaires en tapant:

file *linux_amd64 | grep executable
Outputconcourse_linux_amd64: ELF 64-bit LSB , x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=3f24eae5da950594d8d1aaea7631bc20883afba3, not stripped
fly_linux_amd64:       ELF 64-bit LSB , x86-64, version 1 (SYSV), statically linked, not stripped

La sortie ci-dessus indique que les fichiers sont des exécutables. Nous pouvons ajouter une autorisation d’exécution aux fichiers, supprimer le suffixe + _linux_amd64 + et les déplacer dans le répertoire + / usr / local / bin + en tapant:

chmod +x concourse* fly*
sudo mv concourse* /usr/local/bin/concourse
sudo mv fly* /usr/local/bin/fly

Demander la version de chaque programme servira de petit contrôle pour s’assurer que tout fonctionne correctement:

cd ~
concourse --version
fly --version
Output

Maintenant que nos fichiers binaires sont en place, nous pouvons commencer à configurer Concourse.

Créer les actifs de configuration CI Concourse

Ensuite, nous pouvons commencer à mettre en place la configuration et les clés que Concourse utilisera pour démarrer.

Avant de commencer, créez un répertoire de configuration dans lequel vous pouvez conserver tous les fichiers pertinents:

sudo mkdir /etc/concourse

Nous pouvons maintenant générer des clés de cryptage et créer des fichiers qui définissent notre configuration Concourse.

Création des fichiers de clés

Concourse est composé de quelques composants connexes qui doivent tous être en mesure de communiquer en toute sécurité.

Https://concourse.ci/architecture.html#architecture-atc[ATC] est le hub principal qui traite les demandes Web et API et coordonne les pipelines. Workers gérer les conteneurs pour exécuter les tâches CI / CD définies dans le pipeline. Le TSA est un serveur SSH personnalisé qui enregistre de manière sécurisée les travailleurs avec l’ATC.

Même si nous allons exécuter tous ces composants sur un seul serveur, le travailleur et le TSA s’attendent à une communication sécurisée. Pour satisfaire cette attente, nous allons créer trois jeux de clés:

  • une paire de clés pour le composant TSA

  • une paire de clés pour le travailleur

  • une paire de clés de signature de session utilisée pour signer les jetons pour les sessions utilisateur et la communication TSA-ATC

Celles-ci étant utilisées automatiquement au démarrage de chacun des composants, nous devons créer ces clés sans mot de passe. Nous pouvons créer chacune de ces paires de clés dans le répertoire + / etc / concourse + en tapant:

sudo ssh-keygen -t rsa -q -N '' -f /etc/concourse/tsa_host_key
sudo ssh-keygen -t rsa -q -N '' -f /etc/concourse/worker_key
sudo ssh-keygen -t rsa -q -N '' -f /etc/concourse/session_signing_key

Si nous vérifions dans le répertoire du concours, nous pouvons voir que trois clés publiques et trois clés privées sont maintenant disponibles:

ls -l /etc/concourse
Outputtotal 24
-rw------- 1 root root 1679 May 11 17:19 session_signing_key
-rw-r--r-- 1 root root  394 May 11 17:19 session_signing_key.pub
-rw------- 1 root root 1679 May 11 17:19 tsa_host_key
-rw-r--r-- 1 root root  394 May 11 17:19 tsa_host_key.pub
-rw------- 1 root root 1675 May 11 17:19 worker_key
-rw-r--r-- 1 root root  394 May 11 17:19 worker_key.pub

La TSA décidera quels travailleurs sont autorisés à se connecter au système en vérifiant un fichier de clés autorisé. Nous devons pré-renseigner le fichier de clés autorisées avec la clé publique du travailleur que nous avons générée pour qu’il puisse se connecter correctement.

Comme il s’agit de notre seul ouvrier, nous pouvons simplement copier le fichier par dessus:

sudo cp /etc/concourse/worker_key.pub /etc/concourse/authorized_worker_keys

Maintenant que nous avons les fichiers de clés et un fichier initial pour les ouvriers autorisés, nous pouvons créer les fichiers qui définiront notre configuration Concourse.

Création des fichiers de configuration de l’environnement

Le fichier binaire Concourse ne lit pas de manière native un fichier de configuration. Cependant, les valeurs de configuration peuvent être extraites des variables d’environnement transmises au démarrage du processus.

Dans quelques instants, nous allons créer des fichiers unitaires + systemd + pour définir et gérer nos services de Concourse. Les fichiers d’unité peuvent lire les variables d’environnement d’un fichier et les transmettre au processus au démarrage. Nous allons créer un fichier qui définit les variables pour le processus Concourse + web +, qui démarrent les composants ATC et TSA, ainsi qu’un autre fichier pour le processus Concourse + worker +.

Créez et ouvrez un fichier pour le processus + web + en tapant:

sudo nano /etc/concourse/web_environment

À l’intérieur, nous définirons les variables d’environnement nécessaires aux composants ATC et TSA. Chaque variable commence par + CONCOURSE_ +.

Pour commencer, nous allons définir certaines valeurs statiques que nous n’avons pas besoin de modifier. Ces variables définiront l’emplacement des clés TSA et de session privées, le fichier définissant les travailleurs autorisés et l’emplacement du socket PostgreSQL:

/ etc / concourse / web_environment

# These values can be used as-is
CONCOURSE_SESSION_SIGNING_KEY=/etc/concourse/session_signing_key
CONCOURSE_TSA_HOST_KEY=/etc/concourse/tsa_host_key
CONCOURSE_TSA_AUTHORIZED_KEYS=/etc/concourse/authorized_worker_keys
CONCOURSE_POSTGRES_SOCKET=/var/run/postgresql

Nous allons ensuite définir certaines variables qui devront être modifiées pour correspondre à votre environnement. Le + CONCOURSE_EXTERNAL_URL + définit l’adresse IP et le port auquel le service sera lié. Définissez ceci sur l’adresse IP publique de votre serveur et sur le port 8080.

Nous allons également définir un nom d’utilisateur et un mot de passe pour l’équipe + main +, qui fonctionne en tant que groupe administratif Concourse. Vous pouvez sélectionner n’importe quel nom d’utilisateur et mot de passe ici. Vous pouvez modifier les informations d’identification de l’administrateur à tout moment en modifiant ces valeurs et en redémarrant le service:

/ etc / concourse / web_environment

# These values can be used as-is
CONCOURSE_SESSION_SIGNING_KEY=/etc/concourse/session_signing_key
CONCOURSE_TSA_HOST_KEY=/etc/concourse/tsa_host_key
CONCOURSE_TSA_AUTHORIZED_KEYS=/etc/concourse/authorized_worker_keys
CONCOURSE_POSTGRES_SOCKET=/var/run/postgresql

# Change these values to match your environment
CONCOURSE_BASIC_AUTH_USERNAME=
CONCOURSE_BASIC_AUTH_PASSWORD=
CONCOURSE_EXTERNAL_URL=http://:8080

Enregistrez et fermez le fichier lorsque vous avez terminé.

Ensuite, créez un fichier d’environnement pour le processus + worker +:

sudo nano /etc/concourse/worker_environment

À l’intérieur, nous définirons les emplacements de la clé privée du travailleur, de la clé publique de la TSA et du répertoire dans lequel le travailleur stockera ses fichiers. Nous définirons également l’adresse à laquelle la TSA peut être contactée, qui sera l’hôte local dans notre cas. Vous pouvez utiliser les valeurs ci-dessous sans modification:

/ etc / concourse / worker_environment

# These values can be used as-is
CONCOURSE_WORK_DIR=/var/lib/concourse
CONCOURSE_TSA_WORKER_PRIVATE_KEY=/etc/concourse/worker_key
CONCOURSE_TSA_PUBLIC_KEY=/etc/concourse/tsa_host_key.pub
CONCOURSE_TSA_HOST=127.0.0.1:2222

Enregistrez et fermez le fichier lorsque vous avez terminé.

Création d’un utilisateur système dédié et ajustement des autorisations

Avant de poursuivre, nous devrions créer un utilisateur Linux dédié pour exécuter le processus Concourse + web +. Cela nous permettra de démarrer le service Web avec des privilèges limités.

En raison de la manière dont PostgreSQL gère l’authentification par défaut, il est important que le nom d’utilisateur corresponde au nom d’utilisateur PostgreSQL créé précédemment. Créez un utilisateur système et un groupe appelé + concourse + en tapant:

sudo adduser --system --group concourse

Nous pouvons donner au nouvel utilisateur la propriété du répertoire + / etc / concourse + et de son contenu en tapant:

sudo chown -R concourse:concourse /etc/concourse

Les fichiers d’environnement contiennent des données sensibles telles que le nom d’utilisateur administratif et le mot de passe du serveur CI. Ajustez les autorisations des fichiers d’environnement afin que les utilisateurs normaux ne puissent pas lire ou modifier les valeurs de ces fichiers:

sudo chmod 600 /etc/concourse/*_environment

Nos ressources de configuration appartiennent maintenant à l’utilisateur du système + concourse + avec des privilèges limités pour les autres utilisateurs.

Création de fichiers d’unité Systemd pour le Web et les processus de travail

Nous sommes maintenant prêts à définir les fichiers d’unité Concourse CI qui vont démarrer et gérer les processus d’application. Nous allons créer un fichier pour le processus + web + qui gère les composants TSA et ATC et un fichier pour le processus + worker + qui gère les conteneurs pour les tâches de pipeline.

Création du fichier d’unité Web Concourse

Commencez par créer un fichier + concourse-web.services dans le fichier` + / etc / systemd / system`:

sudo nano /etc/systemd/system/concourse-web.service

À l’intérieur, collez le contenu suivant:

/etc/systemd/system/concourse-web.service

[Unit]
Description=Concourse CI web process (ATC and TSA)
After=postgresql.service

[Service]
User=concourse
Restart=on-failure
EnvironmentFile=/etc/concourse/web_environment
ExecStart=/usr/local/bin/concourse web

[Install]
WantedBy=multi-user.target

La première section du fichier définit la description de l’unité pour le processus + web + et indique que cette unité doit être démarrée après l’unité PostgreSQL lors du choix de la commande.

La section + [Service] + définit la manière dont le service sera exécuté. Nous exécuterons le service en tant qu’utilisateur + concourse + que nous avons configuré précédemment et nous dirons à systemd de le redémarrer automatiquement en cas d’échec, ce qui peut être utile si le processus décède en raison de contraintes de mémoire ou de problèmes similaires. Nous chargeons le fichier + web_environment + défini précédemment pour établir l’environnement et nous démarrons le processus en appelant + concourse web +.

La section + [Install] + indique à systemd comment lier l’unité à l’ordre de démarrage du système si nous configurons le service pour qu’il démarre au démarrage.

Enregistrez et fermez le fichier lorsque vous avez terminé.

Création du fichier d’unité de travail dans le hall

Ensuite, ouvrez un fichier similaire pour définir le processus + worker +:

sudo nano /etc/systemd/system/concourse-worker.service

À l’intérieur, collez le contenu suivant:

/etc/systemd/system/concourse-worker.service

[Unit]
Description=Concourse CI worker process
After=concourse-web.service

[Service]
User=root
Restart=on-failure
EnvironmentFile=/etc/concourse/worker_environment
ExecStart=/usr/local/bin/concourse worker

[Install]
WantedBy=multi-user.target

Cette unité fonctionne comme l’unité + concourse-web +. Cette fois, nous demandons au système de démarrer le processus + worker + après le processus Concourse + web +. Le processus + worker + est exécuté en tant qu’utilisateur + root + au lieu de + concourse + car il nécessite des privilèges administratifs pour la gestion des conteneurs. Nous chargeons le fichier + worker_environment + et utilisons la commande + concourse worker + pour démarrer le processus.

Enregistrez et fermez le fichier lorsque vous avez terminé.

Ajustez le pare-feu et démarrez les services

Avec nos fichiers d’unités en place, nous pouvons maintenant autoriser l’accès via le pare-feu et démarrer les services.

Le processus + web + écoutera les connexions sur le port 8080, nous devons donc ouvrir l’accès à ce port dans le pare-feu + ufw +:

sudo ufw allow 8080

Les conteneurs utilisés par le processus + worker + nécessitent un transfert d’accès pour pouvoir accéder correctement à Internet et résoudre les requêtes DNS. Nous pouvons l’activer en tapant:

sudo ufw default allow routed

Nous pouvons maintenant démarrer nos services en tapant:

sudo systemctl start concourse-web concourse-worker

Nous pouvons vérifier que les deux services ont été démarrés correctement en tapant:

sudo systemctl status concourse-web concourse-worker
Output● concourse-web.service - Concourse CI web process (ATC and TSA)
  Loaded: loaded (/etc/systemd/system/concourse-web.service; disabled; vendor preset: enabled)
  Active:  since Thu 2017-05-11 20:18:16 UTC; 1min 40s ago
Main PID: 9954 (concourse)
   Tasks: 7
  Memory: 100.0M
     CPU: 2.058s
  CGroup: /system.slice/concourse-web.service
          └─9954 /usr/local/bin/concourse web

May 11 20:19:51 testatc concourse[9954]: {"timestamp":"1494533991.818562269","source":"tsa","message":"tsa.connection.keepalive","log_level":1,"data":{"remote":"127.0.0.1:48764","session":"1","type":"keepalive"}}
. . .

● concourse-worker.service - Concourse CI worker process
  Loaded: loaded (/etc/systemd/system/concourse-worker.service; disabled; vendor preset: enabled)
  Active:  since Thu 2017-05-11 20:18:16 UTC; 1min 39s ago
Main PID: 9960 (concourse)
   Tasks: 9
  Memory: 619.6M
     CPU: 20.353s
  CGroup: /system.slice/concourse-worker.service
          └─9960 /usr/local/bin/concourse worker

May 11 20:19:12 testatc concourse[9960]: {"timestamp":"1494533952.909682751","source":"tsa","message":"tsa.connection.channel.forward-worker.heartbeat.start","log_level":1,"data":{"remote":"127.0.0.1:48764","session":"1.1.1.7","worker-address":"127.0.0.1:38993","worker-platform":"linux","worker-tags":""}}
. . .

Vérifiez que les deux services lisent «actif (en cours d’exécution)» et que les lignes du journal ne contiennent aucune erreur évidente. Faites particulièrement attention au service + web + pour vous assurer que les lignes de journal n’indiquent pas de problèmes de connexion à la base de données.

Si les services ont démarré avec succès, activez-les pour qu’ils démarrent à chaque démarrage du serveur:

sudo systemctl enable concourse-web concourse-worker

Vérifier l’accès sur la ligne de commande et via l’interface Web

Maintenant que les services de halls fonctionnent, nous devrions vérifier que nous avons accès.

Vérification de l’accès sur la ligne de commande

Premièrement, vérifions que nous pouvons accéder au service Concourse avec le client en ligne de commande + fly +.

Nous devons nous connecter à l’aide du nom d’utilisateur et du mot de passe administrateur que nous avons configurés dans le fichier + / etc / concourse / web_environment + à l’aide de la sous-commande + login +. Un seul binaire + fly + peut être utilisé pour contacter et gérer plusieurs serveurs Concourse. La commande utilise donc un concept appelé «cibles» comme alias pour différents serveurs. Nous allons appeler notre cible «local» pour vous connecter au serveur Concourse local:

fly -t local login -c http://127.0.0.1:8080

Vous serez invité à entrer le nom d’utilisateur et le mot de passe de l’équipe + main +, que nous avons définis dans le fichier + web_environments +. Après avoir entré vos informations d’identification, “cible enregistrée” devrait s’afficher:

Outputlogging in to team 'main'

username:
password:

target saved

Cela indique que nous avons pu nous connecter avec succès. Pendant que nous sommes ici, vérifions que le processus de travail a bien pu s’inscrire au composant TSA en tapant:

fly -t local workers
Outputname              containers  platform  tags  team  state    version
concourse-server  0           linux     none  none  running  1.0

La commande + fly + est utilisée pour configurer les pipelines et gérer le service Concourse CI. La commande + fly help + fournit des informations sur les commandes supplémentaires.

Vérification de l’accès via l’interface Web

Ensuite, vérifiez l’accès Web en visitant l’adresse IP de votre serveur suivie de «+: 8080 +» dans un navigateur Web:

http://:8080

Vous devriez pouvoir accéder à la page initiale de CI Concourse:

image: https: //assets.digitalocean.com/articles/concourseci_install_1604/initial_screen.png [Écran initial Concourse CI]

À partir de là, vous pouvez éventuellement télécharger la commande + fly + sur votre ordinateur local en tant que client en ligne de commande en cliquant sur l’image correspondant à votre plate-forme. Cela vous permet de gérer votre environnement de CI sans vous connecter au serveur. N’oubliez pas de fournir l’adresse IP publique de votre serveur au lieu de "+ 127.0.0.1 " lorsque vous vous connectez avec " fly +" pour la première fois (lisez l’avertissement concernant le cryptage ci-dessous avant de vous connecter à distance).

Si vous cliquez sur le lien * login * dans le coin supérieur droit, vous pouvez vous connecter à l’interface Web. Tout d’abord, il vous sera demandé de sélectionner votre équipe. L’équipe * principale *, qui est le groupe administratif, est la seule sélection disponible par défaut:

image: https: //assets.digitalocean.com/articles/concourseci_install_1604/select_main_team.png [Équipe principale du concours CI]

Sur la page suivante, il vous sera demandé de saisir vos identifiants.

Après avoir entré les informations d’identification que vous avez configurées dans le fichier + web_environment +, vous serez connecté et ramené à l’interface d’espace réservé par défaut:

image: https: //assets.digitalocean.com/articles/concourseci_install_1604/placeholder_interface.png [Concourse CI select main team]

Une fois que vous avez soumis votre configuration de pipeline au serveur avec + fly +, cet écran sera remplacé par une interface permettant de surveiller l’activité de votre pipeline.

Conclusion

Dans ce guide, nous avons installé PostgreSQL et les fichiers binaires Concourse, configuré des clés de cryptage et configuré l’accès Concourse et le réseau. Après avoir démarré les services, nous nous sommes connectés localement à l’aide de la commande + fly + et avons accédé à l’interface Web pour en vérifier la fonctionnalité.

Comme indiqué précédemment, avant d’utiliser Concourse pour un travail réel, il est important de protéger le Web et les passerelles d’API avec SSL. Suivez notre guide sur installation d’un proxy inverse SSL for Concourse CI with Nginx pour configurer un accès sécurisé à votre serveur avant toute interaction avec le serveur à distance.

Pour apprendre à utiliser + fly + pour ajouter des pipelines à votre serveur Concourse, consultez l’exemple hhello World dans la documentation de Concourse.