### Global defaults env: CCACHE_SIZE: "800M" CCACHE_DIR: "/tmp/ccache_dir" CCACHE_NOHASHDIR: "1" # Debug info might contain a stale path if the build dir changes, but this is fine CCACHE_CPP2: "yes" ### Task templates # https://cirrus-ci.org/guide/tips-and-tricks/#sharing-configuration-between-tasks filter_template: &FILTER_TEMPLATE skip: "!changesInclude('.cirrus.yml', '**.{h,hpp,cpp,c,pro,pri,ts,ui,png,qbs,js}')" regular_task_template: ®ULER_TASK_TEMPLATE << : *FILTER_TEMPLATE ccache_cache: folder: "/tmp/ccache_dir" linux_qt6_task_template: &LINUX_QT6_TASK_TEMPLATE install_script: - bash -c "$PACKAGE_MANAGER_INSTALL -y qbs qt6-base-dev qt6-l10n-tools libqt6svg6-dev qt6-base-dev-tools qmake6 qbs libxerces-c-dev poppler-utils libgl1-mesa-dev" build_script: - uname -a - mkdir -pm 0700 $XDG_RUNTIME_DIR - Xvfb $DISPLAY -ac -screen 0 1600x1200x24+32 -nolisten tcp -nolisten unix & - sleep 1 - ccache --set-config sloppiness=pch_defines,time_macros max_size="$CCACHE_SIZE" - echo $PATH - which qmake6 - which qbs - pwd - ls -l /usr/bin/ | grep -E "${COMPILER_REGEX}" - ${COMPILER} --version - qmake6 --version - qbs --version - qbs setup-toolchains /usr/bin/${COMPILER} ${COMPILER} - qbs setup-qt /usr/bin/qmake6 qt6 - qbs config profiles.qt6.baseProfile ${COMPILER} - qbs-config defaultProfile qt6 - qbs build -f valentina.qbs -d build --command-echo-mode command-line --jobs $(nproc) profile:qt6 config:release modules.buildconfig.enableCcache:${ENABLE_CCACHE} - qbs -p autotest-runner -d build profile:qt6 config:release - ccache -s linux_qt5_qmake_task_template: &LINUX_QT5_QMAKE_TASK_TEMPLATE install_script: - bash -c "$PACKAGE_MANAGER_INSTALL qtbase5-dev libqt5svg5-dev qttools5-dev-tools libqt5xmlpatterns5-dev libqt5core5a libqt5gui5 libqt5printsupport5 libqt5svg5 libqt5widgets5 libqt5xml5 libqt5xmlpatterns5 poppler-utils" build_script: - uname -a - echo $PATH - which qmake - mkdir build - cd build - pwd - ls -l /usr/bin/ | grep -E "${COMPILER_REGEX}" - ${COMPILER} --version - ccache --set-config max_size="$CCACHE_SIZE" - qmake --version - qmake ../Valentina.pro -r -spec ${QMAKE_SPEC} CONFIG+=noDebugSymbols CONFIG+=checkWarnings - make -j$(nproc) - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"$CIRRUS_WORKING_DIR/build/src/libs/vpropertyexplorer/bin:$CIRRUS_WORKING_DIR/build/src/libs/qmuparser/bin" - xvfb-run -a make --silent check TESTARGS="-silent" - ccache -s linux_qt5_qbs_task_template: &LINUX_QT5_QBS_TASK_TEMPLATE install_script: - bash -c "$PACKAGE_MANAGER_INSTALL qbs qtbase5-dev libqt5svg5-dev qttools5-dev-tools libqt5xmlpatterns5-dev libqt5core5a libqt5gui5 libqt5printsupport5 libqt5svg5 libqt5widgets5 libqt5xml5 libqt5xmlpatterns5 poppler-utils" build_script: - uname -a - mkdir -pm 0700 $XDG_RUNTIME_DIR - Xvfb $DISPLAY -ac -screen 0 1600x1200x24+32 -nolisten tcp -nolisten unix & - sleep 1 - ccache --set-config sloppiness=pch_defines,time_macros max_size="$CCACHE_SIZE" - echo $PATH - which qmake - which qbs - pwd - ls -l /usr/bin/ | grep -E "${COMPILER_REGEX}" - ${COMPILER} --version - qmake --version - qbs --version - qbs setup-toolchains /usr/bin/${COMPILER} ${COMPILER} - qbs setup-qt /usr/bin/qmake qt5 - qbs-config defaultProfile qt5 - qbs config profiles.qt5.baseProfile ${COMPILER} - qbs build -f valentina.qbs -d build --command-echo-mode command-line --jobs $(nproc) profile:qt5 config:release modules.buildconfig.enableCcache:${ENABLE_CCACHE} - qbs -p autotest-runner -d build profile:qt5 config:release - ccache -s linux_task: << : *REGULER_TASK_TEMPLATE env: DEBIAN_FRONTEND: "noninteractive" PACKAGE_MANAGER_INSTALL: "apt-get -qq update && apt-get install -y" DISPLAY: ":90" XDG_RUNTIME_DIR: "/tmp/runtime-kdeci/" matrix: - container: image: dismine/clang-ubuntu:latest env: COMPILER: clang QMAKE_SPEC: "linux-clang" COMPILER_REGEX: clang matrix: - name: 'latest Clang [Qt5 QMake]' << : *LINUX_QT5_QMAKE_TASK_TEMPLATE env: QT_SELECT: "qt5" container: cpu: 2 memory: 6G # Set to 6GB to avoid OOM. https://cirrus-ci.org/guide/linux/#linux-container - name: 'latest Clang [Qt5 QBS]' << : *LINUX_QT5_QBS_TASK_TEMPLATE env: QT_SELECT: "qt5" ENABLE_CCACHE: false container: cpu: 2 memory: 6G # Set to 6GB to avoid OOM. https://cirrus-ci.org/guide/linux/#linux-container - name: 'latest Clang [Qt6]' << : *LINUX_QT6_TASK_TEMPLATE env: QT_SELECT: "qt6" ENABLE_CCACHE: false container: cpu: 8 memory: 8G # Set to 8GB to avoid OOM. https://cirrus-ci.org/guide/linux/#linux-container - container: image: dismine/gcc-ubuntu:latest env: COMPILER: gcc QMAKE_SPEC: "linux-g++" GCC_COLORS: 'error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01' COMPILER_REGEX: "gcc|g\\+\\+" matrix: - name: 'latest GCC [Qt5 QMake]' << : *LINUX_QT5_QMAKE_TASK_TEMPLATE env: QT_SELECT: "qt5" container: cpu: 2 memory: 8G # Set to 8GB to avoid OOM. https://cirrus-ci.org/guide/linux/#linux-container - name: 'latest GCC [Qt5 QBS]' << : *LINUX_QT5_QBS_TASK_TEMPLATE env: QT_SELECT: "qt5" ENABLE_CCACHE: true container: cpu: 3 memory: 10G # Set to 10GB to avoid OOM. https://cirrus-ci.org/guide/linux/#linux-container - name: 'latest GCC [Qt6]' << : *LINUX_QT6_TASK_TEMPLATE env: QT_SELECT: "qt6" ENABLE_CCACHE: true container: cpu: 3 memory: 12G # Set to 12GB to avoid OOM. https://cirrus-ci.org/guide/linux/#linux-container macos_task_template: &MACOS_TASK_TEMPLATE << : *REGULER_TASK_TEMPLATE timeout_in: 120m env: ACCESS_TOKEN: ENCRYPTED[81e0b2381ffb628b73f5c94f834010e6631191e0ad03cdd0850d440fb2737a74b68131d842030f010c1bf73ab4cdc1ae] # Should contain the base64 of the certificate MACOS_CERTIFICATE: ENCRYPTED[6600e8c131eaa3ca1d8e4d61a266bfbbf072d557ba89d34e5fb044f8d07af857ea163543824a4a664636a50c1d6d9456] # Should contain the full certificate name, such as Developer ID Application: Your Name (K1234567) MACOS_CERTIFICATE_NAME: ENCRYPTED[9b9e4b0b596a19690a97abfaa8ec90176d8c9567c0c807757ee5dda02672a7426cd25fea3bb7652958abc970912b2138] # Should contain the password you chose when exported the certificate from the Keychain Access app MACOS_CERTIFICATE_PWD: ENCRYPTED[ad78a1c7b5b17ef56c833664cd6a71563b7ea4157ad2daa8e89d88988bdc3f7a669b9d2ee3e47b911707c37f6d84153e] # Should contain apple developer email, the same used the Apple Developer subscription MACOS_NOTARIZATION_APPLE_ID: ENCRYPTED[38dc4848b24abb90c25a0a1156de39af8c88aea6267e934e59cc5fb17dc528e3c1a93d8a9695fe937f4894d10eac707e] # Should contain the app-specific password MACOS_NOTARIZATION_PWD: ENCRYPTED[1df7f3455fb6837adf9ccf2913b5609c0a5125dca3147ece0a51001cf322234c5382977f28a783222f974525a1794cf4] # Should contain the Team ID MACOS_NOTARIZATION_TEAM_ID: ENCRYPTED[8499d687ffd7f6eacda48bd3692bfb22ea6a25eb4a59637b9ff10caa3c8a2df681a790e99b976e7a419d8e5fad2ad35c] # Should contain a strong, randomly generated password MACOS_CI_KEYCHAIN_PWD: ENCRYPTED[7f08698aea44fb7c900267c439c1dfe54e218082e5d6b2354cecc00e21bc640058a55036fd027a1fb5a3d72356abb9ea] QTDIR: "/opt/homebrew/opt/qt6" PATH: $QTDIR/bin:${PATH} # ^ add user paths PIP_CACHE_DIR: ${HOME}/.cache/pip LDFLAGS: "-L$QTDIR/lib" CPPFLAGS: "-I$QTDIR/include" local_homebrew_cache: folder: "$HOME/Library/Caches/Homebrew" global_conan_cache: folder: "$HOME/Library/Caches/Conan" local_conan_cache: folder: "~/.conan/data" pip_cache: folder: ${PIP_CACHE_DIR} install_script: - clang --version - find /Applications -maxdepth 1 -type d -name 'Xcode*.app' - sudo xcode-select -p # Decode the environment variable into a regular .p12 file - echo $MACOS_CERTIFICATE | base64 --decode > certificate.p12 # We need to create a new keychain, otherwise using the certificate will prompt # with a UI dialog asking for the certificate password, which we can't # use in a headless CI environment # Create the keychain with a password ($MACOS_CI_KEYCHAIN_PWD) - security create-keychain -p "$MACOS_CI_KEYCHAIN_PWD" $HOME/Library/Keychains/build.keychain # Make the custom keychain default, so xcodebuild will use it for signing - security default-keychain -s $HOME/Library/Keychains/build.keychain # Unlock the keychain - security unlock-keychain -p "$MACOS_CI_KEYCHAIN_PWD" $HOME/Library/Keychains/build.keychain - security set-keychain-settings $HOME/Library/Keychains/build.keychain # Check if System.keychain is not cluttered # good: 60K # bad: 25MB - du -h /Library/Keychains/System.keychain # Add certificates to keychain and allow codesign to access them # 1) Apple Worldwide Developer Relations Certification Authority - curl https://www.apple.com/certificateauthority/AppleWWDRCAG3.cer --output $HOME/AppleWWDRCAG3.cer --silent - sudo security import $HOME/AppleWWDRCAG3.cer -k /Library/Keychains/System.keychain -T /usr/bin/codesign # 2) Developer Authentication Certification Authority - curl https://www.apple.com/certificateauthority/DeveloperIDG2CA.cer --output $HOME/DeveloperIDG2CA.cer --silent - sudo security import $HOME/DeveloperIDG2CA.cer -k /Library/Keychains/System.keychain -T /usr/bin/codesign # 3) Developer ID - security import certificate.p12 -k $HOME/Library/Keychains/build.keychain -P "$MACOS_CERTIFICATE_PWD" -T /usr/bin/codesign # Delete the files, we no longer need them - rm $HOME/AppleWWDRCAG3.cer - rm $HOME/DeveloperIDG2CA.cer - rm certificate.p12 # Set the partition list (sort of like an access control list) - security set-key-partition-list -S "apple-tool:,apple:,codesign:" -s -k "$MACOS_CI_KEYCHAIN_PWD" $HOME/Library/Keychains/build.keychain # Echo the identity, just so that we know it worked. # This won't display anything secret. - security find-identity -v -p codesigning - brew update > /dev/null - brew install qt6 coreutils ccache qbs cmake ninja git openssl@1.1 pkg-config poppler xerces-c - echo $PATH - export PATH="${HOME}/.local/bin:`python3 -m site --user-base`/bin:$PATH" - echo $PATH - chmod -R 755 /opt/homebrew/opt/qt6/* - chmod -R 755 /opt/homebrew/opt/openssl@1.1/* - chmod -R 755 /opt/homebrew/opt/poppler/* - chmod -R 755 /opt/homebrew/opt/xerces-c/* - python3 --version - pip3 install --user --upgrade pip dropbox - ccache --set-config sloppiness=pch_defines,time_macros max_size="$CCACHE_SIZE" - conan --version - qmake --version - which qmake - qbs --version # Patch Qbs. Remove after Qbs 2.1.2+. - curl https://gist.githubusercontent.com/dismine/43a20f66f563232e54e02f2e85732e7a/raw/e80a0c827348da3e99310ba4a648c1860bb3a8a6/BundleModule.qbs --output $HOME/BundleModule.qbs --silent - cp -f $HOME/BundleModule.qbs $(brew --prefix qbs)/share/qbs/modules/bundle/BundleModule.qbs - rm $HOME/BundleModule.qbs build_script: - echo $PATH - export PATH="${HOME}/.local/bin:`python3 -m site --user-base`/bin:$PATH" - echo $PATH - whereis python3 - sudo ln -s -f /usr/bin/python3 /usr/local/bin/python - sudo ln -s /Library/Developer/CommandLineTools/usr/bin/python3 /Library/Developer/CommandLineTools/usr/bin/python - whereis python - pwd - curl -LJ https://github.com/dismine/macdeployqt/archive/refs/heads/main.zip --output ${HOME}/macdeployqt-main.zip --silent - unzip ${HOME}/macdeployqt-main.zip -d ${HOME} - cmake ${HOME}/macdeployqt-main -GNinja -S ${HOME}/macdeployqt-main -B ${HOME}/macdeployqt-build-dir -DCMAKE_INSTALL_PREFIX=${HOME}/macdeployqt-install-dir -DCMAKE_BUILD_TYPE=Release - cmake --build ${HOME}/macdeployqt-build-dir --target install - qbs setup-toolchains --detect - qbs config --list profiles - qbs setup-qt /opt/homebrew/opt/qt6/bin/qmake qt6 - qbs-config defaultProfile qt6 - qbs config profiles.qt6.baseProfile clang - qbs build -f valentina.qbs -d $CIRRUS_WORKING_DIR/build --command-echo-mode command-line --jobs $(nproc) config:release modules.buildconfig.enableUnitTests:false modules.buildconfig.enableMultiBundle:${MULTI_BUNDLE} qbs.installRoot:$CIRRUS_WORKING_DIR/build/install-root profile:qt6 project.minimumMacosVersion:${MACOS_DEPLOYMENT_TARGET} modules.buildconfig.enableCcache:${ENABLE_CCACHE} moduleProviders.qbspkgconfig.extraPaths:$(brew --prefix xerces-c)/lib/pkgconfig,$(brew --prefix qt6)/lib/pkgconfig,$(brew --prefix openssl@1.1)/lib/pkgconfig "modules.buildconfig.signingIdentity:$MACOS_CERTIFICATE_NAME" modules.macdeployqt.libpath:$(brew --prefix qt6)/lib,$(brew --prefix poppler)/lib modules.macdeployqt.macdeployqtProgramBinPath:${HOME}/macdeployqt-install-dir - qbs build -f valentina.qbs -d $CIRRUS_WORKING_DIR/build -p 'Valentina DMG' --force-probe-execution --jobs $(nproc) config:release modules.buildconfig.enableUnitTests:false modules.buildconfig.enableMultiBundle:${MULTI_BUNDLE} qbs.installRoot:$CIRRUS_WORKING_DIR/build/install-root profile:qt6 project.minimumMacosVersion:${MACOS_DEPLOYMENT_TARGET} modules.buildconfig.enableCcache:${ENABLE_CCACHE} moduleProviders.qbspkgconfig.extraPaths:$(brew --prefix xerces-c)/lib/pkgconfig,$(brew --prefix qt6)/lib/pkgconfig,$(brew --prefix openssl@1.1)/lib/pkgconfig "modules.buildconfig.signingIdentity:$MACOS_CERTIFICATE_NAME" modules.macdeployqt.libpath:$(brew --prefix qt6)/lib,$(brew --prefix poppler)/lib modules.macdeployqt.macdeployqtProgramBinPath:${HOME}/macdeployqt-install-dir # Store the notarization credentials so that we can prevent a UI password dialog # from blocking the CI - echo "Create keychain profile" - xcrun notarytool store-credentials "notarytool-profile" --apple-id "$MACOS_NOTARIZATION_APPLE_ID" --team-id "$MACOS_NOTARIZATION_TEAM_ID" --password "$MACOS_NOTARIZATION_PWD" # Here we send the notarization request to the Apple's Notarization service, waiting for the result. # This typically takes a few seconds inside a CI environment, but it might take more depending on the App # characteristics. Visit the Notarization docs for more information and strategies on how to optimize it if # you're curious - echo "Notarize app" - xcrun notarytool submit "$CIRRUS_WORKING_DIR/build/install-root/share/valentina.dmg" --keychain-profile "notarytool-profile" --wait --timeout 5m # Finally, we need to "attach the staple" to our executable, which will allow our app to be # validated by macOS even when an internet connection is not available. - echo "Attach staple" - xcrun stapler staple $CIRRUS_WORKING_DIR/build/install-root/share/valentina.dmg || true - ccache -s deploy_script: - pwd - $CIRRUS_WORKING_DIR/scripts/cirrus-deploy.sh before_cache_script: - brew cleanup macos_task: macos_instance: image: ghcr.io/cirruslabs/macos-monterey-xcode:14 << : *MACOS_TASK_TEMPLATE env: DEPLOY: "true" QT_VERSION: Qt6 ARCH: armv8 PLATFORM: "macOS_12.4+" MACOS_DEPLOYMENT_TARGET: 12.0 ENABLE_CCACHE: false matrix: - name: 'macOS Monterey 12 [signle bundle, no tests]' env: MULTI_BUNDLE: false - name: 'macOS Monterey 12 [multi bundle, no tests]' env: MULTI_BUNDLE: true