diff --git a/.github/workflows/BuildTheDocs.yml b/.github/workflows/BuildTheDocs.yml deleted file mode 100644 index fcd7981..0000000 --- a/.github/workflows/BuildTheDocs.yml +++ /dev/null @@ -1,72 +0,0 @@ -# ==================================================================================================================== # -# Authors: # -# Patrick Lehmann # -# Unai Martinez-Corral # -# # -# ==================================================================================================================== # -# Copyright 2020-2025 The pyTooling Authors # -# # -# Licensed under the Apache License, Version 2.0 (the "License"); # -# you may not use this file except in compliance with the License. # -# You may obtain a copy of the License at # -# # -# http://www.apache.org/licenses/LICENSE-2.0 # -# # -# Unless required by applicable law or agreed to in writing, software # -# distributed under the License is distributed on an "AS IS" BASIS, # -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -# See the License for the specific language governing permissions and # -# limitations under the License. # -# # -# SPDX-License-Identifier: Apache-2.0 # -# ==================================================================================================================== # -name: Documentation - -on: - workflow_call: - inputs: - artifact: - description: 'Name of the documentation artifact.' - required: false - default: '' - type: string - -jobs: - BuildTheDocs: - name: 📓 Run BuildTheDocs - runs-on: ubuntu-24.04 - - steps: - - name: ⚠️ Deprecation Warning - run: printf "::warning title=%s::%s\n" "Deprecated" "'BuildTheDocs.yml' template is deprecated. Please switch to 'SphinxDocumentation.yml'. See https://pytooling.github.io/Actions/JobTemplate/Documentation/SphinxDocumentation.html" - - - name: ⏬ Checkout repository - uses: actions/checkout@v6 - - - name: 🛳️ Build documentation - uses: buildthedocs/btd@v0 - with: - skip-deploy: true - - - name: 📤 Upload 'documentation' artifacts - uses: pyTooling/upload-artifact@v6 - if: inputs.artifact != '' - with: - name: ${{ inputs.artifact }} - working-directory: doc/_build/html - path: '*' - retention-days: 1 - - - name: '📓 Publish site to GitHub Pages' - if: inputs.artifact == '' && github.event_name != 'pull_request' - run: | - cp --recursive -T doc/_build/html public - cd public - touch .nojekyll - git init - cp ../.git/config ./.git/config - git add . - git config --local user.email "BuildTheDocs@GitHubActions" - git config --local user.name "GitHub Actions" - git commit -a -m "update ${{ github.sha }}" - git push -u origin +HEAD:gh-pages diff --git a/.github/workflows/CoverageCollection.yml b/.github/workflows/CoverageCollection.yml deleted file mode 100644 index 35d202f..0000000 --- a/.github/workflows/CoverageCollection.yml +++ /dev/null @@ -1,187 +0,0 @@ -# ==================================================================================================================== # -# Authors: # -# Patrick Lehmann # -# Unai Martinez-Corral # -# # -# ==================================================================================================================== # -# Copyright 2020-2025 The pyTooling Authors # -# # -# Licensed under the Apache License, Version 2.0 (the "License"); # -# you may not use this file except in compliance with the License. # -# You may obtain a copy of the License at # -# # -# http://www.apache.org/licenses/LICENSE-2.0 # -# # -# Unless required by applicable law or agreed to in writing, software # -# distributed under the License is distributed on an "AS IS" BASIS, # -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -# See the License for the specific language governing permissions and # -# limitations under the License. # -# # -# SPDX-License-Identifier: Apache-2.0 # -# ==================================================================================================================== # -name: Coverage Collection - -on: - workflow_call: - inputs: - ubuntu_image_version: - description: 'Ubuntu image version.' - required: false - default: '24.04' - type: string - python_version: - description: 'Python version.' - required: false - default: '3.11' - type: string - requirements: - description: 'Python dependencies to be installed through pip.' - required: false - default: '-r tests/requirements.txt' - type: string - tests_directory: - description: 'Path to the directory containing tests (test working directory).' - required: false - default: 'tests' - type: string - unittest_directory: - description: 'Path to the directory containing unit tests (relative to tests_directory).' - required: false - default: 'unit' - type: string - coverage_config: - description: 'Path to the .coveragerc file. Use pyproject.toml by default.' - required: false - default: 'pyproject.toml' - type: string - artifact: - description: 'Name of the coverage artifact.' - required: true - type: string - secrets: - codacy_token: - description: 'Token to push result to codacy.' - required: true - -jobs: - - Coverage: - name: 📈 Collect Coverage Data using Python ${{ inputs.python_version }} - runs-on: "ubuntu-${{ inputs.ubuntu_image_version }}" - - steps: - - name: ⚠️ Deprecation Warning - run: printf "::warning title=%s::%s\n" "Deprecated" "'CoverageCollection.yml' template is deprecated. Please switch to 'PublishReleaseNotes.yml'. See https://pytooling.github.io/Actions/JobTemplate/Testing/UnitTesting.html" - - - name: ⏬ Checkout repository - uses: actions/checkout@v6 - with: - lfs: true - submodules: true - - - name: 🐍 Setup Python ${{ inputs.python_version }} - uses: actions/setup-python@v6 - with: - python-version: ${{ inputs.python_version }} - - - name: 🗂 Install dependencies - run: | - python -m pip install --disable-pip-version-check tomli - python -m pip install --disable-pip-version-check ${{ inputs.requirements }} - - - name: 🔁 Extract configurations from pyproject.toml - id: getVariables - shell: python - run: | - from os import getenv - from pathlib import Path - from tomli import load as tomli_load - from textwrap import dedent - - htmlDirectory = 'htmlcov' - xmlFile = './coverage.xml' - coverageRC = "${{ inputs.coverage_config }}".strip() - - # Read output paths from 'pyproject.toml' file - if coverageRC == "pyproject.toml": - pyProjectFile = Path("pyproject.toml") - if pyProjectFile.exists(): - with pyProjectFile.open("rb") as file: - pyProjectSettings = tomli_load(file) - - htmlDirectory = pyProjectSettings["tool"]["coverage"]["html"]["directory"] - xmlFile = pyProjectSettings["tool"]["coverage"]["xml"]["output"] - else: - print(f"File '{pyProjectFile}' not found.") - print(f"::error title=FileNotFoundError::File '{pyProjectFile}' not found.") - exit(1) - - # Read output paths from '.coveragerc' file - elif len(coverageRC) > 0: - coverageRCFile = Path(coverageRC) - if coverageRCFile.exists(): - with coverageRCFile.open("rb") as file: - coverageRCSettings = tomli_load(file) - - htmlDirectory = coverageRCSettings["html"]["directory"] - xmlFile = coverageRCSettings["xml"]["output"] - else: - print(f"File '{coverageRCFile}' not found.") - print(f"::error title=FileNotFoundError::File '{coverageRCFile}' not found.") - exit(1) - - # Write jobs to special file - github_output = Path(getenv("GITHUB_OUTPUT")) - print(f"GITHUB_OUTPUT: {github_output}") - with github_output.open("a+", encoding="utf-8") as f: - f.write(dedent(f"""\ - coverage_report_html_directory={htmlDirectory} - coverage_report_xml={xmlFile} - """)) - - print(f"DEBUG:\n html={htmlDirectory}\n xml={xmlFile}") - - - name: Collect coverage - continue-on-error: true - run: | - export ENVIRONMENT_NAME="Linux (x86-64)" - export PYTHONPATH=$(pwd) - ABSDIR=$(pwd) - cd "${{ inputs.tests_directory || '.' }}" - [ -n '${{ inputs.coverage_config }}' ] && PYCOV_ARGS="--cov-config=${ABSDIR}/${{ inputs.coverage_config }}" || unset PYCOV_ARGS - printf "%s\n" "python -m pytest -rA --cov=${ABSDIR} ${PYCOV_ARGS} ${{ inputs.unittest_directory }} --color=yes" - python -m pytest -rA --cov=${ABSDIR} $PYCOV_ARGS ${{ inputs.unittest_directory }} --color=yes - - - name: Convert to cobertura format - run: coverage xml --data-file=${{ inputs.tests_directory || '.' }}/.coverage - - - name: Convert to HTML format - run: | - coverage html --data-file=${{ inputs.tests_directory || '.' }}/.coverage -d ${{ steps.getVariables.outputs.coverage_report_html_directory }} - rm ${{ steps.getVariables.outputs.coverage_report_html_directory }}/.gitignore - - - name: 📤 Upload 'Coverage Report' artifact - continue-on-error: true - uses: pyTooling/upload-artifact@v6 - with: - name: ${{ inputs.artifact }} - working-directory: ${{ steps.getVariables.outputs.coverage_report_html_directory }} - path: '*' - if-no-files-found: error - retention-days: 1 - - - name: 📊 Publish coverage at CodeCov - continue-on-error: true - uses: codecov/codecov-action@v5 - with: - files: ${{ steps.getVariables.outputs.coverage_report_xml }} - flags: unittests - env_vars: PYTHON - - - name: 📉 Publish coverage at Codacy - continue-on-error: true - uses: codacy/codacy-coverage-reporter-action@v1 - with: - project-token: ${{ secrets.codacy_token }} - coverage-reports: ${{ steps.getVariables.outputs.coverage_report_xml }} diff --git a/.github/workflows/NightlyRelease.yml b/.github/workflows/NightlyRelease.yml deleted file mode 100644 index cee735f..0000000 --- a/.github/workflows/NightlyRelease.yml +++ /dev/null @@ -1,533 +0,0 @@ -# ==================================================================================================================== # -# Authors: # -# Patrick Lehmann # -# # -# ==================================================================================================================== # -# Copyright 2020-2025 The pyTooling Authors # -# # -# Licensed under the Apache License, Version 2.0 (the "License"); # -# you may not use this file except in compliance with the License. # -# You may obtain a copy of the License at # -# # -# http://www.apache.org/licenses/LICENSE-2.0 # -# # -# Unless required by applicable law or agreed to in writing, software # -# distributed under the License is distributed on an "AS IS" BASIS, # -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -# See the License for the specific language governing permissions and # -# limitations under the License. # -# # -# SPDX-License-Identifier: Apache-2.0 # -# ==================================================================================================================== # -name: Nightly - -on: - workflow_call: - inputs: - ubuntu_image: - description: 'Name of the Ubuntu image.' - required: false - default: 'ubuntu-24.04' - type: string - nightly_name: - description: 'Name of the nightly release.' - required: false - default: 'nightly' - type: string - nightly_title: - description: 'Title of the nightly release.' - required: false - default: '' - type: string - nightly_description: - description: 'Description of the nightly release.' - required: false - default: 'Release of artifacts from latest CI pipeline.' - type: string - draft: - description: 'Specify if this is a draft.' - required: false - default: false - type: boolean - prerelease: - description: 'Specify if this is a pre-release.' - required: false - default: false - type: boolean - latest: - description: 'Specify if this is the latest release.' - required: false - default: false - type: boolean - replacements: - description: 'Multi-line string containing search=replace patterns.' - required: false - default: '' - type: string - assets: - description: 'Multi-line string containing artifact:file:title asset descriptions.' - required: true - type: string - inventory-json: - type: string - required: false - default: '' - inventory-version: - type: string - required: false - default: '' - inventory-categories: - type: string - required: false - default: '' - tarball-name: - type: string - required: false - default: '__pyTooling_upload_artifact__.tar' - can-fail: - type: boolean - required: false - default: false - -jobs: - Release: - name: 📝 Update 'Nightly Page' on GitHub - runs-on: ${{ inputs.ubuntu_image }} - continue-on-error: ${{ inputs.can-fail }} - permissions: - contents: write - actions: write -# attestations: write - - steps: - - name: ⚠️ Deprecation Warning - run: printf "::warning title=%s::%s\n" "NightlyRelease" "'NightlyRelease.yml' template is deprecated. Please switch to 'PublishReleaseNotes.yml'. See https://pytooling.github.io/Actions/JobTemplate/Release/PublishReleaseNotes.html" - - - name: ⏬ Checkout repository - uses: actions/checkout@v6 - with: - # The command 'git describe' (used for version) needs the history. - fetch-depth: 0 - - - name: 🔧 Install zstd - run: sudo apt-get install -y --no-install-recommends zstd - - - name: 📑 Delete (old) Release Page - id: deleteReleasePage - run: | - set +e - - ANSI_LIGHT_RED=$'\x1b[91m' - ANSI_LIGHT_GREEN=$'\x1b[92m' - ANSI_LIGHT_YELLOW=$'\x1b[93m' - ANSI_NOCOLOR=$'\x1b[0m' - - export GH_TOKEN=${{ github.token }} - - printf "%s" "Deleting release '${{ inputs.nightly_name }}' ... " - message="$(gh release delete ${{ inputs.nightly_name }} --yes 2>&1)" - if [[ $? -eq 0 ]]; then - printf "%s\n" "${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}" - elif [[ "${message}" == "release not found" ]]; then - printf "%s\n" "${ANSI_LIGHT_YELLOW}[NOT FOUND]${ANSI_NOCOLOR}" - else - printf "%s\n" "${ANSI_LIGHT_RED}[FAILED]${ANSI_NOCOLOR}" - printf " %s\n" "${ANSI_LIGHT_RED}Couldn't delete release '${{ inputs.nightly_name }}' -> Error: '${message}'.${ANSI_NOCOLOR}" - printf "::error title=%s::%s\n" "InternalError" "Couldn't delete release '${{ inputs.nightly_name }}' -> Error: '${message}'." - exit 1 - fi - - - name: 📑 (Re)create (new) Release Page - id: createReleasePage - run: | - set +e - - ANSI_LIGHT_RED=$'\x1b[91m' - ANSI_LIGHT_GREEN=$'\x1b[92m' - ANSI_NOCOLOR=$'\x1b[0m' - - export GH_TOKEN=${{ github.token }} - - addDraft="--draft" - - if [[ "${{ inputs.prerelease }}" == "true" ]]; then - addPreRelease="--prerelease" - fi - - if [[ "${{ inputs.latest }}" == "false" ]]; then - addLatest="--latest=false" - fi - - if [[ "${{ inputs.nightly_title }}" != "" ]]; then - addTitle=("--title" "${{ inputs.nightly_title }}") - fi - - cat <<'EOF' > __NoTeS__.md - ${{ inputs.nightly_description }} - EOF - if [[ -s __NoTeS__.md ]]; then - addNotes=("--notes-file" "__NoTeS__.md") - fi - - # Apply replacements - while IFS=$'\r\n' read -r patternLine; do - # skip empty lines - [[ "$patternLine" == "" ]] && continue - - pattern="${patternLine%%=*}" - replacement="${patternLine#*=}" - sed -i -e "s/%$pattern%/$replacement/g" "__NoTeS__.md" - done <<<'${{ inputs.replacements }}' - - # Add footer line - cat <> __NoTeS__.md - - -------- - Published from [${{ github.workflow }}](https://github.com/Paebbels/ghdl/actions/runs/${{ github.run_id }}) workflow triggered by @${{ github.actor }} on $(date '+%Y-%m-%d %H:%M:%S %Z'). - EOF - - printf "%s\n" "Creating release '${{ inputs.nightly_name }}' ... " - message="$(gh release create "${{ inputs.nightly_name }}" --verify-tag $addDraft $addPreRelease $addLatest "${addTitle[@]}" "${addNotes[@]}" 2>&1)" - if [[ $? -eq 0 ]]; then - printf "%s\n" "${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}" - else - printf "%s\n" "${ANSI_LIGHT_RED}[FAILED]${ANSI_NOCOLOR}" - printf " %s\n" "${ANSI_LIGHT_RED}Couldn't create release '${{ inputs.nightly_name }}' -> Error: '${message}'.${ANSI_NOCOLOR}" - printf "::error title=%s::%s\n" "InternalError" "Couldn't create release '${{ inputs.nightly_name }}' -> Error: '${message}'." - exit 1 - fi - - - name: 📥 Download artifacts and upload as assets - id: uploadAssets - run: | - set +e - - ANSI_LIGHT_RED=$'\x1b[91m' - ANSI_LIGHT_GREEN=$'\x1b[92m' - ANSI_LIGHT_YELLOW=$'\x1b[93m' - ANSI_LIGHT_BLUE=$'\x1b[94m' - ANSI_NOCOLOR=$'\x1b[0m' - - export GH_TOKEN=${{ github.token }} - - Replace() { - line="$1" - while IFS=$'\r\n' read -r patternLine; do - # skip empty lines - [[ "$patternLine" == "" ]] && continue - - pattern="${patternLine%%=*}" - replacement="${patternLine#*=}" - line="${line//"%$pattern%"/"$replacement"}" - done <<<'${{ inputs.replacements }}' - printf "%s\n" "$line" - } - - # Create JSON inventory - if [[ "${{ inputs.inventory-json }}" != "" ]]; then - VERSION="1.0" - - # Split categories by ',' into a Bash array. - # See https://stackoverflow.com/a/45201229/3719459 - if [[ "${{ inputs.inventory-categories }}" != "" ]]; then - readarray -td, inventoryCategories <<<"${{ inputs.inventory-categories }}," - unset 'inventoryCategories[-1]' - declare -p inventoryCategories - else - inventoryCategories="" - fi - - jsonInventory=$(jq -c -n \ - --arg version "${VERSION}" \ - --arg date "$(date +"%Y-%m-%dT%H-%M-%S%:z")" \ - --argjson jsonMeta "$(jq -c -n \ - --arg tag "${{ inputs.nightly_name }}" \ - --arg version "${{ inputs.inventory-version }}" \ - --arg hash "${{ github.sha }}" \ - --arg repo "${{ github.server_url }}/${{ github.repository }}" \ - --arg release "${{ github.server_url }}/${{ github.repository }}/releases/download/${{ inputs.nightly_name }}" \ - --argjson categories "$(jq -c -n \ - '$ARGS.positional' \ - --args "${inventoryCategories[@]}" \ - )" \ - '{"tag": $tag, "version": $version, "git-hash": $hash, "repository-url": $repo, "release-url": $release, "categories": $categories}' \ - )" \ - '{"version": 1.0, "timestamp": $date, "meta": $jsonMeta, "files": {}}' - ) - fi - - ERRORS=0 - # A dictionary of 0/1 to avoid duplicate downloads - declare -A downloadedArtifacts - # A dictionary to check for duplicate asset files in release - declare -A assetFilenames - while IFS=$'\r\n' read -r assetLine; do - if [[ "${assetLine}" == "" || "${assetLine:0:1}" == "#" ]]; then - continue - fi - - # split assetLine colon separated triple: artifact:asset:title - artifact="${assetLine%%:*}" - assetLine="${assetLine#*:}" - asset="${assetLine%%:*}" - assetLine="${assetLine#*:}" - if [[ "${{ inputs.inventory-json }}" == "" ]]; then - categories="" - title="${assetLine##*:}" - else - categories="${assetLine%%:*}" - title="${assetLine##*:}" - fi - - # remove leading whitespace - asset="${asset#"${asset%%[![:space:]]*}"}" - categories="${categories#"${categories%%[![:space:]]*}"}" - title="${title#"${title%%[![:space:]]*}"}" - - # apply replacements - asset="$(Replace "${asset}")" - title="$(Replace "${title}")" - - printf "%s\n" "Publish asset '${asset}' from artifact '${artifact}' with title '${title}'" - printf " %s" "Checked asset for duplicates ... " - if [[ -n "${assetFilenames[$asset]}" ]]; then - printf "%s\n" "${ANSI_LIGHT_RED}[ERROR]${ANSI_NOCOLOR}" - printf "::error title=%s::%s\n" "DuplicateAsset" "Asset '${asset}' from artifact '${artifact}' was already uploaded to release '${{ inputs.nightly_name }}'." - ERRORS=$((ERRORS + 1)) - continue - else - printf "%s\n" "${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}" - assetFilenames[$asset]=1 - fi - - # Download artifact by artifact name - if [[ -n "${downloadedArtifacts[$artifact]}" ]]; then - printf " %s\n" "downloading '${artifact}' ... ${ANSI_LIGHT_YELLOW}[SKIPPED]${ANSI_NOCOLOR}" - else - printf " downloading '${artifact}' ...\n" - printf " %s" "gh run download $GITHUB_RUN_ID --dir \"${artifact}\" --name \"${artifact}\" " - gh run download $GITHUB_RUN_ID --dir "${artifact}" --name "${artifact}" - if [[ $? -eq 0 ]]; then - printf "%s\n" "${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}" - else - printf "%s\n" "${ANSI_LIGHT_RED}[ERROR]${ANSI_NOCOLOR}" - printf " %s\n" "${ANSI_LIGHT_RED}Couldn't download artifact '${artifact}'.${ANSI_NOCOLOR}" - printf "::error title=%s::%s\n" "ArtifactNotFound" "Couldn't download artifact '${artifact}'." - ERRORS=$((ERRORS + 1)) - continue - fi - downloadedArtifacts[$artifact]=1 - - printf " %s" "Checking for embedded tarball ... " - if [[ -f "${artifact}/${{ inputs.tarball-name }}" ]]; then - printf "%s\n" "${ANSI_LIGHT_GREEN}[FOUND]${ANSI_NOCOLOR}" - - pushd "${artifact}" > /dev/null - - printf " %s" "Extracting embedded tarball ... " - tar -xf "${{ inputs.tarball-name }}" - if [[ $? -ne 0 ]]; then - printf "%s\n" "${ANSI_LIGHT_RED}[FAILED]${ANSI_NOCOLOR}" - else - printf "%s\n" "${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}" - fi - - printf " %s" "Removing temporary tarball ... " - rm -f "${{ inputs.tarball-name }}" - if [[ $? -ne 0 ]]; then - printf "%s\n" "${ANSI_LIGHT_RED}[FAILED]${ANSI_NOCOLOR}" - else - printf "%s\n" "${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}" - fi - - popd > /dev/null - else - printf "%s\n" "${ANSI_LIGHT_YELLOW}[SKIPPED]${ANSI_NOCOLOR}" - fi - fi - - # Check if artifact should be compressed (zip, tgz) or if asset was part of the downloaded artifact. - printf " %s" "checking asset '${artifact}/${asset}' ... " - if [[ "${asset}" == !*.zip ]]; then - printf "%s\n" "${ANSI_LIGHT_GREEN}[ZIP]${ANSI_NOCOLOR}" - asset="${asset##*!}" - printf "::group:: %s\n" "Compressing artifact '${artifact}' to '${asset}' ..." - ( - cd "${artifact}" && \ - zip -r "../${asset}" * - ) - retCode=$? - printf "::endgroup::\n" - if [[ $retCode -eq 0 ]]; then - printf " %s\n" "Compression ${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}" - uploadFile="${asset}" - else - printf " %s\n" "Compression ${ANSI_LIGHT_RED}[ERROR]${ANSI_NOCOLOR}" - printf " %s\n" "${ANSI_LIGHT_RED}Couldn't compress '${artifact}' to zip file '${asset}'.${ANSI_NOCOLOR}" - printf "::error title=%s::%s\n" "CompressionError" "Couldn't compress '${artifact}' to zip file '${asset}'." - ERRORS=$((ERRORS + 1)) - continue - fi - elif [[ "${asset}" == !*.tgz || "${asset}" == !*.tar.gz || "${asset}" == \$*.tgz || "${asset}" == \$*.tar.gz ]]; then - printf "%s\n" "${ANSI_LIGHT_GREEN}[TAR/GZ]${ANSI_NOCOLOR}" - - if [[ "${asset:0:1}" == "\$" ]]; then - asset="${asset##*$}" - dirName="${asset%.*}" - printf " %s\n" "Compressing artifact '${artifact}' to '${asset}' ..." - tar -c --gzip --owner=0 --group=0 --file="${asset}" --directory="${artifact}" --transform "s|^\.|${dirName%.tar}|" . - retCode=$? - else - asset="${asset##*!}" - printf " %s\n" "Compressing artifact '${artifact}' to '${asset}' ..." - ( - cd "${artifact}" && \ - tar -c --gzip --owner=0 --group=0 --file="../${asset}" * - ) - retCode=$? - fi - - if [[ $retCode -eq 0 ]]; then - printf " %s\n" "Compression ${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}" - uploadFile="${asset}" - else - printf " %s\n" "Compression ${ANSI_LIGHT_RED}[ERROR]${ANSI_NOCOLOR}" - printf " %s\n" "${ANSI_LIGHT_RED}Couldn't compress '${artifact}' to tgz file '${asset}'.${ANSI_NOCOLOR}" - printf "::error title=%s::%s\n" "CompressionError" "Couldn't compress '${artifact}' to tgz file '${asset}'." - ERRORS=$((ERRORS + 1)) - continue - fi - elif [[ "${asset}" == !*.tzst || "${asset}" == !*.tar.zst || "${asset}" == \$*.tzst || "${asset}" == \$*.tar.zst ]]; then - printf "%s\n" "${ANSI_LIGHT_GREEN}[ZST]${ANSI_NOCOLOR}" - - if [[ "${asset:0:1}" == "\$" ]]; then - asset="${asset##*$}" - dirName="${asset%.*}" - printf " %s\n" "Compressing artifact '${artifact}' to '${asset}' ..." - tar -c --zstd --owner=0 --group=0 --file="${asset}" --directory="${artifact}" --transform "s|^\.|${dirName%.tar}|" . - retCode=$? - else - asset="${asset##*!}" - printf " %s\n" "Compressing artifact '${artifact}' to '${asset}' ..." - ( - cd "${artifact}" && \ - tar -c --zstd --owner=0 --group=0 --file="../${asset}" * - ) - retCode=$? - fi - - if [[ $retCode -eq 0 ]]; then - printf " %s\n" "Compression ${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}" - uploadFile="${asset}" - else - printf " %s\n" "Compression ${ANSI_LIGHT_RED}[ERROR]${ANSI_NOCOLOR}" - printf " %s\n" "${ANSI_LIGHT_RED}Couldn't compress '${artifact}' to zst file '${asset}'.${ANSI_NOCOLOR}" - printf "::error title=%s::%s\n" "CompressionError" "Couldn't compress '${artifact}' to zst file '${asset}'." - ERRORS=$((ERRORS + 1)) - continue - fi - elif [[ -e "${artifact}/${asset}" ]]; then - printf "%s\n" "${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}" - uploadFile="${artifact}/${asset}" - else - printf "%s\n" "${ANSI_LIGHT_RED}[ERROR]${ANSI_NOCOLOR}" - printf " %s\n" "${ANSI_LIGHT_RED}Couldn't find asset '${asset}' in artifact '${artifact}'.${ANSI_NOCOLOR}" - printf "::error title=%s::%s\n" "FileNotFound" "Couldn't find asset '${asset}' in artifact '${artifact}'." - ERRORS=$((ERRORS + 1)) - continue - fi - - # Add asset to JSON inventory - if [[ "${{ inputs.inventory-json }}" != "" ]]; then - if [[ "${categories}" != "${title}" ]]; then - printf " %s\n" "adding file '${uploadFile#*/}' with '${categories//;/ → }' to JSON inventory ..." - category="" - jsonEntry=$(jq -c -n \ - --arg title "${title}" \ - --arg file "${uploadFile#*/}" \ - '{"file": $file, "title": $title}' \ - ) - - while [[ "${categories}" != "${category}" ]]; do - category="${categories##*,}" - categories="${categories%,*}" - jsonEntry=$(jq -c -n --arg cat "${category}" --argjson value "${jsonEntry}" '{$cat: $value}') - done - - jsonInventory=$(jq -c -n \ - --argjson inventory "${jsonInventory}" \ - --argjson file "${jsonEntry}" \ - '$inventory * {"files": $file}' \ - ) - else - printf " %s\n" "adding file '${uploadFile#*/}' to JSON inventory ... ${ANSI_LIGHT_YELLOW}[SKIPPED]${ANSI_NOCOLOR}" - fi - fi - - # Upload asset to existing release page - printf " %s" "uploading asset '${asset}' from '${uploadFile}' with title '${title}' ... " - gh release upload ${{ inputs.nightly_name }} "${uploadFile}#${title}" --clobber - if [[ $? -eq 0 ]]; then - printf "%s\n" "${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}" - else - printf "%s\n" "${ANSI_LIGHT_RED}[ERROR]${ANSI_NOCOLOR}" - printf " %s\n" "${ANSI_LIGHT_RED}Couldn't upload asset '${asset}' from '${uploadFile}' to release '${{ inputs.nightly_name }}'.${ANSI_NOCOLOR}" - printf "::error title=%s::%s\n" "UploadError" "Couldn't upload asset '${asset}' from '${uploadFile}' to release '${{ inputs.nightly_name }}'." - ERRORS=$((ERRORS + 1)) - continue - fi - done <<<'${{ inputs.assets }}' - - if [[ "${{ inputs.inventory-json }}" != "" ]]; then - inventoryTitle="Release Inventory (JSON)" - - printf "%s\n" "Publish asset '${{ inputs.inventory-json }}' with title '${inventoryTitle}'" - printf "::group::${ANSI_LIGHT_BLUE}%s${ANSI_NOCOLOR}\n" "Writing JSON inventory to '${{ inputs.inventory-json }}' ...." - printf "%s\n" "$(jq -n --argjson inventory "${jsonInventory}" '$inventory')" > "${{ inputs.inventory-json }}" - cat "${{ inputs.inventory-json }}" - printf "::endgroup::\n" - - # Upload inventory asset to existing release page - printf " %s" "uploading asset '${{ inputs.inventory-json }}' title '${inventoryTitle}' ... " - gh release upload ${{ inputs.nightly_name }} "${{ inputs.inventory-json }}#${inventoryTitle}" --clobber - if [[ $? -eq 0 ]]; then - printf "%s\n" "${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}" - else - printf "%s\n" "${ANSI_LIGHT_RED}[ERROR]${ANSI_NOCOLOR}" - printf " %s\n" "${ANSI_LIGHT_RED}Couldn't upload asset '${{ inputs.inventory-json }}' to release '${{ inputs.nightly_name }}'.${ANSI_NOCOLOR}" - printf "::error title=%s::%s\n" "UploadError" "Couldn't upload asset '${{ inputs.inventory-json }}' to release '${{ inputs.nightly_name }}'." - ERRORS=$((ERRORS + 1)) - continue - fi - fi - - printf "::group::${ANSI_LIGHT_BLUE}%s${ANSI_NOCOLOR}\n" "Inspecting downloaded artifacts ..." - tree -pash -L 3 . - printf "::endgroup::\n" - - if [[ $ERRORS -ne 0 ]]; then - printf "%s\n" "${ANSI_LIGHT_RED}${ERRORS} errors detected in previous steps.${ANSI_NOCOLOR}" - exit 1 - fi - - - name: 📑 Remove draft state from Release Page - if: ${{ ! inputs.draft }} - run: | - set +e - - ANSI_LIGHT_RED=$'\x1b[91m' - ANSI_LIGHT_GREEN=$'\x1b[92m' - ANSI_NOCOLOR=$'\x1b[0m' - - export GH_TOKEN=${{ github.token }} - - # Remove draft-state from release page - printf "%s" "Remove draft-state from release '${title}' ... " - gh release edit --draft=false "${{ inputs.nightly_name }}" - if [[ $? -eq 0 ]]; then - printf "%s\n" "${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}" - else - printf "%s\n" "${ANSI_LIGHT_RED}[ERROR]${ANSI_NOCOLOR}" - printf " %s\n" "${ANSI_LIGHT_RED}Couldn't remove draft-state from release '${{ inputs.nightly_name }}'.${ANSI_NOCOLOR}" - printf "::error title=%s::%s\n" "ReleasePage" "Couldn't remove draft-state from release '${{ inputs.nightly_name }}'." - fi diff --git a/README.md b/README.md index ec7dc16..fa58966 100644 --- a/README.md +++ b/README.md @@ -75,8 +75,6 @@ As shown in the screenshots above, the expected order is: [**PublishCoverageResults**](.github/workflows/PublishCoverageResults.yml): publish ucode coverage results. - [**NightlyRelease**](.github/workflows/NightlyRelease.yml): publish GitHub Release. - [**PublishReleaseNotes**](.github/workflows/PublishReleaseNotes.yml): publish GitHub Release. - **Documentation:** [**SphinxDocumentation**](.github/workflows/PublishCoverageResults.yml): create HTML and LaTeX documentation using @@ -90,12 +88,11 @@ As shown in the screenshots above, the expected order is: [**IntermediateCleanUp**](.github/workflows/IntermediateCleanUp.yml): delete intermediate artifacts. [**ArtifactCleanUp**](.github/workflows/ArtifactCleanUp.yml): delete artifacts. -- **⚠ Deprecated ⚠:** - [**CoverageCollection**](.github/workflows/CoverageCollection.yml): Use `UnitTesting`, because is can collect code - coverage too. This avoids code duplication in job templates. +- **Removed:** + ❌ **NightlyRelease**: Use `PublishReleaseNotes`, because it's more advanced and not limited to nightly releases. + ❌ **CoverageCollection**: Use `UnitTesting`, because is can collect code coverage too. - [**BuildTheDocs**](.github/workflows/BuildTheDocs.yml): Use `SphinxDocumentation`, `LaTeXDocumentation` and - `PublishToGitHubPages`. BuildTheDocs isn't maintained anymore. + ❌ **BuildTheDocs**: Use `SphinxDocumentation`, `LaTeXDocumentation` and `PublishToGitHubPages`. ### Example pipeline diff --git a/doc/JobTemplate/Deprecated/BuildTheDocs.rst b/doc/JobTemplate/Deprecated/BuildTheDocs.rst deleted file mode 100644 index 4fe76eb..0000000 --- a/doc/JobTemplate/Deprecated/BuildTheDocs.rst +++ /dev/null @@ -1,10 +0,0 @@ -.. _JOBTMPL/BuildTheDocs: - -BuildTheDocs -############ - -.. attention:: - - The ``BuildTheDocs`` job template is deprecated. - - See :ref:`JOBTMPL/SphinxDocumentation` and :ref:`JOBTMPL/LaTeXDocumentation`. diff --git a/doc/JobTemplate/Deprecated/CoverageCollection.rst b/doc/JobTemplate/Deprecated/CoverageCollection.rst deleted file mode 100644 index 2629b76..0000000 --- a/doc/JobTemplate/Deprecated/CoverageCollection.rst +++ /dev/null @@ -1,10 +0,0 @@ -.. _JOBTMPL/CoverageCollection: - -CoverageCollection -################## - -.. attention:: - - The ``CoverageCollection`` job template is deprecated. - - See :ref:`JOBTMPL/UnitTesting` and :ref:`JOBTMPL/PublishCoverageResults`. diff --git a/doc/JobTemplate/Deprecated/NightlyRelease.rst b/doc/JobTemplate/Deprecated/NightlyRelease.rst deleted file mode 100644 index 5c0f5b3..0000000 --- a/doc/JobTemplate/Deprecated/NightlyRelease.rst +++ /dev/null @@ -1,10 +0,0 @@ -.. _JOBTMPL/NightlyRelease: - -NightlyRelease -############## - -.. attention:: - - The ``NightlyRelease`` job template is deprecated. - - See :ref:`JOBTMPL/PublishReleaseNotes`. diff --git a/doc/JobTemplate/Deprecated/index.rst b/doc/JobTemplate/Deprecated/index.rst index ee2af91..ddfdad7 100644 --- a/doc/JobTemplate/Deprecated/index.rst +++ b/doc/JobTemplate/Deprecated/index.rst @@ -5,16 +5,14 @@ Deprecated The category *deprecated* collects outdated job templates: -:ref:`JOBTMPL/CoverageCollection` +CoverageCollection replaced by :ref:`JOBTMPL/UnitTesting` -:ref:`JOBTMPL/NightlyRelease` +NightlyRelease replaced by :ref:`JOBTMPL/PublishReleaseNotes` -:ref:`JOBTMPL/BuildTheDocs` +BuildTheDocs replaced by :ref:`JOBTMPL/SphinxDocumentation` and :ref:`JOBTMPL/LaTeXDocumentation` -.. toctree:: +.. #toctree:: :hidden: - CoverageCollection NightlyRelease - BuildTheDocs diff --git a/doc/JobTemplate/Templates.rst b/doc/JobTemplate/Templates.rst index b4a8cb1..c4cce8d 100644 --- a/doc/JobTemplate/Templates.rst +++ b/doc/JobTemplate/Templates.rst @@ -67,7 +67,7 @@ * :ref:`JOBTMPL/IntermediateCleanup` * :ref:`JOBTMPL/ArtifactCleanup` - .. grid-item:: + .. #grid-item:: :columns: 2 .. rubric:: :ref:`JOBTMPL/Deprecated`