Skip to content

ci: Use cache for build. #1847

ci: Use cache for build.

ci: Use cache for build. #1847

Workflow file for this run

name: CI
on:
pull_request:
push:
branches:
- master
tags:
- "v*"
schedule:
- cron: '5 4 * * 1'
workflow_dispatch:
jobs:
build-and-test:
name: ${{ matrix.os }}_${{ matrix.boost }}_${{ matrix.compiler }}_${{ matrix.geos }}
strategy:
matrix:
os: [ubuntu, macos, windows]
boost: ['latest'] # 1_66 disabled because of discrepancies in wide_oval
geos: ['3.13.1', 'latest', 'none']
compiler: ['g++-10', 'g++'] # TODO: Put clang++ back again.
exclude:
- os: macos # Temporarily disable until fixed
- os: macos
boost: '1_66'
- os: macos
compiler: 'g++-10'
- os: windows
compiler: 'clang++'
- os: windows
compiler: 'g++-10'
- os: windows
boost: '1_66'
include:
- os: ubuntu
geos: '3.13.1'
code_coverage: "--enable-code-coverage"
quick: "--quick"
- os: ubuntu
shell: '/usr/bin/bash -l -e -o pipefail {0}'
local_install_path: '$HOME/.local'
ccache_path: '$HOME/.ccache'
- os: windows
shell: msys2 {0}
local_install_path: '/d/a/pcb2gcode/.local'
ccache_path: '/d/a/pcb2gcode/.ccache'
- compiler: 'g++-10'
werror_flag: '-Werror'
- compiler: 'g++'
werror_flag: ''
runs-on: ${{ matrix.os }}-latest
defaults:
run:
shell: ${{ matrix.shell }}
steps:
- name: Setup msys2
if: matrix.os == 'windows'
uses: msys2/setup-msys2@v2
with:
msystem: MINGW64
update: true
install: >-
autoconf
automake
base-devel
bash
gettext-devel
git
libtool
mingw-w64-x86_64-boost
mingw-w64-x86_64-cairo
mingw-w64-x86_64-cmake
mingw-w64-x86_64-gcc
mingw-w64-x86_64-gtkmm
mingw-w64-x86_64-ccache
zip
- name: Checkout pcb2gcode source
uses: actions/checkout@v3
- name: Setup paths and env
run: |
mkdir -p ${{ matrix.local_install_path }}/bin
mkdir -p ${{ matrix.local_install_path }}/lib/pkgconfig
rm -f ~/.bash_profile
echo "export PKG_CONFIG_PATH='${{ matrix.local_install_path }}/lib/pkgconfig:$PKG_CONFIG_PATH'" >> ~/.bash_profile
echo "export LD_LIBRARY_PATH='${{ matrix.local_install_path }}/lib:$LD_LIBRARY_PATH'" >> ~/.bash_profile
echo "export PATH='${{ matrix.local_install_path }}/bin:$PATH'" >> ~/.bash_profile
echo "export LOCAL_INSTALL_PATH='${{ matrix.local_install_path }}'" >> ~/.bash_profile
echo $GITHUB_JSON
env:
GITHUB_JSON: ${{ toJSON(github) }}
- name: Windows specific setup
if: matrix.os == 'windows'
run: |
echo "export NUM_CPUS='$((`nproc --all` * 4))'" >> ~/.bash_profile
- name: Ubuntu specific setup
if: matrix.os == 'ubuntu'
run: |
sudo apt-get update
sudo apt-get install libgtkmm-2.4-dev moreutils autopoint libc6-dbg librsvg2-dev parallel ccache
echo "export NUM_CPUS='$((`nproc --all` * 4))'" >> ~/.bash_profile
- name: Set clang as default compiler
if: matrix.compiler == 'clang++'
run: |
echo "export CC='`which clang`'" >> ~/.bash_profile
echo "export CXX='`which clang++`'" >> ~/.bash_profile
- name: g++-10 specific setup
if: matrix.compiler == 'g++-10' && matrix.os == 'ubuntu'
run: |
sudo apt-get install g++-10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 --slave /usr/bin/g++ g++ /usr/bin/g++-10 --slave /usr/bin/gcov gcov /usr/bin/gcov-10
sudo update-alternatives --set gcc /usr/bin/gcc-10
- name: g++ specific setup
if: matrix.compiler == 'g++' && matrix.os == 'ubuntu'
run: |
sudo apt-get install g++
- name: Macos specific setup
if: matrix.os == 'macos'
run: |
brew update
rm /usr/local/bin/2to3
brew upgrade python@3
brew reinstall -s libtool
brew install boost gtkmm moreutils gettext librsvg automake pkg-config
brew upgrade wget
hash -r
ln -f -s `which glibtoolize` ${LOCAL_INSTALL_PATH}/bin/libtoolize
ln -f -s `which glibtool` ${LOCAL_INSTALL_PATH}/bin/libtool
hash -r
echo "export BOOST_ROOT='/usr/local/opt/boost'" >> ~/.bash_profile
echo "export NUM_CPUS='$((`sysctl -n hw.logicalcpu` * 4))'" >> ~/.bash_profile
echo "export PKG_CONFIG_PATH='$PKG_CONFIG_PATH:/usr/local/opt/libffi/lib/pkgconfig'" >> ~/.bash_profile
echo "export CPPFLAGS_gerbv='-DQUARTZ'" >> ~/.bash_profile
echo "export PATH='/usr/local/opt/gettext/bin:$PATH'" >> ~/.bash_profile
rm /usr/local/include/boost
- name: Macos geos
if: matrix.geos == 'latest' && matrix.os == 'macos'
run:
brew install geos
- name: Ubuntu geos
if: matrix.geos == 'latest' && matrix.os == 'ubuntu'
run:
sudo apt-get install -y libgeos++-dev
- name: Ubuntu boost
if: matrix.boost == 'latest' && matrix.os == 'ubuntu'
run:
sudo apt-get install -y libboost-program-options-dev
- name: Windows geos
if: matrix.geos == 'latest' && matrix.os == 'windows'
run:
pacman -S --noconfirm mingw-w64-x86_64-geos
- name: Display information about build environment
run: |
pwd
cat ~/.bash_profile
env
if command -v g++; then g++ --version; fi
if command -v clang++; then clang++ --version; fi
if command -v pkg-config; then pkg-config --version; fi
if command -v m4; then m4 --version; fi
- name: Sanitize cache key
id: sanitize-key
run: |
echo "key=$(echo '${{ matrix.os }}_${{ matrix.boost }}_${{ matrix.compiler }}_${{ matrix.geos }}' | sed 's/+/plus/g')" >> $GITHUB_OUTPUT
if command -v cygpath; then
echo "path=$(cygpath -w ${{ matrix.local_install_path }})" >> $GITHUB_OUTPUT
echo "ccache_path=$(cygpath -w ${{ matrix.ccache_path }})" >> $GITHUB_OUTPUT
else
echo "path=${{ matrix.local_install_path }}" >> $GITHUB_OUTPUT
echo "ccache_path=${{ matrix.ccache_path }}" >> $GITHUB_OUTPUT
fi
- name: ccache config
run: |
ccache --version
ccache --show-config
ccache --set-config=cache_dir=${{ matrix.ccache_path }}
ccache -p
ccache -z
- name: Restore cache
uses: actions/cache/restore@v5
with:
path: ${{ steps.sanitize-key.outputs.path }}
key: ${{ steps.sanitize-key.outputs.key }}-${{ github.run_id }}-${{ github.run_attempt }}
restore-keys: |
${{ steps.sanitize-key.outputs.key }}-
- name: Restore ccache
uses: actions/cache/restore@v5
with:
path: ${{ steps.sanitize-key.outputs.ccache_path }}
key: ccache-${{ steps.sanitize-key.outputs.key }}-${{ github.run_id }}-${{ github.run_attempt }}
restore-keys: |
ccache-${{ steps.sanitize-key.outputs.key }}-
- name: Default don't update cache
run: echo "UPDATE_CACHE=false" >> $GITHUB_ENV
- name: Build and install boost
if: matrix.os == 'ubuntu' && matrix.boost != 'latest'
env:
BOOST: ${{ matrix.boost }}_0
run: |
if [ ! -d "${LOCAL_INSTALL_PATH}/include/boost" ]; then
echo "UPDATE_CACHE=true" >> $GITHUB_ENV
pushd ~
for i in {1..5}; do
wget -q -T20 -t1 -O "boost_${BOOST}.tar.bz2" "https://github.com/pcb2gcode/pcb2gcode/releases/download/v2.0.0/boost_${BOOST}.tar.bz2" && break;
done
tar xjf "boost_${BOOST}.tar.bz2"
pushd boost_${BOOST}
./bootstrap.sh --with-libraries=program_options --prefix=/tmp/boost
./b2 -j ${NUM_CPUS}
./b2 install
popd
popd
fi
echo "export BOOST_ROOT='$(echo /tmp/boost)'" >> ~/.bash_profile
- name: Build and install geos
if: matrix.os != 'macos' && matrix.geos != 'none' && matrix.geos != 'latest'
run: |
if ! test -d "${LOCAL_INSTALL_PATH}/include/geos" || ! test -f ${LOCAL_INSTALL_PATH}/bin/geos.version || ! grep -qx "$(git ls-remote https://github.com/libgeos/geos.git ${{ matrix.geos }} )" ${LOCAL_INSTALL_PATH}/bin/geos.version; then
git ls-remote https://github.com/libgeos/geos.git ${{ matrix.geos }} > ${LOCAL_INSTALL_PATH}/bin/geos.version
echo "UPDATE_CACHE=true" >> $GITHUB_ENV
pushd ~
git clone --depth 1 --branch ${{ matrix.geos }} https://github.com/libgeos/geos.git
pushd geos
mkdir build
pushd build
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release .. -DCMAKE_INSTALL_PREFIX=${LOCAL_INSTALL_PATH}
make -j ${NUM_CPUS}
make install
popd
popd
popd
fi
geos-config --version
- name: coverage specific setup
if: matrix.os == 'ubuntu' && matrix.code_coverage
run: |
sudo apt-get install libperlio-gzip-perl libjson-perl libcapture-tiny-perl
pushd ~
git clone --branch=v1.16 --depth=1 https://github.com/linux-test-project/lcov.git
pushd lcov
make PREFIX=${LOCAL_INSTALL_PATH} install
hash -r
lcov --version
- name: Install gerbv
run: |
echo "gerbv/main commit sha is $(git ls-remote https://github.com/eyal0/gerbv.git heads/main)"
if ! gerbv --version || ! test -f ${LOCAL_INSTALL_PATH}/bin/gerbv.version || ! grep -qx "$(git ls-remote https://github.com/eyal0/gerbv.git heads/main)" ${LOCAL_INSTALL_PATH}/bin/gerbv.version; then
git ls-remote https://github.com/eyal0/gerbv.git heads/main > ${LOCAL_INSTALL_PATH}/bin/gerbv.version
echo "UPDATE_CACHE=true" >> $GITHUB_ENV
pushd ~
git clone --depth=1 --branch=main https://github.com/eyal0/gerbv.git
pushd gerbv
sh autogen.sh
./configure CPPFLAGS=$CPPFLAGS_gerbv --disable-update-desktop-database --prefix=${LOCAL_INSTALL_PATH}
make -j ${NUM_CPUS}
make install
popd
popd
fi
gerbv --version
- name: Install valgrind
if: matrix.os == 'ubuntu'
run: |
if ! valgrind --version || ! grep -qx "$(git ls-remote https://github.com/eyal0/valgrind.git master)" ${LOCAL_INSTALL_PATH}/bin/valgrind.version; then
git ls-remote https://github.com/eyal0/valgrind.git master > ${LOCAL_INSTALL_PATH}/bin/valgrind.version
echo "UPDATE_CACHE=true" >> $GITHUB_ENV
pushd ~
git clone --depth=1 --branch=master https://github.com/eyal0/valgrind.git
pushd valgrind
sh autogen.sh
./configure --prefix=${LOCAL_INSTALL_PATH}
make -j ${NUM_CPUS}
make install
popd
popd
fi
valgrind --version
- name: Install parallel
if: matrix.os != 'windows'
run: |
if ! parallel --version; then
echo "UPDATE_CACHE=true" >> $GITHUB_ENV
pushd ~
for i in {1..5}; do
wget -q -T5 -t1 -O "parallel-latest.tar.bz2" 'https://ftpmirror.gnu.org/parallel/parallel-latest.tar.bz2' && break;
done
mkdir parallel
pushd parallel
tar xjf "../parallel-latest.tar.bz2"
pushd parallel-*
./configure --prefix=${LOCAL_INSTALL_PATH}
make
make install
popd
popd
popd
fi
parallel --version
- name: Finalize setup
run: |
hash -r
- name: Autoreconf pcb2gcode
run: autoreconf -fvi
- name: Configure pcb2gcode
run: >-
CXX="`which ccache` ${CXX:-`which g++`}" ./configure pcb2gcode_CPPFLAGS_EXTRA=${{ matrix.werror_flag }}
--disable-dependency-tracking
--disable-silent-rules
--enable-static-boost
--enable-static
${{ matrix.code_coverage }}
|| (cat config.log && false)
- name: Remove debug flags from coverage builds
if: matrix.code_coverage
run: sed -i 's/-g /-g0 /g' Makefile
- name: Make pcb2gcode
run: make -j ${NUM_CPUS}
- name: Display pcb2gcode version
run: |
./pcb2gcode --version
GIT_COMMIT=$(git log -1 --format='%h')
PCB2GCODE_VERSION=$(./pcb2gcode --version | head -1)-g${GIT_COMMIT}
echo "PCB2GCODE_VERSION=$PCB2GCODE_VERSION" >> $GITHUB_ENV
- name: Run examples
if: github.event_name == 'schedule' && matrix.os != 'windows' && ! matrix.code_coverage
run: |
pushd testing/gerbv_example
ls | parallel -k -j ${NUM_CPUS} --halt soon,fail=1 '
{ echo "::group::Running on {}";
pushd {};
if [[ -f "no-valgrind" ]]; then
cat no-valgrind;
fi;
if [[ -f "no-valgrind" || "${{ matrix.os }}" != "ubuntu" ]]; then
time ../../../pcb2gcode || exit;
else
time valgrind --error-exitcode=127 --errors-for-leak-kinds=definite --leak-check=full -s --exit-on-first-error=yes --expensive-definedness-checks=yes -- ../../../pcb2gcode || exit;
fi;
popd;
echo "::endgroup::";
} 2>&1'
popd
- name: Run examples
if: github.event_name == 'schedule' && matrix.os == 'windows' && ! matrix.code_coverage
run: |
for d in testing/gerbv_example/*; do
if [ -d "$d" ]; then
pushd "$d"
time ../../../pcb2gcode || exit $?
popd
fi
done
- name: Reset coverage
if: matrix.code_coverage
continue-on-error: true
run: lcov --directory . -z
- name: Run unit tests
if: ! (matrix.os == 'ubuntu' && ! matrix.code_coverage)
env:
VERBOSE: 1
SKIP_GERBERIMPORTER_TESTS_PNG: 1
run: make -j ${NUM_CPUS} check || (cat test-suite.log && false)
- name: Run unit tests with valgrind
if: matrix.os == 'ubuntu' && ! matrix.code_coverage
env:
VERBOSE: 1
SKIP_GERBERIMPORTER_TESTS_PNG: 1
run: make -j ${NUM_CPUS} check-valgrind || (cat mem-test-suite.log && false)
- name: Run integration tests
if: matrix.geos != 'none' && matrix.geos != 'latest' && matrix.os != 'windows'
run: |
sudo apt-get install python3-setuptools
pip3 install --user wheel colour_runner unittest2 termcolor concurrencytest in_place
/usr/bin/python3 ./integration_tests.py --pcb2gcode-binary "$(pwd)/pcb2gcode" -j ${NUM_CPUS} ${{ matrix.quick }}
# Skip the Windows integration test because there are tiny discrepencies from expected outputs.
#- name: Run integration tests on Windows
# if: matrix.geos != 'none' && matrix.geos != 'latest' && matrix.os == 'windows'
# run: |
# pacman -S --noconfirm mingw-w64-x86_64-python-pip
# pip3 install --user wheel colour_runner unittest2 termcolor concurrencytest in_place
# python3 ./integration_tests.py --pcb2gcode-binary "$(pwd)/pcb2gcode.exe" -j ${NUM_CPUS} ${{ matrix.quick }}
- name: Gather coverage
if: matrix.code_coverage
run: |
lcov --rc lcov_branch_coverage=1 --rc lcov_function_coverage=1 --directory . --capture --no-external --output-file "pcb2gcode-lcov.info"
lcov --rc lcov_branch_coverage=1 --rc lcov_function_coverage=1 -r "pcb2gcode-lcov.info" '*_tests.cpp' -o "pcb2gcode-lcov.info"
- name: Upload coverage artifact
if: matrix.code_coverage
uses: actions/upload-artifact@v4
with:
name: lcov-${{ steps.sanitize-key.outputs.key }}
path: pcb2gcode-lcov.info
- name: Prepare build for upload for Ubuntu and Macos
if: matrix.os != 'windows'
run: |
mkdir -p pcb2gcode-${PCB2GCODE_VERSION}/.libs
cp ./pcb2gcode pcb2gcode-${PCB2GCODE_VERSION}/
if [[ -e ${LOCAL_INSTALL_PATH}/lib/libgerbv.so.1 ]]; then
cp -L ${LOCAL_INSTALL_PATH}/lib/libgerbv.so.1 pcb2gcode-${PCB2GCODE_VERSION}/.libs;
fi
if [[ -f ${LOCAL_INSTALL_PATH}/lib/libgeos.so.* ]]; then
cp -L ${LOCAL_INSTALL_PATH}/lib/libgeos.so.* pcb2gcode-${PCB2GCODE_VERSION}/.libs;
fi
cat > pcb2gcode-${PCB2GCODE_VERSION}/pcb2gcode.sh << EOF
#!/bin/bash
if [[ \$EUID > 0 ]]; then MAYBE_SUDO=sudo; fi
export DEBIAN_FRONTEND=noninteractive
\$MAYBE_SUDO apt-get update -y
\$MAYBE_SUDO apt-get install -y libglib2.0-bin
\$MAYBE_SUDO apt-get install -y libgtkmm-2.4-1v5
LD_LIBRARY_PATH=\$PWD/.libs:\$LD_LIBRARY_PATH ./pcb2gcode "\$@"
EOF
chmod a+x pcb2gcode-${PCB2GCODE_VERSION}/pcb2gcode.sh
tar czvf pcb2gcode-${{ steps.sanitize-key.outputs.key }}-${PCB2GCODE_VERSION}.tar.gz pcb2gcode-${PCB2GCODE_VERSION}
env:
GEOS: ${{ matrix.geos }}
- name: Prepare build for upload for Windows
if: matrix.os == 'windows'
run: |
mkdir pcb2gcode-${PCB2GCODE_VERSION}
pushd pcb2gcode-${PCB2GCODE_VERSION}
cp ../pcb2gcode.exe .
cp ${LOCAL_INSTALL_PATH}/bin/libgerbv-1.dll .
if [[ ${GEOS} != 'none' && ${GEOS} != 'latest' ]]; then
cp ${LOCAL_INSTALL_PATH}/bin/libgeos*.dll .
fi
if [[ ${GEOS} == 'latest' ]]; then
cp /mingw64/bin/libgeos*.dll .
fi
cp /mingw64/bin/libLerc.dll .
cp /mingw64/bin/libboost_program_options-mt.dll .
cp /mingw64/bin/libbrotlicommon.dll .
cp /mingw64/bin/libbrotlidec.dll .
cp /mingw64/bin/libbz2-1.dll .
cp /mingw64/bin/libcairo-2.dll .
cp /mingw64/bin/libdatrie-1.dll .
cp /mingw64/bin/libdeflate.dll .
cp /mingw64/bin/libexpat-1.dll .
cp /mingw64/bin/libffi-8.dll .
cp /mingw64/bin/libfontconfig-1.dll .
cp /mingw64/bin/libfreetype-6.dll .
cp /mingw64/bin/libfribidi-0.dll .
cp /mingw64/bin/libgcc_s_seh-1.dll .
cp /mingw64/bin/libgdk-win32-2.0-0.dll .
cp /mingw64/bin/libgdk_pixbuf-2.0-0.dll .
cp /mingw64/bin/libgio-2.0-0.dll .
cp /mingw64/bin/libglib-2.0-0.dll .
cp /mingw64/bin/libgmodule-2.0-0.dll .
cp /mingw64/bin/libgobject-2.0-0.dll .
cp /mingw64/bin/libgraphite2.dll .
cp /mingw64/bin/libharfbuzz-0.dll .
cp /mingw64/bin/libiconv-2.dll .
cp /mingw64/bin/libintl-8.dll .
cp /mingw64/bin/libjbig-0.dll .
cp /mingw64/bin/libjpeg-8.dll .
cp /mingw64/bin/liblzma-5.dll .
cp /mingw64/bin/libpango-1.0-0.dll .
cp /mingw64/bin/libpangocairo-1.0-0.dll .
cp /mingw64/bin/libpangoft2-1.0-0.dll .
cp /mingw64/bin/libpangowin32-1.0-0.dll .
cp /mingw64/bin/libpcre2-8-0.dll .
cp /mingw64/bin/libpixman-1-0.dll .
cp /mingw64/bin/libpng16-16.dll .
cp /mingw64/bin/libsharpyuv-0.dll .
cp /mingw64/bin/libstdc++-6.dll .
cp /mingw64/bin/libthai-0.dll .
cp /mingw64/bin/libtiff-6.dll .
cp /mingw64/bin/libwebp-7.dll .
cp /mingw64/bin/libwinpthread-1.dll .
cp /mingw64/bin/libzstd.dll .
cp /mingw64/bin/zlib1.dll .
popd
zip -r pcb2gcode-${{ steps.sanitize-key.outputs.key }}-${PCB2GCODE_VERSION}.zip pcb2gcode-${PCB2GCODE_VERSION}
env:
GEOS: ${{ matrix.geos }}
- name: Upload build for Ubuntu and Macos
if: matrix.os != 'windows'
uses: actions/upload-artifact@v4
with:
name: pcb2gcode-${{ steps.sanitize-key.outputs.key }}-${{ env.PCB2GCODE_VERSION }}
path: pcb2gcode-${{ steps.sanitize-key.outputs.key }}-${{ env.PCB2GCODE_VERSION }}.tar.gz
compression-level: 0
- name: Upload build for Windows
if: matrix.os == 'windows'
uses: actions/upload-artifact@v4
with:
name: pcb2gcode-${{ steps.sanitize-key.outputs.key }}-${{ env.PCB2GCODE_VERSION }}
path: pcb2gcode-${{ steps.sanitize-key.outputs.key }}-${{ env.PCB2GCODE_VERSION }}.zip
compression-level: 0
- name: Upload coverage to coveralls
if: matrix.code_coverage
uses: eyal0/github-action@master
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
path-to-lcov: pcb2gcode-lcov.info
flag-name: ci-${{ steps.sanitize-key.outputs.key }}
parallel: true
- name: Save version number
if: matrix.code_coverage
run: echo "${PCB2GCODE_VERSION}" > version.txt
- name: Upload version artifact
if: matrix.code_coverage
uses: actions/upload-artifact@v4
with:
name: version-${{ steps.sanitize-key.outputs.key }}.txt
path: version.txt
- name: Save cache
uses: actions/cache/save@v5
if: env.UPDATE_CACHE == 'true'
with:
path: ${{ steps.sanitize-key.outputs.path }}
key: ${{ steps.sanitize-key.outputs.key }}-${{ github.run_id }}-${{ github.run_attempt }}
- name: Save ccache
uses: actions/cache/save@v5
with:
path: ${{ steps.sanitize-key.outputs.ccache_path }}
key: ccache-${{ steps.sanitize-key.outputs.key }}-${{ github.run_id }}-${{ github.run_attempt }}
- name: ccache stats
run: |
ccache -s
finalize-coverage:
needs: [build-and-test]
name: Finalize coverage
runs-on: ubuntu-latest
steps:
- name: Finalize coverage
uses: eyal0/github-action@master
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
parallel-finished: true
release:
if: github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/v'))
needs: [build-and-test]
name: release
runs-on: ubuntu-latest
steps:
- name: Download the artifacts to release
uses: actions/download-artifact@v4
- run: echo "PCB2GCODE_VERSION=$(cat version/version.txt)" >> $GITHUB_ENV
- uses: "marvinpinto/action-automatic-releases@latest"
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
automatic_release_tag: ${{ startsWith(github.ref, 'refs/heads') && 'latest' || null }}
prerelease: ${{ startsWith(github.ref, 'refs/heads') }}
title: ${{ startsWith(github.ref, 'refs/heads') && 'Development Build' || null }}
files: |
pcb2gcode-*-${{ env.PCB2GCODE_VERSION }}/pcb2gcode-*-${{ env.PCB2GCODE_VERSION }}.*