title: how to make a github action matrix element conditional
body: <p>I have a workflow that uses 'strategy' = 'matrix' and a list of specific configurations to build.</p>
  <p><a href="https://raw.githubusercontent.com/SophistSolutions/Stroika/v2.1-Release/.github/workflows/build-N-test-Linux-v2.1-Dev.yml" rel="noreferrer">Link to Workflow YAML (also provided below)</a></p>
  <pre class="lang-yaml prettyprint-override"><code>#
  # 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: &quot;ignored&quot;
          required: false
          default: &quot;&quot;
  
  ## 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
      ### https://stackoverflow.com/questions/65384420/how-to-make-a-github-action-matrix-element-conditional/65385385#65385385
      ###
      #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: &quot;--jobs=3 QUICK_BUILD=1&quot;
      container: ${{ matrix.container_image }}
      steps:
        - uses: actions/checkout@v2
        - name: Build System Info
          if: ${{ matrix.os=='unix' }}
          run: |
            lsb_release -d 2&gt;/dev/null || true
            echo &quot;CWD=&quot; `pwd`
            echo &quot;nproc=&quot; `nproc`
            grep &quot;model name&quot; /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 &quot;CWD=&quot; `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: &quot;--jobs=3 QUICK_BUILD=1&quot;
      steps:
        - uses: actions/checkout@v2
        - name: Build System Info
          run: |
            echo &quot;CWD: `pwd`&quot;
            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 &quot;TMPDIR=$TMPDIR&quot;
            echo &quot;TMPDIR using ENV.TMPDIR=${{ env.TMPDIR }}&quot;
            # 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: &quot;--jobs=3 QUICK_BUILD=1&quot;
        ARTIFACTS_DIR: &quot;c:/Artifacts/&quot;
      steps:
        - uses: actions/checkout@v2
        # https://stackoverflow.com/questions/58033366/how-to-get-current-branch-within-github-actions
        - name: Extract branch name
          shell: bash
          run: echo &quot;##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})&quot;
          id: extract_branch
        - name: Build System Info
          shell: &quot;bash&quot;
          run: |
            echo &quot;CWD: `pwd`&quot;
            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: &quot;bash&quot;
          run: |
            docker ps -a
            docker exec buildContainer systeminfo
            docker exec buildContainer df -h
        - name: Git Checkout
          shell: &quot;bash&quot;
          run: |
            docker exec buildContainer sh -c &quot;git clone https://github.com/SophistSolutions/Stroika.git &amp;&amp; cd Stroika &amp;&amp; git checkout ${{ steps.extract_branch.outputs.branch }}&quot;
        - name: Configure
          shell: &quot;bash&quot;
          run: |
            docker exec --workdir c:/Stroika buildContainer sh -c &quot;./configure ${{ matrix.config_name }} ${{ matrix.extra_config_args }}&quot;
            docker exec --workdir c:/Stroika buildContainer cat ConfigurationFiles/${{ matrix.config_name }}.xml
        - name: Build
          shell: &quot;bash&quot;
          run: |
            docker exec --workdir c:/Stroika --env MAKEFLAGS=&quot;$MAKEFLAGS&quot; buildContainer make all
        - name: Run-Tests
          shell: &quot;bash&quot;
          run: |
            docker exec --workdir c:/Stroika --env MAKEFLAGS=&quot;$MAKEFLAGS&quot; buildContainer make run-tests
        - name: Build System Info
          shell: &quot;bash&quot;
          run: |
            df -h
            docker exec buildContainer df -h
        - name: Copy Build Artifacts
          shell: &quot;bash&quot;
          # due to flaws in docker (windows must stop) - and cp no wildcards
          run: |
            docker exec --workdir c:/Stroika buildContainer bash -c 'mkdir TRACE_LOGS &amp;&amp; cp $TEMP/Trace*.txt TRACE_LOGS/'
            docker stop buildContainer
            docker cp buildContainer:Stroika/Builds/${{ matrix.config_name }}/ $ARTIFACTS_DIR 2&gt; /dev/null
            docker cp buildContainer:Stroika/TRACE_LOGS $ARTIFACTS_DIR 2&gt; /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-*
  </code></pre>
  <p>But I'd like to ONLY build some of the configurations ONLY when the branch = v2.1-Release. That is - for the most part - just build one or two configurations but build a bunch more on release.</p>
  <p>I've accomplished this by CLONING the script (workflow) and renaming a few things and commenting things out. But it would be nice if the mechanism worked with matrix elements.</p>
  <p>I REALIZE there is an 'if' feature that can be added to each step, but that would create tons of jobs with disabled steps. What I want, is to just not spin up those jobs at all for each matrix element that has the if part evaluates false.</p>