Skip to content

refactor!: project name is mrdocs #1681

refactor!: project name is mrdocs

refactor!: project name is mrdocs #1681

Workflow file for this run

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/mrdox/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/mrdox/blob/master/docs/antora.yml >/dev/null && echo "true" || echo "false")
develop_antora_exists=$(curl --silent --fail --head https://github.com/cppalliance/mrdox/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 }}