From 48a95abb59e40f983a92c4b69ff4eed06681d08e Mon Sep 17 00:00:00 2001 From: Stephan Hageboeck Date: Tue, 19 May 2026 16:56:16 +0200 Subject: [PATCH 1/9] [ci][docs] Fix escaping of regexes in converttonotebook. Strings such as "\s" are not correct, any more. --- documentation/doxygen/converttonotebook.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/doxygen/converttonotebook.py b/documentation/doxygen/converttonotebook.py index bb13fb99d0625..f4cb4f6bc701d 100755 --- a/documentation/doxygen/converttonotebook.py +++ b/documentation/doxygen/converttonotebook.py @@ -423,7 +423,7 @@ def findBracedBlock(text, startpos, openingBraceChar): def findStuffBeforeFunc(text, searchStart, searchEnd): - beforeFunctionRe = re.compile("(;|}|//[^\n]*)\s*$", flags = re.MULTILINE) + beforeFunctionRe = re.compile("(;|}|//[^\n]*)\\s*$", flags = re.MULTILINE) try: # Find the last '}' or comment line etc before function definition: lastMatchBeforeFunc = [thisMatch for thisMatch in beforeFunctionRe.finditer(text, searchStart, searchEnd)][-1] @@ -622,7 +622,7 @@ def changeString(matchObject): matchString = matchString.replace("THISISASPACE" , " ") return matchString - newcode = re.sub("#\s\s?\w\s[\w-]\s\w.*", changeString , code) + newcode = re.sub(r"#\s\s?\w\s[\w-]\s\w.*", changeString , code) return newcode def declareNamespace(code): From f3e80beb9feae81e756048f6d6d6de147a7ea01e Mon Sep 17 00:00:00 2001 From: Stephan Hageboeck Date: Tue, 23 Jun 2026 15:15:14 +0200 Subject: [PATCH 2/9] [CI] Prepare build_root.py for running without checkout. For the doxygen build, it's sufficient to take the source directory prepared by the checkout action. Therefore, a --source_dir argument has been added to the script, which simply picks up the source directory. --- .../workflows/root-ci-config/build_root.py | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/.github/workflows/root-ci-config/build_root.py b/.github/workflows/root-ci-config/build_root.py index 27e49bb7049fc..7ba816342b576 100755 --- a/.github/workflows/root-ci-config/build_root.py +++ b/.github/workflows/root-ci-config/build_root.py @@ -143,7 +143,8 @@ def main(): build_utils.print_warning(f'Failed to download: {err}') args.incremental = False - git_pull("src", args.repository, args.base_ref) + if not args.source_dir: + git_pull("src", args.repository, args.base_ref) benchmark: bool = 'rootbench' in options_dict and options_dict['rootbench'] == "ON" if benchmark: @@ -166,7 +167,10 @@ def main(): # Delete all the .gcda files produces by an artefact. build_utils.remove_file_match_ext(WORKDIR, "gcda") - build(options, args.buildtype) + if args.source_dir: + build(options, args.buildtype, source_dir=args.source_dir) + else: + build(options, args.buildtype) # Build artifacts should only be uploaded for full builds, and only for # "official" branches (master, v?-??-??-patches), i.e. not for pull_request @@ -227,6 +231,7 @@ def parse_args(): parser.add_argument("--pull_repository", default="", help="Url to the pull request incoming repository") parser.add_argument("--head_ref", default=None, help="Ref to feature branch; it may contain a : part") parser.add_argument("--head_sha", default=None, help="Sha of commit that triggered the event") + parser.add_argument("--source_dir", default=None, help="Don't check out. Just use the source dir provided here.") parser.add_argument("--binaries", default="false", help="Whether to create binary artifacts") parser.add_argument("--architecture", default=None, help="Windows only, target arch") parser.add_argument("--repository", default="https://github.com/root-project/root.git", @@ -242,7 +247,7 @@ def parse_args(): args.binaries = args.binaries.lower() in ('yes', 'true', '1', 'on') args.upload_artifacts = args.upload_artifacts.lower() in ('yes', 'true', '1', 'on') - if not args.base_ref: + if not args.base_ref and not args.source_dir: die(os.EX_USAGE, "base_ref not specified") if not args.platform_config: # If nothing special, we take the standard platform configuration, called as the platform @@ -396,8 +401,11 @@ def archive_and_upload(archive_name, prefix): @github_log_group("Configure") -def cmake_configure(options, buildtype): - srcdir = os.path.join(WORKDIR, "src") +def cmake_configure(options, buildtype, **kwargs): + if 'source_dir' in kwargs: + srcdir = kwargs['source_dir'] + else: + srcdir = os.path.join(WORKDIR, "src") builddir = os.path.join(WORKDIR, "build") # Add a private option to make the CI build faster by not changing the @@ -445,7 +453,7 @@ def cmake_build(buildtype): die(result, "Failed to build") -def build(options, buildtype): +def build(options, buildtype, **kwargs): if not os.path.isdir(os.path.join(WORKDIR, "build")): builddir = os.path.join(WORKDIR, "build") result = subprocess_with_log(f"mkdir {builddir}") @@ -454,7 +462,7 @@ def build(options, buildtype): die(result, "Failed to create build directory") if not os.path.exists(os.path.join(WORKDIR, "build", "CMakeCache.txt")): - cmake_configure(options, buildtype) + cmake_configure(options, buildtype, **kwargs) else: cmake_dump_config() From 323da071565385e361e6f9ea53c379742ee33623 Mon Sep 17 00:00:00 2001 From: Stephan Hageboeck Date: Mon, 18 May 2026 13:42:09 +0200 Subject: [PATCH 3/9] [ci][docs] Move doxygen job to alma10; simplify. - Base the doxygen job on the alma10 container. - This allows for using a preinstalled doxygen in the container (currently 1.13.2), replacing the manual install of 1.10 - Also use preinstalled XRootD and qhelpgenerator - Mount the alma10 ccache volume to speed up builds - Remove the override step from the doxygen job. Overrides can be specified as command-line arguments, which significantly shortens the job file. - Remove the duplicated build step. There is no difference between the jobs, so we don't need build job based on the workflow trigger. - Create & compress the tar archive in one go. - Move to qhelpgenerator from qt6: In qt6, with Alma10, qhelpgenerator moved to /usr/lib64, so doxygen didn't find it. --- .github/workflows/root-docs-ci.yml | 98 ++++++------------------------ documentation/doxygen/Doxyfile | 2 +- 2 files changed, 20 insertions(+), 80 deletions(-) diff --git a/.github/workflows/root-docs-ci.yml b/.github/workflows/root-docs-ci.yml index 1cd64060689c3..8d2430f6e9f17 100644 --- a/.github/workflows/root-docs-ci.yml +++ b/.github/workflows/root-docs-ci.yml @@ -33,19 +33,21 @@ jobs: - x64 env: - PLATFORM: alma9 + PLATFORM: alma10 DOC_DIR: master DOC_LOCATION: /github/home BASE_REF: master WEB_DIR_NAME: master - TAR_NAME: htmlmaster.tar + TAR_FILE: htmlmaster.tar.gz permissions: contents: read container: - image: registry.cern.ch/root-ci/alma9:buildready + image: registry.cern.ch/root-ci/alma10:buildready options: '--security-opt label=disable --rm' + volumes: + - alma10_ccache_volume:/github/home/.cache/ccache env: OS_APPLICATION_CREDENTIAL_ID: '7f5b64a265244623a3a933308569bdba' OS_APPLICATION_CREDENTIAL_SECRET: ${{ secrets.OS_APPLICATION_CREDENTIAL_SECRET }} @@ -57,6 +59,12 @@ jobs: PYTHONUNBUFFERED: true steps: + - name: Prepare qhelpgenerator + # Qt6's libexec executables are not in the PATH by default + run: | + QHELPGENERATOR=$(which qhelpgenerator) && echo "QHELPGENERATOR=${QHELPGENERATOR}" >> "${GITHUB_ENV}" + PATH=/usr/lib64/qt6/libexec/:${PATH} QHELPGENERATOR=$(which qhelpgenerator) && echo "QHELPGENERATOR=${QHELPGENERATOR}" >> "${GITHUB_ENV}" + - name: Checkout uses: actions/checkout@v6 with: @@ -67,69 +75,9 @@ jobs: # if the `if` expr is false, `if` still has exit code 0. # if the `if` block is entered, the block's exit code becomes the exit # code of the `if`. - run: 'if [ -d /py-venv/ROOT-CI/bin/ ]; then . /py-venv/ROOT-CI/bin/activate && echo PATH=$PATH >> $GITHUB_ENV; fi' - - - name: Set up directory name and tar filenames - run: | - echo TAR_NAME=html${BASE_REF}.tar >> $GITHUB_ENV - echo DOCDIR_NAME=${BASE_REF} >> $GITHUB_ENV - - # TODO: install latest versions in image on root-ci-images - - name: Install Doxygen 1.10.0 - run : | - mkdir -p ${{ github.workspace }}/doxygen - curl -L https://github.com/doxygen/doxygen/releases/download/Release_1_10_0/doxygen-1.10.0.linux.bin.tar.gz | tar -xz -C ${{ github.workspace }}/doxygen/ --strip-components=1 - echo PATH=$PATH:${{ github.workspace }}/doxygen/bin >> $GITHUB_ENV -# git clone --branch Release_1_12_0 https://github.com/doxygen/doxygen.git -# cd doxygen -# mkdir build -# cd build -# cmake .. -# make -j$(nproc) -# echo PATH=$PATH:${{ github.workspace }}/doxygen/build/bin >> $GITHUB_ENV -# cd ${{ github.workspace }} -# doxygen --version - - - name: Install qhelpgenerator-qt5 - run: | - dnf upgrade -y - dnf install -y qt5-doctools - which qhelpgenerator-qt5 - - - name: Apply option overrides - env: - OVERRIDES: "testing=Off roottest=Off" - CONFIGFILE: '.github/workflows/root-ci-config/buildconfig/alma9.txt' - shell: bash - run: | - set -x - echo '' >> "$CONFIGFILE" - for ENTRY in $OVERRIDES; do - KEY=$( echo "$ENTRY" | cut -d '=' -f 1 ) - # Add entry to file if not exists, otherwise replace - if grep -q "$KEY=" "$CONFIGFILE"; then - sed -i "s/$KEY=.*\$/$ENTRY/" "$CONFIGFILE" - else - echo "$ENTRY" >> "$CONFIGFILE" - fi - done - cat "$CONFIGFILE" || true - - - name: Build ROOT - Workflow Dispatch - if: github.event_name == 'workflow_dispatch' - env: - INCREMENTAL: ${{ inputs.incremental == 'true' }} - run: ".github/workflows/root-ci-config/build_root.py - --buildtype Release - --platform ${{ env.PLATFORM }} - --incremental ${{ env.INCREMENTAL }} - --base_ref ${BASE_REF} - --head_ref ${BASE_REF} - --binaries false - --repository ${{ github.server_url }}/${{ github.repository }}" + run: 'if [ -d /py-venv/ROOT-CI/bin/ ]; then . /py-venv/ROOT-CI/bin/activate && echo ${PATH%:*} >> "${GITHUB_PATH}"; fi' - - name: Build ROOT - Schedule - if: github.event_name == 'schedule' + - name: Build ROOT run: ".github/workflows/root-ci-config/build_root.py --buildtype Release --platform ${{ env.PLATFORM }} @@ -137,7 +85,8 @@ jobs: --base_ref ${BASE_REF} --head_ref ${BASE_REF} --binaries false - --repository ${{ github.server_url }}/${{ github.repository }}" + --repository ${{ github.server_url }}/${{ github.repository }} + --overrides testing=Off roottest=Off" - name: Run Doxygen working-directory: ${{ env.DOC_LOCATION }} @@ -154,11 +103,8 @@ jobs: run: | pwd ls -l - echo ${DOC_DIR} - echo ${TAR_NAME} ls -l ${DOC_DIR} - tar cf ${TAR_NAME} ${DOC_DIR} - gzip ${TAR_NAME} + tar -caf ${TAR_FILE} ${DOC_DIR} ls -l #Upload to GitHub as an artifact @@ -166,16 +112,10 @@ jobs: if: ${{ !cancelled() }} uses: actions/upload-artifact@v6 with: - name: ${{env.TAR_NAME}}.gz - path: ${{env.DOC_LOCATION}}/${{env.TAR_NAME}}.gz + name: ${{env.TAR_FILE}} + path: ${{env.DOC_LOCATION}}/${{env.TAR_FILE}} if-no-files-found: error - - name: Install Kerberos utilities - run: dnf -y install krb5-workstation - - - name: Install XRootD client - run: dnf -y install xrootd-client - - name: Sync documentation to EOS env: RWEBEOS_KT: ${{ secrets.RWEBEOS_KT }} @@ -206,5 +146,5 @@ jobs: rm -r html xrdcp --parallel 64 -rf ./ ${EOS_ENDPOINT}/${EOS_BASE_PATH}/doc/${WEB_DIR_NAME} || failure=1 cd .. - xrdcp -rf ${TAR_NAME}.gz ${EOS_ENDPOINT}/${EOS_BASE_PATH}/download || failure=1 + xrdcp -rf ${TAR_FILE} ${EOS_ENDPOINT}/${EOS_BASE_PATH}/download || failure=1 exit $failure diff --git a/documentation/doxygen/Doxyfile b/documentation/doxygen/Doxyfile index a46142f3c676f..79433c26ee0ec 100644 --- a/documentation/doxygen/Doxyfile +++ b/documentation/doxygen/Doxyfile @@ -1699,7 +1699,7 @@ QHP_SECT_FILTER_ATTRS = # run qhelpgenerator on the generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. -QHG_LOCATION = qhelpgenerator-qt5 +QHG_LOCATION = $(QHELPGENERATOR) # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To From 3e6622f7322965360b19f41945b1604d5fd118d1 Mon Sep 17 00:00:00 2001 From: Stephan Hageboeck Date: Tue, 19 May 2026 17:49:23 +0200 Subject: [PATCH 4/9] [ci][docs] Add a step to clean temporary files. The md5 and map files are used only when doxygen is run on an existing folder. They therefore should not be uploaded or put in the tar archive. --- .github/workflows/root-docs-ci.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/root-docs-ci.yml b/.github/workflows/root-docs-ci.yml index 8d2430f6e9f17..6b42a78b8cb03 100644 --- a/.github/workflows/root-docs-ci.yml +++ b/.github/workflows/root-docs-ci.yml @@ -97,6 +97,14 @@ jobs: cd ROOT-CI/src/documentation/doxygen make -j `nproc --all` + - name: Clean temporary files + # These files are used when doxygen runs incrementally + shell: bash + run: | + cd "/github/home/${DOC_DIR}" + rm html/*.md5 + rm html/*.map + - name: Create documentation archives working-directory: ${{ env.DOC_LOCATION }} shell: bash @@ -135,8 +143,6 @@ jobs: echo ${RWEBEOS_KT} | base64 -d > ${KT_FILE_NAME} kinit -p ${{ secrets.KRB5USER }}@${{ secrets.KRB5REALM }} -kt ${KT_FILE_NAME} cd ${DOC_DIR}/html/ - rm -rf *.map # Intermediate files to create dot graphs - rm -rf *.md5 # As above xrdcp --parallel 64 -rf ./*.html ${EOS_ENDPOINT}/${EOS_BASE_PATH}/doc/${WEB_DIR_NAME} || failure=1 rm -rf *.html xrdcp --parallel 64 -rf ./*.svg ${EOS_ENDPOINT}/${EOS_BASE_PATH}/doc/${WEB_DIR_NAME} || failure=1 From e0e52f376d228c9a89266a8e76fca2d79c62e93b Mon Sep 17 00:00:00 2001 From: Stephan Hageboeck Date: Mon, 18 May 2026 14:16:25 +0200 Subject: [PATCH 5/9] [ci][docs] Run doxy on PR, overhaul triggers, checkout and job inputs. - Add a pull request trigger. This builds the documentation when the doxygen job .yml or files in the doxygen folder are changed. - For manual triggers, allow for choosing the eos upload directory as a job input. - Use only one single checkout for the entire job. The github checkout action knows how to get the correct branch that triggered the workflow, or how to get the PR merge commit. ROOT is built from that source directory, and doxygen subsequently runs from that directory. - Remove the workflow input "incremental". Since the documentation jobs don't upload or download anything, it is without effect. - Run eos upload based on whether secrets are present (i.e. not when PR comes from a fork). --- .github/workflows/root-docs-ci.yml | 82 +++++++++++++++--------------- 1 file changed, 42 insertions(+), 40 deletions(-) diff --git a/.github/workflows/root-docs-ci.yml b/.github/workflows/root-docs-ci.yml index 6b42a78b8cb03..50f5286f7054b 100644 --- a/.github/workflows/root-docs-ci.yml +++ b/.github/workflows/root-docs-ci.yml @@ -1,27 +1,35 @@ name: 'ROOT Docs CI' on: + pull_request: + paths: + - '.github/workflows/root-docs-ci.yml' + - 'documentation/doxygen/**' + branches: + - 'master' - # Allows nightly builds to trigger one run for each branch easily, by - # providing the relevant branch as "default" value here: workflow_call: - inputs: - incremental: - type: boolean - default: true workflow_dispatch: inputs: - incremental: - description: 'Do full build' - type: boolean + eos_upload_directory: + description: 'Make documentation available at /doc/. Leave empty for skipping the upload to eos.' + type: string required: false - default: false - # docu_input: # opportunity: overwrite makeinput.sh with these args - # description: Folders to build documentation for. All folders are built if empty. - # type: string - # default: "" - # required: false + default: 'master' + +env: + PLATFORM: alma10 + DOC_DIR: ${{ case(github.base_ref == null, github.ref_name, 'PullRequest') }} + DOC_LOCATION: /github/home + EOS_DIR_NAME: |- + ${{ case( + inputs.eos_upload_directory != null, inputs.eos_upload_directory, + github.base_ref != null, 'PR', + github.ref_name + ) + }} + TAR_FILE: html${{ case(github.base_ref == null, github.ref_name, '_PullRequest') }}.tar.gz jobs: build-docs: @@ -32,14 +40,6 @@ jobs: - linux - x64 - env: - PLATFORM: alma10 - DOC_DIR: master - DOC_LOCATION: /github/home - BASE_REF: master - WEB_DIR_NAME: master - TAR_FILE: htmlmaster.tar.gz - permissions: contents: read @@ -68,7 +68,6 @@ jobs: - name: Checkout uses: actions/checkout@v6 with: - ref: ${{ env.BASE_REF }} fetch-depth: 0 - name: Set up Python Virtual Env @@ -81,21 +80,20 @@ jobs: run: ".github/workflows/root-ci-config/build_root.py --buildtype Release --platform ${{ env.PLATFORM }} - --incremental ${{ inputs.incremental }} - --base_ref ${BASE_REF} - --head_ref ${BASE_REF} - --binaries false + --incremental false + --source_dir ${GITHUB_WORKSPACE} --repository ${{ github.server_url }}/${{ github.repository }} - --overrides testing=Off roottest=Off" + --overrides testing=Off roottest=Off + --upload_artifacts false + --binaries false" - name: Run Doxygen - working-directory: ${{ env.DOC_LOCATION }} shell: bash run: | - source ROOT-CI/build/bin/thisroot.sh - export DOXYGEN_OUTPUT_DIRECTORY=/github/home/${DOC_DIR} - cd ROOT-CI/src/documentation/doxygen - make -j `nproc --all` + source ${HOME}/ROOT-CI/build/bin/thisroot.sh + export DOXYGEN_OUTPUT_DIRECTORY="/github/home/${DOC_DIR}" + cd documentation/doxygen + make -j "$(nproc --all)" - name: Clean temporary files # These files are used when doxygen runs incrementally @@ -115,8 +113,7 @@ jobs: tar -caf ${TAR_FILE} ${DOC_DIR} ls -l - #Upload to GitHub as an artifact - - name: Upload tar file for GH + - name: Upload tar file to github if: ${{ !cancelled() }} uses: actions/upload-artifact@v6 with: @@ -133,24 +130,29 @@ jobs: EOS_BASE_PATH: /eos/project/r/root-eos/website/ EOS_ENDPOINT: root://eosproject-r.cern.ch KRB5CCNAME: /tmp/krb5cc + if: ${{ env.KRB5REALM != '' && env.EOS_DIR_NAME != null && env.EOS_DIR_NAME != '' }} working-directory: ${{ env.DOC_LOCATION }} # Because of https://github.com/xrootd/xrootd/issues/2235 , the xrd client can copy # only at most 65536 in one go. For this reason, we copy files in batches, dividing # them by extension. Once that is fixed in XRootD, a single command can be used # instead. run: | + echo "Input eos directory: ${EOS_DIR_NAME}" + EOS_DIR_NAME="${EOS_DIR_NAME%-00-patches}" + EOS_DIR_NAME="${EOS_DIR_NAME/-/}" + echo "Uploading to the directory: ${EOS_DIR_NAME}" failure=0 echo ${RWEBEOS_KT} | base64 -d > ${KT_FILE_NAME} kinit -p ${{ secrets.KRB5USER }}@${{ secrets.KRB5REALM }} -kt ${KT_FILE_NAME} cd ${DOC_DIR}/html/ - xrdcp --parallel 64 -rf ./*.html ${EOS_ENDPOINT}/${EOS_BASE_PATH}/doc/${WEB_DIR_NAME} || failure=1 + xrdcp --parallel 64 -rf ./*.html ${EOS_ENDPOINT}/${EOS_BASE_PATH}/doc/${EOS_DIR_NAME} || failure=1 rm -rf *.html - xrdcp --parallel 64 -rf ./*.svg ${EOS_ENDPOINT}/${EOS_BASE_PATH}/doc/${WEB_DIR_NAME} || failure=1 + xrdcp --parallel 64 -rf ./*.svg ${EOS_ENDPOINT}/${EOS_BASE_PATH}/doc/${EOS_DIR_NAME} || failure=1 rm -rf *.svg - xrdcp --parallel 64 -rf ./ ${EOS_ENDPOINT}/${EOS_BASE_PATH}/doc/${WEB_DIR_NAME} || failure=1 + xrdcp --parallel 64 -rf ./ ${EOS_ENDPOINT}/${EOS_BASE_PATH}/doc/${EOS_DIR_NAME} || failure=1 cd .. rm -r html - xrdcp --parallel 64 -rf ./ ${EOS_ENDPOINT}/${EOS_BASE_PATH}/doc/${WEB_DIR_NAME} || failure=1 + xrdcp --parallel 64 -rf ./ ${EOS_ENDPOINT}/${EOS_BASE_PATH}/doc/${EOS_DIR_NAME} || failure=1 cd .. xrdcp -rf ${TAR_FILE} ${EOS_ENDPOINT}/${EOS_BASE_PATH}/download || failure=1 exit $failure From 1bc95a01b6fe3217ae9ab68d6eb0bfa9a33cd68b Mon Sep 17 00:00:00 2001 From: Stephan Hageboeck Date: Thu, 25 Jun 2026 11:02:24 +0200 Subject: [PATCH 6/9] [ci][docs] Print difference of doxygen configuration vs default. This helps to show the customisations wrt. a default config. --- documentation/doxygen/Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/documentation/doxygen/Makefile b/documentation/doxygen/Makefile index 7b22aadb1a11a..1b1a9b5d008a7 100644 --- a/documentation/doxygen/Makefile +++ b/documentation/doxygen/Makefile @@ -77,6 +77,9 @@ doxygen: filter pyzdoc htmlfooter $(call MkDir,$(DOXYGEN_EXAMPLE_PATH)) $(call MkDir,$(DOXYGEN_NOTEBOOK_PATH)) ./makeinput.sh + echo "*** Diff of config file with default template:" + doxygen -x + echo "*** Run doxygen" doxygen bash ./CleanNamespaces.sh gzip $(DOXYGEN_IMAGE_PATH)/ROOT.tag From 8f3b205632b1d60bff4f690d0b62c80ab993b384 Mon Sep 17 00:00:00 2001 From: Stephan Hageboeck Date: Wed, 24 Jun 2026 15:54:50 +0200 Subject: [PATCH 7/9] [ci][docs] Make actionlint and shellcheck happier with the doxygen job. Mostly quote variables to avoid unwanted expansions. --- .github/workflows/root-docs-ci.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/root-docs-ci.yml b/.github/workflows/root-docs-ci.yml index 50f5286f7054b..e6c65829ecc11 100644 --- a/.github/workflows/root-docs-ci.yml +++ b/.github/workflows/root-docs-ci.yml @@ -142,17 +142,17 @@ jobs: EOS_DIR_NAME="${EOS_DIR_NAME/-/}" echo "Uploading to the directory: ${EOS_DIR_NAME}" failure=0 - echo ${RWEBEOS_KT} | base64 -d > ${KT_FILE_NAME} - kinit -p ${{ secrets.KRB5USER }}@${{ secrets.KRB5REALM }} -kt ${KT_FILE_NAME} - cd ${DOC_DIR}/html/ - xrdcp --parallel 64 -rf ./*.html ${EOS_ENDPOINT}/${EOS_BASE_PATH}/doc/${EOS_DIR_NAME} || failure=1 - rm -rf *.html - xrdcp --parallel 64 -rf ./*.svg ${EOS_ENDPOINT}/${EOS_BASE_PATH}/doc/${EOS_DIR_NAME} || failure=1 - rm -rf *.svg - xrdcp --parallel 64 -rf ./ ${EOS_ENDPOINT}/${EOS_BASE_PATH}/doc/${EOS_DIR_NAME} || failure=1 + echo "${RWEBEOS_KT}" | base64 -d > "${KT_FILE_NAME}" + kinit -p ${{ secrets.KRB5USER }}@${{ secrets.KRB5REALM }} -kt "${KT_FILE_NAME}" + cd "${DOC_DIR}/html/" + xrdcp --parallel 64 -rf ./*.html "${EOS_ENDPOINT}/${EOS_BASE_PATH}/doc/${EOS_DIR_NAME}" || failure=1 + rm -rf ./*.html + xrdcp --parallel 64 -rf ./*.svg "${EOS_ENDPOINT}/${EOS_BASE_PATH}/doc/${EOS_DIR_NAME}" || failure=1 + rm -rf ./*.svg + xrdcp --parallel 64 -rf ./ "${EOS_ENDPOINT}/${EOS_BASE_PATH}/doc/${EOS_DIR_NAME}" || failure=1 cd .. rm -r html - xrdcp --parallel 64 -rf ./ ${EOS_ENDPOINT}/${EOS_BASE_PATH}/doc/${EOS_DIR_NAME} || failure=1 + xrdcp --parallel 64 -rf ./ "${EOS_ENDPOINT}/${EOS_BASE_PATH}/doc/${EOS_DIR_NAME}" || failure=1 cd .. - xrdcp -rf ${TAR_FILE} ${EOS_ENDPOINT}/${EOS_BASE_PATH}/download || failure=1 - exit $failure + xrdcp -rf "${TAR_FILE}" "${EOS_ENDPOINT}/${EOS_BASE_PATH}/download" || failure=1 + exit "$failure" From 7848720ed165197d05741d42b07541f9efb1dff7 Mon Sep 17 00:00:00 2001 From: Stephan Hageboeck Date: Wed, 20 May 2026 08:36:17 +0200 Subject: [PATCH 8/9] [ci][docs] Don't compress a tar archive twice; shorter retention. By default, the upload action puts the archive into an archive and tries to compress it. This is unnecessary. Furthermore, reduce the retention period to a week. The default of 90 days is excessive for a nightly job. --- .github/workflows/root-docs-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/root-docs-ci.yml b/.github/workflows/root-docs-ci.yml index e6c65829ecc11..76dc6b10f5112 100644 --- a/.github/workflows/root-docs-ci.yml +++ b/.github/workflows/root-docs-ci.yml @@ -115,11 +115,13 @@ jobs: - name: Upload tar file to github if: ${{ !cancelled() }} - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v7 with: name: ${{env.TAR_FILE}} path: ${{env.DOC_LOCATION}}/${{env.TAR_FILE}} if-no-files-found: error + archive: false + retention-days: 8 - name: Sync documentation to EOS env: From a629793965154bd1e67d035ae7fbb8e51d65b80d Mon Sep 17 00:00:00 2001 From: Stephan Hageboeck Date: Thu, 25 Jun 2026 11:25:04 +0200 Subject: [PATCH 9/9] [CI] Help build_root.py to create the build directory. --- .github/workflows/root-ci-config/build_root.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/root-ci-config/build_root.py b/.github/workflows/root-ci-config/build_root.py index 7ba816342b576..8be928158c137 100755 --- a/.github/workflows/root-ci-config/build_root.py +++ b/.github/workflows/root-ci-config/build_root.py @@ -456,7 +456,7 @@ def cmake_build(buildtype): def build(options, buildtype, **kwargs): if not os.path.isdir(os.path.join(WORKDIR, "build")): builddir = os.path.join(WORKDIR, "build") - result = subprocess_with_log(f"mkdir {builddir}") + result = subprocess_with_log(f"mkdir -p {builddir}") if result != 0: die(result, "Failed to create build directory")