Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GitHub Actions - Automatisation de vos workflows

GitHub Actions - Automatisation de vos workflows

GitHub Action a été rendu public en 2019, mais en quoi peut il nous aider à automatiser nos workflows ? Durant cette conférence, nous appendrons à exécuter une suite de tests, puis déployer notre code. Nos verrons en détails les fichiers de configuration, les subtilités, et comment exploiter toute la puissance de GA.

Cependant, on ne peut pas résumer GA à une CI/CD, car il permet de faire bien plus, comme répondre, trier automatiquement des pull requests, fermer les vieilles issues sans activité, remercier les contributeurs, etc.

---

Quelques resources:

* https://github.com/lyrixx/ga-playground : plein de démo / tips
* https://github.com/lyrixx/ga-docker-playground : intégration de GA + ghrc.io
* https://github.com/lyrixx/ga-netlify-playground : intégration de GA + Netlify

Grégoire Pineau

June 09, 2022
Tweet

More Decks by Grégoire Pineau

Other Decks in Technology

Transcript

  1. GitHub Actions - Automatisation
    de vos workflows
    Grégoire Pineau
    @lyrixx
    Dev @JoliCode
    Core Team @symfony

    View full-size slide

  2. GitHub Actions
    ● Annoncé en 2018 (beta privée)
    ● GA en novembre 2019
    2

    View full-size slide

  3. GitHub Actions
    3

    View full-size slide

  4. GitHub Actions
    ● Permet d'exécuter du code
    ● Dans un environnement contrôlé
    ● Vous codez - GitHub exécute
    ● Supporte n’importe quel langage
    GitHub Actions n’est ni plus ni moins qu’un scheduler de workflows
    4

    View full-size slide

  5. Workflow
    Une recette écrite en YAML
    Dans le dossier .github/workflows
    Avec
    ● un name
    ● des jobs
    ● et biens d’autres choses
    5

    View full-size slide

  6. Quand est déclenché mon workflow ?
    Un système d'événements puissants
    ● repository events:
    ○ commit, tags
    ○ pull request
    ○ issue
    ○ project
    ○ milestones
    ○ etc
    ● cron
    ● trigger custom (API)
    ● à la main
    https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows 6

    View full-size slide

  7. Où est exécuté mon workflow ? aka “runner”
    Chez GitHub
    ● Linux (Ubuntu 18.04, 20.04, ou 22.04)
    ● MacOS (10.15, 11, ou 12)
    ● Windows (Server 2022 ou 2019)
    Chez vous “hosted-runner”
    ● Sur l’OS de votre choix
    7

    View full-size slide

  8. Des Jobs et des Steps
    8

    View full-size slide

  9. Des Jobs et des Steps
    Un workflow exécute un ou plusieurs jobs
    ● en parallèle
    ● ou séquentiellement
    Chaque job exécute une ou plusieurs steps
    ● séquentiellement
    9

    View full-size slide

  10. Une Step
    ● Une marketplace d’actions
    ○ avec des arguments
    ● run
    10

    View full-size slide

  11. Run
    L’instruction la plus simple
    11

    View full-size slide

  12. La marketplace
    ● Beaucoup d’actions
    ● Par GitHub ou non
    ● Vérifié ou non
    ● https://github.com/marketplace?type=actions
    12

    View full-size slide

  13. Partager son action
    ● on peut écrire une action en TypeScript
    ● ou une action composite en YAML
    ● le dépôt doit être open source
    ● (peut être sur la marketplace)
    ● ou privé sur un plan enterprise
    ● ou sinon bidouiller un peu 🤓
    13

    View full-size slide

  14. Partager des actions (privées)
    |-- hello-world (repository)
    | |__ .github
    | └── workflows
    | └── my-first-workflow.yml
    | └── actions
    | |__ hello-world-action
    | └── action.yml
    jobs:
    build:
    runs-on: ubuntu-latest
    steps:
    - uses: ./.github/actions/hello-world-action
    - uses: myorga/foobar@v3 # ⚠
    14
    https://docs.github.com/en/actions/learn-github-actions/finding-and-customizing-actions

    View full-size slide

  15. Interlude :
    Expression & Context
    16

    View full-size slide

  16. Expression
    GitHub a son propre moteur de template : ${{ }}
    Supporte les opérateurs usuels : < > == ! && !! () [] etc
    Ainsi que quelques functions : contains startsWith endsWith format join toJSON fromJSON etc
    Exemple:
    ● startsWith('Hello world', 'He')
    ● join(github.event.issue.labels.*.name, ', ')
    17
    https://docs.github.com/en/actions/learn-github-actions/expressions

    View full-size slide

  17. Context
    18
    Github fourni différentes variables
    ● github
    ● env
    ● job
    ● steps
    ● runner
    ● secrets
    ● etc
    https://docs.github.com/en/actions/learn-github-actions/contexts

    View full-size slide

  18. Jobs, Steps & Dépendances
    19

    View full-size slide

  19. Matrix
    20
    Exécute le même job avec
    différentes configurations

    View full-size slide

  20. Conditions
    Exécute une action ou une step si la condition est OK
    21

    View full-size slide

  21. Dépendance
    Permet de rendre séquentielle
    une série de jobs
    22

    View full-size slide

  22. Jobs
    24
    Chaque job tourne dans une VM différente
    On peut uploader des artefacts

    View full-size slide

  23. L'enchaînement de workflow
    ● Enchaîner les workflows est compliqué (mais possible)
    ● Surtout si on a besoin de partager du context / artefacts
    Un seul workflow avec des jobs conditionnés ✔
    1. Build
    2. Test
    3. Release / Publish
    4. Deploy
    Différents workflows pour des tâches totalement différentes ✔
    25

    View full-size slide

  24. Les entrées / sorties
    26

    View full-size slide

  25. Améliorer le rapport
    Il est possible
    ● d’ajouter des logs aux jobs
    ● d’ajouter un résumé aux jobs
    ● de grouper l’output dans les logs
    29

    View full-size slide

  26. Les secrets
    Trois niveaux de secrets
    ● au niveau de l'organisation
    ● au niveau du projet
    ● au niveau de l'environnement
    Ils sont
    ● non éditables
    ● non affichables dans les logs
    30

    View full-size slide

  27. Les variables d'environnements
    31

    View full-size slide

  28. Surcharge de la configuration
    33
    Il est possible de surcharger la configuration pour
    chaque section

    View full-size slide

  29. Intégration avec Docker
    ● Docker est disponible par défaut
    ● Docker Compose aussi
    ● Un registry : ghcr.io
    ● Des actions pour gérer les workflows
    ○ build
    ○ tag
    ○ push
    ○ ectc
    Example :
    https://github.com/lyrixx/ga-docker-playground
    34

    View full-size slide

  30. Registry natif + Packages
    ● Docker
    ● npm
    ● Maven
    ● NuGet
    ● RubyGems
    Avec le système classique de permissions
    Attention aux connexions avec un repo
    35

    View full-size slide

  31. Utilisation du cache
    36
    ● https://github.com/actions/cache
    ● https://github.com/actions/setup-node
    ● https://github.com/actions/setup-python
    ● https://github.com/actions/setup-java
    ● https://github.com/actions/setup-ruby
    GitHub cache lui-même certains packages
    Des fois le cache est contre-productif

    View full-size slide

  32. Services disponibles
    ● Fait tourner n’importe quel service
    ● Tant qu’il est dans un container
    37

    View full-size slide

  33. Les permissions
    38
    ● Ne pas utiliser de PAT (tant que possible)
    ● Définir les permissions dans le workflow.yml

    View full-size slide

  34. Déploiement ?
    39

    View full-size slide

  35. Les environnements
    40
    ● correspond à une URL
    ● a un jeu de secrets
    ● a un ensemble de protections
    ● disponible uniquement pour
    ○ les repositories publics
    ○ GH Enterprise

    View full-size slide

  36. Les déploiements
    On peut attacher un déploiement dans
    ● un commit
    ● une PR
    ● un environnement
    Très dépendant de l'hébergement
    https://github.com/lyrixx/ga-netlify-playground
    41

    View full-size slide

  37. Intégrations avec des cloud providers (2690)
    42

    View full-size slide

  38. Et à part la CI/CD ?
    43

    View full-size slide

  39. Interaction avec votre communauté
    44

    View full-size slide

  40. Entretien du dépôt
    45

    View full-size slide

  41. Git Split automatique
    ● Vous avez un mono repo
    ● Vous voulez splitter les composants
    ● https://github.com/jderusse/docker-gitsplit
    46

    View full-size slide

  42. Code review
    47

    View full-size slide

  43. Profile GitHub
    48
    Automatiser la MAJ de son
    profile GitHub, avec
    GitHub Actions ➰
    https://github.com/jessfraz

    View full-size slide

  44. https:/
    /estcequegregaplusdefollowerquejolicode.fr
    49
    ● “Project” / blague développé pendant une soirée 🍻🥃󰷺 - piloté à 100% par GitHub
    ● Une action qui est déclenchée via un CRON
    ● Contrôle qui a le plus de followers
    ● “Build” un site web en fonction du résultat
    ● Déploie sur GitHub Pages
    https://github.com/lyrixx/estceque

    View full-size slide

  45. GitHub CLI
    51

    View full-size slide

  46. GitHub CLI
    https://cli.github.com/
    52
    https://cli.github.com/

    View full-size slide

  47. GitHub Extensions
    53

    View full-size slide

  48. Conclusion
    54

    View full-size slide

  49. Quel Pricing ?
    ● Pricing classique de GitHub
    ● Gratuit pour l’open source
    ● Avec un quota pour le closed source
    ● Minutes de build / mois
    55

    View full-size slide

  50. Conclusion
    ● Vraiment très agréable à utiliser
    ● Rapide et relativement simple
    ● Gratuit dans une certaine limite
    ● Documentation très complète
    ● La courbe d'apprentissage est un peu compliquée
    ○ presque trop de documentation
    ○ la sécurité pose souvent des problèmes (mais pour notre bien)
    56

    View full-size slide

  51. Quelques ressources
    ● https://github.com/lyrixx/ga-playground : plein de démo / tips
    ● https://github.com/lyrixx/ga-docker-playground : intégration de GA + ghrc.io
    ● https://github.com/lyrixx/ga-netlify-playground : intégration de GA + Netlify
    ● https://github.com/skills/hello-github-actions : tuto fait par github
    ● https://docs.github.com/en/actions : la documentation officiel
    57

    View full-size slide

  52. Des questions ?
    Grégoire Pineau
    @lyrixx
    Dev @JoliCode
    Core Team @symfony
    59
    Les slides

    View full-size slide