Merge branch 'feat-button-for-cicd-testing' of https://github.com/Tec… #99
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Dev solution checks then package TELBlazor.Components and trigger TELBlazor-DevShowCase deployment | |
| on: | |
| push: | |
| branches-ignore: | |
| - 'main' | |
| - 'master' | |
| permissions: | |
| contents: write | |
| actions: write | |
| env: | |
| # Permission | |
| # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| # Try other token so semver has the ability to add comments | |
| GITHUB_TOKEN: ${{ secrets.NUGETKEY }} | |
| PACKAGES_TOKEN: ${{ secrets.NUGETKEY }} | |
| GITHUB_USERNAME: "Phil-NHS" | |
| # Nuget Set Up | |
| TELBLAZOR_PACKAGE_LOCAL_OUTPUT_PATH: ${{ github.workspace }}/CICDPackageLocation | |
| TELBLAZOR_PACKAGE_SOURCE: "https://nuget.pkg.github.com/TechnologyEnhancedLearning/index.json" | |
| # Build Set Up | |
| USE_TEL_BLAZOR_COMPONENTS_PROJECT_REFERENCE: false | |
| DISABLE_PACKAGE_GENERATION: false | |
| jobs: | |
| dev-call-reusable-ci-checks-workflow: | |
| name: Dev Run CI checks | |
| uses: ./.github/workflows/reuseable-ci-checks.yml | |
| with: | |
| runall: true | |
| secrets: | |
| UNITTESTS_APPSETTINGS_DEVELOPMENT: ${{ secrets.UNITTESTS_APPSETTINGS_DEVELOPMENT }} | |
| WASMSTATICCLIENT_APPSETTINGS_DEVELOPMENT: ${{ secrets.WASMSTATICCLIENT_APPSETTINGS_DEVELOPMENT }} | |
| WASMSERVERHOSTCLIENT_APPSETTINGS_DEVELOPMENT: ${{ secrets.WASMSERVERHOSTCLIENT_APPSETTINGS_DEVELOPMENT }} | |
| WASMSERVERHOST_APPSETTINGS_DEVELOPMENT: ${{ secrets.WASMSERVERHOST_APPSETTINGS_DEVELOPMENT }} | |
| # UNITTESTS_APPSETTINGS_PRODUCTION: ${{ secrets.UNITTESTS_APPSETTINGS_PRODUCTION }} | |
| # WASMSTATICCLIENT_APPSETTINGS_PRODUCTION: ${{ secrets.WASMSTATICCLIENT_APPSETTINGS_PRODUCTION }} | |
| # WASMSERVERHOSTCLIENT_APPSETTINGS_PRODUCTION: ${{ secrets.WASMSERVERHOSTCLIENT_APPSETTINGS_PRODUCTION }} | |
| # WASMSERVERHOST_APPSETTINGS_PRODUCTION: ${{ secrets.WASMSERVERHOST_APPSETTINGS_PRODUCTION }} | |
| #FAKE_WASMSERVERHOST_APPSETTINGS_DEVELOPMENT: ${{ secrets.FAKE_WASMSERVERHOST_APPSETTINGS_DEVELOPMENT }} | |
| # Now we've done due diligence | |
| # The checks have been allowed to run if the workflow fails so if there a multiple fails we know. | |
| # We do not proceed from the point if there is a fail. | |
| # Hence explicit "if" and "needs" | |
| generate-dev-semantic-version: | |
| name: Generate dev semantic version | |
| if: success() | |
| needs: [dev-call-reusable-ci-checks-workflow] | |
| runs-on: ubuntu-latest | |
| outputs: | |
| dev-package-version: ${{ steps.set_dev_semantic_version.outputs.dev-semantic-version }} | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 # Required for Semantic Release to analyze commit history | |
| - name: Install semantic release packages | |
| run: | | |
| echo "Installing semantic-release packages..." | |
| npm install -D \ | |
| semantic-release \ | |
| @semantic-release/changelog \ | |
| @semantic-release/git \ | |
| @semantic-release/commit-analyzer \ | |
| @semantic-release/release-notes-generator \ | |
| @semantic-release/github | |
| echo "Semantic Release packages installed." | |
| npm ls --depth=0 # Debug: List installed packages | |
| - name: Run semantic version (None Blocking) | |
| run: | | |
| # If no version is required we can get an error so here we handle it | |
| set +e | |
| SEMVER_OUTPUT_RAW=$(npx semantic-release) | |
| echo "Raw SEMVER_OUTPUT_RAW=$SEMVER_OUTPUT_RAW" | |
| SEMVER_OUTPUT=$(echo "$SEMVER_OUTPUT_RAW" | grep -oP 'Published release \K[^\s]+') | |
| # In development, we always package and update the website—even if there’s no version change. | |
| # This ensures the CI process runs consistently and the latest code is deployed. | |
| # It's especially useful when squashing commits, as it guarantees the package is still rebuilt and published. | |
| echo "Packaging and updating the website in development, even without version changes, to ensure consistent CI behavior and updated packages after squashed commits." | |
| STATUS=$? | |
| if [ -z "$SEMVER_OUTPUT" ]; then | |
| SEMVER_OUTPUT=$(echo "$SEMVER_OUTPUT_RAW" | grep -oP 'Found git tag v\K[^\s]+') | |
| # Note: If Semver falls back to using a Git tag, it will pick the most recent one. | |
| # This tag may not belong to the current branch, so the result isn't guaranteed to reflect the latest changes on this branch. | |
| echo "Semver fallback: using latest Git tag, which may not be from the current branch." | |
| fi | |
| if [ -z "$SEMVER_OUTPUT" ]; then | |
| SEMVER_OUTPUT="0.0.0" | |
| echo "No semantic version or tag, defaulting to 0.0.0 $SEMVER_OUTPUT" | |
| fi | |
| # Export the result to the environment | |
| echo "SEMVER_OUTPUT=$SEMVER_OUTPUT" >> $GITHUB_ENV | |
| set -e | |
| - name: Rename Semver Version with branch date time dev | |
| id: set_dev_semantic_version | |
| run: | | |
| echo "Semantic Release Output $SEMVER_OUTPUT" | |
| # In development, we always package and update the website—even if there’s no version change. | |
| # This ensures the CI process runs consistently and the latest code is deployed. | |
| # It's especially useful when squashing commits, as it guarantees the package is still rebuilt and published. | |
| timestamp=$(date +"%y%m%d-%H%M") | |
| echo "Timestamp $timestamp" | |
| full_version="${SEMVER_OUTPUT}-${timestamp}" | |
| echo "extracted version $full_version" | |
| echo "dev-semantic-version=$full_version" >> $GITHUB_OUTPUT | |
| build-telblazor-dev-package-and-publish: | |
| if: success() | |
| name: Build dev package and publish | |
| needs: [generate-dev-semantic-version, dev-call-reusable-ci-checks-workflow] | |
| runs-on: ubuntu-latest | |
| env: | |
| DEV_TELBLAZOR_PACKAGE_VERSION: ${{ needs.generate-dev-semantic-version.outputs.dev-package-version }} | |
| steps: | |
| - name: Checkout Code | |
| uses: actions/checkout@v4 | |
| - name: Setup .NET | |
| uses: actions/setup-dotnet@v4 | |
| with: | |
| global-json-file: global.json | |
| - name: Debug version output DEV_TELBLAZOR_PACKAGE_VERSION | |
| run: echo "Extracted Version $DEV_TELBLAZOR_PACKAGE_VERSION " | |
| - name: Replace local environment variable in nuget config because cant provide it as a parameter | |
| run: sed -i "s|%TELBlazorPackageSource%|$TELBLAZOR_PACKAGE_LOCAL_OUTPUT_PATH|g" nuget.config | |
| - name: Create appsettings development from secrets | |
| run: | | |
| declare -A paths | |
| paths["./TELBlazor.Components.UnitTests/appsettings.Development.json"]='${{ secrets.UNITTESTS_APPSETTINGS_DEVELOPMENT }}' | |
| paths["./TELBlazor.Components.ShowCase.WasmStaticClient/wwwroot/appsettings.Development.json"]='${{ secrets.WASMSTATICCLIENT_APPSETTINGS_DEVELOPMENT }}' | |
| paths["./TELBlazor.Components.ShowCase.E2ETests.WasmServerHost/TELBlazor.Components.ShowCase.E2ETests.WasmServerHost.Client/wwwroot/appsettings.Development.json"]='${{ secrets.WASMSERVERHOSTCLIENT_APPSETTINGS_DEVELOPMENT }}' | |
| paths["./TELBlazor.Components.ShowCase.E2ETests.WasmServerHost/TELBlazor.Components.ShowCase.E2ETests.WasmServerHost/appsettings.Development.json"]='${{ secrets.WASMSERVERHOST_APPSETTINGS_DEVELOPMENT }}' | |
| paths["./TELBlazor.Components.UnitTests/appsettings.Production.json"]='${{ secrets.UNITTESTS_APPSETTINGS_PRODUCTION }}' | |
| paths["./TELBlazor.Components.ShowCase.WasmStaticClient/wwwroot/appsettings.Production.json"]='${{ secrets.WASMSTATICCLIENT_APPSETTINGS_PRODUCTION }}' | |
| paths["./TELBlazor.Components.ShowCase.E2ETests.WasmServerHost/TELBlazor.Components.ShowCase.E2ETests.WasmServerHost.Client/wwwroot/appsettings.Production.json"]='${{ secrets.WASMSERVERHOSTCLIENT_APPSETTINGS_PRODUCTION }}' | |
| paths["./TELBlazor.Components.ShowCase.E2ETests.WasmServerHost/TELBlazor.Components.ShowCase.E2ETests.WasmServerHost/appsettings.Production.json"]='${{ secrets.WASMSERVERHOST_APPSETTINGS_PRODUCTION }}' | |
| for path in "${!paths[@]}"; do | |
| mkdir -p "$(dirname "$path")" | |
| printf '%s' "${paths[$path]}" > "$path" | |
| done | |
| - name: Clean lock files because the newly generated package file will supersede the locks | |
| run: | | |
| find . -name "packages.lock.json" -type f -exec rm -f {} \; | |
| - name: Set up Node.js so we have gulp for retrieving TEL Frontend Css | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '20' | |
| - name: Install npm packages so we have gulp for retrieving TEL Frontend Css | |
| working-directory: ./TELBlazor.Components | |
| run: npm ci | |
| #CI is an install that adheres to package-lock | |
| - name: Build TELBlazor.Components (it publishes on build) | |
| env: | |
| DISABLE_PACKAGE_GENERATION: false | |
| run: | | |
| dotnet build TELBlazor.Components -c Release \ | |
| /p:TELBlazorPackageVersion=$DEV_TELBLAZOR_PACKAGE_VERSION \ | |
| /p:NupkgOutputPath=$TELBLAZOR_PACKAGE_LOCAL_OUTPUT_PATH \ | |
| /p:UseTELBlazorComponentsProjectReference=$USE_TEL_BLAZOR_COMPONENTS_PROJECT_REFERENCE \ | |
| /p:DisablePackageGeneration=$DISABLE_PACKAGE_GENERATION | |
| - name: Publish to TechnologyEnhancedLearning as a Dev Package | |
| run: | | |
| dotnet nuget push "$TELBLAZOR_PACKAGE_LOCAL_OUTPUT_PATH/TELBlazor.Components.*.nupkg" \ | |
| --source "$TELBLAZOR_PACKAGE_SOURCE" \ | |
| --api-key $PACKAGES_TOKEN \ | |
| --skip-duplicate | |
| trigger-gh-pages-telblazor-devshowcase-workflow: | |
| name: Create artifact and provide it to TelBlazor-DevShowCase repo and its gh-page trigger | |
| if: success() #not needed but being explicit | |
| needs: [build-telblazor-dev-package-and-publish, generate-dev-semantic-version, dev-call-reusable-ci-checks-workflow] | |
| runs-on: ubuntu-latest | |
| env: | |
| DEV_TELBLAZOR_PACKAGE_VERSION: ${{ needs.generate-dev-semantic-version.outputs.dev-package-version }} | |
| steps: | |
| - name: Checkout Code | |
| uses: actions/checkout@v4 | |
| - name: Setup .NET | |
| uses: actions/setup-dotnet@v4 | |
| with: | |
| global-json-file: global.json | |
| - name: Clean solution | |
| run: | | |
| echo "Cleaning the solution..." | |
| dotnet clean TELBlazor.sln | |
| - name: Replace local environment variable in nuget config because cant provide it as a parameter | |
| run: | | |
| sed -i "s|%TELBlazorPackageSource%|$TELBLAZOR_PACKAGE_SOURCE|g" nuget.config | |
| sed -i "s|%GITHUB_USERNAME%|$GITHUB_USERNAME|g" nuget.config | |
| sed -i "s|%GITHUB_PACKAGES_TOKEN%|$PACKAGES_TOKEN|g" nuget.config | |
| - name: debug DEV_TELBLAZOR_PACKAGE_VERSION | |
| run: | | |
| echo "DEV_TELBLAZOR_PACKAGE_VERSION $DEV_TELBLAZOR_PACKAGE_VERSION" | |
| - name: Create appsettings development from secrets | |
| run: | | |
| declare -A paths | |
| paths["./TELBlazor.Components.UnitTests/appsettings.Development.json"]='${{ secrets.UNITTESTS_APPSETTINGS_DEVELOPMENT }}' | |
| paths["./TELBlazor.Components.ShowCase.WasmStaticClient/wwwroot/appsettings.Development.json"]='${{ secrets.WASMSTATICCLIENT_APPSETTINGS_DEVELOPMENT }}' | |
| paths["./TELBlazor.Components.ShowCase.E2ETests.WasmServerHost/TELBlazor.Components.ShowCase.E2ETests.WasmServerHost.Client/wwwroot/appsettings.Development.json"]='${{ secrets.WASMSERVERHOSTCLIENT_APPSETTINGS_DEVELOPMENT }}' | |
| paths["./TELBlazor.Components.ShowCase.E2ETests.WasmServerHost/TELBlazor.Components.ShowCase.E2ETests.WasmServerHost/appsettings.Development.json"]='${{ secrets.WASMSERVERHOST_APPSETTINGS_DEVELOPMENT }}' | |
| paths["./TELBlazor.Components.UnitTests/appsettings.Production.json"]='${{ secrets.UNITTESTS_APPSETTINGS_PRODUCTION }}' | |
| paths["./TELBlazor.Components.ShowCase.WasmStaticClient/wwwroot/appsettings.Production.json"]='${{ secrets.WASMSTATICCLIENT_APPSETTINGS_PRODUCTION }}' | |
| paths["./TELBlazor.Components.ShowCase.E2ETests.WasmServerHost/TELBlazor.Components.ShowCase.E2ETests.WasmServerHost.Client/wwwroot/appsettings.Production.json"]='${{ secrets.WASMSERVERHOSTCLIENT_APPSETTINGS_PRODUCTION }}' | |
| paths["./TELBlazor.Components.ShowCase.E2ETests.WasmServerHost/TELBlazor.Components.ShowCase.E2ETests.WasmServerHost/appsettings.Production.json"]='${{ secrets.WASMSERVERHOST_APPSETTINGS_PRODUCTION }}' | |
| for path in "${!paths[@]}"; do | |
| mkdir -p "$(dirname "$path")" | |
| printf '%s' "${paths[$path]}" > "$path" | |
| done | |
| - name: Clean lock files because the newly generated package file will superseed the locks | |
| run: | | |
| echo "Listing packages.lock.json files:" | |
| find . -name "packages.lock.json" -type f -print | |
| echo "" | |
| echo "Deleting packages.lock.json files:" | |
| find . -name "packages.lock.json" -type f -exec rm -f {} \; | |
| echo "Listing packages.lock.json files:" | |
| find . -name "packages.lock.json" -type f -print | |
| - name: Publish WasmStaticClient | |
| run: | | |
| dotnet publish ./TELBlazor.Components.ShowCase.WasmStaticClient/TELBlazor.Components.ShowCase.WasmStaticClient.csproj --configuration Release \ | |
| /p:TELBlazorPackageVersion=$DEV_TELBLAZOR_PACKAGE_VERSION \ | |
| /p:NupkgOutputPath=$TELBLAZOR_PACKAGE_LOCAL_OUTPUT_PATH \ | |
| /p:UseTELBlazorComponentsProjectReference=$USE_TEL_BLAZOR_COMPONENTS_PROJECT_REFERENCE \ | |
| /p:TELBlazorPackageSource=$TELBLAZOR_PACKAGE_SOURCE | |
| #include hidden so we get jekyll | |
| - name: Creating artifact of publish folder for test gh page workflow | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: published-telblazor-components-showcase-wasmstaticclient-using-dev-package-${{env.DEV_TELBLAZOR_PACKAGE_VERSION}} | |
| include-hidden-files: true | |
| path: | | |
| ./docs | |
| ./docs/.nojekyll # explicitly include the .nojekyll file | |
| retention-days: 90 | |
| - name: Get artifact location | |
| run: | | |
| # Get the artifact list for the current workflow run | |
| ARTIFACT_LIST=$(gh api "repos/TechnologyEnhancedLearning/TELBlazor/actions/runs/${GITHUB_RUN_ID}/artifacts") | |
| # Echo the entire artifact list for debugging purposes | |
| echo "Artifact List: $ARTIFACT_LIST" | |
| # Extract the download URL from the artifact list (first artifact in the list) | |
| #ARTIFACT_URL=$(echo "$ARTIFACT_LIST" | jq -r '.artifacts[0].archive_download_url') | |
| ARTIFACT_URL=$(echo "$ARTIFACT_LIST" | jq -r '.artifacts[0].url') | |
| # Echo the artifact URL to confirm | |
| echo "Artifact URL: $ARTIFACT_URL" | |
| echo "artifact_url=$ARTIFACT_URL" >> $GITHUB_ENV | |
| - name: Trigger workflow in TELBlazor-DevShowCase repo | |
| run: | | |
| repo_owner="TechnologyEnhancedLearning" | |
| repo_name="TELBlazor-DevShowCase" | |
| event_type="artifact_ready" | |
| # Trigger the workflow | |
| curl -L \ | |
| -X POST \ | |
| -H "Accept: application/vnd.github+json" \ | |
| -H "Authorization: Bearer $PACKAGES_TOKEN" \ | |
| -H "X-GitHub-Api-Version: 2022-11-28" \ | |
| https://api.github.com/repos/$repo_owner/$repo_name/dispatches \ | |
| -d "{\"event_type\": \"$event_type\", \"client_payload\": {\"artifact_url\": \"$artifact_url\"}}" | |