Skip to content

Instantly share code, notes, and snippets.

@jimmystridh
Last active August 28, 2024 13:06
Show Gist options
  • Save jimmystridh/316fa695c1baf0718765c871e70fb320 to your computer and use it in GitHub Desktop.
Save jimmystridh/316fa695c1baf0718765c871e70fb320 to your computer and use it in GitHub Desktop.
Förslag på Förbättrad Deploymentprocess för AiA Content sync och SpcsGPT

Förbättrad Deploymentprocess för AiA och SpcsGPT

Introduktion

Förslag på hur förbättra och automatisera deploymentprocessen mellan våra två projekt, AiA och SpcsGPT.

Vad har vi ändrat?

  1. AiA-projektet:

    • Vi har lagt till en ny workflow, release-and-trigger.yml, som automatiskt skapar en GitHub-release för varje ny version av AiA.
    • Den nya workflowen triggar även en deployment i SpcsGPT-projektet.
  2. SpcsGPT-projektet:

    • Vi har skapat en ny workflow, deploy-aia-artifact.yml, som kan hämta och distribuera den senaste (eller en specifik) version av AiA-artefakten.
    • Denna workflow kan triggas på tre sätt: manuellt, automatiskt från AiA, eller vid push till main-branchen.

Varför har vi gjort dessa ändringar?

  1. Ökad flexibilitet: SpcsGPT kan nu enkelt distribuera den senaste versionen av AiA, eller välja en specifik version vid behov.

  2. Automatisering: Processen för att uppdatera SpcsGPT med den senaste AiA-versionen är nu helt automatiserad, vilket minskar risken för mänskliga fel.

  3. Bättre kontroll: Vi har fortfarande möjlighet att manuellt trigga deployments i SpcsGPT när det behövs, t.ex. för att testa en specifik version.

Processöversikt

Här är en visualisering av den nya processen:

sequenceDiagram
    participant A as AiA Repository
    participant GH as GitHub
    participant S as SpcsGPT Repository
    participant Azure as Azure Function App

    A->>A: Push to main branch
    A->>GH: Create Release
    A->>S: Trigger workflow
    S->>GH: Fetch latest AiA artifact
    S->>S: Apply SpcsGPT config
    S->>Azure: Deploy to Function App
Loading
name: Deploy AiA Artifact
on:
repository_dispatch:
types: [deploy-artifact]
workflow_dispatch:
inputs:
version:
description: 'Version to deploy (leave empty for latest)'
required: false
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Get latest AiA version
if: github.event.inputs.version == ''
id: get_version
uses: actions/github-script@v6
with:
github-token: ${{secrets.WORKFLOW_DISPATCH_TOKEN}}
result-encoding: string
script: |
const { data: releases } = await github.rest.repos.listReleases({
owner: 'your-org',
repo: 'AiA',
});
if (releases.length === 0) {
throw new Error('No releases found');
}
return releases[0].tag_name;
- name: Set version
id: set_version
run: |
if [ -n "${{ github.event.inputs.version }}" ]; then
echo "VERSION=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
else
echo "VERSION=${{ steps.get_version.outputs.result }}" >> $GITHUB_OUTPUT
fi
- name: Download artifact
uses: actions/github-script@v6
with:
github-token: ${{secrets.WORKFLOW_DISPATCH_TOKEN}}
script: |
const fs = require('fs')
const { data: assets } = await github.rest.repos.listReleaseAssets({
owner: 'your-org',
repo: 'AiA',
release_id: '${{ steps.set_version.outputs.VERSION }}',
});
const artifact = assets.find(asset => asset.name === 'function.zip');
if (!artifact) {
throw new Error('Artifact not found');
}
const download = await github.rest.repos.getReleaseAsset({
owner: 'your-org',
repo: 'AiA',
asset_id: artifact.id,
headers: {
'Accept': 'application/octet-stream'
}
});
fs.writeFileSync('${{github.workspace}}/function.zip', Buffer.from(download.data));
- name: Deploy to Azure Function App
uses: Azure/functions-action@v1
with:
app-name: ${{ secrets.AZURE_FUNCTIONAPP_NAME }}
package: ${{github.workspace}}/function.zip
publish-profile: ${{ secrets.AZURE_FUNCTIONAPP_PUBLISH_PROFILE }}
name: package-function
on:
workflow_dispatch:
pull_request:
branches: ["main"]
paths:
- "AiAssistantIndexUpdater/**"
workflow_call:
inputs:
VERSION:
required: true
type: string
outputs:
artifact:
description: "The name of the uploaded function artifact."
value: ${{jobs.build-pkg.outputs.artifact}}
permissions:
contents: read
jobs:
build-pkg:
strategy:
fail-fast: false
runs-on: windows-latest
env:
NUGET_CERT_REVOCATION_MODE: offline
outputs:
artifact: ${{steps.artifactoutput.outputs.artifactname}}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Package Function
run: |
$versionTag = "${{inputs.VERSION}}"
if (-not $versionTag) {
$versionTag = "1.0.0"
}
.github/scripts/package-function.ps1 -Configuration Release -DotnetFramework net8.0 -TargetRuntime win-x64 -OutputDirectory ${{github.workspace}}/.github -Version $versionTag -InformationalVersion "${{inputs.VERSION}}"
- name: Upload package to artifacts
uses: actions/upload-artifact@v4
with:
name: function-${{inputs.VERSION}}
path: ${{github.workspace}}/.github/pkg/function.zip
- name: "Set outputs"
id: artifactoutput
run: Write-Output "artifactname=function-${{inputs.VERSION}}" >> $env:GITHUB_OUTPUT
name: Release and Trigger SpcsGPT Deployment
on:
push:
branches: [ main ]
jobs:
package:
uses: ./.github/workflows/package-function.yml
with:
VERSION: ${{ github.run_number }}
release:
needs: package
runs-on: ubuntu-latest
steps:
- name: Download artifact
uses: actions/download-artifact@v4
with:
name: ${{ needs.package.outputs.artifact }}
- name: Create Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: v${{ github.run_number }}
release_name: Release v${{ github.run_number }}
draft: false
prerelease: false
- name: 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: ./function.zip
asset_name: function.zip
asset_content_type: application/zip
- name: Trigger SpcsGPT Workflow
uses: peter-evans/repository-dispatch@v2
with:
token: ${{ secrets.WORKFLOW_DISPATCH_TOKEN }}
repository: your-org/SpcsGPT
event-type: deploy-artifact
client-payload: '{"version": "v${{ github.run_number }}"}'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment