如何避免 Github Actions 中的代码重复;yaml 中有某种循环吗?

Sim*_*son 7 continuous-integration yaml github github-actions

背景

我正在编写一个 Github 操作来上传每个创建的新标签上的构建工件。事实证明,这样做相当困难。

但是,我想将不同的变体作为单独的文件上传到 github 的发布页面,但无法弄清楚如何为此使用通配符,并转而使用硬编码文件名复制此部分。用硬编码的文件名复制代码很容易出错,而且未来也不是很安全。

我想这个问题可能归结为 yml 的工作原理: 用某种循环或通配符可以缩短这个时间吗?

这是我最终得到的长代码:

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
Run Code Online (Sandbox Code Playgroud)

bub*_*uro 6

Github 操作同时支持通配符和循环。下面的示例是从文档中复制的。

通配符示例

'**/migrate-*.sql'

存储库中任意位置具有前缀 migrate- 和后缀 .sql 的文件。

火柴:

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

更多通配符示例:https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#patterns-to-match-file-paths

循环示例(矩阵)

该步骤运行 3 次,每个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 }}
Run Code Online (Sandbox Code Playgroud)

使用矩阵的其他示例:https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idstrategymatrix