Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions .github/workflows/IaC.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
name: Provision Azure Resources
# We only want to run this script manually.
on:
workflow_dispatch:
inputs:
# We can add inputs to the workflow_dispatch event. This allows us to
# accept user input when running the workflow manually. In this case, we
# have a dropdown that allows us to select the target environment.

targetEnv:
description: 'Target environment'
type: 'choice'
required: true
default: 'dev'
options:
- 'dev'
- 'test'
- 'prod'

# Environment variables are defined in an "env" section.
# We set the target environment to dev.
# Open the deploy-advanced.yml file to see how we can accept user input
# instead of needing to change this file to switch environments.
env:
targetEnv2: dev


jobs:
# This script has one job: build and deploy the IaC resources
build-and-deploy:
# We run this on an Ubuntu-based GitHub hosted runner. This hosted runner
# has certain software already installed, including az cli
runs-on: ubuntu-latest
permissions:
contents: read
pages: write
id-token: write
steps:
# Check out the code. This grabs code from the repository and
# makes it available to the GitHub hosted runner. It will usually be the
# first task for any workflow
- uses: actions/checkout@main

# Log into Azure using a federated credential. We have already set up the
# federation process in a prior step, so we need to pass in the following:
# Client ID = Application registration ID
# Tenant ID = Application owner organization ID (previously called Tenant ID in Azure)
# Subscription ID
# https://github.com/azure/login
- uses: azure/[email protected]
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
# We also need to ensure that enable-AzPSSession is true. This is important for
# using OIDC in Azure. If we were to pass in a client secret instead, we would not need
# this setting enabled
enable-AzPSSession: true

# Deploy ARM template
- name: Run ARM deploy
# https://github.com/azure/arm-deploy
uses: azure/arm-deploy@v1
with:
subscriptionId: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
resourceGroupName: ${{ secrets.AZURE_RG }}
template: ./src/InfrastructureAsCode/main.bicep
parameters: environment=${{ github.event.inputs.targetenv }}
123 changes: 123 additions & 0 deletions .github/workflows/ci-cd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
name: .NET CI-CD

env:
registryName: ${{ secrets.CONTAINER_REGISTRY_NAME }}.azurecr.io
repositoryName: techexcel/dotnetcoreapp
dockerFolderPath: ./src/Application/src/RazorPagesTestSample
tag: ${{github.run_number}}

on:
push:
branches: [ main ]
paths: src/Application/**
pull_request:
branches: [ main ]
paths: src/Application/**
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
jobs:
build:

runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: 8.0

- name: Restore dependencies
run: dotnet restore ./src/Application/src/RazorPagesTestSample/RazorPagesTestSample.csproj
- name: Build
run: dotnet build --no-restore ./src/Application/src/RazorPagesTestSample/RazorPagesTestSample.csproj
- name: Test
run: dotnet test --no-build --verbosity normal ./src/Application/tests/RazorPagesTestSample.Tests/RazorPagesTestSample.Tests.csproj
- uses: actions/github-script@v6
if: failure()
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
let body = "${{ env.build_name }} Workflow Failure \n Build Number: ${{ github.run_number }} \n Build Log: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} \n SHA: [${{ github.sha }}](https://github.com/${{ github.repository }}/commit/${{ github.sha }}) \n";
github.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: "${{ env.build_name }} Workflow ${{ github.run_number }} Failed! ",
body: body
});

dockerBuildPush:
runs-on: ubuntu-latest
needs: build

steps:
- uses: actions/checkout@v3

- name: Docker Login
# You may pin to the exact commit or the version.
# uses: docker/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c
uses: docker/[email protected]
with:
# Server address of Docker registry. If not set then will default to Docker Hub
registry: ${{ secrets.ACR_LOGIN_SERVER }}
# Username used to log against the Docker registry
username: ${{ secrets.ACR_USERNAME }}
# Password or personal access token used to log against the Docker registry
password: ${{ secrets.ACR_PASSWORD }}
# Log out from the Docker registry at the end of a job
logout: true

- name: Docker Build
run: docker build -t $registryName/$repositoryName:$tag --build-arg build_version=$tag $dockerFolderPath

- name: Docker Push
run: docker push $registryName/$repositoryName:$tag

deploy:
needs: dockerBuildPush
uses: ./.github/workflows/reusable-cd.yml
with:
environment: dev
secrets: inherit

# deploy-to-test:

# runs-on: ubuntu-latest
# needs: deploy-to-dev
# environment:
# name: test
# url: https://{your_prefix}-test.azurewebsites.net/

# steps:
# - uses: actions/checkout@v3

# - name: 'Login via Azure CLI'
# uses: azure/[email protected]
# with:
# creds: ${{ secrets.AZURE_CREDENTIALS }}

# - uses: azure/webapps-deploy@v2
# with:
# app-name: '{your_prefix}-test'
# images: {your_registry_name}.azurecr.io/techexcel/dotnetcoreapp:${{github.run_number}}

# deploy-to-prod:

# runs-on: ubuntu-latest
# needs: deploy-to-test
# environment:
# name: prod
# url: https://{your_prefix}-prod.azurewebsites.net/

# steps:
# - uses: actions/checkout@v3

# - name: 'Login via Azure CLI'
# uses: azure/[email protected]
# with:
# creds: ${{ secrets.AZURE_CREDENTIALS }}

# - uses: azure/webapps-deploy@v2
# with:
# app-name: '{your_prefix}-prod'
# images: {your_registry_name}.azurecr.io/techexcel/dotnetcoreapp:${{github.run_number}}
58 changes: 58 additions & 0 deletions .github/workflows/first-worklow.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# The name of the job is what will display on the GitHub repository in the Actions tab.
name: First Workflow

# The 'on' section tells GitHub under what conditions we want to run this workflow.
# https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows
# Common scenarios include:
# workflow-dispatch (manual execution)
# issues
# push
# pull_request
# schedule
on:
workflow_dispatch:
issues:
types: [opened]
env:
VARIABLE_NAME: 'test123'
# This section covers the work to perform.
# We include one or more jobs in this section.
jobs:
# Each individual job will include details like execution order,
# pre-requisite jobs, and execution platform.
job1:
# We can run jobs on GitHub hosted VM runners in Windows, Ubuntu, and Mac OS.
# We can also run jobs on self-hosted hardware.
runs-on: ubuntu-latest

# Each job contains one or more steps. A step needs to have at least a name and a command.
steps:
- name: Step one
# The 'run' command executes a shell or command script. Because this is Ubuntu, the
# default run command will be /bin/bash
run: |
echo "Log from step one"
echo "env variable: $VARIABLE_NAME"
# This section does not appear in the solution file but demonstrates how to set
# custom variables that will be available in the run script.

- name: Step two
run: echo "Log from step two"

job2:
# Job 2 will only run after job 1 completes.
# Removing this 'needs' section would make the jobs run simultaneously.
needs: job1
runs-on: ubuntu-latest

steps:
- name: Cowsays
# The 'uses' command executes a remote GitHub action.
# A command like mscoutermarsh/cowsays-action means you can
# find this code at https://github.com/mscoutermarsh/cowsays-action
uses: mscoutermarsh/cowsays-action@master
# The 'with' block includes parameters that the workflow will pass
# to this action. Parameters are all in key-value format.
with:
text: 'Ready for prod--ship it! and use env var: ${{ env.VARIABLE_NAME }}'
color: 'magenta'
2 changes: 1 addition & 1 deletion .github/workflows/pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ name: Deploy Jekyll site to Pages

on:
push:
branches: ["main"]
branches: ["feature"]

# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
Expand Down
40 changes: 40 additions & 0 deletions .github/workflows/reusable-cd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: .NET CD Workflow

on:
workflow_call:
inputs:
environment:
description: 'Environment'
required: true
default: 'dev'
type: string

jobs:
deploy:
runs-on: ubuntu-latest
permissions:
contents: read
pages: write
id-token: write
environment:
name: ${{ inputs.environment }}
url: "https://techexcel-${{ inputs.environment }}.azurewebsites.net/"
steps:
- uses: azure/[email protected]
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
# We also need to ensure that enable-AzPSSession is true. This is important for
# using OIDC in Azure. If we were to pass in a client secret instead, we would not need
# this setting enabled
enable-AzPSSession: true

- uses: azure/webapps-deploy@v2
with:
app-name: 'ghwxvgb4jngfa-${{ inputs.environment }}'
images: ${{ secrets.ACR_LOGIN_SERVER }}/techexcel/dotnetcoreapp:${{ github.run_number }}




1 change: 1 addition & 0 deletions CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* puneet-minhas
9 changes: 8 additions & 1 deletion src/Application/src/RazorPagesTestSample/Data/Message.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,16 @@ public class Message
{
public int Id { get; set; }

/// <summary>
/// Gets or sets the text of the message.
/// </summary>
/// <remarks>
/// This property is required and should contain text data.
/// The maximum length of the text is 250 characters.
/// </remarks>
[Required]
[DataType(DataType.Text)]
[StringLength(200, ErrorMessage = "There's a 200 character limit on messages. Please shorten your message.")]
[StringLength(250, ErrorMessage = "There's a 250 character limit on messages. Please shorten your message.")]
public string Text { get; set; }
}
#endregion
Expand Down
18 changes: 18 additions & 0 deletions src/Application/src/RazorPagesTestSample/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build-env /app/out .
# Default ASP.NET port changed with .NET 8.0
ENV ASPNETCORE_HTTP_PORTS=80
ENTRYPOINT ["dotnet", "RazorPagesTestSample.dll"]
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
@page
@model IndexModel
@{
ViewData["Title"] = "Munson's Pickles and Preserves Team Messaging System";
ViewData["Title"] = "Munson's Pickles and Preserves Team Messaging System!!";
}

<h1>@ViewData["Title"]</h1>
Expand Down
Loading