Skip to content

master -> main

master -> main #153

Workflow file for this run

name: ci
on:
push: {branches-ignore: [latest], tags: ['*']}
pull_request:
env:
PACKAGE_NAME: ${{ github.event.repository.name }}
PACKAGE_VERSION: ${{ github.sha }}
MYCI_NEXUS_USERNAME: cppfw
MYCI_NEXUS_PASSWORD: ${{ secrets.MYCI_NEXUS_PASSWORD }}
MYCI_GIT_USERNAME: igagis
MYCI_GIT_PASSWORD: ${{ secrets.MYCI_GIT_ACCESS_TOKEN }}
MYCI_CONAN_REMOTE: https://gagis.hopto.org/conan
MYCI_CONAN_USER: cppfw
MYCI_CONAN_PASSWORD: ${{ secrets.MYCI_CONAN_PASSWORD }}
jobs:
##### coverage #####
coverage:
runs-on: ubuntu-latest
container: debian:bookworm
name: coverage - measure
env:
linux_distro: debian
linux_release: bookworm
steps:
- name: add cppfw deb repo
uses: myci-actions/add-deb-repo@main
with:
repo: deb https://gagis.hopto.org/repo/cppfw/${{ env.linux_distro }} ${{ env.linux_release }} main
repo-name: cppfw
keys-asc: https://gagis.hopto.org/repo/cppfw/pubkey.gpg
install: myci locales git pipx
- name: add llvm repo (for clang-format)
uses: myci-actions/add-deb-repo@main
with:
repo: deb http://apt.llvm.org/${{ env.linux_release }} llvm-toolchain-${{ env.linux_release }} main
repo-name: llvm
keys-asc: https://apt.llvm.org/llvm-snapshot.gpg.key
- name: git clone
uses: myci-actions/checkout@main
- name: prepare debian package
run: myci-deb-prepare.sh
- name: install deps
run: myci-deb-install-build-deps.sh
- name: add DE locale
# needed for testing that locale with "," as decimal delimiter does not break the parsing with string_parser
run: |
echo "de_DE.UTF-8 UTF-8" >> /etc/locale.gen
locale-gen
- name: build
run: make config=gcov
- name: test
run: make config=gcov test
- name: generate coverage report
# due to some bug in gcov, we need to use --gcov-ignore-parse-errors=negative_hits.warn
run: pipx run gcovr --gcov-ignore-parse-errors=negative_hits.warn --exclude-throw-branches --filter src/ --cobertura > cobertura.xml
- name: upload coverage report to artifacts
uses: actions/upload-artifact@v4
with:
name: cobertura.xml
path: cobertura.xml
- name: upload coverage data to codecov.io
uses: codecov/codecov-action@v4
if: always() # even if previous steps fail, this one needs to be run
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: cobertura.xml
# flags: unittests # optional
name: codecov-umbrella # optional
fail_ci_if_error: true # optional (default = false)
verbose: true # optional (default = false)
##### sanitizer #####
sanitizer:
strategy:
fail-fast: false
matrix:
include:
- {os: debian, codename: bookworm, image_owner: }
- {os: debian, codename: bookworm, image_owner: , labels: [arm32,docker]}
- {os: debian, codename: bookworm, image_owner: , labels: [arm64,docker]}
runs-on: ${{ (matrix.labels == '' && 'ubuntu-latest') || matrix.labels }}
container: ${{ matrix.image_owner }}${{ matrix.os }}:${{ matrix.codename }}
name: sanitizer - ${{ matrix.image_owner }}${{ matrix.os }}:${{ matrix.codename }} | ${{ matrix.labels[0] }}
steps:
- name: add cppfw deb repo
uses: myci-actions/add-deb-repo@main
with:
repo: deb https://gagis.hopto.org/repo/cppfw/${{ matrix.os }} ${{ matrix.codename }} main
repo-name: cppfw
keys-asc: https://gagis.hopto.org/repo/cppfw/pubkey.gpg
install: myci git
- name: add llvm repo (for clang-format)
uses: myci-actions/add-deb-repo@main
with:
repo: deb http://apt.llvm.org/${{ matrix.codename }} llvm-toolchain-${{ matrix.codename }} main
repo-name: llvm
keys-asc: https://apt.llvm.org/llvm-snapshot.gpg.key
- name: install ci tools
run: |
apt install --assume-yes devscripts equivs
- name: git clone
uses: myci-actions/checkout@main
- name: prepare debian package
run: myci-deb-prepare.sh
- name: install deps
run: myci-deb-install-build-deps.sh
- name: build
run: make config=asan
- name: test
run: make config=asan test
##### linux #####
linux:
strategy:
fail-fast: false
matrix:
include:
# - {os: debian, codename: buster, image_owner: }
# - {os: debian, codename: buster, image_owner: i386/, labels: [i386,docker]}
# - {os: debian, codename: buster, image_owner: arm32v7/, labels: [arm32,docker]}
# - {os: debian, codename: bullseye, image_owner: }
# - {os: debian, codename: bullseye, image_owner: i386/, labels: [i386,docker]}
# - {os: debian, codename: bullseye, image_owner: arm32v7/, labels: [arm32,docker]}
# - {os: debian, codename: bullseye, image_owner: arm64v8/, labels: [arm64,docker]}
- {os: debian, codename: bookworm, image_owner: }
# - {os: debian, codename: bookworm, image_owner: i386/, labels: [i386,docker]}
- {os: debian, codename: bookworm, image_owner: , labels: [arm32,docker]}
- {os: debian, codename: bookworm, image_owner: , labels: [arm64,docker]}
# - {os: ubuntu, codename: focal, image_owner: }
# - {os: ubuntu, codename: jammy, image_owner: }
- {os: ubuntu, codename: noble, image_owner: }
# - {os: raspbian, codename: buster, image_owner: igagis/, labels: [arm32,docker]}
# - {os: raspbian, codename: bullseye, image_owner: igagis/, labels: [arm32,docker]}
- {os: raspbian, codename: bookworm, image_owner: igagis/, labels: [arm32,docker]}
runs-on: ${{ (matrix.labels == '' && 'ubuntu-latest') || matrix.labels }}
container: ${{ matrix.image_owner }}${{ matrix.os }}:${{ matrix.codename }}
name: linux - ${{ matrix.image_owner }}${{ matrix.os }}:${{ matrix.codename }} | ${{ matrix.labels[0] }}
steps:
- name: set TZ for ubuntu:focal
run: |
# configure timezone to avoid 'tzdata' package to require user interaction during installation (needed for ubuntu:focal)
TZ=Europe/Helsinki ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
- name: add cppfw deb repo
uses: myci-actions/add-deb-repo@main
with:
repo: deb https://gagis.hopto.org/repo/cppfw/${{ matrix.os }} ${{ matrix.codename }} main
repo-name: cppfw
keys-asc: https://gagis.hopto.org/repo/cppfw/pubkey.gpg
install: myci git devscripts equivs
- name: add llvm repo (for clang-format)
uses: myci-actions/add-deb-repo@main
with:
repo: deb http://apt.llvm.org/${{ matrix.codename }} llvm-toolchain-${{ matrix.codename }} main
repo-name: llvm
keys-asc: https://apt.llvm.org/llvm-snapshot.gpg.key
- name: git clone
uses: myci-actions/checkout@main
- name: set PACKAGE_VERSION
uses: myci-actions/export-env-var@main
with: {name: PACKAGE_VERSION, value: $(myci-deb-version.sh debian/changelog)}
- name: prepare debian package
run: myci-deb-prepare.sh
- name: install deps
run: myci-deb-install-build-deps.sh
- name: build
run: dpkg-buildpackage --unsigned-source --unsigned-changes
- name: deploy deb packages
run: |
echo "${{ secrets.MYCI_REPO_SSH_KEY }}" > repo_key_rsa && chmod 600 repo_key_rsa
myci-deploy-apt-ssh.sh --key repo_key_rsa --server gagis.hopto.org --repo cppfw/${{ matrix.os }} --distro ${{ matrix.codename }} --component main ../lib${PACKAGE_NAME}*_${PACKAGE_VERSION}_*.*deb
if: startsWith(github.ref, 'refs/tags/')
##### archlinux #####
# archlinux:
# strategy:
# fail-fast: false
# matrix:
# include:
# - {image: "archlinux:latest", arch: amd64}
# - {image: "lopsided/archlinux-arm32v7:latest", arch: arm32, labels: [arm32,docker]}
# - {image: "lopsided/archlinux-arm64v8:latest", arch: arm64, labels: [arm64,docker]}
# runs-on: ${{ (matrix.labels == '' && 'ubuntu-latest') || matrix.labels }}
# container: ${{ matrix.image }}
# name: linux - archlinux - ${{ matrix.arch }}
# steps:
# - name: install ci tools
# run: |
# pacman --sync --refresh --sysupgrade --noconfirm --noprogressbar base-devel git
# - name: add cppfw pacman repo
# uses: myci-actions/add-pacman-repo@main
# with:
# name: cppfw
# url: https://gagis.hopto.org/repo/cppfw/archlinux/${{ matrix.arch }}
# key-server: https://gagis.hopto.org/repo/cppfw/pubkey.gpg
# install: >-
# myci
# - name: git clone
# uses: myci-actions/checkout@main
# - name: set PACKAGE_VERSION
# uses: myci-actions/export-env-var@main
# with: {name: PACKAGE_VERSION, value: $(myci-deb-version.sh debian/changelog)}
# # makepkg needs to install dependency packages, so nobody user needs sudo rights
# - name: add nobody to sudoers
# run: |
# echo "nobody ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
# - name: build
# run: |
# # provide write access to user nobody
# chmod --recursive 777 .
# cd archlinux
# sudo --user=nobody --preserve-env=PACKAGE_VERSION makepkg --syncdeps --noconfirm --skipinteg --noprogressbar
# - name: deploy
# run: |
# echo "${{ secrets.MYCI_REPO_SSH_KEY }}" > repo_key_rsa && chmod 600 repo_key_rsa
# myci-deploy-pacman-ssh.sh --server gagis.hopto.org --key repo_key_rsa --repo cppfw/archlinux/${{ matrix.arch }} --database cppfw archlinux/$PACKAGE_NAME-*.pkg.*
# if: startsWith(github.ref, 'refs/tags/')
##### macosx #####
macosx:
runs-on: macos-latest
steps:
- name: workaround python2 and python3 issue when upgrading python
run : |
rm -rf /usr/local/bin/2to3*
rm -rf /usr/local/bin/idle3*
rm -rf /usr/local/bin/pydoc3*
rm -rf /usr/local/bin/python3
rm -rf /usr/local/bin/python3-config
rm -rf /usr/local/bin/python3*
rm -rf /usr/local/bin/python3*-config
- name: git clone
uses: myci-actions/checkout@main
- name: install clang-tidy and clang-format
run: |
brew install llvm
ln -s "$(brew --prefix llvm)/bin/clang-format" "/usr/local/bin/clang-format"
ln -s "$(brew --prefix llvm)/bin/clang-tidy" "/usr/local/bin/clang-tidy"
ln -s "$(brew --prefix llvm)/bin/clang-apply-replacements" "/usr/local/bin/clang-apply-replacements"
- name: add cppfw tap
run: |
brew tap cppfw/tap
brew update
- name: install ci tools
run: brew install myci make
- name: set PATH to use latest make
uses: myci-actions/export-env-var@main
with: {name: PATH, value: "$HOMEBREW_PREFIX/opt/make/libexec/gnubin:$PATH"}
- name: set CFLAGS
uses: myci-actions/export-env-var@main
with: {name: CFLAGS, value: "-isystem $HOMEBREW_PREFIX/include $CFLAGS"}
- name: set CXXFLAGS
uses: myci-actions/export-env-var@main
with: {name: CXXFLAGS, value: "-isystem $HOMEBREW_PREFIX/include $CXXFLAGS"}
- name: set LDFLAGS
uses: myci-actions/export-env-var@main
with: {name: LDFLAGS, value: "-L $HOMEBREW_PREFIX/lib $LDFLAGS"}
- name: install deps
run: myci-brew-install.sh `myci-list-deps-homebrew.sh`
- name: build
run: make --include-dir=$(brew --prefix)/include
- name: test
run: make --include-dir=$(brew --prefix)/include test
- name: deploy
run: myci-deploy-homebrew.sh --tap cppfw/tap
if: startsWith(github.ref, 'refs/tags/')
##### ios #####
ios:
runs-on: macos-latest
steps:
- name: workaround python2 and python3 issue when upgrading python
run : |
rm -rf /usr/local/bin/2to3*
rm -rf /usr/local/bin/idle3*
rm -rf /usr/local/bin/pydoc3*
rm -rf /usr/local/bin/python3
rm -rf /usr/local/bin/python3-config
rm -rf /usr/local/bin/python3*
rm -rf /usr/local/bin/python3*-config
- name: add cppfw tap
run: |
brew tap cppfw/tap
brew update
- name: install ci tools
run: brew install myci
- name: git clone
uses: myci-actions/checkout@main
- name: set PACKAGE_VERSION
uses: myci-actions/export-env-var@main
with: {name: PACKAGE_VERSION, value: $(myci-deb-version.sh debian/changelog)}
- name: add cocoapods repo
run: pod repo add --silent cppfw https://[email protected]/cppfw/cocoapods-repo.git
- name: install deps
run: pod install --project-directory=xcode
- name: add sources to xcode project
run: |
curl -L https://github.com/zackslash/Xcode-Proj-Adder/raw/master/bin/XcodeProjAdder -O
chmod +x XcodeProjAdder
cd xcode/$PACKAGE_NAME
../../XcodeProjAdder -XCP $PACKAGE_NAME.xcodeproj -SCSV `echo $(find ../../src -type f -name *.cpp) | sed -E -e 's/ /,/g'`
- name: build
run: |
xcodebuild CONFIGURATION_BUILD_DIR=../build_ios -sdk iphoneos -workspace xcode/$PACKAGE_NAME.xcworkspace -scheme $PACKAGE_NAME -configuration Release
xcodebuild CONFIGURATION_BUILD_DIR=../build_iossim -sdk iphonesimulator -workspace xcode/$PACKAGE_NAME.xcworkspace -scheme $PACKAGE_NAME -configuration Release
xcodebuild -create-xcframework -framework "xcode/build_ios/$PACKAGE_NAME.framework" -framework "xcode/build_iossim/$PACKAGE_NAME.framework" -output "xcode/$PACKAGE_NAME.xcframework"
- name: create package
run: myci-create-zip-package.sh --headers-dir src --file xcode/$PACKAGE_NAME.xcframework///lib/ios --file LICENSE $PACKAGE_NAME-$PACKAGE_VERSION.zip
- name: deploy
run: |
echo "${{ secrets.MYCI_REPO_SSH_KEY }}" > repo_key_rsa && chmod 600 repo_key_rsa
myci-deploy-cocoapods-ssh.sh --repo cppfw --version $PACKAGE_VERSION --server gagis.hopto.org --key repo_key_rsa --generic-repo cppfw/cocoapods --package $PACKAGE_NAME-$PACKAGE_VERSION.zip cocoapods/$PACKAGE_NAME.podspec.in
if: startsWith(github.ref, 'refs/tags/')
##### android #####
android:
runs-on: ubuntu-latest
container: mingc/android-build-box:latest
steps:
- name: git clone
uses: myci-actions/checkout@main
- name: add cppfw deb repo
uses: myci-actions/add-deb-repo@main
with:
repo: deb https://gagis.hopto.org/repo/cppfw/$(lsb_release --id --short | tr '[:upper:]' '[:lower:]') $(lsb_release --codename --short) main
repo-name: cppfw
keys-asc: https://gagis.hopto.org/repo/cppfw/pubkey.gpg
install: myci ninja-build
- name: set PACKAGE_VERSION
uses: myci-actions/export-env-var@main
with: {name: PACKAGE_VERSION, value: $(myci-deb-version.sh debian/changelog)}
- name: build
run: |
cd android
./gradlew copy_aar --warning-mode all
myci-apply-version.sh --version $PACKAGE_VERSION *.pom.in
myci-apply-version.sh --version $PACKAGE_VERSION *.aar.in --filename-only
- name: deploy
run: myci-deploy-maven-nexus.sh --base-url https://gagis.hopto.org/nexus --repo android android/$PACKAGE_NAME-$PACKAGE_VERSION.aar
if: startsWith(github.ref, 'refs/tags/')
##### msys2 #####
msys2:
runs-on: windows-latest
defaults:
run:
shell: msys2 {0}
strategy:
fail-fast: false
matrix:
include:
- {arch: i686, repo: mingw32}
- {arch: x86_64, repo: mingw64}
name: msys2 - ${{ matrix.repo }}
steps:
- name: make msys2 to provide the default shell
uses: msys2/setup-msys2@v2
with:
update: true
msystem: MSYS
install: >-
msys2-devel
mingw-w64-${{ matrix.arch }}-toolchain
- name: add cppfw pacman msys repo
uses: myci-actions/add-pacman-repo@main
with:
name: cppfw_msys
url: https://gagis.hopto.org/repo/cppfw/msys2/msys
shell: 'msys2 {0}'
key-server: https://gagis.hopto.org/repo/cppfw/pubkey.gpg
install: myci
- name: add cppfw pacman msys/mingw repo
uses: myci-actions/add-pacman-repo@main
with:
name: cppfw_${{ matrix.repo }}
url: https://gagis.hopto.org/repo/cppfw/msys2/${{ matrix.repo }}
shell: 'msys2 {0}'
key-server: https://gagis.hopto.org/repo/cppfw/pubkey.gpg
- name: git clone
uses: myci-actions/checkout@main
- name: prepare pacman package
run: myci-apply-version.sh --version $(myci-deb-version.sh debian/changelog) msys2/PKGBUILD.in
- name: build
# to make makepkg-mingw build only one architecture we need to set the MINGW_ARCH
env: {MINGW_ARCH: '${{ matrix.repo }}'}
run: |
cd msys2
PKGEXT='.pkg.tar.xz' makepkg-mingw --syncdeps --noconfirm --skipinteg
- name: deploy
run: |
echo "${{ secrets.MYCI_REPO_SSH_KEY }}" > repo_key_rsa && chmod 600 repo_key_rsa
for f in $(find msys2 -name "mingw-w64-${{ matrix.arch }}-$PACKAGE_NAME-*-any.pkg.*"); do
myci-deploy-pacman-ssh.sh --server gagis.hopto.org --key repo_key_rsa --repo cppfw/msys2/${{ matrix.repo }} --database cppfw_${{ matrix.repo }} $f
done
if: startsWith(github.ref, 'refs/tags/')
##### msvs #####
msvs:
runs-on: windows-latest
defaults:
run:
shell: powershell
steps:
- name: git clone
uses: actions/checkout@v3
- name: install CoAPP tools
uses: myci-actions/install-coapp-tools@main
- name: nuget update
run: |
nuget restore msvs_solution/msvs_solution.sln
nuget update msvs_solution/msvs_solution.sln
- name: add msbuild to PATH
uses: microsoft/[email protected]
- name: build
run: .\nuget\build_nuget.ps1
- name: deploy
uses: myci-actions/publish-nuget@main
with:
filename: '.\nuget\*.nupkg'
api-key: ${{ secrets.NUGET_DOT_ORG_API_KEY }}
if: startsWith(github.ref, 'refs/tags/')
##### conan - linux #####
conan-linux:
# TODO: remove comment
# if: ${{ false }} # disable until libpng is updated
strategy:
fail-fast: false
matrix:
include:
- {os: debian, codename: bookworm, image_owner: }
# - {os: debian, codename: bookworm, image_owner: i386/, labels: [i386,docker]}
- {os: debian, codename: bookworm, image_owner: , labels: [arm32,docker]}
- {os: debian, codename: bookworm, image_owner: , labels: [arm64,docker]}
runs-on: ${{ (matrix.labels == '' && 'ubuntu-latest') || matrix.labels }}
container: ${{ matrix.image_owner }}${{ matrix.os }}:${{ matrix.codename }}
name: conan - linux | ${{ matrix.labels[0] }}
steps:
- name: add llvm repo (for clang-format)
uses: myci-actions/add-deb-repo@main
with:
repo: deb http://apt.llvm.org/${{ matrix.codename }} llvm-toolchain-${{ matrix.codename }} main
repo-name: llvm
keys-asc: https://apt.llvm.org/llvm-snapshot.gpg.key
install: clang-format clang-tidy
- name: add cppfw deb repo
uses: myci-actions/add-deb-repo@main
with:
repo: deb https://gagis.hopto.org/repo/cppfw/${{ matrix.os }} ${{ matrix.codename }} main
repo-name: cppfw
keys-asc: https://gagis.hopto.org/repo/cppfw/pubkey.gpg
install: devscripts equivs myci prorab prorab-extra pipx cmake git libx11-dev
- name: add ~/.local/bin to PATH
uses: myci-actions/export-env-var@main
with: {name: PATH, value: "$PATH:$HOME/.local/bin"}
- name: install conan
run: pipx install conan
- name: create default conan profile
run: |
conan profile detect --name default
sed -i -E "s/compiler.cppstd=.*$/compiler.cppstd=17/g" ~/.conan2/profiles/default
- name: git clone
uses: myci-actions/checkout@main
- name: set PACKAGE_VERSION
uses: myci-actions/export-env-var@main
with: {name: PACKAGE_VERSION, value: $(myci-deb-version.sh debian/changelog)}
if: startsWith(github.ref, 'refs/tags/')
- name: build
run: |
conan remote add cppfw $MYCI_CONAN_REMOTE
conan create conan --build=missing --user $MYCI_CONAN_USER --channel main --version $PACKAGE_VERSION
- name: deploy conan package
run: |
conan remote login --password $MYCI_CONAN_PASSWORD cppfw $MYCI_CONAN_USER
conan upload --check --remote cppfw $PACKAGE_NAME/$PACKAGE_VERSION@$MYCI_CONAN_USER/main
if: startsWith(github.ref, 'refs/tags/')
##### conan - macosx #####
# conan-macosx:
# strategy:
# fail-fast: false
# matrix:
# os:
# # - macos-10.15
# - macos-11
# # - macos-12
# name: conan - ${{ matrix.os }}
# runs-on: ${{ matrix.os }}
# steps:
# - name: workaround python2 and python3 issue when upgrading python
# run : |
# rm -rf /usr/local/bin/2to3*
# rm -rf /usr/local/bin/idle3*
# rm -rf /usr/local/bin/pydoc3*
# rm -rf /usr/local/bin/python3
# rm -rf /usr/local/bin/python3-config
# rm -rf /usr/local/bin/python3*
# rm -rf /usr/local/bin/python3*-config
# - name: git clone
# uses: myci-actions/checkout@main
# - name: install clang-tidy and clang-format
# run: |
# brew install llvm
# ln -s "$(brew --prefix llvm)/bin/clang-format" "/usr/local/bin/clang-format"
# ln -s "$(brew --prefix llvm)/bin/clang-tidy" "/usr/local/bin/clang-tidy"
# ln -s "$(brew --prefix llvm)/bin/clang-apply-replacements" "/usr/local/bin/clang-apply-replacements"
# - name: add cppfw tap
# run: |
# brew tap cppfw/tap
# brew update
# - name: install ci tools
# run: brew install myci prorab prorab-extra conan make pkg-config
# - name: create default conan profile
# run: |
# conan profile detect --name default
# sed -i -E "s/compiler.cppstd=.*$/compiler.cppstd=17/g" ~/.conan2/profiles/default
# - name: set PATH to use latest make
# uses: myci-actions/export-env-var@main
# with: {name: PATH, value: "/usr/local/opt/make/libexec/gnubin:$PATH"}
# - name: set PACKAGE_VERSION
# uses: myci-actions/export-env-var@main
# with: {name: PACKAGE_VERSION, value: $(myci-deb-version.sh debian/changelog)}
# if: startsWith(github.ref, 'refs/tags/')
# - name: build
# run: |
# conan remote add cppfw $MYCI_CONAN_REMOTE
# conan create conan --user $MYCI_CONAN_USER --channel main --version $PACKAGE_VERSION
# - name: deploy conan package
# run: |
# conan remote login --password $MYCI_CONAN_PASSWORD cppfw $MYCI_CONAN_USER
# conan upload --check --remote cppfw $PACKAGE_NAME/$PACKAGE_VERSION@$MYCI_CONAN_USER/main
# if: startsWith(github.ref, 'refs/tags/')