如何使 github 动作矩阵元素成为条件
how to make a github action matrix element conditional
我有一个使用 'strategy' = 'matrix' 的工作流和要构建的特定配置列表。
Link to Workflow YAML (also provided below)
#
# build-N-test-v2.1-Dev and build-N-test-v2.1-Release are neary
# identical, but a few tests are commented out (to not needlessly stress CI system)
# for v2.1-Dev builds
#
# NOTE: I've tried many tricks - none which seem to work - to get this working on one file with one
# workflow and tests
# https://github.community/t/what-is-the-correct-if-condition-syntax-for-checking-matrix-os-version/16221
# https://github.community/t/how-to-conditionally-include-exclude-items-in-matrix-eg-based-on-branch/16853
#
# but none seem to work
#
name: build-N-test-v2.1-Dev
on:
push:
branches:
- v2.1-Dev
#- v2.1-Release
workflow_dispatch:
inputs:
ignored:
description: "ignored"
required: false
default: ""
## NB: JOBS section IDENTICAL between v2.1-Dev and 2.1-Release files EXCEPT that on v2.1-Dev file
## comment out all entries marked with includeInDevBranchBuilds: false
jobs:
build-n-test-Linux:
runs-on: ${{ matrix.runs_on }}
strategy:
#
# Configuration notes
# o --debug-symbols false to reduce build disk size (and we aren't debugging anyhow) in many debug configurations
#
matrix:
include:
# ## SADLY: Container operations are only supported on Linux runners
# - displayTargetName: windows-DBG
# os: windows
# compiler: g++-8
# runs_on: windows-latest
# container_image: sophistsolutionsinc/stroika-buildvm-windows-cygwin-vs2k19
# cpp_version: c++17
# config_name: Debug
# extra_config_args: --apply-default-debug-flags --trace2file enable
## centos 8
- displayTargetName: centos-8
os: unix
compiler: g++
runs_on: ubuntu-latest
container_image: sophistsolutionsinc/stroika-buildvm-centos-8-small
cpp_version: c++17
config_name: Release
extra_config_args: --apply-default-release-flags --trace2file enable
includeInDevBranchBuilds: true
## ubuntu 18.04
- displayTargetName: ubuntu-18.04-g++-8 (Debug)
os: unix
compiler: g++-8
runs_on: ubuntu-latest
container_image: sophistsolutionsinc/stroika-buildvm-ubuntu1804-regression-tests
cpp_version: c++17
config_name: Debug
extra_config_args: --apply-default-debug-flags --trace2file enable --debug-symbols false
includeInDevBranchBuilds: true
- displayTargetName: ubuntu-18.04-cross-compile-raspberrypi (Debug)
os: unix
compiler: g++-8
runs_on: ubuntu-latest
container_image: sophistsolutionsinc/stroika-buildvm-ubuntu1804-regression-tests
cpp_version: c++17
config_name: Debug
extra_config_args: --apply-default-release-flags --trace2file enable --compiler-driver arm-linux-gnueabihf-g++-8 --cross-compiling true
includeInDevBranchBuilds: true
# ubuntu 20.04
# - displayTargetName: ubuntu-20.04-g++-9 (Debug)
# os: unix
# compiler: g++-9
# runs_on: ubuntu-latest
# container_image: sophistsolutionsinc/stroika-buildvm-ubuntu2004-regression-tests
# cpp_version: c++17
# config_name: Debug
# extra_config_args: --apply-default-debug-flags --trace2file enable --debug-symbols false
# includeInDevBranchBuilds: false
# - displayTargetName: ubuntu-20.04-g++-10 (Debug)
# os: unix
# compiler: g++-10
# runs_on: ubuntu-latest
# container_image: sophistsolutionsinc/stroika-buildvm-ubuntu2004-regression-tests
# cpp_version: c++17
# config_name: Debug
# extra_config_args: --apply-default-debug-flags --trace2file enable --debug-symbols false
# includeInDevBranchBuilds: false
- displayTargetName: ubuntu-20.04-g++-10
os: unix
compiler: g++-10
runs_on: ubuntu-latest
container_image: sophistsolutionsinc/stroika-buildvm-ubuntu2004-regression-tests
cpp_version: c++17
config_name: Release
extra_config_args: --apply-default-release-flags --trace2file enable
includeInDevBranchBuilds: true
# - displayTargetName: ubuntu-20.04-g++-10-c++2a
# os: unix
# compiler: g++-10
# runs_on: ubuntu-latest
# container_image: sophistsolutionsinc/stroika-buildvm-ubuntu2004-regression-tests
# cpp_version: c++2a
# config_name: Release
# extra_config_args: --apply-default-release-flags --trace2file enable
# includeInDevBranchBuilds: false
# - displayTargetName: ubuntu-20.04-clang++-10
# os: unix
# compiler: clang++-10
# runs_on: ubuntu-latest
# container_image: sophistsolutionsinc/stroika-buildvm-ubuntu2004-regression-tests
# cpp_version: c++17
# config_name: Release
# extra_config_args: --apply-default-release-flags --trace2file enable
# includeInDevBranchBuilds: false
### ATTEMPT TO COMPRESS 2 workflow files into one, but so far not working
### SEE
###
###
#if: github.ref == 'refs/heads/v2.1-Release' || matrix.includeInDevBranchBuilds
env:
# vm has 2 virtual CPUs, but 8GB ram, so jobs=5 (empirical), and QUICK_BUILD avoids some internal testing
MAKEFLAGS: "--jobs=3 QUICK_BUILD=1"
container: ${{ matrix.container_image }}
steps:
- uses: actions/checkout@v2
- name: Build System Info
if: ${{ matrix.os=='unix' }}
run: |
lsb_release -d 2>/dev/null || true
echo "CWD=" `pwd`
echo "nproc=" `nproc`
grep "model name" /proc/cpuinfo | head -1
grep processor /proc/cpuinfo | wc -l
grep MemTotal /proc/meminfo
df -h
- name: Build System Info (Windows)
if: ${{ matrix.os=='windows' }}
run: |
echo "CWD=" `pwd`
df -h
- name: Configure ${{ matrix.config_name }}
run: |
./configure ${{ matrix.config_name }} --compiler-driver ${{ matrix.compiler }} ${{ matrix.extra_config_args }} --cppstd-version ${{ matrix.cpp_version }}
cat ConfigurationFiles/${{ matrix.config_name }}.xml
# Break out third-party-components to do clean so we dont run out of disk space, and break out TPC AND library
# to show the summary time for each part
- name: Make third-party-components
run: |
make third-party-components
make clean
- name: Make libraries
run: make libraries
- name: Make all
run: make all
- name: Run Tests
run: make run-tests
- name: Archive Samples Results
uses: actions/upload-artifact@v2
with:
name: Sample apps (${{ matrix.displayTargetName }})
path: |
Builds/${{ matrix.config_name }}/Samples-*
- name: Archive Log Results
uses: actions/upload-artifact@v2
with:
name: Log Data (${{ matrix.displayTargetName }})
path: |
Builds/${{ matrix.config_name }}/PerformanceDump.txt
/tmp/Trace*.txt
build-n-test-MacOS:
runs-on: ${{ matrix.runs_on }}
strategy:
matrix:
# Add to extra_config_args for build speed: --Xerces no --OpenSSL no --lzma no --boost no
include:
- displayTargetName: MacOS-Debug
os: macos-10.15
runs_on: macos-10.15
config_name: Debug
extra_config_args: --apply-default-debug-flags --trace2file enable
includeInDevBranchBuilds: true
# - displayTargetName: MacOS
# os: macos-10.15
# runs_on: macos-10.15
# config_name: Release
# extra_config_args: --apply-default-release-flags --trace2file enable
# includeInDevBranchBuilds: false
env:
# vm has 2 virtual CPUs, but 8GB ram, so jobs=5 (empirical), and QUICK_BUILD avoids some internal testing
MAKEFLAGS: "--jobs=3 QUICK_BUILD=1"
steps:
- uses: actions/checkout@v2
- name: Build System Info
run: |
echo "CWD: `pwd`"
df -h
system_profiler SPSoftwareDataType
sw_vers
# If we had docker ability, most of these would be built into a docker file
- name: Install Basic Build requirements
run: |
brew install gnu-sed
brew install p7zip
brew install automake
make install-realpath
- name: Configure
run: |
./configure ${{ matrix.config_name }} ${{ matrix.extra_config_args }}
cat ConfigurationFiles/${{ matrix.config_name }}.xml
- name: Build third-party-components
run: |
make third-party-components
make clean
- name: Build Library
run: |
make libraries
- name: Build All
run: |
make all
- name: Run-Tests
run: |
make run-tests
- name: Workaround GitHub-Actions-MacOS Issue with env.TMPDIR
run: |
mkdir /tmp/LOGS-ARCHIVE
cp $TMPDIR/Trace*.txt /tmp/LOGS-ARCHIVE
- name: DEBUG Workaround GitHub-Actions-MacOS Issue with env.TMPDIR
run: |
echo "TMPDIR=$TMPDIR"
echo "TMPDIR using ENV.TMPDIR=${{ env.TMPDIR }}"
# Just the echo line above shows empty, and then the ls line causes exit 1/failure
#ls -l ${{ env.TMPDIR }}/Trace*.txt
#if this gets fixed, then lose Workaround GitHub-Actions-MacOS, and directly reference ${{ env.TMPDIR }}/Trace*.txt in Archive Log Results
- name: Build System Info
run: |
df -h
- name: Archive Log Results
uses: actions/upload-artifact@v2
with:
name: Log Results (${{ matrix.displayTargetName }})
path: |
Builds/${{ matrix.config_name }}/PerformanceDump.txt
/tmp/LOGS-ARCHIVE
#${{ env.TMPDIR }}/Trace*.txt
- name: Archive Sample Results
uses: actions/upload-artifact@v2
with:
name: Samples (${{ matrix.displayTargetName }})
path: |
Builds/${{ matrix.config_name }}/Samples-*
build-n-test-Windows:
runs-on: ${{ matrix.runs_on }}
strategy:
matrix:
# Add to extra_config_args for build speed: --Xerces no --OpenSSL no --lzma no --boost no
include:
- displayTargetName: windows-x86-Debug
os: windows
runs_on: windows-latest
container_image: sophistsolutionsinc/stroika-buildvm-windows-cygwin-vs2k19
config_name: Debug
extra_config_args: --arch x86 --apply-default-debug-flags --trace2file enable
includeInDevBranchBuilds: true
# - displayTargetName: windows-x86-Release
# os: windows
# runs_on: windows-latest
# container_image: sophistsolutionsinc/stroika-buildvm-windows-cygwin-vs2k19
# config_name: Release
# extra_config_args: --arch x86 --apply-default-release-flags --trace2file enable
# includeInDevBranchBuilds: false
# - displayTargetName: windows-x86_64-Debug
# os: windows
# runs_on: windows-latest
# container_image: sophistsolutionsinc/stroika-buildvm-windows-cygwin-vs2k19
# config_name: Debug
# extra_config_args: --arch x86_64 --apply-default-debug-flags --trace2file enable
# includeInDevBranchBuilds: false
# - displayTargetName: windows-x86_64-Release
# os: windows
# runs_on: windows-latest
# container_image: sophistsolutionsinc/stroika-buildvm-windows-cygwin-vs2k19
# config_name: Release
# extra_config_args: --arch x86 --apply-default-release-flags --trace2file enable
# includeInDevBranchBuilds: false
env:
# vm has 2 virtual CPUs, but 8GB ram, so jobs=5 (empirical), and QUICK_BUILD avoids some internal testing
MAKEFLAGS: "--jobs=3 QUICK_BUILD=1"
ARTIFACTS_DIR: "c:/Artifacts/"
steps:
- uses: actions/checkout@v2
#
- name: Extract branch name
shell: bash
run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
id: extract_branch
- name: Build System Info
shell: "bash"
run: |
echo "CWD: `pwd`"
df -h
systeminfo
echo NUMBER_OF_PROCESSORS=$NUMBER_OF_PROCESSORS
- name: docker pull ${{ matrix.container_image }}
run: docker pull ${{ matrix.container_image }}
- name: Start docker build environment
run: |
docker run --tty --memory 5G --cpus 2 --storage-opt 'size=50GB' --detach --name buildContainer ${{ matrix.container_image }}
- name: Print Info about docker system
shell: "bash"
run: |
docker ps -a
docker exec buildContainer systeminfo
docker exec buildContainer df -h
- name: Git Checkout
shell: "bash"
run: |
docker exec buildContainer sh -c "git clone https://github.com/SophistSolutions/Stroika.git && cd Stroika && git checkout ${{ steps.extract_branch.outputs.branch }}"
- name: Configure
shell: "bash"
run: |
docker exec --workdir c:/Stroika buildContainer sh -c "./configure ${{ matrix.config_name }} ${{ matrix.extra_config_args }}"
docker exec --workdir c:/Stroika buildContainer cat ConfigurationFiles/${{ matrix.config_name }}.xml
- name: Build
shell: "bash"
run: |
docker exec --workdir c:/Stroika --env MAKEFLAGS="$MAKEFLAGS" buildContainer make all
- name: Run-Tests
shell: "bash"
run: |
docker exec --workdir c:/Stroika --env MAKEFLAGS="$MAKEFLAGS" buildContainer make run-tests
- name: Build System Info
shell: "bash"
run: |
df -h
docker exec buildContainer df -h
- name: Copy Build Artifacts
shell: "bash"
# due to flaws in docker (windows must stop) - and cp no wildcards
run: |
docker exec --workdir c:/Stroika buildContainer bash -c 'mkdir TRACE_LOGS && cp $TEMP/Trace*.txt TRACE_LOGS/'
docker stop buildContainer
docker cp buildContainer:Stroika/Builds/${{ matrix.config_name }}/ $ARTIFACTS_DIR 2> /dev/null
docker cp buildContainer:Stroika/TRACE_LOGS $ARTIFACTS_DIR 2> /dev/null
rm -rf $ARTIFACTS_DIR/{ThirdPartyComponents,Tests,*.lib}
- name: Archive Log Results
uses: actions/upload-artifact@v2
with:
name: Log Results (${{ matrix.displayTargetName }})
path: |
${{ env.ARTIFACTS_DIR }}PerformanceDump.txt
${{ env.ARTIFACTS_DIR }}TRACE_LOGS
- name: Archive Sample Results
uses: actions/upload-artifact@v2
with:
name: Samples (${{ matrix.displayTargetName }})
path: |
${{ env.ARTIFACTS_DIR }}Samples-*
但我只想在分支 = v2.1-Release 时构建一些配置。也就是说——在大多数情况下——只构建一个或两个配置,但在发布时构建更多配置。
我通过克隆脚本(工作流程)并重命名一些内容并注释掉它们来完成此操作。但是,如果该机制与矩阵元素一起使用,那就太好了。
我意识到有一个 'if' 功能可以添加到每个步骤,但这会创建大量禁用步骤的作业。我想要的是根本不为每个具有 if 部分评估为 false 的矩阵元素启动这些作业。
TLDR:您可以使用 one 工作流来完成您想要的操作,方法是过滤您想要在先前构建 job/step 中使用的配置,并使用该配置的结果在您的 build-n-test
作业中过滤为矩阵值。
更长的版本:
您可以创建一个 job
(即 build-n-test),其中 strategy.matrix
的值根据某些条件不同,通过设置strategy.matrix
到前一个作业的反序列化 output
的值(即 matrix_prep)。之前的工作将负责根据您的自定义条件构建 matrix
值。以下 yaml 对此进行了演示(稍后已包含一个副本,并添加了注释以进行解释):
name: Configurable Build Matrix
on: push
jobs:
matrix_prep:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: Check out code into the Go module directory
uses: actions/checkout@v2
- id: set-matrix
run: |
branchName=$(echo '${{ github.ref }}' | sed 's,refs/heads/,,g')
matrix=$(jq --arg branchName "$branchName" 'map(. | select((.runOn==$branchName) or (.runOn=="always")) )' matrix_includes.json)
echo ::set-output name=matrix::{\"include\":$(echo $matrix)}
build-n-test:
needs: matrix_prep
runs-on: ${{ matrix.runs_on }}
strategy:
matrix: ${{fromJson(needs.matrix_prep.outputs.matrix)}}
steps:
- run: echo "Hello ${{ matrix.someValue }}"
设置矩阵任务中使用的matrix_includes.json
文件的内容可以在本段之后找到。 要查看问题中的矩阵配置 JSON,请查看此答案的底部附近。 我选择了 JSON文件与工作流定义本身分开,因为我发现在工作流本身中包含原始 JSON 非常混乱(特别是如果 JSON 文件很大)。
[
{
"runs_on":"ubuntu-16.04",
"someValue":"Foo",
"runOn":"always"
},
{
"runs_on":"ubuntu-18.04",
"someValue":"Bar",
"runOn":"v2.1-Release"
},
{
"runs_on":"ubuntu-20.04",
"someValue":"Hello again",
"runOn":"v2.1-Release"
}
]
使用上面的设置,all 构建将包含一个配置,只有分支名称匹配 v2.1-Release 时才会包含两个配置。通过对 Workflow 文件中的 sed
和 jq
选项进行一些调整,可以放宽分支名称限制,这样您就可以为包含 [=24= 的所有分支配置 运行 ](而不是仅仅针对单个分支)。如果有兴趣,我可能会将其包含在此答案中(因为它不一定符合您当前的问题)。
set-matrix
职位说明
关于set-matrix
任务,请参考以下注意事项:
# ${{ github.ref }} returns the full git ref. As such, 'refs/heads/` should be stripped for easier future use
branchName=$(echo '${{ github.ref }}' | sed 's,refs/heads/,,g')
# Use jq to read in a json file that represents the matrix configuration. Each block has a 'runOn' property.
# The jq filter is setup to only output items that are set to 'always' or that have a branch name that matches
# the current branch.
matrix=$(jq --arg branchName "$branchName" 'map(. | select((.runOn==$branchName) or (.runOn=="always")) )' matrix_includes.json)
# This 'echo' uses a special syntax so that the output of this job is set correctly
echo ::set-output name=matrix::{\"include\":$(echo $matrix)}
工作流程说明
以下 yaml 内容应与上面相同,并添加一些注释以帮助解释:
name: Configurable Build Matrix
on: push
jobs:
matrix_prep:
# Using a separate job and agent so as to be able to use tools like 'sed' and 'jq'
runs-on: ubuntu-latest
# Defining outputs of a job allows for easier consumption and use
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
# Checking out code as the set-matrix step utilizes a file named matrix_includes.json
- name: Check out code into the Go module directory
uses: actions/checkout@v2
# This step is explained more in a following section
- id: set-matrix
run: |
branchName=$(echo '${{ github.ref }}' | sed 's,refs/heads/,,g')
matrix=$(jq --arg branchName "$branchName" 'map(. | select((.runOn==$branchName) or (.runOn=="always")) )' matrix_includes.json)
echo ::set-output name=matrix::{\"include\":$(echo $matrix)}\"
build-n-test:
# By stating 'needs' here, the output of 'matrix_prep' is available to this job
needs: matrix_prep
runs-on: ${{ matrix.runs_on }}
strategy:
# We need to convert the json string output into an object that the GitHub Workflow expects.
# Thankfully, the json-schema for Workflows allows 'matrix' to be set to an expression.
matrix: ${{fromJson(needs.matrix_prep.outputs.matrix)}}
steps:
# Output a configuration specific value as proof and as a sanity check
- run: echo "Hello ${{ matrix.someValue }}"
示范[=86=]
我为这个演示整理了两个文件:
- workflow definition(粘贴在下方)
- A JSON file to contain matrix information(粘贴在下方)
以下两个屏幕截图来自 运行s 在不同分支上使用相同的工作流定义。请注意,两者之间的 build-n-test 作业数量不同:
为主分支构建
为 v2.1 版本分支构建
这是因为第一个构建发生在 main
分支上,第二个构建发生在 v2.1-Release
分支上。从上面包含的 matrix_includes.json
文件可以看出,这是预期的,因为当分支为 [=28= 时,两个配置设置为 运行 only ],并且只有一个配置设置为运行 always.
更多细节
矩阵配置过滤
过滤是通过使用 json 数组中的 jq 到 select 个对象来完成的,这些对象的 runOn
值设置为 always
或者匹配当前 branchName
。这是我之前提到的对您的逻辑的轻微调整:我没有说 includeInDevBranchBuilds
,而是使用 runOn
,因为它似乎更适合这个特定示例。
分行名称
set-matrix
步骤使用上一行中设置的值:branchName=$(echo '${{ github.ref }}' | sed 's,refs/heads/.*-,,g')
。此行将从分支引用中删除 refs/heads/
,并将结果存储在值 branchName
中。例如,如果您的分支是 2.1-Release
,branchName
将设置为 2.1-Release
,并且之前的过滤器将匹配任何具有 "runOn":"2.1-Release"
的对象或 "runOn":"always"
.
JSON 文件
创建 JSON 文件是为了模拟您链接的工作流中 includes
语句的 内容 。 JSON 用作 GitHub 动作具有内置 JSON 函数。作为示例,以下是我将 matrix:include
部分转换为 JSON 的看法。 请注意,我已将 includeInDevBranchBuilds
更改为 runOn
,并将值设置为 always
或 v2.1-Release
。
[
{
"displayTargetName": "centos-8",
"os": "unix",
"compiler": "g++",
"runs_on": "ubuntu-latest",
"container_image": "sophistsolutionsinc/stroika-buildvm-centos-8-small",
"cpp_version": "c++17",
"config_name": "Release",
"extra_config_args": "--apply-default-release-flags --trace2file enable",
"runOn": "always"
},
{
"displayTargetName": "ubuntu-18.04-g++-8 (Debug)",
"os": "unix",
"compiler": "g++-8",
"runs_on": "ubuntu-latest",
"container_image": "sophistsolutionsinc/stroika-buildvm-ubuntu1804-regression-tests",
"cpp_version": "c++17",
"config_name": "Debug",
"extra_config_args": "--apply-default-debug-flags --trace2file enable",
"runOn": "always"
},
{
"displayTargetName": "ubuntu-20.04-g++-9 (Debug)",
"os": "unix",
"compiler": "g++-9",
"runs_on": "ubuntu-latest",
"container_image": "sophistsolutionsinc/stroika-buildvm-ubuntu2004-regression-tests",
"cpp_version": "c++17",
"config_name": "Debug",
"extra_config_args": "--apply-default-debug-flags --trace2file enable",
"runOn": "v2.1-Release"
},
{
"displayTargetName": "ubuntu-20.04-g++-10 (Debug)",
"os": "unix",
"compiler": "g++-10",
"runs_on": "ubuntu-latest",
"container_image": "sophistsolutionsinc/stroika-buildvm-ubuntu2004-regression-tests",
"cpp_version": "c++17",
"config_name": "Debug",
"extra_config_args": "--apply-default-debug-flags --trace2file enable",
"runOn": "v2.1-Release"
},
{
"displayTargetName": "ubuntu-20.04-g++-10",
"os": "unix",
"compiler": "g++-10",
"runs_on": "ubuntu-latest",
"container_image": "sophistsolutionsinc/stroika-buildvm-ubuntu2004-regression-tests",
"cpp_version": "c++17",
"config_name": "Release",
"extra_config_args": "--apply-default-release-flags --trace2file enable",
"runOn": "always"
},
{
"displayTargetName": "ubuntu-20.04-g++-10-c++2a",
"os": "unix",
"compiler": "g++-10",
"runs_on": "ubuntu-latest",
"container_image": "sophistsolutionsinc/stroika-buildvm-ubuntu2004-regression-tests",
"cpp_version": "c++2a",
"config_name": "Release",
"extra_config_args": "--apply-default-release-flags --trace2file enable",
"runOn": "v2.1-Release"
},
{
"displayTargetName": "ubuntu-20.04-clang++-10",
"os": "unix",
"compiler": "clang++-10",
"runs_on": "ubuntu-latest",
"container_image": "sophistsolutionsinc/stroika-buildvm-ubuntu2004-regression-tests",
"cpp_version": "c++17",
"config_name": "Release",
"extra_config_args": "--apply-default-release-flags --trace2file enable",
"runOn": "v2.1-Release"
}
]
添加另一个答案,因为这个答案使用 custom Actions 而不是内联-shell 脚本。免责声明:我是其中一个动作的维护者(感谢您的启发)。
通过使用两个额外的操作,
您可以实现与我的其他答案中的 类似的效果,但可以说是更简洁的方式:
.github/workflows/sample.yml
name: Configurable Build Matrix
on: push
jobs:
matrix_prep:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- uses: actions/checkout@v2
- uses: nelonoel/branch-name@v1.0.1
- id: set-matrix
uses: JoshuaTheMiller/conditional-build-matrix@0.0.1
with:
filter: '[?runOn==`${{ env.BRANCH_NAME }}` || runOn==`always`]'
build-n-test:
needs: matrix_prep
runs-on: ${{ matrix.runs_on }}
strategy:
matrix: ${{fromJson(needs.matrix_prep.outputs.matrix)}}
steps:
- run: echo "Hello ${{ matrix.someValue }}"
.github/workflows/matrix_includes.json
[
{
"runs_on":"ubuntu-16.04",
"someValue":"Foo",
"runOn":"always"
},
{
"runs_on":"ubuntu-18.04",
"someValue":"Bar",
"runOn":"v2.1-Release"
},
{
"runs_on":"ubuntu-20.04",
"someValue":"Hello again",
"runOn":"v2.1-Release"
}
]
两个文件都可以在repo of the Action
中找到
备注
filter
输入也使用不同的过滤语法:它使用 JMESPATH. I've found JMESPATH to be very well documented and supported. To learn more about how the sytax works, you can visit their interactive examples page. 而不是 jq
- 默认情况下,
conditional-build-matrix
操作会在 .github/workflows/
文件夹下查找名为 matrix_includes.json
的文件(与其他答案中包含的相同文件)。这个位置可以自定义,是documented on the Action's page.
我有一个使用 'strategy' = 'matrix' 的工作流和要构建的特定配置列表。
Link to Workflow YAML (also provided below)
#
# build-N-test-v2.1-Dev and build-N-test-v2.1-Release are neary
# identical, but a few tests are commented out (to not needlessly stress CI system)
# for v2.1-Dev builds
#
# NOTE: I've tried many tricks - none which seem to work - to get this working on one file with one
# workflow and tests
# https://github.community/t/what-is-the-correct-if-condition-syntax-for-checking-matrix-os-version/16221
# https://github.community/t/how-to-conditionally-include-exclude-items-in-matrix-eg-based-on-branch/16853
#
# but none seem to work
#
name: build-N-test-v2.1-Dev
on:
push:
branches:
- v2.1-Dev
#- v2.1-Release
workflow_dispatch:
inputs:
ignored:
description: "ignored"
required: false
default: ""
## NB: JOBS section IDENTICAL between v2.1-Dev and 2.1-Release files EXCEPT that on v2.1-Dev file
## comment out all entries marked with includeInDevBranchBuilds: false
jobs:
build-n-test-Linux:
runs-on: ${{ matrix.runs_on }}
strategy:
#
# Configuration notes
# o --debug-symbols false to reduce build disk size (and we aren't debugging anyhow) in many debug configurations
#
matrix:
include:
# ## SADLY: Container operations are only supported on Linux runners
# - displayTargetName: windows-DBG
# os: windows
# compiler: g++-8
# runs_on: windows-latest
# container_image: sophistsolutionsinc/stroika-buildvm-windows-cygwin-vs2k19
# cpp_version: c++17
# config_name: Debug
# extra_config_args: --apply-default-debug-flags --trace2file enable
## centos 8
- displayTargetName: centos-8
os: unix
compiler: g++
runs_on: ubuntu-latest
container_image: sophistsolutionsinc/stroika-buildvm-centos-8-small
cpp_version: c++17
config_name: Release
extra_config_args: --apply-default-release-flags --trace2file enable
includeInDevBranchBuilds: true
## ubuntu 18.04
- displayTargetName: ubuntu-18.04-g++-8 (Debug)
os: unix
compiler: g++-8
runs_on: ubuntu-latest
container_image: sophistsolutionsinc/stroika-buildvm-ubuntu1804-regression-tests
cpp_version: c++17
config_name: Debug
extra_config_args: --apply-default-debug-flags --trace2file enable --debug-symbols false
includeInDevBranchBuilds: true
- displayTargetName: ubuntu-18.04-cross-compile-raspberrypi (Debug)
os: unix
compiler: g++-8
runs_on: ubuntu-latest
container_image: sophistsolutionsinc/stroika-buildvm-ubuntu1804-regression-tests
cpp_version: c++17
config_name: Debug
extra_config_args: --apply-default-release-flags --trace2file enable --compiler-driver arm-linux-gnueabihf-g++-8 --cross-compiling true
includeInDevBranchBuilds: true
# ubuntu 20.04
# - displayTargetName: ubuntu-20.04-g++-9 (Debug)
# os: unix
# compiler: g++-9
# runs_on: ubuntu-latest
# container_image: sophistsolutionsinc/stroika-buildvm-ubuntu2004-regression-tests
# cpp_version: c++17
# config_name: Debug
# extra_config_args: --apply-default-debug-flags --trace2file enable --debug-symbols false
# includeInDevBranchBuilds: false
# - displayTargetName: ubuntu-20.04-g++-10 (Debug)
# os: unix
# compiler: g++-10
# runs_on: ubuntu-latest
# container_image: sophistsolutionsinc/stroika-buildvm-ubuntu2004-regression-tests
# cpp_version: c++17
# config_name: Debug
# extra_config_args: --apply-default-debug-flags --trace2file enable --debug-symbols false
# includeInDevBranchBuilds: false
- displayTargetName: ubuntu-20.04-g++-10
os: unix
compiler: g++-10
runs_on: ubuntu-latest
container_image: sophistsolutionsinc/stroika-buildvm-ubuntu2004-regression-tests
cpp_version: c++17
config_name: Release
extra_config_args: --apply-default-release-flags --trace2file enable
includeInDevBranchBuilds: true
# - displayTargetName: ubuntu-20.04-g++-10-c++2a
# os: unix
# compiler: g++-10
# runs_on: ubuntu-latest
# container_image: sophistsolutionsinc/stroika-buildvm-ubuntu2004-regression-tests
# cpp_version: c++2a
# config_name: Release
# extra_config_args: --apply-default-release-flags --trace2file enable
# includeInDevBranchBuilds: false
# - displayTargetName: ubuntu-20.04-clang++-10
# os: unix
# compiler: clang++-10
# runs_on: ubuntu-latest
# container_image: sophistsolutionsinc/stroika-buildvm-ubuntu2004-regression-tests
# cpp_version: c++17
# config_name: Release
# extra_config_args: --apply-default-release-flags --trace2file enable
# includeInDevBranchBuilds: false
### ATTEMPT TO COMPRESS 2 workflow files into one, but so far not working
### SEE
###
###
#if: github.ref == 'refs/heads/v2.1-Release' || matrix.includeInDevBranchBuilds
env:
# vm has 2 virtual CPUs, but 8GB ram, so jobs=5 (empirical), and QUICK_BUILD avoids some internal testing
MAKEFLAGS: "--jobs=3 QUICK_BUILD=1"
container: ${{ matrix.container_image }}
steps:
- uses: actions/checkout@v2
- name: Build System Info
if: ${{ matrix.os=='unix' }}
run: |
lsb_release -d 2>/dev/null || true
echo "CWD=" `pwd`
echo "nproc=" `nproc`
grep "model name" /proc/cpuinfo | head -1
grep processor /proc/cpuinfo | wc -l
grep MemTotal /proc/meminfo
df -h
- name: Build System Info (Windows)
if: ${{ matrix.os=='windows' }}
run: |
echo "CWD=" `pwd`
df -h
- name: Configure ${{ matrix.config_name }}
run: |
./configure ${{ matrix.config_name }} --compiler-driver ${{ matrix.compiler }} ${{ matrix.extra_config_args }} --cppstd-version ${{ matrix.cpp_version }}
cat ConfigurationFiles/${{ matrix.config_name }}.xml
# Break out third-party-components to do clean so we dont run out of disk space, and break out TPC AND library
# to show the summary time for each part
- name: Make third-party-components
run: |
make third-party-components
make clean
- name: Make libraries
run: make libraries
- name: Make all
run: make all
- name: Run Tests
run: make run-tests
- name: Archive Samples Results
uses: actions/upload-artifact@v2
with:
name: Sample apps (${{ matrix.displayTargetName }})
path: |
Builds/${{ matrix.config_name }}/Samples-*
- name: Archive Log Results
uses: actions/upload-artifact@v2
with:
name: Log Data (${{ matrix.displayTargetName }})
path: |
Builds/${{ matrix.config_name }}/PerformanceDump.txt
/tmp/Trace*.txt
build-n-test-MacOS:
runs-on: ${{ matrix.runs_on }}
strategy:
matrix:
# Add to extra_config_args for build speed: --Xerces no --OpenSSL no --lzma no --boost no
include:
- displayTargetName: MacOS-Debug
os: macos-10.15
runs_on: macos-10.15
config_name: Debug
extra_config_args: --apply-default-debug-flags --trace2file enable
includeInDevBranchBuilds: true
# - displayTargetName: MacOS
# os: macos-10.15
# runs_on: macos-10.15
# config_name: Release
# extra_config_args: --apply-default-release-flags --trace2file enable
# includeInDevBranchBuilds: false
env:
# vm has 2 virtual CPUs, but 8GB ram, so jobs=5 (empirical), and QUICK_BUILD avoids some internal testing
MAKEFLAGS: "--jobs=3 QUICK_BUILD=1"
steps:
- uses: actions/checkout@v2
- name: Build System Info
run: |
echo "CWD: `pwd`"
df -h
system_profiler SPSoftwareDataType
sw_vers
# If we had docker ability, most of these would be built into a docker file
- name: Install Basic Build requirements
run: |
brew install gnu-sed
brew install p7zip
brew install automake
make install-realpath
- name: Configure
run: |
./configure ${{ matrix.config_name }} ${{ matrix.extra_config_args }}
cat ConfigurationFiles/${{ matrix.config_name }}.xml
- name: Build third-party-components
run: |
make third-party-components
make clean
- name: Build Library
run: |
make libraries
- name: Build All
run: |
make all
- name: Run-Tests
run: |
make run-tests
- name: Workaround GitHub-Actions-MacOS Issue with env.TMPDIR
run: |
mkdir /tmp/LOGS-ARCHIVE
cp $TMPDIR/Trace*.txt /tmp/LOGS-ARCHIVE
- name: DEBUG Workaround GitHub-Actions-MacOS Issue with env.TMPDIR
run: |
echo "TMPDIR=$TMPDIR"
echo "TMPDIR using ENV.TMPDIR=${{ env.TMPDIR }}"
# Just the echo line above shows empty, and then the ls line causes exit 1/failure
#ls -l ${{ env.TMPDIR }}/Trace*.txt
#if this gets fixed, then lose Workaround GitHub-Actions-MacOS, and directly reference ${{ env.TMPDIR }}/Trace*.txt in Archive Log Results
- name: Build System Info
run: |
df -h
- name: Archive Log Results
uses: actions/upload-artifact@v2
with:
name: Log Results (${{ matrix.displayTargetName }})
path: |
Builds/${{ matrix.config_name }}/PerformanceDump.txt
/tmp/LOGS-ARCHIVE
#${{ env.TMPDIR }}/Trace*.txt
- name: Archive Sample Results
uses: actions/upload-artifact@v2
with:
name: Samples (${{ matrix.displayTargetName }})
path: |
Builds/${{ matrix.config_name }}/Samples-*
build-n-test-Windows:
runs-on: ${{ matrix.runs_on }}
strategy:
matrix:
# Add to extra_config_args for build speed: --Xerces no --OpenSSL no --lzma no --boost no
include:
- displayTargetName: windows-x86-Debug
os: windows
runs_on: windows-latest
container_image: sophistsolutionsinc/stroika-buildvm-windows-cygwin-vs2k19
config_name: Debug
extra_config_args: --arch x86 --apply-default-debug-flags --trace2file enable
includeInDevBranchBuilds: true
# - displayTargetName: windows-x86-Release
# os: windows
# runs_on: windows-latest
# container_image: sophistsolutionsinc/stroika-buildvm-windows-cygwin-vs2k19
# config_name: Release
# extra_config_args: --arch x86 --apply-default-release-flags --trace2file enable
# includeInDevBranchBuilds: false
# - displayTargetName: windows-x86_64-Debug
# os: windows
# runs_on: windows-latest
# container_image: sophistsolutionsinc/stroika-buildvm-windows-cygwin-vs2k19
# config_name: Debug
# extra_config_args: --arch x86_64 --apply-default-debug-flags --trace2file enable
# includeInDevBranchBuilds: false
# - displayTargetName: windows-x86_64-Release
# os: windows
# runs_on: windows-latest
# container_image: sophistsolutionsinc/stroika-buildvm-windows-cygwin-vs2k19
# config_name: Release
# extra_config_args: --arch x86 --apply-default-release-flags --trace2file enable
# includeInDevBranchBuilds: false
env:
# vm has 2 virtual CPUs, but 8GB ram, so jobs=5 (empirical), and QUICK_BUILD avoids some internal testing
MAKEFLAGS: "--jobs=3 QUICK_BUILD=1"
ARTIFACTS_DIR: "c:/Artifacts/"
steps:
- uses: actions/checkout@v2
#
- name: Extract branch name
shell: bash
run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
id: extract_branch
- name: Build System Info
shell: "bash"
run: |
echo "CWD: `pwd`"
df -h
systeminfo
echo NUMBER_OF_PROCESSORS=$NUMBER_OF_PROCESSORS
- name: docker pull ${{ matrix.container_image }}
run: docker pull ${{ matrix.container_image }}
- name: Start docker build environment
run: |
docker run --tty --memory 5G --cpus 2 --storage-opt 'size=50GB' --detach --name buildContainer ${{ matrix.container_image }}
- name: Print Info about docker system
shell: "bash"
run: |
docker ps -a
docker exec buildContainer systeminfo
docker exec buildContainer df -h
- name: Git Checkout
shell: "bash"
run: |
docker exec buildContainer sh -c "git clone https://github.com/SophistSolutions/Stroika.git && cd Stroika && git checkout ${{ steps.extract_branch.outputs.branch }}"
- name: Configure
shell: "bash"
run: |
docker exec --workdir c:/Stroika buildContainer sh -c "./configure ${{ matrix.config_name }} ${{ matrix.extra_config_args }}"
docker exec --workdir c:/Stroika buildContainer cat ConfigurationFiles/${{ matrix.config_name }}.xml
- name: Build
shell: "bash"
run: |
docker exec --workdir c:/Stroika --env MAKEFLAGS="$MAKEFLAGS" buildContainer make all
- name: Run-Tests
shell: "bash"
run: |
docker exec --workdir c:/Stroika --env MAKEFLAGS="$MAKEFLAGS" buildContainer make run-tests
- name: Build System Info
shell: "bash"
run: |
df -h
docker exec buildContainer df -h
- name: Copy Build Artifacts
shell: "bash"
# due to flaws in docker (windows must stop) - and cp no wildcards
run: |
docker exec --workdir c:/Stroika buildContainer bash -c 'mkdir TRACE_LOGS && cp $TEMP/Trace*.txt TRACE_LOGS/'
docker stop buildContainer
docker cp buildContainer:Stroika/Builds/${{ matrix.config_name }}/ $ARTIFACTS_DIR 2> /dev/null
docker cp buildContainer:Stroika/TRACE_LOGS $ARTIFACTS_DIR 2> /dev/null
rm -rf $ARTIFACTS_DIR/{ThirdPartyComponents,Tests,*.lib}
- name: Archive Log Results
uses: actions/upload-artifact@v2
with:
name: Log Results (${{ matrix.displayTargetName }})
path: |
${{ env.ARTIFACTS_DIR }}PerformanceDump.txt
${{ env.ARTIFACTS_DIR }}TRACE_LOGS
- name: Archive Sample Results
uses: actions/upload-artifact@v2
with:
name: Samples (${{ matrix.displayTargetName }})
path: |
${{ env.ARTIFACTS_DIR }}Samples-*
但我只想在分支 = v2.1-Release 时构建一些配置。也就是说——在大多数情况下——只构建一个或两个配置,但在发布时构建更多配置。
我通过克隆脚本(工作流程)并重命名一些内容并注释掉它们来完成此操作。但是,如果该机制与矩阵元素一起使用,那就太好了。
我意识到有一个 'if' 功能可以添加到每个步骤,但这会创建大量禁用步骤的作业。我想要的是根本不为每个具有 if 部分评估为 false 的矩阵元素启动这些作业。
TLDR:您可以使用 one 工作流来完成您想要的操作,方法是过滤您想要在先前构建 job/step 中使用的配置,并使用该配置的结果在您的 build-n-test
作业中过滤为矩阵值。
更长的版本:
您可以创建一个 job
(即 build-n-test),其中 strategy.matrix
的值根据某些条件不同,通过设置strategy.matrix
到前一个作业的反序列化 output
的值(即 matrix_prep)。之前的工作将负责根据您的自定义条件构建 matrix
值。以下 yaml 对此进行了演示(稍后已包含一个副本,并添加了注释以进行解释):
name: Configurable Build Matrix
on: push
jobs:
matrix_prep:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: Check out code into the Go module directory
uses: actions/checkout@v2
- id: set-matrix
run: |
branchName=$(echo '${{ github.ref }}' | sed 's,refs/heads/,,g')
matrix=$(jq --arg branchName "$branchName" 'map(. | select((.runOn==$branchName) or (.runOn=="always")) )' matrix_includes.json)
echo ::set-output name=matrix::{\"include\":$(echo $matrix)}
build-n-test:
needs: matrix_prep
runs-on: ${{ matrix.runs_on }}
strategy:
matrix: ${{fromJson(needs.matrix_prep.outputs.matrix)}}
steps:
- run: echo "Hello ${{ matrix.someValue }}"
设置矩阵任务中使用的matrix_includes.json
文件的内容可以在本段之后找到。 要查看问题中的矩阵配置 JSON,请查看此答案的底部附近。 我选择了 JSON文件与工作流定义本身分开,因为我发现在工作流本身中包含原始 JSON 非常混乱(特别是如果 JSON 文件很大)。
[
{
"runs_on":"ubuntu-16.04",
"someValue":"Foo",
"runOn":"always"
},
{
"runs_on":"ubuntu-18.04",
"someValue":"Bar",
"runOn":"v2.1-Release"
},
{
"runs_on":"ubuntu-20.04",
"someValue":"Hello again",
"runOn":"v2.1-Release"
}
]
使用上面的设置,all 构建将包含一个配置,只有分支名称匹配 v2.1-Release 时才会包含两个配置。通过对 Workflow 文件中的 sed
和 jq
选项进行一些调整,可以放宽分支名称限制,这样您就可以为包含 [=24= 的所有分支配置 运行 ](而不是仅仅针对单个分支)。如果有兴趣,我可能会将其包含在此答案中(因为它不一定符合您当前的问题)。
set-matrix
职位说明
关于set-matrix
任务,请参考以下注意事项:
# ${{ github.ref }} returns the full git ref. As such, 'refs/heads/` should be stripped for easier future use
branchName=$(echo '${{ github.ref }}' | sed 's,refs/heads/,,g')
# Use jq to read in a json file that represents the matrix configuration. Each block has a 'runOn' property.
# The jq filter is setup to only output items that are set to 'always' or that have a branch name that matches
# the current branch.
matrix=$(jq --arg branchName "$branchName" 'map(. | select((.runOn==$branchName) or (.runOn=="always")) )' matrix_includes.json)
# This 'echo' uses a special syntax so that the output of this job is set correctly
echo ::set-output name=matrix::{\"include\":$(echo $matrix)}
工作流程说明
以下 yaml 内容应与上面相同,并添加一些注释以帮助解释:
name: Configurable Build Matrix
on: push
jobs:
matrix_prep:
# Using a separate job and agent so as to be able to use tools like 'sed' and 'jq'
runs-on: ubuntu-latest
# Defining outputs of a job allows for easier consumption and use
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
# Checking out code as the set-matrix step utilizes a file named matrix_includes.json
- name: Check out code into the Go module directory
uses: actions/checkout@v2
# This step is explained more in a following section
- id: set-matrix
run: |
branchName=$(echo '${{ github.ref }}' | sed 's,refs/heads/,,g')
matrix=$(jq --arg branchName "$branchName" 'map(. | select((.runOn==$branchName) or (.runOn=="always")) )' matrix_includes.json)
echo ::set-output name=matrix::{\"include\":$(echo $matrix)}\"
build-n-test:
# By stating 'needs' here, the output of 'matrix_prep' is available to this job
needs: matrix_prep
runs-on: ${{ matrix.runs_on }}
strategy:
# We need to convert the json string output into an object that the GitHub Workflow expects.
# Thankfully, the json-schema for Workflows allows 'matrix' to be set to an expression.
matrix: ${{fromJson(needs.matrix_prep.outputs.matrix)}}
steps:
# Output a configuration specific value as proof and as a sanity check
- run: echo "Hello ${{ matrix.someValue }}"
示范[=86=]
我为这个演示整理了两个文件:
- workflow definition(粘贴在下方)
- A JSON file to contain matrix information(粘贴在下方)
以下两个屏幕截图来自 运行s 在不同分支上使用相同的工作流定义。请注意,两者之间的 build-n-test 作业数量不同:
为主分支构建
这是因为第一个构建发生在 main
分支上,第二个构建发生在 v2.1-Release
分支上。从上面包含的 matrix_includes.json
文件可以看出,这是预期的,因为当分支为 [=28= 时,两个配置设置为 运行 only ],并且只有一个配置设置为运行 always.
更多细节
矩阵配置过滤
过滤是通过使用 json 数组中的 jq 到 select 个对象来完成的,这些对象的 runOn
值设置为 always
或者匹配当前 branchName
。这是我之前提到的对您的逻辑的轻微调整:我没有说 includeInDevBranchBuilds
,而是使用 runOn
,因为它似乎更适合这个特定示例。
分行名称
set-matrix
步骤使用上一行中设置的值:branchName=$(echo '${{ github.ref }}' | sed 's,refs/heads/.*-,,g')
。此行将从分支引用中删除 refs/heads/
,并将结果存储在值 branchName
中。例如,如果您的分支是 2.1-Release
,branchName
将设置为 2.1-Release
,并且之前的过滤器将匹配任何具有 "runOn":"2.1-Release"
的对象或 "runOn":"always"
.
JSON 文件
创建 JSON 文件是为了模拟您链接的工作流中 includes
语句的 内容 。 JSON 用作 GitHub 动作具有内置 JSON 函数。作为示例,以下是我将 matrix:include
部分转换为 JSON 的看法。 请注意,我已将 includeInDevBranchBuilds
更改为 runOn
,并将值设置为 always
或 v2.1-Release
。
[
{
"displayTargetName": "centos-8",
"os": "unix",
"compiler": "g++",
"runs_on": "ubuntu-latest",
"container_image": "sophistsolutionsinc/stroika-buildvm-centos-8-small",
"cpp_version": "c++17",
"config_name": "Release",
"extra_config_args": "--apply-default-release-flags --trace2file enable",
"runOn": "always"
},
{
"displayTargetName": "ubuntu-18.04-g++-8 (Debug)",
"os": "unix",
"compiler": "g++-8",
"runs_on": "ubuntu-latest",
"container_image": "sophistsolutionsinc/stroika-buildvm-ubuntu1804-regression-tests",
"cpp_version": "c++17",
"config_name": "Debug",
"extra_config_args": "--apply-default-debug-flags --trace2file enable",
"runOn": "always"
},
{
"displayTargetName": "ubuntu-20.04-g++-9 (Debug)",
"os": "unix",
"compiler": "g++-9",
"runs_on": "ubuntu-latest",
"container_image": "sophistsolutionsinc/stroika-buildvm-ubuntu2004-regression-tests",
"cpp_version": "c++17",
"config_name": "Debug",
"extra_config_args": "--apply-default-debug-flags --trace2file enable",
"runOn": "v2.1-Release"
},
{
"displayTargetName": "ubuntu-20.04-g++-10 (Debug)",
"os": "unix",
"compiler": "g++-10",
"runs_on": "ubuntu-latest",
"container_image": "sophistsolutionsinc/stroika-buildvm-ubuntu2004-regression-tests",
"cpp_version": "c++17",
"config_name": "Debug",
"extra_config_args": "--apply-default-debug-flags --trace2file enable",
"runOn": "v2.1-Release"
},
{
"displayTargetName": "ubuntu-20.04-g++-10",
"os": "unix",
"compiler": "g++-10",
"runs_on": "ubuntu-latest",
"container_image": "sophistsolutionsinc/stroika-buildvm-ubuntu2004-regression-tests",
"cpp_version": "c++17",
"config_name": "Release",
"extra_config_args": "--apply-default-release-flags --trace2file enable",
"runOn": "always"
},
{
"displayTargetName": "ubuntu-20.04-g++-10-c++2a",
"os": "unix",
"compiler": "g++-10",
"runs_on": "ubuntu-latest",
"container_image": "sophistsolutionsinc/stroika-buildvm-ubuntu2004-regression-tests",
"cpp_version": "c++2a",
"config_name": "Release",
"extra_config_args": "--apply-default-release-flags --trace2file enable",
"runOn": "v2.1-Release"
},
{
"displayTargetName": "ubuntu-20.04-clang++-10",
"os": "unix",
"compiler": "clang++-10",
"runs_on": "ubuntu-latest",
"container_image": "sophistsolutionsinc/stroika-buildvm-ubuntu2004-regression-tests",
"cpp_version": "c++17",
"config_name": "Release",
"extra_config_args": "--apply-default-release-flags --trace2file enable",
"runOn": "v2.1-Release"
}
]
添加另一个答案,因为这个答案使用 custom Actions 而不是内联-shell 脚本。免责声明:我是其中一个动作的维护者(感谢您的启发)。
通过使用两个额外的操作,
您可以实现与我的其他答案中的
.github/workflows/sample.yml
name: Configurable Build Matrix
on: push
jobs:
matrix_prep:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- uses: actions/checkout@v2
- uses: nelonoel/branch-name@v1.0.1
- id: set-matrix
uses: JoshuaTheMiller/conditional-build-matrix@0.0.1
with:
filter: '[?runOn==`${{ env.BRANCH_NAME }}` || runOn==`always`]'
build-n-test:
needs: matrix_prep
runs-on: ${{ matrix.runs_on }}
strategy:
matrix: ${{fromJson(needs.matrix_prep.outputs.matrix)}}
steps:
- run: echo "Hello ${{ matrix.someValue }}"
.github/workflows/matrix_includes.json
[
{
"runs_on":"ubuntu-16.04",
"someValue":"Foo",
"runOn":"always"
},
{
"runs_on":"ubuntu-18.04",
"someValue":"Bar",
"runOn":"v2.1-Release"
},
{
"runs_on":"ubuntu-20.04",
"someValue":"Hello again",
"runOn":"v2.1-Release"
}
]
两个文件都可以在repo of the Action
中找到备注
filter
输入也使用不同的过滤语法:它使用 JMESPATH. I've found JMESPATH to be very well documented and supported. To learn more about how the sytax works, you can visit their interactive examples page. 而不是 jq
- 默认情况下,
conditional-build-matrix
操作会在.github/workflows/
文件夹下查找名为matrix_includes.json
的文件(与其他答案中包含的相同文件)。这个位置可以自定义,是documented on the Action's page.