From de81a36c6f622a38e076e439cfeb8979465d2e8b Mon Sep 17 00:00:00 2001 From: Rafael Sene Date: Thu, 5 Oct 2023 16:54:45 -0300 Subject: [PATCH] Upgrade the build process to leverage containers and generate pdf and html Signed-off-by: Rafael Sene --- .github/workflows/build-pdf.yml | 79 ------------------------- .github/workflows/build.yml | 77 +++++++++++++++++++++++++ .github/workflows/create-release.yml | 55 ------------------ .gitignore | 1 + Makefile | 86 ++++++++++++++++++++++------ 5 files changed, 146 insertions(+), 152 deletions(-) delete mode 100644 .github/workflows/build-pdf.yml create mode 100644 .github/workflows/build.yml delete mode 100644 .github/workflows/create-release.yml diff --git a/.github/workflows/build-pdf.yml b/.github/workflows/build-pdf.yml deleted file mode 100644 index 2eb424d..0000000 --- a/.github/workflows/build-pdf.yml +++ /dev/null @@ -1,79 +0,0 @@ -# This workflow installs dependencies for PDF generation, generates the PDF, -# and uploads the PDF as an artifact. - -name: Build Document PDF - -on: - push: - branches: - - main - pull_request: - branches: - - main - workflow_dispatch: - workflow_call: - outputs: - name: - description: "The base name of the pdf file (without .pdf extensions)" - value: ${{ jobs.build.outputs.name }} - pdf-name: - description: "The name of the pdf file (with .pdf extensions)" - value: ${{ jobs.build.outputs.pdf-name }} - -jobs: - build: - runs-on: ubuntu-latest - - env: - NAME: profiles - APT_PACKAGES_FILE: ${{ github.workspace }}/dependencies/apt_packages.txt - BUNDLE_GEMFILE: ${{ github.workspace }}/dependencies/Gemfile - BUNDLE_BIN: ${{ github.workspace }}/bin - NPM_PACKAGE_FOLDER: ${{ github.workspace }}/dependencies - outputs: - name: ${{ steps.step1.outputs.name }} - pdf-name: ${{ steps.step2.outputs.pdf-name }} - steps: - - name: Set outputs.name - id: step1 - run: echo "::set-output name=name::$NAME" - - name: Set outputs.pdf-name - id: step2 - run: echo "::set-output name=pdf-name::$NAME.pdf" - - name: Checkout repository - uses: actions/checkout@v2 - with: - submodules: 'true' - - name: Install Ubuntu packages - run: | - sudo apt-get update - grep -vE '^#' ${APT_PACKAGES_FILE} | xargs sudo apt-get install --yes --no-install-recommends - # Ruby for asciidoctor - - name: Setup Ruby and Gemfile content - uses: ruby/setup-ruby@v1 - with: - ruby-version: "3.2.0" - bundler-cache: true - # Node.js for wavedrom - - uses: actions/cache@v2 - with: - path: ~/.npm - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - name: Setup Node.js - uses: actions/setup-node@v2 - with: - node-version: '14' - - name: Install Node.js dependencies - run: npm install ${NPM_PACKAGE_FOLDER} - - name: Generate PDF - run: | - PATH=${PATH}:${BUNDLE_BIN}:$(npm bin) \ - make - - name: Archive PDF result - uses: actions/upload-artifact@v2 - with: - name: ${{ env.NAME }}.pdf - path: ${{ env.NAME }}.pdf - retention-days: 7 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..1689a67 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,77 @@ +name: Create Specification Document + +# The workflow is triggered by pull request, push to main, and manual dispatch. +on: + workflow_dispatch: + inputs: + version: + description: 'Release version, e.g. X.Y.Z:' + required: true + type: string + revision_mark: + description: 'Set revision mark as Draft, Release or Stable:' + required: true + type: string + default: 'Draft' + prerelease: + description: 'Tag as a pre-release?' + required: false + type: boolean + default: true + draft: + description: 'Create release as a draft?' + required: false + type: boolean + default: false + pull_request: + push: + branches: + - main + +jobs: + build: + runs-on: ubuntu-latest + + steps: + # Step 1: Checkout the repository + - name: Checkout repository + uses: actions/checkout@v3 + with: + submodules: 'recursive' + + # Step 2: Pull the latest RISC-V Docs container image + - name: Pull Container + run: docker pull riscvintl/riscv-docs-base-container-image:latest + + # Step 3: Build Files + - name: Build Files + run: make + env: + VERSION: v${{ github.event.inputs.version }} + REVMARK: ${{ github.event.inputs.revision_mark }} + + # Step 4: Upload the built PDF files as a single artifact + - name: Upload Build Artifacts + uses: actions/upload-artifact@v3 + with: + name: Build Artifacts + path: | + ${{ github.workspace }}/*.pdf + ${{ github.workspace }}/*.html + retention-days: 30 + + # Create Release + - name: Create Release + uses: softprops/action-gh-release@v1 + with: + files: | + ${{ github.workspace }}/*.pdf + ${{ github.workspace }}/*.html + tag_name: v${{ github.event.inputs.version }} + name: Release ${{ github.event.inputs.version }} + draft: ${{ github.event.inputs.draft }} + prerelease: ${{ github.event.inputs.prerelease }} + env: + GITHUB_TOKEN: ${{ secrets.GHTOKEN }} + if: github.event_name == 'workflow_dispatch' + # This condition ensures this step only runs for workflow_dispatch events. diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml deleted file mode 100644 index 1ac0d27..0000000 --- a/.github/workflows/create-release.yml +++ /dev/null @@ -1,55 +0,0 @@ -# This work flow includes source and PDF in Release. It relies on the build-pdf workflow to create the PDF. -# -# NOTE: At this time it only runs manually. - -name: Create Document Release - -on: - workflow_dispatch: - inputs: - version: - description: 'Release version, e.g. X.Y.Z:' - required: true - type: string - prerelease: - description: 'Tag as a pre-release?' - required: false - type: boolean - default: true - draft: - description: 'Create release as a draft?' - required: false - type: boolean - default: false - -jobs: - build: - uses: ./.github/workflows/build-pdf.yml - release: - runs-on: ubuntu-latest - needs: build - steps: - - name: Create Release - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: v${{ github.event.inputs.version }} - release_name: Release ${{ github.event.inputs.version }} - draft: ${{ github.event.inputs.draft }} - prerelease: ${{ github.event.inputs.prerelease }} - - name: Download Artifacts - uses: actions/download-artifact@v2 - with: - name: ${{ needs.build.outputs.pdf-name }} - - name: Upload Release Asset - id: upload-release-asset - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ${{ needs.build.outputs.pdf-name }} - asset_name: ${{ needs.build.outputs.name }}_${{ github.event.inputs.version }}.pdf - asset_content_type: application/pdf diff --git a/.gitignore b/.gitignore index 06f8085..3f6b211 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .DS_Store .*.swp *.pdf +*.html diff --git a/Makefile b/Makefile index d60146c..81d39f2 100644 --- a/Makefile +++ b/Makefile @@ -1,24 +1,74 @@ -HEADER=profiles.adoc -DOC_PDF=$(HEADER:%.adoc=%.pdf) -DOC_HTML=$(HEADER:%.adoc=%.html) +# Makefile for RISC-V Doc Template +# +# This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 +# International License. To view a copy of this license, visit +# http://creativecommons.org/licenses/by-sa/4.0/ or send a letter to +# Creative Commons, PO Box 1866, Mountain View, CA 94042, USA. +# +# SPDX-License-Identifier: CC-BY-SA-4.0 +# +# Description: +# +# This Makefile is designed to automate the process of building and packaging +# the Doc Template for RISC-V Extensions. -all: $(DOC_PDF) +DOCKER_RUN := docker run --rm -v ${PWD}:/build -w /build \ +riscvintl/riscv-docs-base-container-image:latest -%.pdf : %.adoc - asciidoctor-pdf \ - -r asciidoctor-diagram \ - -a toc \ - -a compress \ - -a pdf-style=docs-resources/themes/riscv-pdf.yml \ - -a pdf-fontsdir=docs-resources/fonts \ - --failure-level=ERROR \ - -o $@ $< +HEADER_SOURCE := profiles.adoc +PDF_RESULT := $(HEADER_SOURCE:%.adoc=%.pdf) +HTML_RESULT := $(HEADER_SOURCE:%.adoc=%.html) -html: $(DOC_HTML) - open $(DOC_HTML) +ASCIIDOCTOR_PDF := asciidoctor-pdf +ASCIIDOCTOR_HTML := asciidoctor -$(DOC_HTML): $(HEADER) - asciidoctor -o $@ $< +OPTIONS := --trace \ + -a compress \ + -a mathematical-format=svg \ + -a pdf-fontsdir=docs-resources/fonts \ + -a pdf-style=docs-resources/themes/riscv-pdf.yml \ + --failure-level=ERROR + +REQUIRES := --require=asciidoctor-diagram \ + --require=asciidoctor-mathematical + +.PHONY: all build clean build-container-pdf build-no-container-pdf build-container-html build-no-container-html + +all: build + +build: + @echo "Checking if Docker is available..." + @if command -v docker >/dev/null 2>&1 ; then \ + echo "Docker is available, building inside Docker container..."; \ + $(MAKE) build-container-pdf; \ + $(MAKE) build-container-html; \ + else \ + echo "Docker is not available, building without Docker..."; \ + $(MAKE) build-no-container-pdf; \ + $(MAKE) build-no-container-html; \ + fi + +build-container-pdf: + @echo "Starting build inside Docker container..." + $(DOCKER_RUN) /bin/sh -c "$(ASCIIDOCTOR_PDF) $(OPTIONS) $(REQUIRES) --out-file=$(PDF_RESULT) $(HEADER_SOURCE)" + @echo "Build completed successfully inside Docker container." + +build-no-container-pdf: + @echo "Starting build..." + $(ASCIIDOCTOR_PDF) $(OPTIONS) $(REQUIRES) --out-file=$(PDF_RESULT) $(HEADER_SOURCE) + @echo "Build completed successfully." + +build-container-html: + @echo "Starting build inside Docker container..." + $(DOCKER_RUN) /bin/sh -c "$(ASCIIDOCTOR_HTML) $(OPTIONS) $(REQUIRES) --out-file=$(HTML_RESULT) $(HEADER_SOURCE)" + @echo "Build completed successfully inside Docker container." + +build-no-container-html: + @echo "Starting build..." + $(ASCIIDOCTOR_HTML) $(OPTIONS) $(REQUIRES) --out-file=$(HTML_RESULT) $(HEADER_SOURCE) + @echo "Build completed successfully." clean: - rm -f $(DOC_PDF) + @echo "Cleaning up generated files..." + rm -f $(PDF_RESULT) $(HTML_RESULT) + @echo "Cleanup completed."