Configurer un pipeline Drone CI / CD avec Kubernetes

Dernière mise à jour:

J'aime dire que la livraison continue ou le CD est la partie la plus importante de Cloud Native. Il y a tellement d'excellents outils et vous devez choisir les bons. Il y a quelques semaines, j'écrivais presque sur le même sujet, uniquement avec Jenkins. Bien que Jenkins soit l'outil CI / CD le plus utilisé, toutes les équipes n'en sont pas satisfaites. Jenkins a un grand nombre de plugins et le grand ensemble de fonctionnalités, mais il semble toujours vieux. Il est lourd et n'est pas construit avec des conteneurs à l'esprit. Il y a quelques jours, j'ai lu la nouvelle introduction de Jenkins X, nous verrons donc des changements à l'avenir. Avec Drone, les conteneurs sont les citoyens de première classe. Dans cet article, je vais passer par l'installation sur Kubernetes et expliquer le pipeline simple. Plus tard, vous pouvez comparer en quoi le pipeline Drone est différent du pipeline que j'ai fait avec Jenkins.

Article de blog précédent

Déployer Drone sur Kubernetes

Heureusement, il y a le tableau Drone Helm disponible. Ce n'est pas dans le référentiel stable, mais ça va. Avant le déploiement, il y a quelques éléments spécifiques au Drone. Le drone se connecte au système de contrôle de version et vous ne pouvez pas le démarrer sans en configurer un. Je vais configurer le référentiel GitHub et enregistrer la nouvelle application OAuth. Vous devriez avoir quelque chose comme ça:

drone_github_app

Vous obtiendrez votre ID client et votre secret que vous devrez utiliser pour configurer le drone. Sur la base du graphique officiel du drone, je vais créer un fichier de configuration personnalisé drone.yaml pour remplacer les valeurs par défaut. Remplacez le nom de domaine et d'autres informations pour correspondre à votre environnement:

ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
    kubernetes.io/tls-acme: 'true'
  hosts:
    - drone.test.akomljen.com
  tls:
    - secretName: drone-tls
      hosts:
        - drone.test.akomljen.com

server:
  host: "https://drone.test.akomljen.com"
  env:
    DRONE_ADMIN: komljen
    DRONE_PROVIDER: "github"
    DRONE_OPEN: "true"
    DRONE_GITHUB: "true"
    DRONE_GITHUB_CLIENT: "CLIENT_ID"
    DRONE_GITHUB_SECRET: "CLIENT_SECRET"

Ajoutons le référentiel d'incubateur et installons les composants du drone à partir de là. Utilisez un fichier de configuration personnalisé que vous avez créé:

⚡ helm repo add 
     incubator https://kubernetes-charts-incubator.storage.googleapis.com

⚡ helm install --name drone 
     --namespace drone 
     -f drone.yaml 
     incubator/drone

⚡ kubectl get pods -n drone
NAME                                  READY     STATUS    RESTARTS   AGE
drone-drone-agent-6847ddc7dc-q4jqx    2/2       Running   0          1m
drone-drone-server-7fdcffd964-kt6xs   1/1       Running   0          1m     

Attendez quelques minutes et vos applications Drone devraient être prêtes. Autorisez votre référentiel GitHub via l'interface utilisateur Web et vous êtes prêt à partir.

Création et compréhension du pipeline

Une chose que j'aime chez Drone, c'est que les plugins sont aussi des conteneurs. Cela signifie que vous n'avez pas besoin d'installer de plugins sur le drone lui-même. Vous les incluez dans le pipeline et ils fonctionneront sur n'importe quel serveur Drone. Ceci est la liste complète des plugins disponibles. Écrire vos propres plugins est facile et je le montrerai plus tard dans ce post. La liste des plugins n'est pas énorme par rapport à Jenkins. Jenkins a plus de 1000 plugins disponibles, mais cela ne signifie pas que Drone manque de nombreuses fonctionnalités. C'est différent à coup sûr. Voici le pipeline que j'ai créé pour cet article de blog:

pipeline:
  build:
    image: gradle:4.5.1-jdk9
    commands: gradle --help
  docker:
    image: plugins/docker
    secrets: ( docker_username, docker_password )
    repo: komljen/test-image
    tags: ${DRONE_COMMIT_SHA}
  kubectl:
    image: komljen/drone-kubectl-helm
    secrets: ( kubernetes_server, kubernetes_cert, kubernetes_token )
    kubectl: "get pods"
  helm:
    image: komljen/drone-kubectl-helm
    secrets: ( kubernetes_server, kubernetes_cert, kubernetes_token )
    helm: list
  notify:
    image: plugins/slack
    channel: drone-notification
    secrets: ( slack_webhook )

Ce pipeline est également disponible dans le référentiel. Ce n'est pas le vrai projet et je l'ai créé pour vous montrer différentes étapes. Pour plus de fonctionnalités, veuillez consulter les documents officiels. Voyons quelques détails spécifiques à ce sujet.

Gérer les secrets

Pour gérer les secrets avec Drone, vous pouvez utiliser l'interface utilisateur Web ou installer l'outil Drone CLI. Je préfère l'outil CLI car il a plus d'options disponibles et vous pouvez faire beaucoup d'autres choses en fait. Si vous utilisez MacOS, la façon la plus simple de l'installer est de brew:

⚡ brew tap drone/drone
⚡ brew install drone

Ensuite, vous devez connecter l'outil CLI au serveur Drone. Trouver le jeton utilisateur sur l'interface utilisateur Web https:///account/token, exportez les variables d'environnement et vérifiez la connexion au serveur:

⚡ export DRONE_SERVER=https://drone.test.akomljen.com
⚡ export DRONE_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZXh0Ijoia29tbGplbiIsInR5cGUiOiJ1c2VyIn0.1GRLOtmCyNnvfGGCC6_iUBFgyoeSadk5TiOoj5Yk-pY

⚡ drone info
User: komljen
Email: (email protected)

Si tout fonctionne bien, allez-y et ajoutez quelques secrets. Les secrets ne sont pas globaux, vous devez donc les ajouter par référentiel. Les secrets mondiaux sont une fonctionnalité d'entreprise. Je n'aime pas ça. Fixons d'abord les secrets de Docker:

⚡ drone secret add 
     -repository / 
     -name docker_password -value ""
⚡ drone secret add 
     -repository / 
     -name docker_username -value ""

Et ajoutez également des secrets pour kubectl et Helm:

⚡ drone secret add 
     -repository / 
     -name kubernetes_server -value ""

⚡ drone secret add 
     -repository / 
     -name kubernetes_cert -value ""

⚡ drone secret add  
     -repository / 
     -name kubernetes_token -value ""

J'ai inclus le plugin de notification Slack, vous devez donc ajouter un autre secret:

⚡ drone secret add 
     -repository / 
     -name slack_webhook -value ""

Comment fonctionne le système de plugins?

Les plugins sont faciles à écrire et ils sont essentiellement l'image Docker avec le script d'exécution. Vous pouvez même créer des plugins bash. Pour une référence, jetez un œil au plugin que j'ai créé pour cet article de blog drone-kubectl-helm. Variables d'environnement dans le script run.sh préfixées par PLUGIN_ sont les paramètres personnalisés. Par exemple:

pipeline:
  kubectl:
    image: komljen/drone-kubectl-helm
    secrets: ( kubernetes_server, kubernetes_cert, kubernetes_token )
    kubectl: "get nodes"

Dans ce pipeline, kubectl le paramètre est disponible en tant que variable d'environnement PLUGIN_KUBECTL à l'intérieur du conteneur. De plus, chaque clé secrète secrets est disponible en tant que variable d'environnement majuscule. Dans l'exemple ci-dessus, KUBERNETES_SERVER, KUBERNETES_CERT et KUBERNETES_TOKEN sont placés dans le conteneur. Facile non?

En outre, vous pouvez trouver une liste complète des variables d'environnement intégrées dans les documents officiels. Cela est utile lorsque vous souhaitez marquer vos images Docker avec un ID de validation ou obtenir d'autres informations sur la génération.

Par rapport à Jenkins où vous pouvez écrire un pipeline de script complexe, avec Drone, toute la complexité peut faire partie d'une image Docker. Cela signifie également qu'il est facilement réutilisable.

Avec un pipeline Drone défini, chaque poussée vers le référentiel exécutera la nouvelle tâche. J'ai configuré mon nom d'utilisateur komljen en tant qu'administrateur Drone. Cela signifie que je peux configurer le référentiel avec des fonctionnalités supplémentaires, comme les crochets du référentiel. Certains plugins nécessitent une modification des paramètres du référentiel pour fonctionner. Ces paramètres de référentiel sont disponibles sur l'interface utilisateur Web
https://///settings. Au final, voici à quoi ressemble un exemple d'exécution. J'aime l'interface utilisateur simpliste:

drone_run-1

Sommaire

Comparé au pipeline Jenkins, le drone semble simple. Et c'est. Mais, toutes les fonctionnalités ne sont pas disponibles gratuitement, et je ne peux pas encore imaginer créer un pipeline pour un projet complexe avec Drone. Bien sûr, vous pouvez le faire, mais avec Jenkins et la possibilité d'utiliser des pipelines scriptés, vous avez beaucoup plus de liberté. L'énorme inconvénient pour moi était une mauvaise documentation Drone. Faites-moi part de votre expérience avec Drone ou Jenkins. Restez à l'écoute pour le prochain.

Nous serions ravis de connaître votre avis

      Laisser un commentaire