Contexte

J'écris une action Github pour télécharger des artefacts de construction sur chaque nouvelle balise créée. Cela s'est avéré être assez difficile à faire.

Cependant, je voulais télécharger les différentes variantes sous forme de fichiers séparés sur la page de publication de github, mais je ne pouvais pas comprendre comment utiliser un caractère générique pour cela, et j'ai plutôt dû dupliquer ces sections avec des noms de fichiers codés en dur. Dupliquer du code avec des noms de fichiers codés en dur est sujet aux erreurs et n'est pas très sûr pour l'avenir.

Je suppose que la question se résume peut-être au fonctionnement de yml : Cela aurait-il pu être fait plus court avec une sorte de boucle ou de caractère générique ?

C'est le long code avec lequel j'ai fini :

name: Android Release

on:
  push:
    tags:
      - 'CUST*'
jobs:
  create:
    name: Create Release
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@master
  apk:
    name: Generate APK
    runs-on: ubuntu-18.04

    steps:
      - uses: actions/checkout@v1
      - name: set up JDK 1.8
        uses: actions/setup-java@v1
        with:
          java-version: 1.8
      - name: Build debug APK
        run: bash ./gradlew assembleDebug --stacktrace
      - name: PackRelease
        run: |
           zip CustSignalDebug_universal.zip --junk-paths  app/build/outputs/apk/play/debug/*universal*.apk
           zip CustSignalDebug_arm64_v8a.zip --junk-paths  app/build/outputs/apk/play/debug/*arm64-v8a*.apk
           zip CustSignalDebug_armeabi_v7a.zip --junk-paths  app/build/outputs/apk/play/debug/*armeabi-v7a*.apk
           zip CustSignalDebug_x86.zip --junk-paths  app/build/outputs/apk/play/debug/*x86*.apk
           zip CustSignalDebugAll_APK.zip --junk-paths  app/build/outputs/apk/play/debug/*.apk
      - name: Upload APK univeral
        uses: actions/upload-artifact@v1
        with:
          name: CustSignalDebug_universal.zip
          path: CustSignalDebug_universal.zip
      - name: Upload APK arm64
        uses: actions/upload-artifact@v1
        with:
          name: CustSignalDebug_arm64_v8a.zip
          path: CustSignalDebug_arm64_v8a.zip
      - name: Upload APK arm64 v8a
        uses: actions/upload-artifact@v1
        with:
          name: CustSignalDebug_armeabi_v7a.zip
          path: CustSignalDebug_armeabi_v7a.zip
      - name: Upload APK x86
        uses: actions/upload-artifact@v1
        with:
          name: CustSignalDebug_x86.zip
          path: CustSignalDebug_x86.zip
      - name: Upload APK
        uses: actions/upload-artifact@v1
        with:
          name: CustSignalDebugAll_APK.zip
          path: CustSignalDebugAll_APK.zip
      - name: Create Release
        id: create_release
        uses: actions/create-release@v1.0.0
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ github.ref }}
          release_name: Release ${{ github.ref }}
          draft: false
          prerelease: true
      - name: Upload Release Asset All
        id: upload-release-asset0 
        uses: actions/upload-release-asset@v1.0.1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps 
          asset_path: CustSignalDebugAll_APK.zip
          asset_name: CustSignalDebugAll_APK.zip
          asset_content_type: application/zip      
      - name: Upload Release Asset universal
        id: upload-release-asset1 
        uses: actions/upload-release-asset@v1.0.1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps 
          asset_path: CustSignalDebug_universal.zip
          asset_name: CustSignalDebug_universal.zip
          asset_content_type: application/zip
      - name: Upload Release Asset arm7
        id: upload-release-asset2 
        uses: actions/upload-release-asset@v1.0.1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps 
          asset_path: CustSignalDebug_armeabi_v7a.zip
          asset_name: CustSignalDebug_armeabi_v7a.zip
          asset_content_type: application/zip
      - name: Upload Release Asset Arm64
        id: upload-release-asset3
        uses: actions/upload-release-asset@v1.0.1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps 
          asset_path: CustSignalDebug_arm64_v8a.zip
          asset_name: CustSignalDebug_arm64_v8a.zip
          asset_content_type: application/zip 
      - name: Upload Release Asset x86
        id: upload-release-asset4
        uses: actions/upload-release-asset@v1.0.1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps 
          asset_path: CustSignalDebug_x86.zip
          asset_name: CustSignalDebug_x86.zip
          asset_content_type: application/zip
7
Simson 6 févr. 2020 à 06:53

2 réponses

Meilleure réponse

Les actions Github prennent en charge à la fois les caractères génériques et les boucles. Les exemples ci-dessous ont été copiés à partir des docs.

Exemple de caractères génériques

'**/migrate-*.sql'

Un fichier avec le préfixe migrate- et le suffixe .sql n'importe où dans le référentiel.

Allumettes:

  • migrer-10909.sql
  • db/migrate-v1.0.sql
  • db/sept/migrate-v1.sql

Plus d'exemples de caractères génériques : https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#patterns-to-match-file-paths

Exemple de boucle (matrice)

Celui-ci exécute l'étape 3 fois, une avec chaque valeur de la variable node :

strategy:
  matrix:
    node: [6, 8, 10]
steps:
  # Configures the node version used on GitHub-hosted runners
  - uses: actions/setup-node@v1
    with:
      # The Node.js version to configure
      node-version: ${{ matrix.node }}

Autres exemples utilisant la matrice : https://docs .github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idstrategymatrix

3
bubbassauro 10 août 2020 à 01:01

Cela aurait-il pu être fait plus court avec une sorte de boucle ou de caractère générique ?

Oui, mais non sans investir un peu de temps pour écrire du code, ce qui vous fera probablement plus de travail qu'il ne vous en économisera.

GitHub Actions lui-même ne prend en charge rien comme les boucles selon la documentation officielle. Cela signifie que si vous souhaitez raccourcir le fichier, vous devez écrire vous-même le code en développant le fichier et l'appliquer au fichier avant de l'utiliser avec les actions GitHub.

Vous pouvez suivre le même chemin que plusieurs autres outils basés sur YAML (par exemple, Ansible) et utiliser le moteur de modélisation Jinja2 de Python pour écrire des boucles. Cependant, c'est très gênant car vous devrez échapper aux expressions GH Actions car elles utilisent une syntaxe similaire.

Une meilleure façon de procéder serait probablement de créer la structure de données en Python (ou tout autre langage de script prenant en charge YAML) et de la vider en tant que YAML.

Je ne recommanderais aucune de ces approches en raison de l'entropie qu'elles ajoutent à votre configuration, mais c'est certainement possible.

3
flyx 6 févr. 2020 à 11:31