diff --git a/.github/workflows/NightlyRelease.yml b/.github/workflows/NightlyRelease.yml index d5f81b4..80b339d 100644 --- a/.github/workflows/NightlyRelease.yml +++ b/.github/workflows/NightlyRelease.yml @@ -71,7 +71,7 @@ jobs: permissions: contents: write actions: write - attestations: write +# attestations: write steps: - name: ⏬ Checkout repository @@ -80,6 +80,9 @@ jobs: # 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: | @@ -100,8 +103,8 @@ jobs: echo -e "${ANSI_LIGHT_YELLOW}[NOT FOUND]${ANSI_NOCOLOR}" else echo -e "${ANSI_LIGHT_RED}[FAILED]${ANSI_NOCOLOR}" - echo "Couldn't delete release '${{ inputs.nightly_name }}' -> Error: '${message}'." - echo "::error title=InternalError::Couldn't delete release '${{ inputs.nightly_name }}'." + echo -e "${ANSI_LIGHT_RED}Couldn't delete release '${{ inputs.nightly_name }}' -> Error: '${message}'.${ANSI_NOCOLOR}" + echo "::error title=InternalError::Couldn't delete release '${{ inputs.nightly_name }}' -> Error: '${message}'." exit 1 fi @@ -145,13 +148,13 @@ jobs: EOF echo "Creating release '${{ inputs.nightly_name }}' ... " - gh release create "${{ inputs.nightly_name }}" --verify-tag $addDraft $addPreRelease $addLatest "${addTitle[@]}" "${addNotes[@]}" + message="$(gh release create "${{ inputs.nightly_name }}" --verify-tag $addDraft $addPreRelease $addLatest "${addTitle[@]}" "${addNotes[@]}" 2>&1)" if [[ $? -eq 0 ]]; then echo -e "${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}" else echo -e "${ANSI_LIGHT_RED}[FAILED]${ANSI_NOCOLOR}" - echo "Couldn't create release '${{ inputs.nightly_name }}'." - echo "::error title=InternalError::Couldn't create release '${{ inputs.nightly_name }}'." + echo -e "${ANSI_LIGHT_RED}Couldn't create release '${{ inputs.nightly_name }}' -> Error: '${message}'.${ANSI_NOCOLOR}" + echo "::error title=InternalError::Couldn't create release '${{ inputs.nightly_name }}' -> Error: '${message}'." exit 1 fi @@ -210,7 +213,7 @@ jobs: echo -e "${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}" else echo -e "${ANSI_LIGHT_RED}[ERROR]${ANSI_NOCOLOR}" - echo "Couldn't download artifact '${artifact}'." + echo -e "${ANSI_LIGHT_RED}Couldn't download artifact '${artifact}'.${ANSI_NOCOLOR}" echo "::error title=ArtifactNotFound::Couldn't download artifact '${artifact}'." ERRORS=1 continue @@ -220,37 +223,79 @@ jobs: # Check if artifact should be compressed (zip, tgz) or if asset was part of the downloaded artifact. echo -n " checking asset '${artifact}/${asset}' ... " - if [[ "${asset}" == !*zip ]]; then + if [[ "${asset}" == !*.zip ]]; then echo -e "${ANSI_LIGHT_GREEN}[ZIP]${ANSI_NOCOLOR}" asset="${asset##*!}" echo " Compressing artifact '${artifact}' to '${asset}' ..." - cd "${artifact}" - zip -r "../${asset}" * - cd - + ( + cd "${artifact}" && \ + zip -r "../${asset}" * + ) if [[ $? -eq 0 ]]; then echo -e " Compression ${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}" uploadFile="${asset}" else echo -e " Compression ${ANSI_LIGHT_RED}[ERROR]${ANSI_NOCOLOR}" - echo "Couldn't compress '${artifact}' to zip file '${asset}'." - echo "::error title=ZipError::Couldn't compress '${artifact}' to zip file '${asset}'." + echo -e "${ANSI_LIGHT_RED}Couldn't compress '${artifact}' to zip file '${asset}'.${ANSI_NOCOLOR}" + echo "::error title=CompressionError::Couldn't compress '${artifact}' to zip file '${asset}'." ERRORS=1 continue fi - elif [[ "${asset}" == !*tgz ]]; then + elif [[ "${asset}" == !*.tgz || "${asset}" == !*.tar.gz || "${asset}" == \$*.tgz || "${asset}" == \$*.tar.gz ]]; then echo -e "${ANSI_LIGHT_GREEN}[TAR/GZ]${ANSI_NOCOLOR}" - asset="${asset##*!}" - echo " Compressing artifact '${artifact}' to '${asset}' ..." - cd "${artifact}" - tar -czf "../${asset}" * - cd - - if [[ $? -eq 0 ]]; then + + if [[ "${asset:0:1}" == "\$" ]]; then + asset="${asset##*$}" + dirName="${asset%.*}" + echo " Compressing artifact '${artifact}' to '${asset}' ..." + tar -c --gzip --file="${asset}" --directory="${artifact}" --transform "s|^\.|${dirName%.tar}|" . + retCode=$? + else + asset="${asset##*!}" + echo " Compressing artifact '${artifact}' to '${asset}' ..." + ( + cd "${artifact}" && \ + tar -c --gzip --file="../${asset}" * + ) + retCode=$? + fi + + if [[ $retCode -eq 0 ]]; then echo -e " Compression ${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}" uploadFile="${asset}" else echo -e " Compression ${ANSI_LIGHT_RED}[ERROR]${ANSI_NOCOLOR}" - echo "Couldn't compress '${artifact}' to tgz file '${asset}'." - echo "::error title=ZipError::Couldn't compress '${artifact}' to tgz file '${asset}'." + echo -e "${ANSI_LIGHT_RED}Couldn't compress '${artifact}' to tgz file '${asset}'.${ANSI_NOCOLOR}" + echo "::error title=CompressionError::Couldn't compress '${artifact}' to tgz file '${asset}'." + ERRORS=1 + continue + fi + elif [[ "${asset}" == !*.tzst || "${asset}" == !*.tar.zst || "${asset}" == \$*.tzst || "${asset}" == \$*.tar.zst ]]; then + echo -e "${ANSI_LIGHT_GREEN}[ZST]${ANSI_NOCOLOR}" + + if [[ "${asset:0:1}" == "\$" ]]; then + asset="${asset##*$}" + dirName="${asset%.*}" + echo " Compressing artifact '${artifact}' to '${asset}' ..." + tar -c --zstd --file="${asset}" --directory="${artifact}" --transform "s|^\.|${dirName%.tar}|" . + retCode=$? + else + asset="${asset##*!}" + echo " Compressing artifact '${artifact}' to '${asset}' ..." + ( + cd "${artifact}" && \ + tar -c --zstd --file="../${asset}" * + ) + retCode=$? + fi + + if [[ $retCode -eq 0 ]]; then + echo -e " Compression ${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}" + uploadFile="${asset}" + else + echo -e " Compression ${ANSI_LIGHT_RED}[ERROR]${ANSI_NOCOLOR}" + echo -e "${ANSI_LIGHT_RED}Couldn't compress '${artifact}' to zst file '${asset}'.${ANSI_NOCOLOR}" + echo "::error title=CompressionError::Couldn't compress '${artifact}' to zst file '${asset}'." ERRORS=1 continue fi @@ -259,7 +304,7 @@ jobs: uploadFile="${artifact}/${asset}" else echo -e "${ANSI_LIGHT_RED}[ERROR]${ANSI_NOCOLOR}" - echo "Couldn't find asset '${asset}' in artifact '${artifact}'." + echo -e "${ANSI_LIGHT_RED}Couldn't find asset '${asset}' in artifact '${artifact}'.${ANSI_NOCOLOR}" echo "::error title=FileNotFound::Couldn't find asset '${asset}' in artifact '${artifact}'." ERRORS=1 continue @@ -272,12 +317,12 @@ jobs: echo -e "${ANSI_LIGHT_GREEN}[OK]${ANSI_NOCOLOR}" else echo -e "${ANSI_LIGHT_RED}[ERROR]${ANSI_NOCOLOR}" - echo "Couldn't upload asset '${asset}' from '${uploadFile}' to release '${{ inputs.nightly_name }}'." + echo -e "${ANSI_LIGHT_RED}Couldn't upload asset '${asset}' from '${uploadFile}' to release '${{ inputs.nightly_name }}'.${ANSI_NOCOLOR}" echo "::error title=UploadError::Couldn't upload asset '${asset}' from '${uploadFile}' to release '${{ inputs.nightly_name }}'." ERRORS=1 continue fi - done <<<"${{ inputs.assets }}" + done <<<'${{ inputs.assets }}' echo "Inspecting downloaded artifacts ..." tree -L 3 . diff --git a/.github/workflows/_Checking_NamespacePackage_Pipeline.yml b/.github/workflows/_Checking_NamespacePackage_Pipeline.yml index 0389b9a..11e9035 100644 --- a/.github/workflows/_Checking_NamespacePackage_Pipeline.yml +++ b/.github/workflows/_Checking_NamespacePackage_Pipeline.yml @@ -1,4 +1,4 @@ -name: Verification of Pipeline Templates +name: Verification of Pipeline Templates (Namespace Package) on: push: diff --git a/.github/workflows/_Checking_Nightly.yml b/.github/workflows/_Checking_Nightly.yml new file mode 100644 index 0000000..6df4383 --- /dev/null +++ b/.github/workflows/_Checking_Nightly.yml @@ -0,0 +1,97 @@ +name: Verification of Nightly Releases + +on: + push: + workflow_dispatch: + +jobs: + Build: + name: Build something + runs-on: ubuntu-24.04 + + steps: + - name: 🖉 Build 1 + run: | + echo "Document 1 $(date --utc '+%d.%m.%Y - %H:%M:%S')" > document1.txt + echo "Analysis log $(date --utc '+%d.%m.%Y - %H:%M:%S')" > analysis.log + echo "Build log $(date --utc '+%d.%m.%Y - %H:%M:%S')" > build.log + + - name: 📤 Upload artifact + uses: actions/upload-artifact@v4 + with: + name: document + path: | + document1.txt + *.log + if-no-files-found: error + retention-days: 1 + + - name: 🖉 Program + run: | + echo "Document other $(date --utc '+%d.%m.%Y - %H:%M:%S')" > document1.txt + echo "Program $(date --utc '+%d.%m.%Y - %H:%M:%S')" > program.py + + - name: 📤 Upload artifact + uses: actions/upload-artifact@v4 + with: + name: other + path: | + *.txt + *.py + if-no-files-found: error + retention-days: 1 + + NightlyPage: + uses: ./.github/workflows/NightlyRelease.yml + needs: + - Build + secrets: inherit + permissions: + contents: write + actions: write +# attestations: write + with: + prerelease: true + nightly_title: "Nightly Release" + nightly_description: | + This *nightly* release contains all latest and important artifacts created by GHDL's CI pipeline. + + # GHDL 5.0.0-dev + + GHDL offers the simulator and synthesis tool for VHDL. GHDL can be build for various backends: + * `gcc` - using the GCC compiler framework + * `mcode` - in memory code generation + * `llvm` - using the LLVM compiler framework + * `llvm-jit` - using the LLVM compiler framework, but in memory + + The following asset categories are provided for GHDL: + * macOS x64-64 builds as TAR/GZ file + * macOS aarch64 builds as TAR/GZ file + * Ubuntu 24.04 LTS builds as TAR/GZ file + * Windows builds for standalone usage (without MSYS2) as ZIP file + * MSYS2 packages as TAR/ZST file + + # pyGHDL 5.0.0-dev + + The Python package `pyGHDL` offers Python binding (`pyGHDL.libghdl`) to a `libghdl` shared library (`*.so`/`*.dll`). + In addition to the low-level binding layer, pyGHDL offers: + * a Language Server Protocol (LSP) instance for e.g. live code checking by editors + * a Code Document Object Model (CodeDOM) based on [pyVHDLModel](https://github.com/VHDL/pyVHDLModel) + + The following asset categories are provided for pyGHDL: + * Platform specific Python wheel package for Ubuntu incl. `pyGHDL...so` + * Platform specific Python wheel package for Windows incl. `pyGHDL...dll` + assets: | + document: document1.txt: Documentation + document: build.log: Logfile + other: document1.txt: SBOM + other: program.py: Application + document:!archive1.zip: Archive 1 - zip + document:!archive2.tgz: Archive 2 - tgz + document:!archive3.tar.gz: Archive 3 - tar.gz + document:!archive4.tzst: Archive 4 - tzst + document:!archive5.tar.zst:Archive 5 - tar.zst + document:$archive6.tgz: Archive 6 - tgz + dir + document:$archive7.tar.gz: Archive 7 - tar.gz + dir + document:$archive8.tzst: Archive 8 - tzst + dir + document:$archive9.tar.zst:Archive 9 - tar.zst + dir diff --git a/.github/workflows/_Checking_SimplePackage_Pipeline.yml b/.github/workflows/_Checking_SimplePackage_Pipeline.yml index a56af1b..3331c72 100644 --- a/.github/workflows/_Checking_SimplePackage_Pipeline.yml +++ b/.github/workflows/_Checking_SimplePackage_Pipeline.yml @@ -1,4 +1,4 @@ -name: Verification of Pipeline Templates +name: Verification of Pipeline Templates (Simple Package) on: push: