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 Slide

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

    View Slide

  3. GitHub Actions
    3

    View 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 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 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 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 Slide

  8. Des Jobs et des Steps
    8

    View 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 Slide

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

    View Slide

  11. Run
    L’instruction la plus simple
    11

    View Slide

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

    View 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 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 Slide

  15. Résumé
    15

    View Slide

  16. Interlude :
    Expression & Context
    16

    View Slide

  17. 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 Slide

  18. 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 Slide

  19. Jobs, Steps & Dépendances
    19

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  23. Pitfalls
    23

    View Slide

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

    View Slide

  25. 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 Slide

  26. Les entrées / sorties
    26

    View Slide

  27. Input
    27

    View Slide

  28. Output
    28

    View Slide

  29. 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 Slide

  30. 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 Slide

  31. Les variables d'environnements
    31

    View Slide

  32. Astuces
    32

    View Slide

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

    View Slide

  34. 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 Slide

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

    View Slide

  36. 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 Slide

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

    View Slide

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

    View Slide

  39. Déploiement ?
    39

    View Slide

  40. 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 Slide

  41. 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 Slide

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

    View Slide

  43. Et à part la CI/CD ?
    43

    View Slide

  44. Interaction avec votre communauté
    44

    View Slide

  45. Entretien du dépôt
    45

    View Slide

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

    View Slide

  47. Code review
    47

    View Slide

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

    View Slide

  49. 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 Slide

  50. 50
    Ou du fun

    View Slide

  51. GitHub CLI
    51

    View Slide

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

    View Slide

  53. GitHub Extensions
    53

    View Slide

  54. Conclusion
    54

    View Slide

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

    View Slide

  56. 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 Slide

  57. 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 Slide

  58. Merci
    58

    View Slide

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

    View Slide