Skip to content

Merge pull request #107 from TechnologyEnhancedLearning/refactor-logging #41

Merge pull request #107 from TechnologyEnhancedLearning/refactor-logging

Merge pull request #107 from TechnologyEnhancedLearning/refactor-logging #41

Workflow file for this run

name: release
on:
push:
branches:
- master
workflow_dispatch:
permissions:
contents: write
actions: write
env:
# Permission
# Using key with more permissions
GITHUB_TOKEN: ${{ secrets.NUGETKEY }}
TEL_GIT_PACKAGES_TOKEN: ${{ secrets.NUGETKEY }}
GITHUB_USERNAME: "Phil-NHS"
# Nuget Set Up
NUGET_PACKAGES_OUTPUT_PATH: ${{ github.workspace }}/CICDPackageLocation
LOCAL_PACKAGES_PATH: ${{ github.workspace }}/CICDPackageLocation
TEL_GIT_PACKAGE_SOURCE : "https://nuget.pkg.github.com/TechnologyEnhancedLearning/index.json"
# Build Set Up
USE_TEL_BLAZOR_COMPONENTS_PROJECT_REFERENCE: false
jobs:
generate-semantic-version:
name: Generate semantic version for package and repo
runs-on: ubuntu-latest
outputs:
semantic-release-version: ${{ steps.set_semantic_version.outputs.semantic-release-version }}
semantic-version-change-required: ${{ steps.set_semantic_version.outputs.semantic-version-change-required }}
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
#configured with .releaseserc
- name: run semantic release
id: set_semantic_version
run: |
echo "running semantic-release"
SEMVER_OUTPUT_RAW=$(npx semantic-release 2>&1)
STATUS=$?
echo "status = $STATUS"
echo "$SEMVER_OUTPUT_RAW"
# Check for no changes and set SEMVER_VERSION accordingly
if echo "$SEMVER_OUTPUT_RAW" | grep -q 'There are no relevant changes'; then
echo "No relevant changes found"
SEMVER_CHANGED=false
echo "Changes do not warrant a version change. gh_pages and packages won't be updated."
echo "semantic-version-change-required=$SEMVER_CHANGED" >> $GITHUB_OUTPUT
echo "Changes do not warrant a version change. gh_pages and packages won't be updated."
# Check if version bump expected
elif echo "$SEMVER_OUTPUT_RAW" | grep -q 'Published release'; then
# Extract the actual version, if it fails here we want to know
SEMVER_VERSION=$(echo "$SEMVER_OUTPUT_RAW" | grep -oP 'Published release \K[\d.]+')
echo "Version change detected - SEMVER_VERSION=$SEMVER_VERSION"
echo "version change required true"
SEMVER_CHANGED=true
echo "semantic-release-version=$SEMVER_VERSION" >> $GITHUB_OUTPUT
echo "semantic-version-change-required=$SEMVER_CHANGED" >> $GITHUB_OUTPUT
else
echo "⚠️ Semver-release not successfully parsed ⚠️"
echo "Output did not match expected patterns"
echo "Raw output was: $SEMVER_OUTPUT_RAW"
exit 1
fi
# 0 not exclusively due to no version bump so check output
# if [ "${STATUS:-0}" -ne 0 ]; then
# echo "Status code is not 0"
# if echo "$SEMVER_OUTPUT_RAW" | grep -q "No release published"; then
# echo "no version change detected"
# # No new version, but we can find the current version
# #echo "No new version required getting current version from git tags"
# #SEMVER_VERSION=$(git describe --tags --abbrev=0 2>/dev/null || echo "0.0.0-version-placeholder") # last git tag
# echo "semantic-release-version=$SEMVER_VERSION"
# SEMVER_CHANGED=false
# echo "Changes do not warrant a version change. gh_pages and packages won't be updated."
# #echo "semantic-release-version=$SEMVER_VERSION" >> $GITHUB_OUTPUT
# echo "semantic-version-change-required=$SEMVER_CHANGED" >> $GITHUB_OUTPUT
# exit 0 # treat as success code didnt fail there just was no version increment required
# else
# echo "exit using status outcome of semver"
# exit $STATUS # real error → fail pipeline
# fi
# else
# echo "grep semver version"
# SEMVER_VERSION=$(echo "$SEMVER_OUTPUT_RAW" | grep -oP 'Published release \K[\d.]+')
# echo "semantic-release-version=$SEMVER_VERSION"
# # qqqq VERSION=$(echo "$OUTPUT" | grep "Published release" | awk '{print $NF}') - AI suggestion try if issues
# # awk is a text-processing tool that splits each line into fields using whitespace by default.
# # $NF is a special variable in awk that means “the last field” of the current line.
# # print $NF prints just that last field.
# SEMVER_CHANGED=true
# echo "semantic-version-change-required=$SEMVER_CHANGED"
# echo "version change required true"
# echo "semantic-release-version=$SEMVER_VERSION" >> $GITHUB_OUTPUT
# echo "semantic-version-change-required=$SEMVER_CHANGED" >> $GITHUB_OUTPUT
# # Just because weve been handling errors
# exit 0
# fi
#configured with .releaseserc
# qqqq- name: Run semantic release
# id: set_semantic_version
# run: |
# set +e
# RELEASE_OUTPUT=$(npx semantic-release 2>&1)
# echo "$RELEASE_OUTPUT"
# # Try to extract the version from the full output
# SEMVER_VERSION=$(echo "$RELEASE_OUTPUT" | grep -oP 'Published release \K[\d.]+')
# # Output it clearly for debugging
# echo "Parsed semantic-release version: $SEMVER_VERSION"
# # Set GitHub Action output
# echo "semantic-release-version=$SEMVER_VERSION" >> $GITHUB_OUTPUT
# # Check if SEMVER_VERSION is empty and echo the message if so
# if [ -z "$SEMVER_VERSION" ]; then
# echo "Changes do not warrant a version change. gh_pages and packages won't be updated."
# fi
# set -e
build-telblazor-package-and-publish:
needs: [generate-semantic-version]
runs-on: ubuntu-latest
if: ${{ needs.generate-semantic-version.outputs.semantic-version-change-required == 'true' }} # Only run if there's a version
env:
TELBLAZOR_PACKAGE_VERSION: ${{ needs.generate-semantic-version.outputs.semantic-release-version }}
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
global-json-file: global.json
# the restore cant be given env values to override values like it can in build so we need to remove this file so we use the env values
- name: Remove local package settings (CI Only)
run: rm -f PackageSettings.props.local
- name: Replace nuget.config with CI template
run: |
rm -f nuget.config
cp nuget.config.cicd nuget.config
- name: Replace local environment variable in nuget config because cant provide it as a parameter
run: |
sed -i "s|%TEL_BLAZOR_PACKAGE_SOURCE%|$LOCAL_PACKAGES_PATH|g" nuget.config
sed -i "s|%GITHUB_USERNAME%|$GITHUB_USERNAME|g" nuget.config
sed -i "s|%TEL_GIT_PACKAGES_TOKEN%|$TEL_GIT_PACKAGES_TOKEN|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
run: npm ci
#CI is an install that adheres to package-lock
- name: Build and pack TELBlazor.Components
run: |
dotnet build TELBlazor.Components -c Release \
/p:TELBlazorPackageVersion=$TELBLAZOR_PACKAGE_VERSION \
/p:NugetPackagesOutputPath=$NUGET_PACKAGES_OUTPUT_PATH \
/p:UseTELBlazorComponentsProjectReference=$USE_TEL_BLAZOR_COMPONENTS_PROJECT_REFERENCE \
/p:DisablePackageGeneration=false
- name: Publish to TELBlazor.Components Package
run: |
dotnet nuget push "$NUGET_PACKAGES_OUTPUT_PATH/TELBlazor.Components.*.nupkg" \
--source "$TEL_GIT_PACKAGE_SOURCE" \
--api-key $TEL_GIT_PACKAGES_TOKEN \
--skip-duplicate
update-gh-pages-site:
name: Update the production TELBlazor ShowCase page (on this repo)
needs: [build-telblazor-package-and-publish, generate-semantic-version]
runs-on: ubuntu-latest
if: ${{ needs.generate-semantic-version.outputs.semantic-version-change-required == 'true' }} # Only run if there's a version
env:
TELBLAZOR_PACKAGE_VERSION: ${{ needs.generate-semantic-version.outputs.semantic-release-version }}
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
global-json-file: global.json
- name: Remove local packagesettings (CI Only)
run: rm -f PackageSettings.props.local
- name: Replace nuget.config with CI template
run: |
rm -f nuget.config
cp nuget.config.cicd nuget.config
- name: Replace local environment variable in nuget config because cant provide it as a parameter
run: |
sed -i "s|%TEL_BLAZOR_PACKAGE_SOURCE%|$TEL_GIT_PACKAGE_SOURCE|g" nuget.config
sed -i "s|%GITHUB_USERNAME%|$GITHUB_USERNAME|g" nuget.config
sed -i "s|%TEL_GIT_PACKAGES_TOKEN%|$TEL_GIT_PACKAGES_TOKEN|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: |
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: 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
run: npm ci
- name: Build solution without generating new package
run: |
dotnet build TELBlazor.sln -c Release \
/p:TELBlazorPackageVersion=$TELBLAZOR_PACKAGE_VERSION \
/p:NugetPackagesOutputPath=$NUGET_PACKAGES_OUTPUT_PATH \
/p:UseTELBlazorComponentsProjectReference=false \
/p:DisablePackageGeneration=true
- name: Publish WasmStaticClient TELBlazor ShowCase
run: |
dotnet publish ./TELBlazor.Components.ShowCase.WasmStaticClient/TELBlazor.Components.ShowCase.WasmStaticClient.csproj --configuration Release \
/p:TELBlazorPackageVersion=$TELBLAZOR_PACKAGE_VERSION \
/p:NugetPackagesOutputPath=$NUGET_PACKAGES_OUTPUT_PATH \
/p:UseTELBlazorComponentsProjectReference=false \
/p:DisablePackageGeneration=true
- name: Deploy to GitHub Pages
uses: JamesIves/github-pages-deploy-action@v4
with:
folder: docs # The folder the action should deploy
branch: gh-pages # The branch the action should deploy to