Overload sets and scope refactor #1777
Workflow file for this run
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/[email protected] | |
id: cpp-matrix | |
with: | |
compilers: | | |
gcc 13.1 | |
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/[email protected] | |
id: setup-cpp | |
with: | |
compiler: ${{ matrix.compiler }} | |
version: ${{ matrix.version }} | |
check-latest: ${{ matrix.compiler == 'clang' }} | |
- name: Install packages | |
uses: alandefreitas/cpp-actions/[email protected] | |
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/[email protected] | |
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/[email protected] | |
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/* [email protected]:/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/[email protected] | |
id: setup-cpp | |
with: | |
compiler: clang | |
version: 16 | |
check-latest: true | |
- name: Install packages | |
uses: alandefreitas/cpp-actions/[email protected] | |
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/[email protected] | |
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: | | |
config_template=$(printf '%s\n' \ | |
"verbose: true" \ | |
"source-root: ." \ | |
"generate: %s" \ | |
"multipage: %s" \ | |
"inaccessible-members: never" \ | |
"filters:" \ | |
" symbols:" \ | |
" exclude:" \ | |
" - 'boost::urls::detail'" \ | |
" - 'boost::urls::*::detail'" \ | |
) | |
set -x | |
for variant in single multi; do | |
for format in adoc html xml; do | |
[[ $variant = multi ]] && multiline="true" || multiline="false" | |
printf "$config_template\n" $format $multiline > $(pwd)/boost/libs/url/mrdocs.yml | |
mkdir -p "demos/boost-url/$variant/$format" | |
mrdocs --config="$(pwd)/boost/libs/url/mrdocs.yml" "$(pwd)/boost/libs/url/__build__/compile_commands.json" --addons="$(pwd)/share/mrdocs/addons" --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 [email protected] "rm -rf $demo_dir; mkdir -p $demo_dir" | |
chmod 755 -R $(pwd)/demos | |
scp -r $(pwd)/demos/* [email protected]:$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/[email protected] | |
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/[email protected] | |
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/[email protected] | |
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 }} | |