Skip to content

Commit 1b9314e

Browse files
Adding dotnet simple web (#1)
* simple version of web app * fixing env * fixing azuresub * adding simple dotnet build * adding sample web simple * adding build job name * adding deployment job name
1 parent 25ba31b commit 1b9314e

File tree

3 files changed

+260
-0
lines changed

3 files changed

+260
-0
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
name: 1.0$(rev:.r)
2+
3+
trigger:
4+
- main
5+
6+
resources:
7+
repositories:
8+
- repository: templates
9+
type: github
10+
name: joshjohanning/pipeline-templates
11+
endpoint: joshjohanning
12+
ref: refs/heads/simple-web
13+
14+
stages:
15+
- stage: 'Build'
16+
variables:
17+
wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot'
18+
dotnetSdkVersion: '3.1.300'
19+
buildConfiguration: 'Release'
20+
jobs:
21+
- template: dotnet-core-web/dotnet-core-build-simple-web-app.yml@templates
22+
parameters:
23+
buildConfiguration: '${{ variables.buildConfiguration }}'
24+
nugetFeed: ''
25+
name: 'Tailspin.SpaceGame.Web'
26+
projectFile: '**/Tailspin.SpaceGame.Web.csproj'
27+
repo: 'self'
28+
runSonarQube: 'false'
29+
sonarProjectKey: '*'
30+
sonarProjectName: 'Tailspin.SpaceGame.Web'
31+
runDotNetCoreTests: 'true'
32+
vmImage: 'ubuntu-latest'
33+
34+
- stage: deployDev
35+
displayName: Deploy to Dev
36+
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
37+
variables:
38+
- name: azureSubscription
39+
value: demo-mslearn-tailspin-azure
40+
- group: tailspin.DEV
41+
jobs:
42+
- template: dotnet-core-web/dotnet-core-deploy-simple-web-app.yml@templates
43+
parameters:
44+
name: 'Tailspin.SpaceGame.Web'
45+
runDeploy: true
46+
environment:
47+
name: 'dev'
48+
vmImage: 'ubuntu-latest'
49+
replaceTokensTargetFiles: |
50+
**/appsettings.tokenize.json => appsettings.json
51+
**/connectionstrings.tokenize.json => connectionstrings.json
52+
appSettingsEdits: '-ASPNETCORE_ENVIRONMENT Development'
53+
jsonVariableSubstituion: 'appsettings.json'
54+
azureSubscription: '${{ variables.azureSubscription }}'
55+
websiteName: 'app-tailspin-DEV'
56+
resourceGroupName: 'rg-tailspin-terraform-DEV'
57+
slotName: 'swap'
58+
59+
- stage: deployProd
60+
displayName: Deploy to Prod
61+
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
62+
variables:
63+
- name: azureSubscription
64+
value: demo-mslearn-tailspin-azure
65+
- group: tailspin.PROD
66+
jobs:
67+
- template: dotnet-core-web/dotnet-core-deploy-simple-web-app.yml@templates
68+
parameters:
69+
name: 'Tailspin.SpaceGame.Web'
70+
runDeploy: true
71+
environment:
72+
name: 'prod'
73+
vmImage: 'ubuntu-latest'
74+
replaceTokensTargetFiles: |
75+
**/appsettings.tokenize.json => appsettings.json
76+
**/connectionstrings.tokenize.json => connectionstrings.json
77+
appSettingsEdits: '-ASPNETCORE_ENVIRONMENT Production'
78+
jsonVariableSubstituion: 'appsettings.json'
79+
azureSubscription: '${{ variables.azureSubscription }}'
80+
websiteName: 'app-tailspin-PROD'
81+
resourceGroupName: 'rg-tailspin-terraform-PROD'
82+
slotName: 'swap'
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
parameters:
2+
buildConfiguration: 'Release'
3+
nugetFeed: ''
4+
name: 'Tailspin.SpaceGame.Web'
5+
vmImage: 'ubuntu-latest'
6+
projectFile: '**/Tailspin.SpaceGame.Web.csproj'
7+
runDotNetCoreTests: true
8+
9+
jobs:
10+
11+
- job: build
12+
displayName: build ${{ parameters.name }}
13+
variables:
14+
# Use the latest reportgenerator for code coverage
15+
disable.coverage.autogenerate: 'true'
16+
pool:
17+
vmImage: '${{ parameters.vmImage }}'
18+
19+
steps:
20+
21+
- checkout: self
22+
23+
# - task: VersionAssemblies@2
24+
# inputs:
25+
# sourcePath: '$(Build.SourcesDirectory)'
26+
# filePattern: '**/AssemblyInfo.*'
27+
# versionSource: 'buildNumber'
28+
# versionFormat: 'fourParts'
29+
# replaceVersionFormat: 'fourParts'
30+
31+
- task: DotNetCoreCLI@2
32+
displayName: 'dotnet restore'
33+
inputs:
34+
command: 'restore'
35+
projects: '${{ parameters.projectFile }}'
36+
vstsFeed: '${{ parameters.nugetFeed }}'
37+
38+
- task: DotNetCoreCLI@2
39+
displayName: 'dotnet build'
40+
inputs:
41+
command: 'build'
42+
projects: '${{ parameters.projectFile }}'
43+
arguments: '--configuration ${{ parameters.buildConfiguration }} /p:Version=$(build.buildnumber)'
44+
45+
- ${{ if eq(parameters.runDotNetCoreTests, 'true') }}:
46+
# Run tests - ensure `coverlet.msbuild` nuget package is added on each test project for code coverage
47+
# This should run on windows+ubuntu
48+
# If only cared about windows and were okay with downloading a .coverage file instead of inline results, remove the /p: arguments and just used '--collect "Code coverage"'
49+
# Sept 22 20: updated code coverage to be less flaky - old: /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura' . See: https://github.com/coverlet-coverage/coverlet/blob/master/Documentation/KnownIssues.md#1-vstest-stops-process-execution-earlydotnet-test
50+
# With new version, we are using 'coverlet.collector' NuGet package instead
51+
- task: DotNetCoreCLI@2
52+
displayName: 'dotnet test'
53+
inputs:
54+
command: test
55+
projects: '**/*[Tt]ests/*.csproj'
56+
publishTestResults: true
57+
arguments: '--collect:"XPlat Code Coverage"'
58+
59+
# Run the report generator for just the app
60+
- task: reportgenerator@4
61+
inputs:
62+
reports: '$(Build.SourcesDirectory)/**/coverage.cobertura.xml;$(Pipeline.Workspace)/**/Cobertura.xml;$(Agent.WorkFolder)/**/coverage.cobertura.xml'
63+
targetdir: '$(Build.ArtifactStagingDirectory)/CoverageResults'
64+
#
65+
66+
# Download all CoverageResults for all pipeline jobs
67+
- download: 'current'
68+
patterns: '**/CoverageResults/**'
69+
70+
- task: reportgenerator@4
71+
inputs:
72+
reports: '$(Build.SourcesDirectory)/**/coverage.cobertura.xml;$(Pipeline.Workspace)/**/Cobertura.xml;$(Agent.WorkFolder)/**/coverage.cobertura.xml'
73+
targetdir: '$(Pipeline.Workspace)/CoverageResults'
74+
75+
- task: PublishCodeCoverageResults@1
76+
displayName: 'Publish code coverage report'
77+
inputs:
78+
codeCoverageTool: 'Cobertura'
79+
summaryFileLocation: '$(Pipeline.Workspace)/CoverageResults/Cobertura.xml'
80+
reportDirectory: '$(Pipeline.Workspace)/CoverageResults'
81+
82+
- task: reportgenerator@4
83+
displayName: 'Converting coverage file to sonarqube format'
84+
inputs:
85+
reports: '$(Build.SourcesDirectory)/**/coverage.cobertura.xml;$(Pipeline.Workspace)/**/Cobertura.xml;$(Agent.WorkFolder)/**/coverage.cobertura.xml'
86+
targetdir: '$(Agent.TempDirectory)'
87+
reporttypes: 'SonarQube'
88+
89+
- task: DotNetCoreCLI@2
90+
displayName: 'dotnet publish'
91+
inputs:
92+
command: 'publish'
93+
publishWebProjects: false
94+
projects: '${{ parameters.projectFile }}'
95+
zipAfterPublish: true
96+
arguments: '--configuration ${{ parameters.buildConfiguration }} --output $(build.artifactstagingdirectory) /p:Version=$(build.buildnumber)'
97+
98+
- publish: '$(Build.ArtifactStagingDirectory)'
99+
artifact: ${{ parameters.name }}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
parameters:
2+
environment: 'Dev'
3+
vmImage: 'ubuntu-latest'
4+
name: 'Tailspin.SpaceGame.Web'
5+
runDeploy: true
6+
replaceTokensTargetFiles: ''
7+
appSettingsEdits: '-ASPNETCORE_ENVIRONMENT Development'
8+
jsonVariableSubstituion: 'appsettings.json'
9+
azureSubscription: ''
10+
websiteName: 'app-tailspin-DEV'
11+
resourceGroupName: 'rg-tailspin-terraform-DEV'
12+
slotName: 'swap'
13+
14+
jobs:
15+
16+
- deployment: web
17+
displayName: deploy ${{ parameters.name }}
18+
pool:
19+
vmImage: '${{ parameters.vmImage }}'
20+
21+
environment: '${{ parameters.environment }}'
22+
23+
strategy:
24+
runOnce:
25+
deploy:
26+
steps:
27+
# saves time only downloading the artifact needed
28+
- download: current
29+
artifact: ${{ parameters.name }}
30+
31+
- task: ExtractFiles@1
32+
displayName: 'Extract files'
33+
inputs:
34+
archiveFilePatterns: '$(pipeline.workspace)/**/${{ parameters.name }}.zip'
35+
destinationFolder: '$(Pipeline.Workspace)/${{ parameters.name }}/deploy'
36+
37+
- task: qetza.replacetokens.replacetokens-task.replacetokens@3
38+
displayName: 'Replace tokens'
39+
inputs:
40+
rootDirectory: '$(pipeline.workspace)'
41+
targetFiles: '${{ parameters.replaceTokensTargetFiles }}'
42+
escapeType: none
43+
verbosity: detailed
44+
45+
- task: AzureRmWebAppDeployment@4
46+
displayName: 'Deploy Azure App Service'
47+
name: webAppDeployment
48+
condition: and(succeeded(), eq('${{ parameters.runDeploy }}', true))
49+
inputs:
50+
azureSubscription: '${{ parameters.azureSubscription }}'
51+
appType: 'webApp' # could make this a parameter if 'webAppLinux' was ever needed to be used
52+
WebAppName: '${{ parameters.websiteName }}'
53+
deployToSlotOrASE: true
54+
ResourceGroupName: '${{ parameters.resourceGroupName }}'
55+
SlotName: '${{ parameters.slotName }}'
56+
packageForLinux: '$(Pipeline.Workspace)/${{ parameters.name }}/deploy'
57+
AppSettings: '${{ parameters.appSettingsEdits }}'
58+
JSONFiles: '${{ parameters.jsonVariableSubstituion }}'
59+
60+
- task: AzureAppServiceManage@0
61+
inputs:
62+
azureSubscription: '${{ parameters.azureSubscription }}'
63+
Action: 'Swap Slots'
64+
WebAppName: '${{ parameters.websiteName }}'
65+
ResourceGroupName: '${{ parameters.resourceGroupName }}'
66+
SourceSlot: '${{ parameters.slotName }}'
67+
swapWithProduction: true
68+
69+
- task: AzureCLI@2
70+
displayName: 'Output WebApp URL'
71+
inputs:
72+
azureSubscription: '${{ parameters.azureSubscription }}'
73+
scriptType: 'pscore'
74+
scriptLocation: 'inlineScript'
75+
inlineScript: |
76+
$webApp = az webapp show --name ${{ parameters.websiteName }} --resource-group ${{ parameters.resourceGroupName }} | ConvertFrom-Json
77+
write-host $webApp.defaultHostName -ForegroundColor "green"
78+
79+
# az webapp show --name app-tailspin-DEV --resource-group rg-tailspin-terraform-DEV --query defaultHostName

0 commit comments

Comments
 (0)