Yaml 为不同的GitHub操作作业共享相同的步骤

Yaml 为不同的GitHub操作作业共享相同的步骤,yaml,github-actions,Yaml,Github Actions,我有一个跨平台的项目,它将建立在两个平台上:mac和linux(ubuntu) 我的管道包含3个作业: 准备好docker形象,并尽一切必要构建项目 在准备好的docker容器中构建ubuntu,具体取决于步骤1 建立在MacOS之上,不需要任何东西 linux和macos的步骤完全相同。但是矩阵有很大的不同,linux构建也不尽相同 在容器内运行 有没有办法在两个不同的工作之间共享步骤 我尝试了YAML锚,但GitHub不支持它们 完整工作流程 on: push: branches

我有一个跨平台的项目,它将建立在两个平台上:mac和linux(ubuntu)

我的管道包含3个作业:

  • 准备好docker形象,并尽一切必要构建项目
  • 在准备好的docker容器中构建ubuntu,具体取决于步骤1
  • 建立在MacOS之上,不需要任何东西
  • linux和macos的步骤完全相同。但是矩阵有很大的不同,linux构建也不尽相同 在容器内运行

    有没有办法在两个不同的工作之间共享步骤

    我尝试了YAML锚,但GitHub不支持它们

    完整工作流程

    on:
      push:
        branches: [ main, support/1.2.x ]
      pull_request:
        branches: [ main, support/1.2.x ]
    
    jobs:
      Docker-iroha-builder:
        runs-on: ubuntu-latest
        steps:
          -
            name: Checkout
            uses: actions/checkout@v2
          -
            name: Set up Docker Buildx
            uses: docker/setup-buildx-action@v1
          -
            name: Cache Docker layers
            uses: actions/cache@v2
            with:
              path: /tmp/.buildx-cache
              key: ${{ runner.os }}-buildx-${{ github.sha }}
              restore-keys: |
                ${{ runner.os }}-buildx-
          -
            name: Login to DockerHub
            uses: docker/login-action@v1 
            with:
              username: ${{ secrets.DOCKERHUB_USERNAME }}
              password: ${{ secrets.DOCKERHUB_TOKEN }}
          -
            name: Build and push
            uses: docker/build-push-action@v2
            with:
              file: docker/develop/Dockerfile.builder
              # context: .
              push: true
              tags: ${{ secrets.DOCKERHUB_ORG }}/iroha:builder
              cache-from: type=local,src=/tmp/.buildx-cache
              cache-to: type=local,dest=/tmp/.buildx-cache-new
          -
            # Temp fix
            # https://github.com/docker/build-push-action/issues/252
            # https://github.com/moby/buildkit/issues/1896
            name: Move cache
            run: |
              rm -rf /tmp/.buildx-cache
              mv /tmp/.buildx-cache-new /tmp/.buildx-cache
    
    
      build-iroha-ubuntu:
        needs: Docker-iroha-builder
        runs-on: ubuntu-latest
        container: ikyb/iroha:builder
        strategy:
          fail-fast: false
          matrix:
            cc: [ gcc-9, gcc-10, clang ]  ##todo g++-10
            USE_BURROW: [ -DUSE_BURROW=OFF ]
            debrel: [ Debug ] #,Release, RelWithDebInfo
        steps:
          - ## Takes 22 seconds with default github runner
            name: Homebrew
            run: brew install cmake ninja coreutils
            if: ${{ runner.os == 'MacOS' }}
          -
            name: Checkout
            uses: actions/checkout@v2
          -
            name: Cache vcpkg
            uses: actions/cache@v2
            with:
              path: |
                build-vcpkg
                build/vcpkg_installed
                $HOME/.cache/vcpkg
              key:          ${{ runner.os }}-vcpkg-${{ github.sha }}
              restore-keys: ${{ runner.os }}-vcpkg-
          - 
            name: Build Iroha vcpkg dependancies
            run: ./vcpkg/build_iroha_deps.sh $PWD/build-vcpkg
          - 
            name: CMake configure
            run: |
              export CC=${{ matrix.cc }} CXX=$(echo ${{ matrix.cc }} | sed -es,gcc,g++, -es,clang,clang++,)
              cmake -B build -DCMAKE_TOOLCHAIN_FILE=$PWD/build-vcpkg/scripts/buildsystems/vcpkg.cmake \
                 ${{ matrix.USE_BURROW }} -GNinja #-DCMAKE_VERBOSE_MAKEFILE=ON
          -
            name: CMake build
            run: cmake --build build --config ${{ matrix.debrel }}
    
      build-iroha-macos:
        runs-on: macos-latest
        strategy:
          fail-fast: false
          matrix:
            USE_BURROW: [ -DUSE_BURROW=OFF ]
            debrel: [ Debug,Release ]
        steps:
          - ## Takes 22 seconds with default github runner
            name: Homebrew
            run: brew install cmake ninja coreutils
            if: ${{ runner.os == 'MacOS' }}
          -
            name: Checkout
            uses: actions/checkout@v2
          -
            name: Cache vcpkg
            uses: actions/cache@v2
            with:
              path: |
                build-vcpkg
                build/vcpkg_installed
                $HOME/.cache/vcpkg
              key:          ${{ runner.os }}-vcpkg-${{ github.sha }}
              restore-keys: ${{ runner.os }}-vcpkg-
          - 
            name: Build Iroha vcpkg dependancies
            run: ./vcpkg/build_iroha_deps.sh $PWD/build-vcpkg
          - 
            name: CMake configure
            run: |
              export CC=${{ matrix.cc }} CXX=$(echo ${{ matrix.cc }} | sed -es,gcc,g++, -es,clang,clang++,)
              cmake -B build -DCMAKE_TOOLCHAIN_FILE=$PWD/build-vcpkg/scripts/buildsystems/vcpkg.cmake \
                 ${{ matrix.USE_BURROW }} -GNinja #-DCMAKE_VERBOSE_MAKEFILE=ON
          -
            name: CMake build
            run: cmake --build build --config ${{ matrix.debrel }}
    
    
    TL;博士 我用shell工具解决了我的问题
    yq

    yq eval 'explode(.)' file.yml
    
    长话短说 YAML中的GitHub工作流描述不支持锚定。 有几种变通方法=>不管怎样,它们都可以从源代码构建编辑工作流yaml。 因此,我建议再做一个基于YAML工具的
    make workflows.sh

    用法
  • 将工作流移动到
    .github/*.src.yml
  • make workflows.sh
    放入目录
    .github/
  • (可选)复制或链接
    pre-commit.sh
    .git/hooks/pre-commit
    比如
    ln-s../.github/pre-commit.sh.git/hooks/pre-commit

  • 文件
    makeworkflows.sh

    #!/usr/bin/env bash
    set -euo pipefail
    
    ## The script expands '*.src.yml' from $1(default: script's directory) 
    ## to $2 (default:subdirectory 'workflows') with corresponding name '*.yml'
    ## Main goal is to dereference YAML anchors.
    ## Deals only with Git cached/indexed files
    ## Set -x to debug
    
    script_dir=$(dirname $(realpath "$0"))
    dir_from=${1:-${script_dir}}
    dir_to=${2:-workflows}
    cd $dir_from
    
    edited=
    for f in $(git status -s -- \*.src.yml | sed 's,^.. ,,') ;do
        readonly out=$(echo $f | sed s,.src.yml\$,.yml,)
        readonly wout=$dir_to/$out
        readonly tempout=$(mktemp)
        trap "rm -f $tempout" EXIT
        echo >>$tempout "## DO NOT EDIT"
        echo >>$tempout "## Generated from $f with $(basename $0)"
        echo >>$tempout ""
        yq eval 'explode(.)' $f >>$tempout
        if ! diff -q $wout $tempout &>/dev/null ;then
            mv $tempout $wout
            edited+="'$out' "
        fi
    done
    
    if [[ -n "$edited" ]] 
    then echo >&2 "make-workflows: these files were edited: $edited"
    else echo >&2 "make-workflows: everything is up to date"
    fi
    

    文件pre-commit.sh

    #!/usr/bin/env bash
    set -euo pipefail
    
    gitroot=$(git rev-parse --show-toplevel)
    
    cd $gitroot
    ./.github/make-workflows.sh
    git add .github/workflows
    
    链接

  • 这是很多人问的问题,你可以在这里()和这里()找到一些关于它的参考资料。目前,一个解决方案似乎是使用
    复合运行步骤操作
    (),另一个解决方案是使用
    YAML锚定
    ()。我找到了下一个试图解决此问题的材料:1。2.3.