chore: update tests #1715
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Continuous Integration | |
on: | |
push: | |
branches: | |
- develop | |
- master | |
- '*' | |
tags: | |
- "v*.*.*" | |
pull_request: | |
branches: | |
- develop | |
concurrency: | |
group: ${{format('{0}:{1}', github.repository, github.ref)}} | |
cancel-in-progress: true | |
jobs: | |
cpp-matrix: | |
runs-on: ubuntu-latest | |
name: Generate Test Matrix | |
outputs: | |
matrix: ${{ steps.cpp-matrix.outputs.matrix }} | |
steps: | |
- name: Clone cpp-actions | |
uses: actions/checkout@v3 | |
- name: Generate Test Matrix | |
uses: alandefreitas/cpp-actions/cpp-matrix@v1.5.0 | |
id: cpp-matrix | |
with: | |
compilers: | | |
gcc 13.2 | |
clang 16 | |
msvc 14.34 | |
standards: '>=20' | |
max-standards: 1 | |
latest-factors: gcc | |
factors: clang # Don't include Asan because `clang/AST/Decl.h` fails | |
build: | |
needs: cpp-matrix | |
strategy: | |
fail-fast: false | |
matrix: | |
include: ${{ fromJSON(needs.cpp-matrix.outputs.matrix) }} | |
defaults: | |
run: | |
shell: bash | |
name: ${{ matrix.name }} | |
runs-on: ${{ matrix.runs-on }} | |
container: ${{ matrix.container }} | |
permissions: | |
contents: write | |
steps: | |
- name: Clone MrDocs | |
uses: actions/checkout@v3 | |
- name: Install LLVM | |
id: llvm-install | |
shell: bash | |
run: | | |
set -xe | |
# Determine LLVM configuration type | |
llvm_config_type="${{ matrix.build-type }}" | |
if [ "${{ runner.os }}" == "Windows" ]; then | |
llvm_runner_os="Windows" | |
# if [ "$llvm_config_type" == "Release" ]; then | |
# llvm_config_type="RelWithDebInfo" | |
# fi | |
llvm_archive_type="7z" | |
llvm_config_type="Release" | |
else | |
llvm_runner_os="Linux" | |
llvm_archive_type="tar.xz" | |
llvm_config_type="Release" | |
fi | |
llvm_commit_id=29b20829 | |
llvm_archive_filename="$llvm_runner_os-$llvm_config_type-$llvm_commit_id.$llvm_archive_type" | |
llvm_url="https://github.com/cppalliance/mrdocs/releases/download/llvm-package-release/$llvm_archive_filename" | |
if ! curl --head --silent --fail "$llvm_url"; then | |
llvm_url="https://mrdox.com/llvm+clang/$llvm_archive_filename" | |
fi | |
# Download LLVM binaries | |
curl -L -o "$llvm_archive_filename" "$llvm_url" | |
# Install LLVM to runner.tool_cache/llvm+clang | |
llvm_root="${{runner.tool_cache}}/llvm+clang" | |
llvm_root=$(echo "$llvm_root" | sed 's/\\/\//g') | |
mkdir -p "$llvm_root" | |
if [ "${{ runner.os }}" != "Windows" ]; then | |
tar -xvf "$llvm_archive_filename" -C "$llvm_root" --strip-components=1 | |
else | |
7z x "$llvm_archive_filename" | |
cd "$llvm_config_type" | |
mv * "$llvm_root" | |
cd .. | |
rm -rf "$llvm_config_type" | |
fi | |
# Export LLVM_ROOT | |
echo "llvm_root=$llvm_root" | |
echo -E "llvm-root=$llvm_root" >> $GITHUB_OUTPUT | |
- name: Install Duktape | |
id: duktape-install | |
shell: bash | |
run: | | |
set -xe | |
curl -L -o "duktape-2.7.0.tar.xz" "https://github.com/svaarala/duktape/releases/download/v2.7.0/duktape-2.7.0.tar.xz" | |
duktape_dir="${{runner.tool_cache}}/duktape" | |
duktape_dir=$(echo "$duktape_dir" | sed 's/\\/\//g') | |
mkdir -p "$duktape_dir" | |
tar -xvf "duktape-2.7.0.tar.xz" -C "$duktape_dir" | |
echo "duktape-dir=$duktape_dir/duktape-2.7.0" >> $GITHUB_OUTPUT | |
echo "duktape_dir=$duktape_dir/duktape-2.7.0" | |
- name: Install Node.js | |
uses: actions/setup-node@v3 | |
with: | |
node-version: '18' | |
- name: Setup C++ | |
uses: alandefreitas/cpp-actions/setup-cpp@v1.5.0 | |
id: setup-cpp | |
with: | |
compiler: ${{ matrix.compiler }} | |
version: ${{ matrix.version }} | |
check-latest: ${{ matrix.compiler == 'clang' }} | |
- name: Install packages | |
uses: alandefreitas/cpp-actions/package-install@v1.5.0 | |
id: package-install | |
with: | |
apt-get: ${{ matrix.install }} openjdk-11-jdk ninja-build ${{ matrix.compiler == 'clang' && 'libstdc++-12-dev' || '' }} | |
vcpkg: fmt libxml2[tools] | |
cc: ${{ steps.setup-cpp.outputs.cc || matrix.cc }} | |
ccflags: ${{ matrix.ccflags }} | |
cxx: ${{ steps.setup-cpp.outputs.cxx || matrix.cxx }} | |
cxxflags: ${{ matrix.cxxflags }} | |
- name: CMake Workflow | |
uses: alandefreitas/cpp-actions/cmake-workflow@v1.5.0 | |
with: | |
cmake-version: '>=3.20' | |
generator: Ninja | |
toolchain: ${{ steps.package-install.outputs.vcpkg-toolchain }} | |
build-type: ${{ matrix.build-type }} | |
cxxstd: ${{ matrix.cxxstd }} | |
cc: ${{ steps.setup-cpp.outputs.cc || matrix.cc }} | |
ccflags: ${{ matrix.ccflags }} | |
cxx: ${{ steps.setup-cpp.outputs.cxx || matrix.cxx }} | |
cxxflags: ${{ matrix.cxxflags }}${{ ( matrix.compiler == 'gcc' && ' -static-libstdc++') || '' }}${{ ( matrix.asan && ' -static-libasan') || '' }}${{ ( matrix.tsan && ' -static-libtsan') || '' }} | |
install-prefix: .local | |
extra-args: ${{ format('-D LLVM_ROOT="{0}" -D Clang_ROOT="{0}" -D DUKTAPE_SOURCE_ROOT="{1}" -D CMAKE_EXPORT_COMPILE_COMMANDS=ON', steps.llvm-install.outputs.llvm-root || '/usr/local', steps.duktape-install.outputs.duktape-dir) }} | |
export-compile-commands: ${{ matrix.time-trace }} | |
package: ${{ matrix.is-main }} | |
package-dir: packages | |
- name: Upload GitHub Release Artifacts | |
if: ${{ matrix.is-main && matrix.compiler != 'clang' }} | |
uses: actions/upload-artifact@v3 | |
with: | |
name: release-packages-${{ runner.os }} | |
path: build/packages | |
retention-days: 1 | |
- name: FlameGraph | |
uses: alandefreitas/cpp-actions/flamegraph@v1.5.0 | |
if: matrix.time-trace | |
with: | |
build-dir: build | |
github_token: ${{ secrets.GITHUB_TOKEN }} | |
- name: Codecov | |
if: ${{ matrix.coverage }} | |
run: | | |
set -x | |
# Find gcov | |
gcov_tool="gcov" | |
if command -v "gcov-${{ steps.setup-cpp.outputs.version-major }}.${{ steps.setup-cpp.outputs.version-minor }}" &> /dev/null; then | |
gcov_tool="gcov" | |
elif command -v "gcov-${{ steps.setup-cpp.outputs.version-major }}" &> /dev/null; then | |
gcov_tool="gcov-${{ steps.setup-cpp.outputs.version-major }}" | |
fi | |
lcov -c -q -o "./build/coverage.info" -d "./build" --include "$(pwd)/*" --gcov-tool "$gcov_tool" | |
# Upload to codecov | |
bash <(curl -s https://codecov.io/bash) -f "./build/coverage.info" | |
# Update summary | |
echo "# Coverage" >> $GITHUB_STEP_SUMMARY | |
echo "" >> $GITHUB_STEP_SUMMARY | |
echo "[![codecov](https://codecov.io/github/$GITHUB_REPOSITORY/commit/$GITHUB_SHA/graphs/sunburst.svg)](https://codecov.io/github/$GITHUB_REPOSITORY/commit/$GITHUB_SHA)" >> $GITHUB_STEP_SUMMARY | |
echo "" >> $GITHUB_STEP_SUMMARY | |
echo "" >> $GITHUB_STEP_SUMMARY | |
echo "$GITHUB_REF_NAME: [![codecov](https://codecov.io/github/$GITHUB_REPOSITORY/branch/$GITHUB_REF_NAME/graph/badge.svg)](https://codecov.io/github/$GITHUB_REPOSITORY/commit/$GITHUB_SHA)" >> $GITHUB_STEP_SUMMARY | |
echo "" >> $GITHUB_STEP_SUMMARY | |
docs: | |
needs: build | |
defaults: | |
run: | |
shell: bash | |
name: Documentation | |
timeout-minutes: 30 | |
runs-on: ubuntu-22.04 | |
permissions: | |
contents: write | |
steps: | |
- name: Clone mrdocs | |
uses: actions/checkout@v3 | |
- name: Install Node.js | |
uses: actions/setup-node@v3 | |
with: | |
node-version: '18' | |
- name: Generate Site | |
working-directory: docs | |
run: | | |
npm install | |
master_antora_exists=$(curl --silent --fail --head https://github.com/cppalliance/mrdocs/blob/master/docs/antora.yml >/dev/null && echo "true" || echo "false") | |
develop_antora_exists=$(curl --silent --fail --head https://github.com/cppalliance/mrdocs/blob/develop/docs/antora.yml >/dev/null && echo "true" || echo "false") | |
if [ "$master_antora_exists" == "true" ] && [ "$develop_antora_exists" == "true" ]; then | |
# Antora is set up in both master and develop: render complete playbook | |
npx antora antora-playbook.yml | |
else | |
# Antora is not set up in master and develop yet: render local playbook while integration is not complete | |
# The local playbook is used for local development and for the documentation included in the release | |
npx antora local-antora-playbook.yml | |
fi | |
- name: Publish to GitHub Pages | |
if: ${{ github.event_name == 'push' && (contains(fromJSON('["master", "develop"]'), github.ref_name) || startsWith(github.ref, 'refs/tags/')) }} | |
uses: peaceiris/actions-gh-pages@v3 | |
with: | |
github_token: ${{ secrets.GITHUB_TOKEN }} | |
publish_dir: docs/build/site | |
force_orphan: true | |
- name: Update website | |
if: ${{ github.event_name == 'push' && (contains(fromJSON('["master", "develop"]'), github.ref_name) || startsWith(github.ref, 'refs/tags/')) }} | |
env: | |
SSH_AUTH_SOCK: /tmp/ssh_agent.sock | |
run: | | |
# Add SSH key | |
mkdir -p /home/runner/.ssh | |
ssh-keyscan dev-websites.cpp.al >> /home/runner/.ssh/known_hosts | |
echo "${{ secrets.DEV_WEBSITES_SSH_KEY }}" > /home/runner/.ssh/github_actions | |
chmod 600 /home/runner/.ssh/github_actions | |
ssh-agent -a $SSH_AUTH_SOCK > /dev/null | |
ssh-add /home/runner/.ssh/github_actions | |
# Copy files | |
chmod 755 -R $(pwd)/docs/build/site | |
scp -r $(pwd)/docs/build/site/* ubuntu@dev-websites.cpp.al:/var/www/mrdox.com/ | |
demos: | |
needs: build | |
defaults: | |
run: | |
shell: bash | |
name: Demos | |
timeout-minutes: 120 | |
runs-on: ubuntu-22.04 | |
permissions: | |
contents: write | |
steps: | |
- name: Clone mrdocs | |
uses: actions/checkout@v3 | |
- uses: actions/download-artifact@v3 | |
with: | |
name: release-packages-Linux | |
path: packages | |
- name: List artifacts | |
run: ls -R | |
working-directory: packages | |
- name: Setup C++ | |
uses: alandefreitas/cpp-actions/setup-cpp@v1.5.0 | |
id: setup-cpp | |
with: | |
compiler: clang | |
version: 16 | |
check-latest: true | |
- name: Install packages | |
uses: alandefreitas/cpp-actions/package-install@v1.5.0 | |
id: package-install | |
with: | |
apt-get: libstdc++-12-dev asciidoctor | |
cc: ${{ steps.setup-cpp.outputs.cc }} | |
cxx: ${{ steps.setup-cpp.outputs.cxx }} | |
- name: Install mrdocs from release package | |
run: | | |
set -x | |
sudo find packages -name 'MrDocs-*-Linux.tar.gz' -exec tar -xzf {} -C /usr/local --strip-components=1 \; | |
mrdocs --version | |
- name: Clone Boost.URL | |
uses: alandefreitas/cpp-actions/boost-clone@v1.5.0 | |
id: boost-url-clone | |
with: | |
branch: master | |
modules: url | |
boost-dir: boost | |
modules-scan-paths: '"test example"' | |
modules-exclude-paths: '' | |
trace-commands: true | |
- name: Configure Boost.URL | |
working-directory: boost/libs/url | |
run: | | |
set -x | |
if [ -d "__build__" ]; then | |
rm -rf __build__ | |
fi | |
mkdir __build__ | |
cd __build__ | |
mkdir __include_dirs__ | |
cd __include_dirs__ | |
output_file="include_dirs.txt" | |
echo "cmake_minimum_required(VERSION 3.22)" > CMakeLists.txt | |
echo "project(get_implicit_dirs)" >> CMakeLists.txt | |
echo "file(WRITE \"${output_file}\" \"\${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}\")" >> CMakeLists.txt | |
mkdir __build__ | |
cd __build__ | |
cmake -D CMAKE_CXX_COMPILER=${{ steps.setup-cpp.outputs.cxx }} -D CMAKE_C_COMPILER=${{ steps.setup-cpp.outputs.cc }} .. | |
cd .. | |
default_includes=$(cat "$output_file") | |
cd .. | |
cmake -D BOOST_URL_BUILD_TESTS=OFF -D BOOST_URL_BUILD_EXAMPLES=OFF -D CMAKE_EXPORT_COMPILE_COMMANDS=ON -D CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES="$default_includes" -D CMAKE_CXX_COMPILER=${{ steps.setup-cpp.outputs.cxx }} -D CMAKE_C_COMPILER=${{ steps.setup-cpp.outputs.cc }} .. | |
- name: Generate demos | |
run: | | |
echo "verbose: true" > $(pwd)/boost/libs/url/mrdocs-single.yml | |
echo "source-root: ." >> $(pwd)/boost/libs/url/mrdocs-single.yml | |
echo "multipage: false" >> $(pwd)/boost/libs/url/mrdocs-single.yml | |
echo "inaccessible-members: never" >> $(pwd)/boost/libs/url/mrdocs-single.yml | |
echo "filters:" >> $(pwd)/boost/libs/url/mrdocs-single.yml | |
echo " symbols:" >> $(pwd)/boost/libs/url/mrdocs-single.yml | |
echo " exclude:" >> $(pwd)/boost/libs/url/mrdocs-single.yml | |
echo " - 'boost::urls::detail'" >> $(pwd)/boost/libs/url/mrdocs-single.yml | |
echo " - 'boost::urls::*::detail'" >> $(pwd)/boost/libs/url/mrdocs-single.yml | |
echo "verbose: true" > $(pwd)/boost/libs/url/mrdocs-multi.yml | |
echo "source-root: ." >> $(pwd)/boost/libs/url/mrdocs-multi.yml | |
echo "multipage: true" >> $(pwd)/boost/libs/url/mrdocs-multi.yml | |
echo "inaccessible-members: never" >> $(pwd)/boost/libs/url/mrdocs-multi.yml | |
echo "filters:" >> $(pwd)/boost/libs/url/mrdocs-multi.yml | |
echo " symbols:" >> $(pwd)/boost/libs/url/mrdocs-multi.yml | |
echo " exclude:" >> $(pwd)/boost/libs/url/mrdocs-multi.yml | |
echo " - 'boost::urls::detail'" >> $(pwd)/boost/libs/url/mrdocs-multi.yml | |
echo " - 'boost::urls::*::detail'" >> $(pwd)/boost/libs/url/mrdocs-multi.yml | |
set -x | |
for variant in single multi; do | |
for format in adoc html xml; do | |
mkdir -p "demos/boost-url/$variant/$format" | |
mrdocs --config="$(pwd)/boost/libs/url/mrdocs-$variant.yml" "$(pwd)/boost/libs/url/__build__/compile_commands.json" --addons="$(pwd)/share/mrdocs/addons" --format="$format" --output="$(pwd)/demos/boost-url/$variant/$format" | |
done | |
asciidoctor -R "$(pwd)/demos/boost-url/$variant/adoc" -D "$(pwd)/demos/boost-url/$variant/adoc-asciidoc" "$(pwd)/demos/boost-url/$variant/adoc/**/*.adoc" | |
done | |
tar -cjf $(pwd)/demos.tar.gz -C $(pwd)/demos --strip-components 1 . | |
echo "demos_path=$(pwd)/demos.tar.gz" >> $GITHUB_ENV | |
- name: Upload demo artifacts | |
uses: actions/upload-artifact@v3 | |
with: | |
name: demos | |
path: ${{ env.demos_path }} | |
retention-days: 1 | |
- name: Update website demos | |
if: ${{ github.event_name == 'push' && (contains(fromJSON('["master", "develop"]'), github.ref_name) || startsWith(github.ref, 'refs/tags/')) }} | |
env: | |
SSH_AUTH_SOCK: /tmp/ssh_agent.sock | |
run: | | |
# Add SSH key | |
mkdir -p /home/runner/.ssh | |
ssh-keyscan dev-websites.cpp.al >> /home/runner/.ssh/known_hosts | |
echo "${{ secrets.DEV_WEBSITES_SSH_KEY }}" > /home/runner/.ssh/github_actions | |
chmod 600 /home/runner/.ssh/github_actions | |
ssh-agent -a $SSH_AUTH_SOCK > /dev/null | |
ssh-add /home/runner/.ssh/github_actions | |
# Copy files | |
demo_dir="/var/www/mrdox.com/demos/${{ github.ref_name }}" | |
ssh ubuntu@dev-websites.cpp.al "rm -rf $demo_dir; mkdir -p $demo_dir" | |
chmod 755 -R $(pwd)/demos | |
scp -r $(pwd)/demos/* ubuntu@dev-websites.cpp.al:$demo_dir/ | |
releases: | |
needs: build | |
defaults: | |
run: | |
shell: bash | |
name: Releases | |
timeout-minutes: 120 | |
runs-on: ubuntu-22.04 | |
permissions: | |
contents: write | |
steps: | |
- name: Clone mrdocs | |
uses: actions/checkout@v3 | |
- uses: actions/download-artifact@v3 | |
with: | |
name: release-packages-Linux | |
path: build | |
- uses: actions/download-artifact@v3 | |
with: | |
name: release-packages-Windows | |
path: build | |
- name: List artifacts | |
run: ls -R | |
working-directory: build | |
- name: Create changelog | |
uses: alandefreitas/cpp-actions/create-changelog@v1.5.0 | |
with: | |
output-path: CHANGELOG.md | |
thank-non-regular: ${{ startsWith(github.ref, 'refs/tags/') }} | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
limit: 150 | |
- name: Remove branch release | |
if: ${{ github.event_name == 'push' && (contains(fromJSON('["master", "develop"]'), github.ref_name)) }} | |
uses: dev-drprasad/delete-tag-and-release@v1.0 | |
with: | |
tag_name: ${{ github.ref_name }}-release | |
github_token: ${{ secrets.GITHUB_TOKEN }} | |
delete_release: true | |
- name: Create GitHub Package Release | |
if: ${{ github.event_name == 'push' && (contains(fromJSON('["master", "develop"]'), github.ref_name) || startsWith(github.ref, 'refs/tags/')) }} | |
uses: softprops/action-gh-release@v1 | |
with: | |
files: build/MrDocs-?.?.?-*.* | |
name: ${{ github.ref_name || github.ref }} | |
tag_name: ${{ github.ref_name || github.ref }}${{ ((!startsWith(github.ref, 'refs/tags/')) && '-release') || '' }} | |
body_path: CHANGELOG.md | |
prerelease: false | |
draft: false | |
token: ${{ github.token }} | |
- uses: dev-drprasad/delete-older-releases@v0.2.1 | |
if: ${{ github.event_name == 'push' && contains(fromJSON('["master", "develop"]'), github.ref_name) }} | |
with: | |
keep_latest: 1 | |
delete_tag_pattern: ${{ github.ref_name }} | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |