Как избежать дублирования кода в Github Actions; есть ли какие-то петли в yaml? - PullRequest
3 голосов
/ 06 февраля 2020

Фон

Я пишу действие Github для загрузки артефактов сборки на каждый новый созданный тег. Это оказалось довольно простым делом.

Однако я хотел загрузить разные варианты в виде отдельных файлов на страницу релиза github, но не мог понять, как использовать для этого подстановочный знак, и прибегнул к дублируя эти разделы жестко закодированными именами файлов. Дублирование кода с жестко закодированными именами файлов подвержено ошибкам и не очень безопасно в будущем.

Я полагаю, что вопрос, возможно, сводится к тому, как работает yml: Возможно, это было бы сделано короче с помощью некоторого al oop или подстановочный знак?

Это длинный код, с которым я закончил:

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

1 Ответ

2 голосов
/ 06 февраля 2020

Можно ли было сделать это короче с помощью некоторого аль oop или подстановочного знака?

Да, но не без того, чтобы потратить некоторое время на написание кода, который, вероятно, вызовет у вас больше работать, чем он спасет вас.

Сам GitHub Actions не поддерживает ничего подобного циклам в соответствии с официальной документацией . Это означает, что если вы хотите сократить файл, вам нужно самостоятельно написать код, расширяющий файл, и применить его к файлу, прежде чем использовать его с действиями GitHub.

Вы можете go, как несколько других YAML. инструменты на основе (например, Ansible) go и использование шаблонизатора Jinja2 Python для записи циклов. Однако это очень неловко, поскольку вам нужно будет избегать выражений GH Actions, поскольку они используют сходный синтаксис.

Вероятно, лучшим способом для go было бы создание структуры данных в Python (или любом другом языке сценариев, поддерживающем YAML) и выводите его как YAML.

Я бы не рекомендовал ни один из этих подходов из-за энтропии, которую они добавляют к вашей установке, но это определенно возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...