diff --git a/Instructions/advanced/01-enhance-workload-traffic-manager-test-azure-chaos-studio.md b/Instructions/advanced/01-enhance-workload-traffic-manager-test-azure-chaos-studio.md index 20823da..6ae3ec0 100644 --- a/Instructions/advanced/01-enhance-workload-traffic-manager-test-azure-chaos-studio.md +++ b/Instructions/advanced/01-enhance-workload-traffic-manager-test-azure-chaos-studio.md @@ -78,7 +78,7 @@ The exercise consists of the following tasks: cd eShopOnWeb ``` -1. Run the following commands to create the resource group and deploy the web app to East US: +1. Run the following commands to create the resource group and deploy the web app to East US, replacing `XXXX` with any combination of letters and numbers, as the webAppName must be globally unique: ```bash # Create resource group for East US @@ -88,16 +88,16 @@ The exercise consists of the following tasks: az deployment group create \ --resource-group rg-eshoponweb-eastus \ --template-file infra/webapp.bicep \ - --parameters webAppName=eshoponweb-eastus-$(uuidgen)-$(date +%s) \ - sku=F1 \ - linuxFxVersion="DOTNETCORE|8.0" + --parameters webAppName=eshoponweb-eastus-XXXX sku=S1 ``` 1. Wait for the deployment to complete. This might take a few minutes. +>**Note**: If you receive an `The content for this response was already consumed` error, you might not have sufficient quota in the specified location, so you need to create the resources in a different region. + ### Deploy the web app to West US -1. Run the following commands to deploy the web app to West US: +1. Run the following commands to deploy the web app to West US, replacing `XXXX` with any combination of letters and numbers, as the webAppName must be globally unique: ```bash # Create resource group for West US @@ -107,9 +107,7 @@ The exercise consists of the following tasks: az deployment group create \ --resource-group rg-eshoponweb-westus \ --template-file infra/webapp.bicep \ - --parameters webAppName=eshoponweb-westus-$(date +%s%N) \ - sku=F1 \ - linuxFxVersion="DOTNETCORE|8.0" + --parameters webAppName=eshoponweb-westus-XXXX sku=S1 ``` 1. Wait for the deployment to complete. This might take a few minutes. @@ -248,7 +246,7 @@ The exercise consists of the following tasks: 1. On the **Basics** tab of the **Create an experiment** page, perform the following actions: - Verify that your Azure subscription appears in the **Subscription** drop-down list. - - Select the **Create new** link below the **Resource Group** drop-down list, in the **Name** text box, enter **`rg-devops-foundations`**, and then select **OK**. + - Select **`rg-devops-foundations`** in the **Resource Group** drop-down list. - In the **Experiment details** section, in the **Name** text box, enter **`DevOps_Foundations_Labs_Experiment_01`**. - In the **Region** drop-down list, select the **West US** Azure region. diff --git a/Instructions/advanced/02-implement-self-service-infrastructure-bicep.md b/Instructions/advanced/02-implement-self-service-infrastructure-bicep.md index d15fd9d..5f52e12 100644 --- a/Instructions/advanced/02-implement-self-service-infrastructure-bicep.md +++ b/Instructions/advanced/02-implement-self-service-infrastructure-bicep.md @@ -17,7 +17,7 @@ You will learn how to: - Enforce governance using tags and Azure policies - Implement automated scaling with Bicep -This lab takes approximately **20** minutes to complete. +This lab takes approximately **30** minutes to complete. ## Before you start @@ -377,7 +377,7 @@ In a self-service infrastructure environment, it is essential to enforce governa ```bash cat > test-policy-compliant.bicep << EOF param location string = 'eastus' - param storageAccountName string = 'testcompliant\${uniqueString(resourceGroup().id)}' + param storageAccountName string = 'testcomp\${uniqueString(resourceGroup().id)}' resource testStorage 'Microsoft.Storage/storageAccounts@2023-01-01' = { name: storageAccountName diff --git a/Instructions/advanced/03-configure-pipelines-code-yaml.md b/Instructions/advanced/03-configure-pipelines-code-yaml.md index fe8b282..ed30499 100644 --- a/Instructions/advanced/03-configure-pipelines-code-yaml.md +++ b/Instructions/advanced/03-configure-pipelines-code-yaml.md @@ -28,10 +28,10 @@ You need: First, you'll create an Azure DevOps project for this lab. 1. In your browser, open your Azure DevOps organization -2. Click **New Project** +2. Select **New Project** 3. Give your project the name **eShopOnWeb_MultiStageYAML** 4. Leave other fields with defaults -5. Click **Create** +5. Select **Create** ![Screenshot of the create new project panel](media/create-project.png) @@ -40,11 +40,11 @@ First, you'll create an Azure DevOps project for this lab. Next, you'll import the sample repository that contains the application code. 1. In your Azure DevOps organization, open the **eShopOnWeb_MultiStageYAML** project -2. Click **Repos > Files** -3. Click **Import a Repository** +2. Select **Repos > Files** +3. Select **Import a Repository** 4. Select **Import** 5. In the **Import a Git Repository** window, paste this URL: `https://github.com/MicrosoftLearning/eShopOnWeb.git` -6. Click **Import** +6. Select **Import** ![Screenshot of the import repository panel](media/import-repo.png) @@ -57,8 +57,8 @@ The repository is organized this way: - **src** folder contains the .NET 8 website used in the lab scenarios 7. Go to **Repos > Branches** -8. Hover on the **main** branch then click the ellipsis on the right -9. Click **Set as default branch** +8. Hover on the **main** branch then select the ellipsis on the right +9. Select **Set as default branch** > **Note**: If the main branch is already the default branch, this option will be grayed out. Continue with the instructions. @@ -68,10 +68,10 @@ You'll create an Azure web app to deploy your application to. 1. From your lab computer, navigate to the [Azure Portal](https://portal.azure.com) 2. Sign in with the user account that has the Owner role in your Azure subscription -3. In the Azure portal toolbar, click the **Cloud Shell** icon (to the right of the search box) +3. In the Azure portal toolbar, select the **Cloud Shell** icon (to the right of the search box) 4. If prompted to select either **Bash** or **PowerShell**, select **Bash** -> **Note**: If this is your first time starting Cloud Shell and you see the "Getting started" pop-up, select "No storage account required" and your subscription, then click "Apply". +> **Note**: If this is your first time starting Cloud Shell and you see the "Getting started" pop-up, select "No storage account required" and your subscription, then select "Apply". 5. From the Bash prompt, run these commands to create a resource group (replace `` with your preferred Azure region like 'centralus', 'westeurope'): @@ -108,15 +108,15 @@ Now you'll configure CI/CD pipelines using YAML definitions. ### Add a YAML build definition 1. Navigate to the **Pipelines** section in Azure DevOps -2. In the **Create your first Pipeline** window, click **Create pipeline** -3. On the **Where is your code?** pane, click **Azure Repos Git (YAML)** -4. On the **Select a repository** pane, click **eShopOnWeb_MultiStageYAML** +2. In the **Create your first Pipeline** window, select **Create pipeline** +3. On the **Where is your code?** pane, select **Azure Repos Git (YAML)** +4. On the **Select a repository** pane, select **eShopOnWeb_MultiStageYAML** 5. On the **Configure your pipeline** pane, scroll down and select **Existing Azure Pipelines YAML File** 6. In the **Selecting an existing YAML File** blade, specify: - Branch: **main** - Path: **.ado/eshoponweb-ci.yml** -7. Click **Continue** to save these settings -8. From the **Review your Pipeline YAML** screen, click **Run** to start the Build Pipeline +7. Select **Continue** to save these settings +8. From the **Review your Pipeline YAML** screen, select **Run** to start the Build Pipeline 9. Wait for the Build Pipeline to complete successfully > **Note**: Each task from the YAML file is available for review, including any warnings and errors. @@ -125,8 +125,8 @@ Now you'll configure CI/CD pipelines using YAML definitions. Now you'll add continuous delivery to enable automatic deployment. -1. On the pipeline run pane, click the ellipsis symbol (⋯) in the upper right corner -2. In the dropdown menu, click **Edit pipeline** +1. On the pipeline run pane, select the ellipsis symbol (⋯) in the upper right corner +2. In the dropdown menu, select **Edit pipeline** 3. Navigate to the end of the file (line 56) and press **Enter** to add a new empty line 4. On line **57**, add this content to define the **Release** stage: @@ -142,8 +142,8 @@ Now you'll add continuous delivery to enable automatic deployment. 5. Set the cursor on a new line at the end of the YAML definition 6. In the list of tasks on the right side, search for and select **Azure App Service Deploy** -7. In the **Azure App Service deploy** pane, specify these settings and click **Add**: - - **Azure subscription**: Select your Azure subscription, click **Authorize**, and authenticate when prompted +7. In the **Azure App Service deploy** pane, specify these settings and select **Add**: + - **Azure subscription**: Select your Azure subscription, select **Authorize**, and authenticate when prompted - **App Service name**: Select the web app you deployed earlier - **Package or folder**: Update to `$(Build.ArtifactStagingDirectory)/**/Web.zip` - Open **Application and Configuration Settings** and in **App settings** add: `-UseOnlyInMemoryDatabase true -ASPNETCORE_ENVIRONMENT Development` @@ -172,7 +172,7 @@ The added code should look similar to this: - Download Type: **Specific Artifact** - Artifact Name: **Website** - Destination Directory: **$(Build.ArtifactStagingDirectory)** -12. Click **Add** +12. Select **Add** The added code should look like this: @@ -186,23 +186,23 @@ The added code should look like this: ``` 13. If the YAML indentation is off, press **Tab** twice to indent it properly -14. Click **Validate and save**, then click **Save** again to commit the change to the main branch +14. Select **Validate and save**, then select **Save** again to commit the change to the main branch 15. Navigate to **Pipelines** and select **Pipelines** again -16. Open the **eShopOnWeb_MultiStageYAML** Pipeline and click **Run pipeline** +16. Open the **eShopOnWeb_MultiStageYAML** Pipeline and select **Run pipeline** 17. Confirm the **Run** from the appearing pane 18. Notice the 2 different stages: **Build .Net Core Solution** and **Deploy to Azure Web App** 19. Wait for the pipeline to complete the Build Stage successfully 20. When the Deploy Stage wants to start, you'll see a **Permissions Needed** prompt -21. Click **View** -22. From the **Waiting for Review** pane, click **Permit** -23. Validate the message and confirm by clicking **Permit** +21. Select **View** +22. From the **Waiting for Review** pane, select **Permit** +23. Validate the message and confirm by selecting **Permit** 24. Wait for the Deploy Stage to complete successfully ### Review the deployed site 1. Switch back to the Azure portal and navigate to your Azure web app -2. On the Azure web app blade, click **Overview** -3. On the overview blade, click **Browse** to open your site in a new browser tab +2. On the Azure web app blade, select **Overview** +3. On the overview blade, select **Browse** to open your site in a new browser tab 4. Verify that the deployed site loads as expected, showing the eShopOnWeb E-commerce website ## Configure Environment settings for approvals @@ -213,19 +213,19 @@ YAML Pipelines don't have Release/Quality Gates like Classic Release Pipelines, 1. From your Azure DevOps Project **eShopOnWeb_MultiStageYAML**, navigate to **Pipelines** 2. Under the Pipelines menu on the left, select **Environments** -3. Click **Create Environment** +3. Select **Create Environment** 4. In the **New Environment** pane, add the name **approvals** 5. Under **Resources**, select **None** -6. Click **Create** +6. Select **Create** 7. Once the environment is created, select the **Approvals and Checks** tab 8. From **Add your first check**, select **Approvals** 9. Add your Azure DevOps User Account Name to the **approvers** field -10. Click **Create** +10. Select **Create** ### Update the YAML pipeline for approvals 1. Navigate to **Repos**, browse to the **.ado** folder, and select the **eshoponweb-ci.yml** file -2. Click the **Edit** button to switch to editing mode +2. Select the **Edit** button to switch to editing mode 3. Navigate to the start of the **Deploy job** (Line 60: `- job: Deploy`) 4. Add a new empty line right below and add: @@ -274,13 +274,13 @@ The resulting YAML should look like this: AppSettings: "-UseOnlyInMemoryDatabase true -ASPNETCORE_ENVIRONMENT Development" ``` -8. Click **Commit** and **Commit** again to save the changes +8. Select **Commit** and **Commit** again to save the changes 9. Navigate to **Pipelines > Pipelines** and open the **EshopOnWeb_MultiStageYAML** Pipeline -10. Click **Run Pipeline** to trigger a new run +10. Select **Run Pipeline** to trigger a new run 11. The Build Stage will complete as before 12. For the Deploy Stage, you'll see **Waiting (1 check in progress)** and a message about needing approval -13. Click the **Review** button -14. From the **Waiting for review** pane, click **Approve** +13. Select the **Review** button +14. From the **Waiting for review** pane, select **Approve** 15. This allows the Deploy Stage to proceed and successfully deploy to the Azure Web App > **Note**: While this example only used approvals, other checks such as Azure Monitor, REST API, etc., can be used in a similar way. @@ -290,9 +290,9 @@ The resulting YAML should look like this: Remember to delete the resources created in the Azure portal to avoid unnecessary charges: 1. In the Azure portal, navigate to the **az400m03l07-RG** resource group -2. Click **Delete resource group** +2. Select **Delete resource group** 3. Type the resource group name to confirm deletion -4. Click **Delete** +4. Select **Delete** ## Summary diff --git a/Instructions/advanced/04-control-deployments-release-gates.md b/Instructions/advanced/04-control-deployments-release-gates.md index 56e6bb1..b908445 100644 --- a/Instructions/advanced/04-control-deployments-release-gates.md +++ b/Instructions/advanced/04-control-deployments-release-gates.md @@ -43,10 +43,10 @@ There are 4 types of gates included by default: First, you'll create an Azure DevOps project for this lab. 1. In your browser, open your Azure DevOps organization -2. Click **New Project** +2. Select **New Project** 3. Give your project the name **eShopOnWeb** 4. Leave other fields with defaults -5. Click **Create** +5. Select **Create** ![Screenshot of the create new project panel](media/create-project.png) @@ -55,11 +55,11 @@ First, you'll create an Azure DevOps project for this lab. Next, you'll import the sample repository that contains the application code. 1. In your Azure DevOps organization, open the **eShopOnWeb** project -2. Click **Repos > Files** -3. Click **Import a Repository** +2. Select **Repos > Files** +3. Select **Import a Repository** 4. Select **Import** 5. In the **Import a Git Repository** window, paste this URL: `https://github.com/MicrosoftLearning/eShopOnWeb.git` -6. Click **Import** +6. Select **Import** ![Screenshot of the import repository panel](media/import-repo.png) @@ -72,27 +72,27 @@ The repository is organized this way: - **src** folder contains the .NET 8 website used in the lab scenarios 7. Go to **Repos > Branches** -8. Hover on the **main** branch then click the ellipsis on the right -9. Click **Set as default branch** +8. Hover on the **main** branch then select the ellipsis on the right +9. Select **Set as default branch** ## Configure CI Pipeline You'll add a YAML build definition to the project. 1. Navigate to the **Pipelines** section -2. In the **Create your first Pipeline** window, click **Create pipeline** -3. On the **Where is your code?** pane, click **Azure Repos Git (YAML)** -4. On the **Select a repository** pane, click **eShopOnWeb** +2. In the **Create your first Pipeline** window, select **Create pipeline** +3. On the **Where is your code?** pane, select **Azure Repos Git (YAML)** +4. On the **Select a repository** pane, select **eShopOnWeb** 5. On the **Configure your pipeline** pane, scroll down and select **Existing Azure Pipelines YAML File** 6. In the **Selecting an existing YAML File** blade, specify: - Branch: **main** - Path: **.ado/eshoponweb-ci.yml** -7. Click **Continue** to save these settings -8. From the **Review your Pipeline YAML** screen, click **Run** to start the Build Pipeline +7. Select **Continue** to save these settings +8. From the **Review your Pipeline YAML** screen, select **Run** to start the Build Pipeline 9. Wait for the Build Pipeline to complete successfully -10. Go to **Pipelines > Pipelines** and click on the recently created pipeline -11. Click on the ellipsis and **Rename/move** option -12. Name it **eshoponweb-ci** and click **Save** +10. Go to **Pipelines > Pipelines** and select the recently created pipeline +11. Select the ellipsis and **Rename/move** option +12. Name it **eshoponweb-ci** and select **Save** ## Create Azure Resources for the Release Pipeline @@ -102,10 +102,10 @@ You'll create two Azure web apps representing the DevTest and Production environ 1. From your lab computer, navigate to the [Azure Portal](https://portal.azure.com) 2. Sign in with the user account that has the Owner role in your Azure subscription -3. In the Azure portal, click the **Cloud Shell** icon (to the right of the search box) +3. In the Azure portal, select the **Cloud Shell** icon (to the right of the search box) 4. If prompted to select either **Bash** or **PowerShell**, select **Bash** -> **Note**: If this is your first time starting Cloud Shell and you see the "You have no storage mounted" message, select your subscription and click "Apply". +> **Note**: If this is your first time starting Cloud Shell and you see the "You have no storage mounted" message, select your subscription and select "Apply". 5. From the Bash prompt, run this command to create a resource group (replace `` with your preferred Azure region): @@ -148,30 +148,30 @@ You'll create two Azure web apps representing the DevTest and Production environ | Name | the name of the DevTest web app from the previous task | | Region | the same Azure region where you deployed the web apps | -4. Click **Review + create** and then click **Create** +4. Select **Review + create** and then select **Create** 5. Wait for the provisioning process to complete 6. Navigate to the resource group **az400m03l08-RG** -7. In the list of resources, click the **DevTest** web app -8. On the DevTest web app page, in the left menu under **Monitoring**, click **Application Insights** -9. Click **Turn on Application Insights** -10. In the **Change your resource** section, click **Select existing resource** +7. In the list of resources, select the **DevTest** web app +8. On the DevTest web app page, in the left menu under **Monitoring**, select **Application Insights** +9. Select **Turn on Application Insights** +10. In the **Change your resource** section, select **Select existing resource** 11. Select the newly created Application Insight resource -12. Click **Apply** and when prompted for confirmation, click **Yes** +12. Select **Apply** and when prompted for confirmation, select **Yes** 13. Wait until the change takes effect ### Create monitor alerts 1. From the same **Application Insights** menu, select **View Application Insights Data** -2. On the Application Insights resource blade, under **Monitoring**, click **Alerts** -3. Click **Create > Alert rule** -4. In the **Condition** section, click **See all signals** +2. On the Application Insights resource blade, under **Monitoring**, select **Alerts** +3. Select **Create > Alert rule** +4. In the **Condition** section, select **See all signals** 5. Type **Requests** and from the results, select **Failed Requests** 6. In the **Condition** section, leave **Threshold** set to **Static** and validate these defaults: - Aggregation Type: Count - Operator: Greater Than - Unit: Count 7. In the **Threshold value** textbox, type **0** -8. Click **Next:Actions** +8. Select **Next:Actions** 9. Don't make changes in Actions, and define these parameters under **Details**: | Setting | Value | @@ -180,7 +180,7 @@ You'll create two Azure web apps representing the DevTest and Production environ | Alert rule name | **RGATESDevTest_FailedRequests** | | Advanced Options: Automatically resolve alerts | **cleared** | -10. Click **Review+Create**, then **Create** +10. Select **Review+Create**, then **Create** 11. Wait for the alert rule to be created successfully > **Note**: Metric alert rules might take up to 10 minutes to activate. @@ -192,28 +192,28 @@ You'll configure a release pipeline with deployment gates. ### Set Up Release Tasks 1. From the **eShopOnWeb** project in Azure DevOps, select **Pipelines** and then **Releases** -2. Click **New Pipeline** +2. Select **New Pipeline** 3. From the **Select a template** window, choose **Azure App Service Deployment** under **Featured** templates -4. Click **Apply** +4. Select **Apply** 5. In the Stage window, update the default "Stage 1" name to **DevTest** 6. Close the popup window using the **X** button 7. On the top of the page, rename the pipeline from **New release pipeline** to **eshoponweb-cd** -8. Hover over the DevTest Stage and click the **Clone** button +8. Hover over the DevTest Stage and select the **Clone** button 9. Name the cloned stage **Production** > **Note**: The pipeline now contains two stages named **DevTest** and **Production**. 10. On the **Pipeline** tab, select the **Add an Artifact** rectangle 11. Select **eshoponweb-ci** in the **Source (build pipeline)** field -12. Click **Add** to confirm the selection -13. From the **Artifacts** rectangle, click the **Continuous deployment trigger** (lightning bolt) -14. Click **Disabled** to toggle the switch and enable it +12. Select **Add** to confirm the selection +13. From the **Artifacts** rectangle, select the **Continuous deployment trigger** (lightning bolt) +14. Select **Disabled** to toggle the switch and enable it 15. Leave all other settings at default and close the pane ### Configure DevTest stage -1. Within the **DevTest Environments** stage, click the **1 job, 1 task** label -2. In the **Azure subscription** dropdown, select your Azure subscription and click **Authorize** +1. Within the **DevTest Environments** stage, select the **1 job, 1 task** label +2. In the **Azure subscription** dropdown, select your Azure subscription and select **Authorize** 3. Authenticate using the user account with the Owner role in the Azure subscription 4. Confirm the App Type is set to "Web App on Windows" 5. In the **App Service name** dropdown, select the name of the **DevTest** web app @@ -223,28 +223,28 @@ You'll configure a release pipeline with deployment gates. ### Configure Production stage -1. Navigate to the **Pipeline** tab and within the **Production** Stage, click **1 job, 1 task** +1. Navigate to the **Pipeline** tab and within the **Production** Stage, select **1 job, 1 task** 2. Under the Tasks tab, in the **Azure subscription** dropdown, select the Azure subscription you used for the DevTest stage 3. In the **App Service name** dropdown, select the name of the **Prod** web app 4. Select the **Deploy Azure App Service** task 5. In the **Package or Folder** field, update the default value to: `$(System.DefaultWorkingDirectory)/**/Web.zip` 6. Open **Application and Configuration Settings** and enter this in **App settings**: `-UseOnlyInMemoryDatabase true -ASPNETCORE_ENVIRONMENT Development` -7. Click **Save** and in the Save dialog box, click **OK** +7. Select **Save** and in the Save dialog box, select **OK** ### Test the release pipeline -1. In the **Pipelines** section, click **Pipelines** -2. Click the **eshoponweb-ci** build pipeline and then click **Run Pipeline** -3. Accept the default settings and click **Run** to trigger the pipeline +1. In the **Pipelines** section, select **Pipelines** +2. Select the **eshoponweb-ci** build pipeline and then select **Run Pipeline** +3. Accept the default settings and select **Run** to trigger the pipeline 4. Wait for the build pipeline to finish > **Note**: After the build succeeds, the release will be triggered automatically and the application will be deployed to both environments. -5. In the **Pipelines** section, click **Releases** -6. On the **eshoponweb-cd** pane, click the entry representing the most recent release +5. In the **Pipelines** section, select **Releases** +6. On the **eshoponweb-cd** pane, select the entry representing the most recent release 7. Track the progress of the release and verify that deployment to both web apps completed successfully 8. Switch to the Azure portal, navigate to the **az400m03l08-RG** resource group -9. Click the **DevTest** web app, then click **Browse** +9. Select the **DevTest** web app, then select **Browse** 10. Verify that the web page loads successfully in a new browser tab 11. Repeat for the **Production** web app 12. Close the browser tabs displaying the EShopOnWeb web site @@ -256,24 +256,24 @@ You'll set up Quality Gates in the release pipeline. ### Configure pre-deployment gates for approvals 1. In the Azure DevOps portal, open the **eShopOnWeb** project -2. In **Pipelines > Releases**, click **eshoponweb-cd** and then **Edit** -3. On the left edge of the **DevTest Environment** stage, click the oval shape representing **Pre-deployment conditions** +2. In **Pipelines > Releases**, select **eshoponweb-cd** and then **Edit** +3. On the left edge of the **DevTest Environment** stage, select the oval shape representing **Pre-deployment conditions** 4. On the **Pre-deployment conditions** pane, set the **Pre-deployment approvals** slider to **Enabled** 5. In the **Approvers** text box, type and select your Azure DevOps account name > **Note**: In a real-life scenario, this should be a DevOps Team name alias instead of your own name. 6. **Save** the pre-approval settings and close the popup window -7. Click **Create Release** and confirm by pressing **Create** -8. Notice "Release-2" has been created. Click the "Release-2" link to navigate to its details +7. Select **Create Release** and confirm by pressing **Create** +8. Notice "Release-2" has been created. Select the "Release-2" link to navigate to its details 9. Notice the **DevTest** Stage is in a **Pending Approval** state -10. Click the **Approve** button to trigger the DevTest Stage +10. Select the **Approve** button to trigger the DevTest Stage ### Configure post-deployment gates for Azure Monitor -1. Back on the **eshoponweb-cd** pane, on the right edge of the **DevTest Environment** stage, click the oval shape representing **Post-deployment conditions** +1. Back on the **eshoponweb-cd** pane, on the right edge of the **DevTest Environment** stage, select the oval shape representing **Post-deployment conditions** 2. Set the **Gates** slider to **Enabled** -3. Click **+ Add** and select **Query Azure Monitor Alerts** +3. Select **+ Add** and select **Query Azure Monitor Alerts** 4. In the **Query Azure Monitor Alerts** section: - **Azure subscription**: Select the service connection representing your Azure subscription - **Resource group**: Select **az400m03l08-RG** @@ -291,7 +291,7 @@ You'll set up Quality Gates in the release pipeline. > **Note**: The sampling interval and timeout work together so that gates will call their functions at suitable intervals and reject the deployment if they don't succeed within the timeout period. 7. Close the **Post-deployment conditions** pane -8. Click **Save** and in the Save dialog box, click **OK** +8. Select **Save** and in the Save dialog box, select **OK** ## Test Release Gates @@ -300,8 +300,8 @@ You'll test the release gates by updating the application and triggering a deplo ### Generate alerts and test the release process 1. From the Azure Portal, browse to the **DevTest Web App** resource -2. From the Overview pane, notice the **URL** field showing the web application hyperlink -3. Click this link to open the eShopOnWeb web application +2. From the Overview pane, notice the **Default domain** field showing the web application hyperlink +3. Select this link to open the eShopOnWeb web application 4. To simulate a **Failed Request**, add **/discount** to the URL, which will result in an error since that page doesn't exist 5. Refresh this page several times to generate multiple events 6. From the Azure Portal, search for **Application Insights** and select the **DevTest-AppInsights** resource @@ -312,11 +312,11 @@ You'll test the release gates by updating the application and triggering a deplo 9. Return to the Azure DevOps Portal and open the **eShopOnWeb** Project 10. Navigate to **Pipelines > Releases** and select **eshoponweb-cd** -11. Click the **Create Release** button +11. Select the **Create Release** button 12. Wait for the Release pipeline to start and **approve** the DevTest Stage release action 13. Wait for the DevTest release Stage to complete successfully 14. Notice how the **Post-deployment Gates** switches to **Evaluation Gates** status -15. Click the **Evaluation Gates** icon +15. Select the **Evaluation Gates** icon 16. For **Query Azure Monitor Alerts**, notice an initial failed state 17. Let the Release pipeline remain in pending state for the next 5 minutes 18. After 5 minutes pass, notice the 2nd evaluation failing again @@ -335,9 +335,9 @@ This is expected behavior, since there's an Application Insights Alert triggered Remember to delete the resources created in the Azure portal to avoid unnecessary charges: 1. In the Azure portal, navigate to the **az400m03l08-RG** resource group -2. Click **Delete resource group** +2. Select **Delete resource group** 3. Type the resource group name to confirm deletion -4. Click **Delete** +4. Select **Delete** ## Summary diff --git a/Instructions/advanced/05-integrate-azure-key-vault-azure-devops.md b/Instructions/advanced/05-integrate-azure-key-vault-azure-devops.md index 3a190a6..6d08725 100644 --- a/Instructions/advanced/05-integrate-azure-key-vault-azure-devops.md +++ b/Instructions/advanced/05-integrate-azure-key-vault-azure-devops.md @@ -28,10 +28,10 @@ Azure Key Vault provides secure storage and management of sensitive data, such a First, you'll create an Azure DevOps project for this lab. 1. In your browser, open your Azure DevOps organization -2. Click **New Project** +2. Select **New Project** 3. Give your project the name **eShopOnWeb** 4. Leave other fields with defaults -5. Click **Create** +5. Select **Create** ![Screenshot of the create new project panel](media/create-project.png) @@ -40,10 +40,10 @@ First, you'll create an Azure DevOps project for this lab. Next, you'll import the sample repository that contains the application code. 1. In your Azure DevOps organization, open the **eShopOnWeb** project -2. Click **Repos > Files** -3. Click **Import** +2. Select **Repos > Files** +3. Select **Import** 4. In the **Import a Git Repository** window, paste this URL: `https://github.com/MicrosoftLearning/eShopOnWeb.git` -5. Click **Import** +5. Select **Import** ![Screenshot of the import repository panel](media/import-repo.png) @@ -56,33 +56,47 @@ The repository is organized this way: - **src** folder contains the .NET 8 website used in the lab scenarios 6. Go to **Repos > Branches** -7. Hover on the **main** branch then click the ellipsis on the right -8. Click **Set as default branch** +7. Hover on the **main** branch then select the ellipsis on the right +8. Select **Set as default branch** ## Setup CI pipeline to build eShopOnWeb container You'll create a CI pipeline that builds and pushes container images to an Azure Container Registry (ACR). +### Setup service connection + +An Azure Resource Manager service connection allows you to connect to Azure resources like Azure Key Vault from your pipeline. This connection lets you use a pipeline to deploy to Azure resources, such as an Azure App Service app, without needing to authenticate each time. + +1. In the Azure DevOps project, go to **Project settings > Service connections**. +2. Select **Create service connection**, then select **Azure Resource Manager** and **Next**. +3. In the **New Azure service connection** pane, verify the following settings and then select **Save**: + - **Identity type**: App registration (automatic) + - **Credential**: Workload identity federation + - **Scope level**: Subscription + - **Subscription**: *Select the subscription you are using for this lab* + - **Service Connection Name**: `azure subs` + - **Grant access permission to all pipelines**: Enabled + ### Setup and Run CI pipeline You'll import an existing CI YAML pipeline definition that creates an Azure Container Registry and builds/publishes container images. 1. From your lab computer, navigate to the Azure DevOps **eShopOnWeb** project -2. Go to **Pipelines > Pipelines** and click **Create Pipeline** (or **New pipeline**) +2. Go to **Pipelines > Pipelines** and select **Create Pipeline** (or **New pipeline**) 3. On the **Where is your code?** window, select **Azure Repos Git (YAML)** 4. Select the **eShopOnWeb** repository 5. On the **Configure** section, choose **Existing Azure Pipelines YAML file** 6. Select branch: **main** 7. Provide the path: **/.ado/eshoponweb-ci-dockercompose.yml** -8. Click **Continue** +8. Select **Continue** ![Screenshot of the existing pipeline YAML](media/select-ci-container-compose.png) 9. In the YAML pipeline definition, customize your Resource Group name by replacing **NAME** in **AZ400-EWebShop-NAME** with a unique value 10. Replace **YOUR-SUBSCRIPTION-ID** with your own Azure subscription ID -11. Click **Save and Run** and wait for the pipeline to execute successfully +11. Select **Save and Run** and wait for the pipeline to execute successfully -> **Important**: If you see the message "This pipeline needs permission to access resources before this run can continue to Docker Compose to ACI", click on View, Permit and Permit again. This is needed to allow the pipeline to create the resource. +> **Important**: If you see the message "This pipeline needs permission to access resources before this run can continue to Docker Compose to ACI", select View, Permit and Permit again. This is needed to allow the pipeline to create the resource. The build definition consists of these tasks: @@ -91,16 +105,15 @@ The build definition consists of these tasks: - **DockerCompose** task builds and pushes the container images for eShopOnWeb to the Azure Container Registry 12. Your pipeline will take a name based on the project name. Let's **rename** it for better identification -13. Go to **Pipelines > Pipelines** and click on the recently created pipeline -14. Click on the ellipsis and **Rename/Remove** option -15. Name it **eshoponweb-ci-dockercompose** and click **Save** - +13. Go to **Pipelines > Pipelines** and select the recently created pipeline +14. Select the ellipsis and **Rename/Remove** option +15. Name it **eshoponweb-ci-dockercompose** and select **Save** 16. Once execution is finished, in the Azure Portal, open the previously defined Resource Group 17. You should find an Azure Container Registry (ACR) with the created container images **eshoppublicapi** and **eshopwebmvc** ![Screenshot of container images in ACR](media/azure-container-registry.png) -18. Click on **Access Keys**, enable the **Admin user** if not done already, and copy the **password** value +18. Select **Access Keys**, enable the **Admin user** if not done already, and copy the **password** value ![Screenshot of the ACR password location](media/acr-password.png) @@ -111,8 +124,8 @@ You'll use this password in the following task as a secret in Azure Key Vault. You'll create an Azure Key Vault to store the ACR password as a secret. 1. In the Azure portal, in the **Search resources, services, and docs** text box, type **Key vault** and press **Enter** -2. Select **Key vault** blade, click **Create > Key Vault** -3. On the **Basics** tab of the **Create a key vault** blade, specify these settings and click **Next**: +2. Select **Key vault** blade, select **Create > Key Vault** +3. On the **Basics** tab of the **Create a key vault** blade, specify these settings and select **Next**: | Setting | Value | | ----------------------------- | --------------------------------------------------------------- | @@ -125,22 +138,25 @@ You'll create an Azure Key Vault to store the ACR password as a secret. | Purge protection | **Disable purge protection** | 4. On the **Access configuration** tab, select **Vault access policy** -5. In the **Access policies** section, click **+ Create** to setup a new policy +5. In the **Access policies** section, select **+ Create** to setup a new policy > **Note**: You need to secure access to your key vaults by allowing only authorized applications and users. To access the data from the vault, you need to provide read (Get/List) permissions to the service connection for authentication in the pipeline. 6. On the **Permission** blade, below **Secret permissions**, check **Get** and **List** permissions -7. Click **Next** +7. Select **Next** 8. On the **Principal** blade, search for your **Azure subscription service connection** -9. Select it from the list and click **Next**, **Next**, **Create** (access policy) -10. Back on the **Create a key vault** blade, click **Review + Create > Create** + +> **Note**: To see how the principal for your service connection is identified, in Azure DevOps, you can navigate to **Project settings > Service connections > azure subs** and open the link **Manage App registration**. This will open a new Azure Portal tab with the principal's name and Application ID that you can use to find it in the previous step. + +9. Select it from the list and select **Next**, **Next**, **Create** (access policy) +10. Back on the **Create a key vault** blade, select **Review + Create > Create** > **Note**: Wait for the Azure Key Vault to be provisioned. This should take less than 1 minute. -11. On the **Your deployment is complete** blade, click **Go to resource** -12. On the Azure Key Vault blade, in the vertical menu on the left side, in the **Objects** section, click **Secrets** -13. On the **Secrets** blade, click **Generate/Import** -14. On the **Create a secret** blade, specify these settings and click **Create**: +11. On the **Your deployment is complete** blade, select **Go to resource** +12. On the Azure Key Vault blade, in the vertical menu on the left side, in the **Objects** section, select **Secrets** +13. On the **Secrets** blade, select **Generate/Import** +14. On the **Create a secret** blade, specify these settings and select **Create**: | Setting | Value | | -------------- | ------------------------------------------- | @@ -154,7 +170,7 @@ You'll create a Variable Group in Azure DevOps that will retrieve the ACR passwo 1. On your lab computer, navigate to the Azure DevOps project **eShopOnWeb** 2. In the vertical navigational pane, select **Pipelines > Library** -3. Click **+ Variable Group** +3. Select **+ Variable Group** 4. On the **New variable group** blade, specify these settings: | Setting | Value | @@ -164,9 +180,9 @@ You'll create a Variable Group in Azure DevOps that will retrieve the ACR passwo | Azure subscription | **Available Azure service connection > Azure subs** | | Key vault name | Your key vault name | -5. Under **Variables**, click **+ Add** and select the **acr-secret** secret -6. Click **OK** -7. Click **Save** +5. Under **Variables**, select **+ Add** and select the **acr-secret** secret +6. Select **OK** +7. Select **Save** ![Screenshot of the variable group creation](media/vg-create.png) @@ -175,13 +191,13 @@ You'll create a Variable Group in Azure DevOps that will retrieve the ACR passwo You'll import a CD pipeline, customize it, and run it to deploy the container image in an Azure Container Instance. 1. From your lab computer, navigate to the Azure DevOps **eShopOnWeb** project -2. Go to **Pipelines > Pipelines** and click **New Pipeline** +2. Go to **Pipelines > Pipelines** and select **New Pipeline** 3. On the **Where is your code?** window, select **Azure Repos Git (YAML)** 4. Select the **eShopOnWeb** repository 5. On the **Configure** section, choose **Existing Azure Pipelines YAML file** 6. Select branch: **main** 7. Provide the path: **/.ado/eshoponweb-cd-aci.yml** -8. Click **Continue** +8. Select **Continue** 9. In the YAML pipeline definition, customize: @@ -190,10 +206,10 @@ You'll import a CD pipeline, customize it, and run it to deploy the container im - **YOUR-ACR.azurecr.io** and **ACR-USERNAME** with your ACR login server (both need the ACR name, can be reviewed on the ACR > Access Keys) - **AZ400-EWebShop-NAME** with the resource group name defined before in the lab -10. Click **Save and Run** +10. Select **Save and Run** 11. Open the pipeline and wait for it to execute successfully -> **Important**: If you see the message "This pipeline needs permission to access resources before this run can continue to Docker Compose to ACI", click on View, Permit and Permit again. This is needed to allow the pipeline to create the resource. +> **Important**: If you see the message "This pipeline needs permission to access resources before this run can continue to Docker Compose to ACI", select View, Permit and Permit again. This is needed to allow the pipeline to create the resource. The CD definition consists of these tasks: @@ -210,9 +226,9 @@ The CD definition consists of these tasks: Remember to delete the resources created in the Azure portal to avoid unnecessary charges: 1. In the Azure portal, navigate to the **AZ400-EWebShop-NAME** resource group -2. Click **Delete resource group** +2. Select **Delete resource group** 3. Type the resource group name to confirm deletion -4. Click **Delete** +4. Select **Delete** ## Summary diff --git a/Instructions/advanced/06-enable-dynamic-configuration-feature-flags.md b/Instructions/advanced/06-enable-dynamic-configuration-feature-flags.md index c55c9e5..5d964f2 100644 --- a/Instructions/advanced/06-enable-dynamic-configuration-feature-flags.md +++ b/Instructions/advanced/06-enable-dynamic-configuration-feature-flags.md @@ -38,20 +38,20 @@ Key benefits include: First, you'll create an Azure DevOps project for this lab. 1. In your browser, open your Azure DevOps organization -2. Click **New Project** +2. Select **New Project** 3. Give your project the name **eShopOnWeb** 4. Choose **Scrum** on the **Work Item process** dropdown -5. Click **Create** +5. Select **Create** ## Import the eShopOnWeb Git Repository Next, you'll import the sample repository that contains the application code. 1. In your Azure DevOps organization, open the **eShopOnWeb** project -2. Click **Repos > Files** -3. Click **Import** +2. Select **Repos > Files** +3. Select **Import** 4. In the **Import a Git Repository** window, paste this URL: `https://github.com/MicrosoftLearning/eShopOnWeb.git` -5. Click **Import** +5. Select **Import** The repository is organized this way: @@ -59,52 +59,66 @@ The repository is organized this way: - **src** folder contains the .NET 8 website used in the lab scenarios 6. Go to **Repos > Branches** -7. Hover on the **main** branch then click the ellipsis on the right -8. Click **Set as default branch** +7. Hover on the **main** branch then select the ellipsis on the right +8. Select **Set as default branch** ## Import and run CI/CD Pipelines You'll import CI/CD pipelines to build and deploy the eShopOnWeb application. The CI pipeline is prepared to build the application and run tests. The CD pipeline will deploy the application to an Azure Web App. +### Setup service connection + +An Azure Resource Manager service connection allows you to connect to Azure resources like Azure Key Vault from your pipeline. This connection lets you use a pipeline to deploy to Azure resources, such as an Azure App Service app, without needing to authenticate each time. + +1. In the Azure DevOps project, go to **Project settings > Service connections**. +2. Select **Create service connection**, then select **Azure Resource Manager** and **Next**. +3. In the **New Azure service connection** pane, verify the following settings and then select **Save**: + - **Identity type**: App registration (automatic) + - **Credential**: Workload identity federation + - **Scope level**: Subscription + - **Subscription**: *Select the subscription you are using for this lab* + - **Service Connection Name**: `azure subs` + - **Grant access permission to all pipelines**: Enabled + ### Import and run the CI pipeline Let's start by importing the CI pipeline named [eshoponweb-ci.yml](https://github.com/MicrosoftLearning/eShopOnWeb/blob/main/.ado/eshoponweb-ci.yml). 1. Go to **Pipelines > Pipelines** -2. Click **Create Pipeline** (if there are no pipelines) or **New pipeline** (if there are already created pipelines) +2. Select **Create Pipeline** (if there are no pipelines) or **New pipeline** (if there are already created pipelines) 3. Select **Azure Repos Git (Yaml)** 4. Select the **eShopOnWeb** repository 5. Select **Existing Azure Pipelines YAML File** 6. Select the **main** branch and the **/.ado/eshoponweb-ci.yml** file -7. Click **Continue** -8. Click the **Run** button to run the pipeline +7. Select **Continue** +8. Select the **Run** button to run the pipeline 9. Your pipeline will take a name based on the project name. Let's **rename** it for better identification -10. Go to **Pipelines > Pipelines** and click on the recently created pipeline -11. Click on the ellipsis and **Rename/Remove** option -12. Name it **eshoponweb-ci** and click **Save** +10. Go to **Pipelines > Pipelines** and select the recently created pipeline +11. Select the ellipsis and **Rename/Remove** option +12. Name it **eshoponweb-ci** and select **Save** ### Import and run the CD pipeline Let's import the CD pipeline named [eshoponweb-cd-webapp-code.yml](https://github.com/MicrosoftLearning/eShopOnWeb/blob/main/.ado/eshoponweb-cd-webapp-code.yml). 1. Go to **Pipelines > Pipelines** -2. Click **New pipeline** +2. Select **New pipeline** 3. Select **Azure Repos Git (Yaml)** 4. Select the **eShopOnWeb** repository 5. Select **Existing Azure Pipelines YAML File** 6. Select the **main** branch and the **/.ado/eshoponweb-cd-webapp-code.yml** file -7. Click **Continue** +7. Select **Continue** 8. In the YAML pipeline definition, set the variable section: - **resource-group**: the name of the resource group, for example **rg-az400-container-NAME** (replace NAME) - **location**: the name of the Azure region, for example **southcentralus** - - **templateFile**: **'infra/webapp.bicep'** + - **templateFile**: **'webapp.bicep'** - **subscriptionid**: your Azure subscription id - **azureserviceconnection**: **'azure subs'** - **webappname**: the globally unique name of the web app, for example **az400-webapp-NAME** -9. Click **Save and Run** +9. Select **Save and Run** 10. Open the pipeline and wait for it to execute successfully -> **Important**: If you see the message "This pipeline needs permission to access resources before this run can continue", click on View, Permit and Permit again. +> **Important**: If you see the message "This pipeline needs permission to access resources before this run can continue", select View, Permit and Permit again. 11. Rename the pipeline to **eshoponweb-cd-webapp-code** for better identification @@ -112,25 +126,25 @@ Let's import the CD pipeline named [eshoponweb-cd-webapp-code.yml](https://githu You'll create the Azure App Configuration service to centrally store the application configuration and feature flags. -1. In the Azure portal, search for **App Configuration** and click **Create app configuration** +1. In the Azure portal, search for **App Configuration** and select **Create app configuration** 2. Select or create a resource group 3. Specify the location for the app configuration resource 4. Enter a name for the configuration store (must be globally unique) 5. Select the **Standard** pricing tier for this lab (required for feature flags) -6. Click **Review + create** then **Create** +6. Select **Review + create** then **Create** 7. Once the resource is created, go to the resource ## Set up configuration keys in App Configuration You'll add configuration keys that your application will consume. -1. In the left pane of the App Configuration service, select **Configuration explorer** -2. Click **Create > Key-value** and add: +1. In the left pane of the App Configuration service, under **Operations**, select **Configuration explorer** +2. Select **Create > Key-value** and add: - **Key**: eShopOnWeb:Settings:ShowPipelineInfo - **Value**: true - **Label**: leave empty - **Content type**: leave empty -3. Click **Apply** and repeat the process to add these keys: +3. Select **Apply** and repeat the process to add these keys: - **Key**: eShopOnWeb:Settings:ShowImageDevVersion, **Value**: false - **Key**: eShopOnWeb:Settings:ShowImageProdVersion, **Value**: true @@ -139,12 +153,12 @@ You'll add configuration keys that your application will consume. You'll create feature flags to control application features dynamically. 1. In the left pane of the App Configuration service, select **Feature manager** -2. Click **Create** and add: +2. Select **Create** and add **Feature flag**: - **Enable feature flag**: checked - **Feature flag name**: ShoppingCart - **Label**: leave empty - **Description**: Enable the shopping cart feature -3. Click **Apply** +3. Select **Apply** 4. Repeat to create another feature flag: - **Feature flag name**: Pipeline - **Description**: Enable the pipeline information display @@ -156,15 +170,16 @@ You'll modify the application to connect to Azure App Configuration. ### Add App Configuration connection string 1. In the Azure portal, go to your App Configuration resource -2. Select **Access keys** from the left menu +2. Select **Access settings** under **Settings** from the left menu 3. Copy the **Primary** connection string 4. Go to your Azure Web App resource (created by the CD pipeline) -5. In the left menu, select **Configuration** -6. Click **New application setting** and add: - - **Name**: ConnectionStrings:AppConfig +5. In the left menu, under **Settings**, select **Environment variables** +6. Select the **Connection strings** tab and add: + - **Name**: AppConfig - **Value**: [paste the App Configuration connection string] + - **Type**: Custom - **Deployment slot setting**: leave unchecked -7. Click **OK** then **Save** +7. Select **Apply**, then select **Apply** again ### Update application code @@ -202,7 +217,7 @@ You'll test the dynamic configuration capabilities by changing settings without 3. Go back to App Configuration in the Azure portal 4. In **Configuration explorer**, find the **eShopOnWeb:Settings:ShowPipelineInfo** key 5. Change its value from **true** to **false** -6. Click **Apply** +6. Select **Apply** 7. Refresh your web application (may take up to 30 seconds to refresh) 8. Notice that the pipeline information is no longer displayed @@ -212,7 +227,7 @@ You'll test the dynamic configuration capabilities by changing settings without 2. Go back to App Configuration in the Azure portal 3. In **Feature manager**, find the **ShoppingCart** feature flag 4. Toggle its state (enable/disable) -5. Click **Apply** +5. Select **Apply** 6. Refresh your web application 7. Notice that the shopping cart feature appears or disappears based on the flag state @@ -223,13 +238,13 @@ Feature flags support more advanced scenarios: ### Conditional activation 1. In the Azure portal, go to your App Configuration **Feature manager** -2. Click on the **Pipeline** feature flag -3. Click **Add filter** +2. Select the **Pipeline** feature flag +3. Select **Add filter** 4. Select **Targeting filter** 5. Configure percentage-based rollout: - **Default percentage**: 50 - **Groups**: Leave empty for this demo -6. Click **Apply** +6. Select **Apply** This configuration will show the feature to 50% of users randomly. @@ -246,7 +261,7 @@ You can monitor how your application uses App Configuration: 1. In the Azure portal, go to your App Configuration resource 2. Select **Monitoring** from the left menu -3. Click **Metrics** to see: +3. Select **Metrics** to see: - **Requests** - Number of configuration requests - **Throttled requests** - Requests that were throttled - **Storage utilization** - How much storage is being used @@ -257,9 +272,9 @@ Remember to delete the resources created in the Azure portal to avoid unnecessar 1. Delete the resource group containing your App Configuration and Web App resources 2. In the Azure portal, navigate to your resource group -3. Click **Delete resource group** +3. Select **Delete resource group** 4. Type the resource group name to confirm deletion -5. Click **Delete** +5. Select **Delete** ## Summary diff --git a/Instructions/advanced/07-deployments-azure-bicep-templates.md b/Instructions/advanced/07-deployments-azure-bicep-templates.md index 81024df..5ae17db 100644 --- a/Instructions/advanced/07-deployments-azure-bicep-templates.md +++ b/Instructions/advanced/07-deployments-azure-bicep-templates.md @@ -39,10 +39,10 @@ Key benefits of Bicep: First, you'll create an Azure DevOps project for this lab. 1. In your browser, open your Azure DevOps organization -2. Click **New Project** +2. Select **New Project** 3. Give your project the name **eShopOnWeb** 4. Leave other fields with defaults -5. Click **Create** +5. Select **Create** ![Screenshot of the create new project panel](media/create-project.png) @@ -51,11 +51,11 @@ First, you'll create an Azure DevOps project for this lab. Next, you'll import the sample repository that contains the application code and infrastructure templates. 1. In your Azure DevOps organization, open the **eShopOnWeb** project -2. Click **Repos > Files** -3. Click **Import a Repository** +2. Select **Repos > Files** +3. Select **Import a Repository** 4. Select **Import** 5. In the **Import a Git Repository** window, paste this URL: `https://github.com/MicrosoftLearning/eShopOnWeb.git` -6. Click **Import** +6. Select **Import** ![Screenshot of the import repository panel](media/import-repo.png) @@ -68,8 +68,8 @@ The repository is organized this way: - **src** folder contains the .NET 8 website used in the lab scenarios 7. Go to **Repos > Branches** -8. Hover on the **main** branch then click the ellipsis on the right -9. Click **Set as default branch** +8. Hover on the **main** branch then select the ellipsis on the right +9. Select **Set as default branch** ## Understand an Azure Bicep template and simplify it using a reusable module @@ -103,7 +103,7 @@ Notice how simple the resource definitions are and the ability to implicitly ref You'll create a storage template module **storage.bicep** which will create a storage account only and will be imported by the main template. -1. First, remove the storage resource from the main template. Click the **Edit** button: +1. First, remove the storage resource from the main template. Select the **Edit** button: ![Screenshot of the pipeline edit button](media/edit.png) @@ -126,9 +126,9 @@ You'll create a storage template module **storage.bicep** which will create a st ![Screenshot of the file commit button](media/commit.png) -6. Next, hover your mouse over the `Infra` folder and click the ellipsis icon +6. Next, hover your mouse over the `Infra` folder and select the ellipsis icon 7. Select **New**, and **File** -8. Enter **storage.bicep** for the name and click **Create** +8. Enter **storage.bicep** for the name and select **Create** ![Screenshot of the new file menu](media/newfile.png) @@ -157,7 +157,7 @@ You'll create a storage template module **storage.bicep** which will create a st You'll modify the `simple-windows-vm.bicep` template to reference the template module you created. -1. Navigate back to the `simple-windows-vm.bicep` file and click **Edit** +1. Navigate back to the `simple-windows-vm.bicep` file and select **Edit** 2. Add the following code after the variables: ```bicep @@ -199,23 +199,23 @@ You'll use an Azure DevOps YAML pipeline to deploy your template to your Azure e ### Deploy resources to Azure by YAML pipelines 1. Navigate back to the **Pipelines** pane in the **Pipelines** hub -2. In the **Create your first Pipeline** window, click **Create pipeline** -3. On the **Where is your code?** pane, click **Azure Repos Git (YAML)** -4. On the **Select a repository** pane, click **eShopOnWeb** +2. In the **Create your first Pipeline** window, select **Create pipeline** +3. On the **Where is your code?** pane, select **Azure Repos Git (YAML)** +4. On the **Select a repository** pane, select **eShopOnWeb** 5. On the **Configure your pipeline** pane, scroll down and select **Existing Azure Pipelines YAML File** 6. In the **Selecting an existing YAML File** blade, specify: - Branch: **main** - Path: **.ado/eshoponweb-cd-windows-cm.yml** -7. Click **Continue** to save these settings +7. Select **Continue** to save these settings 8. In the variables section: - Choose a name for your resource group - Set the desired location - Replace the value of the service connection with one of your existing service connections -9. Click the **Save and run** button from the top right corner +9. Select the **Save and run** button from the top right corner ![Screenshot of the save and run button](media/saveandrun.png) -10. When the commit dialog appears, click **Save and run** again +10. When the commit dialog appears, select **Save and run** again 11. Wait for the deployment to finish and review the results ![Screenshot of the successful resource deployment to Azure using YAML pipelines](media/deploy.png) @@ -227,9 +227,9 @@ You'll use an Azure DevOps YAML pipeline to deploy your template to your Azure e Remember to delete the resources created in the Azure portal to avoid unnecessary charges: 1. In the Azure portal, navigate to the resource group you created -2. Click **Delete resource group** +2. Select **Delete resource group** 3. Type the resource group name to confirm deletion -4. Click **Delete** +4. Select **Delete** ## Summary diff --git a/Instructions/advanced/08-monitor-application-performance-azure-load-testing.md b/Instructions/advanced/08-monitor-application-performance-azure-load-testing.md index f648452..e6d9029 100644 --- a/Instructions/advanced/08-monitor-application-performance-azure-load-testing.md +++ b/Instructions/advanced/08-monitor-application-performance-azure-load-testing.md @@ -36,18 +36,18 @@ Azure Load Testing is a fully managed load-testing service that enables you to g First, you'll create an Azure DevOps project for this lab. 1. In your browser, open your Azure DevOps organization -2. Click **New Project** +2. Select **New Project** 3. Give your project the name **eShopOnWeb** and choose **Scrum** on the **Work Item process** dropdown -4. Click **Create** +4. Select **Create** ## Import eShopOnWeb Git Repository Next, you'll import the sample repository that contains the application code. 1. In your Azure DevOps organization, open the **eShopOnWeb** project -2. Click **Repos > Files**, then **Import** +2. Select **Repos > Files**, then **Import** 3. In the **Import a Git Repository** window, paste this URL: `https://github.com/MicrosoftLearning/eShopOnWeb.git` -4. Click **Import** +4. Select **Import** The repository structure: @@ -58,15 +58,15 @@ The repository structure: - **src** folder contains the .NET 8 website used in lab scenarios 5. Go to **Repos > Branches** -6. Hover on the **main** branch then click the ellipsis on the right -7. Click **Set as default branch** +6. Hover on the **main** branch then select the ellipsis on the right +7. Select **Set as default branch** ## Create Azure resources You'll create Azure resources needed for this lab using Azure Cloud Shell. 1. Navigate to the [Azure Portal](https://portal.azure.com) and sign in -2. In the toolbar, click the **Cloud Shell** icon located directly to the right of the search text box +2. In the toolbar, select the **Cloud Shell** icon located directly to the right of the search text box 3. If prompted to select either **Bash** or **PowerShell**, select **Bash** > **Note**: If this is the first time you are starting Cloud Shell and you are presented with the "You have no storage mounted" message, select the subscription you are using in this lab, and select **Create storage**. @@ -103,9 +103,9 @@ You'll configure CI/CD Pipelines as code with YAML in Azure DevOps. ### Add a YAML build and deploy definition 1. Navigate to the **Pipelines** pane in the **Pipelines** hub -2. Click **New pipeline** (or Create Pipeline if this is the first one you create) -3. On the **Where is your code?** pane, click **Azure Repos Git (YAML)** option -4. On the **Select a repository** pane, click **eShopOnWeb** +2. Select **New pipeline** (or Create Pipeline if this is the first one you create) +3. On the **Where is your code?** pane, select **Azure Repos Git (YAML)** option +4. On the **Select a repository** pane, select **eShopOnWeb** 5. On the **Configure your pipeline** pane, scroll down and select **Starter Pipeline** 6. **Select** all lines from the Starter Pipeline, and delete them 7. **Copy** the full template pipeline from below: @@ -170,9 +170,9 @@ You'll configure CI/CD Pipelines as code with YAML in Azure DevOps. ``` 8. Set the cursor on a new line at the end of the YAML definition at the indentation of the previous task level -9. Click **Show Assistant** from the right hand side of the portal +9. Select **Show Assistant** from the right hand side of the portal 10. In the list of tasks, search for and select the **Azure App Service Deploy** task -11. In the **Azure App Service deploy** pane, specify the following settings and click **Add**: +11. In the **Azure App Service deploy** pane, specify the following settings and select **Add**: - In the **Azure subscription** drop-down list, select your Azure subscription - Validate **App Service Type** points to Web App on Windows @@ -180,7 +180,7 @@ You'll configure CI/CD Pipelines as code with YAML in Azure DevOps. - In the **Package or folder** text box, **update** the Default Value to `$(Build.ArtifactStagingDirectory)/**/Web.zip` - Expand **Application and Configuration Settings**, and in the App settings text box, add: `-UseOnlyInMemoryDatabase true -ASPNETCORE_ENVIRONMENT Development` -12. Confirm the settings from the Assistant pane by clicking the **Add** button +12. Confirm the settings from the Assistant pane by selecting the **Add** button The snippet of code added should look similar to this: @@ -196,16 +196,14 @@ The snippet of code added should look similar to this: ``` 13. Before saving the updates, give it a clear name. On top of the yaml-editor window, rename **azure-pipelines-#.yml** to **m08l14-pipeline.yml** -14. Click **Save**, on the **Save** pane, click **Save** again to commit the change directly into the main branch -15. Navigate to **Pipelines** and select **Pipelines** again. Select **All** to open all pipeline definitions -16. Select the pipeline and confirm to run it by clicking **Run pipeline** and confirm by clicking **Run** once more -17. Notice the 2 different Stages: **Build .Net Core Solution** and **Deploy to Azure Web App** -18. Wait for the pipeline to complete successfully +14. Select **Save and run**, on the **Save** pane, select **Save and run** again to commit the change directly into the main branch +15. Notice the 2 different Stages: **Build .Net Core Solution** and **Deploy to Azure Web App** +16. Wait for the pipeline to complete successfully ### Review the deployed site 1. Switch back to the Azure portal and navigate to the Azure web app blade -2. On the Azure web app blade, click **Overview** and click **Browse** to open your site in a new browser tab +2. On the Azure web app blade, select **Overview** and select **Browse** to open your site in a new browser tab 3. Verify that the deployed site loads as expected, showing the eShopOnWeb E-commerce website ## Deploy and Setup Azure Load Testing @@ -219,19 +217,19 @@ You'll deploy an Azure Load Testing Resource and configure different Load Testin 1. From the Azure Portal, navigate to **Create Azure Resource** 2. In the search field, enter **Azure Load Testing** 3. Select **Azure Load Testing** (published by Microsoft) from the search results -4. Click **Create** to start the deployment process +4. Select **Create** to start the deployment process 5. Provide the necessary details for the resource deployment: - **Subscription**: select your Azure Subscription - **Resource Group**: select the Resource Group you used for deploying the Web App Service - - **Name**: `eShopOnWebLoadTesting` + - **Name**: use a globally unique name, for example `eShopOnWebLoadTesting-NAME` (replace `NAME`) - **Region**: Select a region close to your region > **Note**: Azure Load Testing service is not available in all Azure Regions. -6. Click **Review and Create**, to validate your settings -7. Click **Create** to confirm and deploy the Azure Load Testing resource +6. Select **Review and Create**, to validate your settings +7. Select **Create** to confirm and deploy the Azure Load Testing resource 8. Wait for the deployment to complete successfully -9. Click **Go to Resource** to navigate to the **eShopOnWebLoadTesting** Azure Load Testing resource +9. Select **Go to Resource** to navigate to the **eShopOnWebLoadTesting** Azure Load Testing resource ### Create Azure Load Testing tests @@ -240,7 +238,7 @@ You'll create different Azure Load Testing tests using different load configurat #### Create first load test (Virtual Users) 1. From the **eShopOnWebLoadTesting** Azure Load Testing Resource blade, navigate to **Tests** under **Tests** -2. Click the **+ Create** menu option, and select **Create a URL-based test** +2. Select the **+ Create** menu option, and select **Create a URL-based test** 3. Complete the following parameters and settings: - **Test URL**: Enter the URL from the Azure App Service you deployed (az400eshoponweb...azurewebsites.net), **including https://** @@ -249,12 +247,17 @@ You'll create different Azure Load Testing tests using different load configurat - **Test Duration (minutes)**: 5 - **Ramp-up time (minutes)**: 1 -4. Click **Review and Create**, then **Create** +> **Note**: If the settings above are not present in the **Basics** tab, make sure the **Enable advanced settings** option is unchecked. + +4. Select **Review and Create**, then **Create** 5. The test will run for 5 minutes #### Create second load test (Requests per Second) -1. From the top menu, click **Create**, **Create a URL-based test** +1. From the top menu, select **Create**, **Create a URL-based test** + +> **Note**: If you were redirected to the test run page after creating it, select **View all test runs > View all tests** to return to the main Tests pane. + 2. Complete the following parameters and settings: - **Test URL**: Enter the URL from the Azure App Service (including https://) @@ -264,7 +267,7 @@ You'll create different Azure Load Testing tests using different load configurat - **Test Duration (minutes)**: 5 - **Ramp-up time (minutes)**: 1 -3. Click **Review + create**, then **Create** +3. Select **Review + create**, then **Create** 4. The test will run for about 5 minutes ### Validate Azure Load Testing results @@ -272,7 +275,7 @@ You'll create different Azure Load Testing tests using different load configurat With both tests complete, you'll validate the outcome of the Azure Load Testing TestRuns. 1. From **Azure Load Testing**, navigate to **Tests** -2. Select either of the test definitions to open a detailed view by **clicking** on one of the tests +2. Select either of the test definitions to open a detailed view by **selecting** one of the tests 3. Select the **TestRun_mm/dd/yy-hh:hh** from the resulting list 4. From the detailed **TestRun** page, identify the actual outcome of the simulation: @@ -297,7 +300,9 @@ You'll grant the required permissions to the Azure DevOps Service Connection. 3. Under the **Pipelines** section, select **Service Connections** 4. Notice the Service Connection with the name of your Azure Subscription 5. **Select the Service Connection**. From the **Overview** tab, navigate to **Details** and select **Manage service connection roles** -6. This redirects you to the Azure Portal, opening the resource group details in the access control (IAM) blade +6. This redirects you to the Azure Portal, opening the subscription details in the access control (IAM) blade + +> **Note**: If there is no **Manage service connection roles** option available, you may need to select **Convert** first to convert your service connection to workload identity federation. ### Grant permissions to the Azure Load Testing resource @@ -305,7 +310,7 @@ Azure Load Testing uses Azure RBAC to grant permissions for performing specific 1. Select **+ Add** and **Add role assignment** 2. In the **Role tab**, select **Load Test Contributor** in the list of job function roles -3. In the **Members tab**, select **Select members**, find and select your user account and click **Select** +3. In the **Members tab**, select **Select members**, find and select your user account and select **Select** 4. In the **Review + assign tab**, select **Review + assign** to add the role assignment You can now use the service connection in your Azure Pipelines workflow to access your Azure load testing resource. @@ -327,23 +332,23 @@ To run a load test with Azure Load Testing in a CI/CD workflow, you need to add 7. Select **Repos**. In the source code folder structure, notice the **tests** subfolder 8. Notice the ellipsis (...), and select **New > Folder** 9. Specify **jmeter** as folder name, and **placeholder.txt** for the file name -10. Click **Commit** to confirm the creation of the placeholder file and jmeter folder +10. Select **Commit** to confirm the creation of the placeholder file and jmeter folder 11. From the **Folder structure**, navigate to the new created **jmeter** subfolder -12. Click the **ellipsis(...)** and select **Upload File(s)** +12. Select the **ellipsis(...)** and select **Upload File(s)** 13. Using the **Browse** option, navigate to the location of the extracted zip-file, and select both **config.yaml** and **quick_test.jmx** -14. Click **Commit** to confirm the file upload into source control +14. Select **Commit** to confirm the file upload into source control 15. Within Repos, browse to the **/tests/jmeter** subfolder -16. Open the Load Testing **config.yaml** file. Click **Edit** to allow editing +16. Open the Load Testing **config.yaml** file. Select **Edit** to allow editing 17. Replace the **displayName** and **testId** attributes with the value **ado_load_test** -18. Click **Commit** to save the changes +18. Select **Commit** to save the changes ### Update the CI/CD workflow YAML definition file 1. Open the [Azure Load Testing task extension](https://marketplace.visualstudio.com/items?itemName=AzloadTest.AzloadTesting) in the Azure DevOps Marketplace, and select **Get it free** 2. Select your Azure DevOps organization, and then select **Install** to install the extension -3. From the Azure DevOps Portal, navigate to **Pipelines** and select the pipeline created earlier. Click **Edit** -4. In the YAML script, navigate to **line 56** and press ENTER/RETURN to add a new empty line (right before the Deploy Stage) -5. At line 57, select the Tasks Assistant and search for **Azure Load Testing** (make sure you position the cursor at the indentation of the previous task level). +3. From the Azure DevOps Portal, navigate to **Pipelines** and select the pipeline created earlier. Select **Edit** +4. In the YAML script, navigate to **line 43** and press ENTER/RETURN to add a new empty line (right before the Deploy Stage) +5. At line 44, select the Tasks Assistant and search for **Azure Load Testing** (make sure you position the cursor at the indentation of the previous task level). 6. Complete the graphical pane with the correct settings: - Azure Subscription: Select the subscription which runs your Azure Resources @@ -353,7 +358,7 @@ To run a load test with Azure Load Testing in a CI/CD workflow, you need to add - Load Test Run Name: ado_run - Load Test Run Description: load testing from ADO -7. Click **Add** to inject the parameters as a YAML snippet +7. Select **Add** to inject the parameters as a YAML snippet 8. Fix indentation if needed (add 2 spaces or tab to position the snippet correctly) The YAML code should look like this: @@ -379,9 +384,9 @@ The YAML code should look like this: 11. Fix indentation if needed 12. **Save** the changes -13. Once saved, click **Run** to trigger the pipeline -14. Confirm the branch (main) and click **Run** to start the pipeline run -15. From the pipeline status page, click the **Build** stage to open the verbose logging details +13. Once saved, select **Run** to trigger the pipeline +14. Confirm the branch (main) and select **Run** to start the pipeline run +15. From the pipeline status page, select the **Build** stage to open the verbose logging details 16. Wait for the pipeline to arrive at the **AzureLoadTest** task 17. While the task is running, browse to the **Azure Load Testing** in the Azure Portal and see how the pipeline creates a new RunTest named **adoloadtest1** 18. Navigate back to the Azure DevOps CI/CD Pipeline Run view, where the **AzureLoadTest task** should complete successfully @@ -392,7 +397,7 @@ You'll use load test fail criteria to get alerted when the application doesn't m 1. From Azure DevOps, navigate to the eShopOnWeb Project, and open **Repos** 2. Within Repos, browse to the **/tests/jmeter** subfolder -3. Open the Load Testing **config.yaml** file. Click **Edit** to allow editing +3. Open the Load Testing **config.yaml** file. Select **Edit** to allow editing 4. Replace `failureCriteria: []` if present, otherwise append the following snippet: ```yaml @@ -401,7 +406,7 @@ You'll use load test fail criteria to get alerted when the application doesn't m - percentage(error) > 50 ``` -5. Save the changes by clicking **Commit** and Commit once more +5. Save the changes by selecting **Commit** and Commit once more 6. Navigate back to **Pipelines** and run the **eShopOnWeb** pipeline again 7. After a few minutes, it will complete with a **failed** status for the **AzureLoadTest** task 8. Open the verbose logging view for the pipeline, and validate the details of the **AzureLoadtest** diff --git a/Instructions/intermediate/01-implement-ci-cd-with-github-actions-and-iac-with-bicep.md b/Instructions/intermediate/01-implement-ci-cd-with-github-actions-and-iac-with-bicep.md index 8c5a4f8..f5e40fa 100644 --- a/Instructions/intermediate/01-implement-ci-cd-with-github-actions-and-iac-with-bicep.md +++ b/Instructions/intermediate/01-implement-ci-cd-with-github-actions-and-iac-with-bicep.md @@ -98,13 +98,13 @@ The exercise consists of the following tasks: ### Configure the target environment -> **Note:** You will start by creating the resource groups. You will run the workflow twice in order to deploy two instances of the website in two different Azure regions (East US and West US in this example). You can adapt these to use regions closer to your location if preferred. +> **Note:** You will start by creating the resource groups. You will run the workflow twice in order to deploy two instances of the website in two different Azure regions (East US and West Europe in this example). You can adapt these to use regions closer to your location if preferred. 1. Switch to the web browser tab displaying the Azure portal at `https://portal.azure.com`. 1. In the Azure portal, in the search text box at the top of the page, enter **`Resource groups`** and select **Resource groups** in the list of results. 1. On the **Resource groups** page, select **+ Create**. -1. In the **Resource groups** text box, enter **`rg-eshoponweb-westus`**. -1. In the **Region** drop-down list, select **(US) West US**. +1. In the **Resource groups** text box, enter **`rg-eshoponweb-westeurope`**. +1. In the **Region** drop-down list, select **(Europe) West Europe**. 1. Select **Review + create** and then, on the **Review + create**, select **Create**. 1. On the **Resource groups** page, select **+ Create**. 1. In the **Resource groups** text box, enter **`rg-eshoponweb-eastus`**. @@ -168,7 +168,7 @@ The exercise consists of the following tasks: ### Validate the IaC and CI/CD functionality -1. Switch to the web browser window displaying the forked **eShopOnWeb** GitHub repo page and, if needed, on the **eShopOnWeb** page, click in the **Code** tab and, in the drop-down list confirm that the current branch is **main**. +1. Switch to the web browser window displaying the forked **eShopOnWeb** GitHub repo page and, if needed, on the **eShopOnWeb** page, select the **Code** tab and, in the drop-down list confirm that the current branch is **main**. 1. In the web browser window displaying the **main** branch of the forked **eShopOnWeb** GitHub repo page, navigate to the **.github/workflows** folder and select **eshoponweb-cicd.yml**. 1. In the **.github/workflows/eshoponweb-cicd.yml** pane, select the pencil icon to edit the workflow. 1. In the **Edit** pane, replace line 4 with the following text: @@ -182,11 +182,11 @@ The exercise consists of the following tasks: 1. In the **Edit** pane, replace line 8 with the following text: ```yaml - RESOURCE-GROUP: rg-eshoponweb-westus + RESOURCE-GROUP: rg-eshoponweb-westeurope ``` 1. In the **Edit** pane, replace the `YOUR-SUBS-ID` placeholder in line 11 with the value of the Azure subscription ID you recorded earlier in this exercise: -1. In the **Edit** pane, replace the `eshoponweb-webapp-NAME` placeholder in line 11 with the name of the **first** Azure App Service web app you generated earlier in this exercise. +1. In the **Edit** pane, replace the `eshoponweb-webapp-NAME` placeholder in line 12 with the name of the **first** Azure App Service web app you generated earlier in this exercise. 1. In the **.github/workflows/eshoponweb-cicd.yml** pane, select **Commit changes** and then select **Commit changes** again. 1. In the web browser window displaying the **main** branch of the forked **eShopOnWeb** GitHub repo page, navigate to the **infra** folder and select **webapp.bicep**. 1. In the **infra/webapp.bicep** pane, select the pencil icon to edit the workflow. @@ -225,8 +225,8 @@ The exercise consists of the following tasks: RESOURCE-GROUP: rg-eshoponweb-eastus ``` -1. In the **Edit** pane, replace the `location` variable in line 9 with the region nearest to your location. -1. In the **Edit** pane, replace the `eshoponweb-webapp-NAME` placeholder in line 11 with the name of the **second** Azure App Service web app you generated earlier in this exercise. +1. In the **Edit** pane, replace the `location` variable in line 9 with `eastus` or the region nearest to your location. +1. In the **Edit** pane, replace the `eshoponweb-webapp-NAME` placeholder in line 12 with the name of the **second** Azure App Service web app you generated earlier in this exercise. 1. In the **.github/workflows/eshoponweb-cicd.yml** pane, select **Commit changes** and then select **Commit changes** again. 1. In the web browser window displaying the forked **eShopOnWeb** GitHub repo page, select **Actions**. 1. In the **All workflows** section on the left side, select **eShopOnWeb Build and Test**. @@ -246,7 +246,6 @@ The exercise consists of the following tasks: 1. On the **App Services** page, in the list of App Services, select the **devops-webapp-westeurope-** app service you created earlier in this exercise. 1. On the **devops-webapp-westeurope-** page, in the **Essentials** section, verify that the **Default domain** value is displayed and select it to open the web app in a new browser tab. 1. In the new browser tab, verify that the web app is displayed and that it's functional. You can also verify the second web app in the **East US** region in the same way. - > **Note**: Leave the deployed Azure resources running. You will need them in the next lab. ## Clean up resources diff --git a/Instructions/intermediate/02-implement-microsoft-dev-box.md b/Instructions/intermediate/02-implement-microsoft-dev-box.md index ccebca5..7dcb16b 100644 --- a/Instructions/intermediate/02-implement-microsoft-dev-box.md +++ b/Instructions/intermediate/02-implement-microsoft-dev-box.md @@ -36,7 +36,7 @@ To complete the lab, you need: 1. Start a web browser and navigate to the Microsoft Entra admin center at `https://entra.microsoft.com`. 1. If prompted, sign in by using a Microsoft Entra account with Global Administrator permissions in your tenant. -1. In the Microsoft Entra admin center, in the left navigation pane, expand **Identity** and select **Groups**. +1. In the Microsoft Entra admin center, in the left navigation pane, expand **Entra ID** and select **Groups**. 1. On the **Groups | All groups** page, select **+ New group**. 1. On the **New Group** page, specify the following settings and select **Create**: @@ -51,7 +51,7 @@ To complete the lab, you need: - **DevCenter_Dev_Leads** (Development team leads) - **DevCenter_Dev_Users** (Developers) -1. In the Microsoft Entra admin center, in the left navigation pane, expand **Identity** and select **Users**. +1. In the Microsoft Entra admin center, in the left navigation pane, expand **Entra ID** and select **Users**. 1. On the **Users | All users** page, select **+ New user** and then **Create new user**. 1. On the **New user** page, specify the following settings and select **Create**: @@ -184,7 +184,7 @@ In this task, you will create a dev center project. A dev center project typical 1. In the web browser displaying the Azure portal, on the **devcenter-basic** page, in the vertical navigation menu on the left side, expand the **Manage** section and select **Projects**. 1. On the **devcenter-basic | Projects** page, select **+ Create**. -1. On the **Basics** tab of the **Create a project** page, specify the following settings and then select **Next: Dev box management**: +1. On the **Basics** tab of the **Create a project** page, specify the following settings and then select **Next: Dev box settings**: | Setting | Value | | -------------- | ------------------------------------------------------------ | @@ -194,7 +194,7 @@ In this task, you will create a dev center project. A dev center project typical | Name | **devcenter-project-basic** | | Description | **Basic Dev Center Project** | -1. On the **Dev box management** tab of the **Create a project** page, specify the following settings and then select **Next: Catalogs**: +1. On the **Dev box settings** tab of the **Create a project** page, specify the following settings and then select **Next: Catalogs**: | Setting | Value | | ----------------------- | ----- | diff --git a/Instructions/intermediate/04-configure-agent-pools-pipeline-styles.md b/Instructions/intermediate/04-configure-agent-pools-pipeline-styles.md index 53dd959..e72e601 100644 --- a/Instructions/intermediate/04-configure-agent-pools-pipeline-styles.md +++ b/Instructions/intermediate/04-configure-agent-pools-pipeline-styles.md @@ -18,7 +18,7 @@ You will learn how to: - Implement self-hosted agents. - Configure agent pools for pipelines. -This lab takes approximately **30** minutes to complete. +This lab takes approximately **45** minutes to complete. ## Before you start @@ -112,7 +112,7 @@ In this section, you will create an Azure virtual machine (VM) and use it to cre | **Virtual machine name** text box | Enter name of your preference, for example, **`eshoponweb-vm`**. | | **Region** drop-down list | You can choose your closest [azure](https://azure.microsoft.com/explore/global-infrastructure/geographies) region. For example, "eastus", "eastasia", "westus", etc. | | **Availability options** drop-down list | Select **No infrastructure redundancy required**. | - | **Security type** drop-down list | Select with the **Trusted launch virtual machines** option. | + | **Security type** drop-down list | Select the **Trusted launch virtual machines** option. | | **Image** drop-down list | Select the **Windows Server 2022 Datacenter: Azure Edition - x64 Gen2** image. | | **Size** drop-down list | Select the cheapest **Standard** size for testing purposes. | | **Username** text box | Enter the username of your preference | diff --git a/Instructions/intermediate/05-enable-continuous-integration-azure-pipelines.md b/Instructions/intermediate/05-enable-continuous-integration-azure-pipelines.md index 30d260a..429ef7c 100644 --- a/Instructions/intermediate/05-enable-continuous-integration-azure-pipelines.md +++ b/Instructions/intermediate/05-enable-continuous-integration-azure-pipelines.md @@ -31,13 +31,13 @@ If you don't already have an Azure DevOps organization, follow these steps: 1. Use a private browser session to get a new **personal Microsoft Account (MSA)** at `https://account.microsoft.com` (skip if you already have one). 1. Using the same browser session, sign up for a free Azure subscription at `https://azure.microsoft.com/free` (skip if you already have one). -1. Open a browser and navigate to Azure portal at `https://portal.azure.com`, then search at the top of the Azure portal screen for **Azure DevOps**. In the resulting page, click **Azure DevOps organizations**. -1. Next, click on the link labelled **My Azure DevOps Organizations** or navigate directly to `https://aex.dev.azure.com`. +1. Open a browser and navigate to Azure portal at `https://portal.azure.com`, then search at the top of the Azure portal screen for **Azure DevOps**. In the resulting page, select **Azure DevOps organizations**. +1. Next, select the link labelled **My Azure DevOps Organizations** or navigate directly to `https://aex.dev.azure.com`. 1. On the **We need a few more details** page, select **Continue**. 1. In the drop-down box on the left, choose **Default Directory**, instead of **Microsoft Account**. -1. If prompted (_"We need a few more details"_), provide your name, e-mail address, and location and click **Continue**. -1. Back at `https://aex.dev.azure.com` with **Default Directory** selected click the blue button **Create new organization**. -1. Accept the _Terms of Service_ by clicking **Continue**. +1. If prompted (_"We need a few more details"_), provide your name, e-mail address, and location and select **Continue**. +1. Back at `https://aex.dev.azure.com` with **Default Directory** selected select the blue button **Create new organization**. +1. Accept the _Terms of Service_ by selecting **Continue**. 1. If prompted (_"Almost done"_), leave the name for the Azure DevOps organization at default (it needs to be a globally unique name) and pick a hosting location close to you from the list. 1. Once the newly created organization opens in **Azure DevOps**, select **Organization settings** in the bottom left corner. 1. At the **Organization settings** screen select **Billing** (opening this screen takes a few seconds). @@ -46,9 +46,9 @@ If you don't already have an Azure DevOps organization, follow these steps: > **Note**: You may **wait a couple of minutes before using the CI/CD capabilities** so that the new settings are reflected in the backend. Otherwise, you will still see the message _"No hosted parallelism has been purchased or granted"_. -1. In **Organization Settings**, go to section **Pipelines** and click **Settings**. +1. In **Organization Settings**, go to section **Pipelines** and select **Settings**. 1. Toggle the switch to **Off** for **Disable creation of classic build pipelines** and **Disable creation of classic release pipelines**. -1. In **Organization Settings**, go to section **Security** and click **Policies**. +1. In **Organization Settings**, go to section **Security** and select **Policies**. 1. Toggle the switch to **On** for **Allow public projects**. ### Create and configure the Azure DevOps project (if needed) @@ -77,8 +77,8 @@ If you don't already have an Azure DevOps organization, follow these steps: 1. Leave the web browser window open. 1. Go to **Repos > Branches**. -1. Hover on the **main** branch then click the ellipsis on the right of the column. -1. Click on **Set as default branch**. +1. Hover on the **main** branch then select the ellipsis on the right of the column. +1. Select **Set as default branch**. ## Include build validation as part of a Pull Request @@ -91,11 +91,11 @@ In this task, you will import the YAML build definition that will be used as a B Let's start by importing the build pipeline named [eshoponweb-ci-pr.yml](https://github.com/MicrosoftLearning/eShopOnWeb/blob/main/.ado/eshoponweb-ci-pr.yml). 1. Go to **Pipelines > Pipelines** -1. Click on **Create Pipeline** or **New Pipeline** button +1. Select **Create Pipeline** or **New Pipeline** button 1. Select **Azure Repos Git (YAML)** 1. Select the **eShopOnWeb** repository 1. Select **Existing Azure Pipelines YAML File** -1. Select the **main** branch and the **/.ado/eshoponweb-ci-pr.yml** file, then click on **Continue** +1. Select the **main** branch and the **/.ado/eshoponweb-ci-pr.yml** file, then select **Continue** The build definition consists of the following tasks: @@ -104,8 +104,8 @@ Let's start by importing the build pipeline named [eshoponweb-ci-pr.yml](https:/ - **DotNet Test**: .Net test driver used to execute unit tests. - **DotNet Publish**: Publishes the application and its dependencies to a folder for deployment to a hosting system. In this case, it's **Build.ArtifactStagingDirectory**. -1. On the **Review your pipeline YAML** pane, click the down-facing caret symbol next to the **Run** button, click **Save**. -1. Your pipeline will take a name based on the project name. Let's **rename** it for identifying the pipeline better. Go to **Pipelines > Pipelines** and click on the recently created pipeline. Click on the ellipsis and **Rename/Move** option. Name it **eshoponweb-ci-pr** and click on **Save**. +1. On the **Review your pipeline YAML** pane, select the down-facing caret symbol next to the **Run** button, select **Save**. +1. Your pipeline will take a name based on the project name. Let's **rename** it for identifying the pipeline better. Go to **Pipelines > Pipelines** and select the recently created pipeline. Select the ellipsis and **Rename/Move** option. Name it **eshoponweb-ci-pr** and select **Save**. ### Branch Policies @@ -113,34 +113,34 @@ In this task, you will add policies to the main branch and only allow changes us 1. Go to **Repos > Branches** section. 1. On the **Mine** tab of the **Branches** pane, hover the mouse pointer over the **main** branch entry to reveal the ellipsis symbol on the right side. -1. Click the ellipsis and, in the pop-up menu, select **Branch Policies**. +1. Select the ellipsis and, in the pop-up menu, select **Branch Policies**. 1. On the **main** tab of the repository settings, enable the option for **Require minimum number of reviewers**. Add **1** reviewer and check the box **Allow requestors to approve their own changes**(as you are the only user in your project for the lab) -1. On the **main** tab of the repository settings, in the **Build Validation** section, click **+** (Add a new build policy) and in the **Build pipeline** list, select **eshoponweb-ci-pr** then click **Save**. +1. On the **main** tab of the repository settings, in the **Build Validation** section, select **+** (Add a new build policy) and in the **Build pipeline** list, select **eshoponweb-ci-pr** then select **Save**. ### Working with Pull Requests In this task, you will use the Azure DevOps portal to create a Pull Request, using a new branch to merge a change into the protected **main** branch. -1. Navigate to the **Repos** section in the eShopOnWeb navigation and click **Branches**. +1. Navigate to the **Repos** section in the eShopOnWeb navigation and select **Branches**. 1. Create a new branch named **Feature01** based on the **main** branch. -1. Click **Feature01** and navigate to the **/eShopOnWeb/src/Web/Program.cs** file as part of the **Feature01** branch -1. Click the **Edit** button in the top-right +1. Select **Feature01** and navigate to the **/eShopOnWeb/src/Web/Program.cs** file as part of the **Feature01** branch +1. Select the **Edit** button in the top-right 1. Make the following change on the first line: ```csharp // Testing my PR ``` -1. Click on **Commit > Commit** (leave default commit message). -1. A message will pop-up, proposing to create a Pull Request (as your **Feature01** branch is now ahead in changes, compared to **main**). Click on **Create a Pull Request**. -1. In the **New pull request** tab, leave defaults and click on **Create**. +1. Select **Commit > Commit** (leave default commit message). +1. A message will pop-up, proposing to create a Pull Request (as your **Feature01** branch is now ahead in changes, compared to **main**). Select **Create a Pull Request**. +1. In the **New pull request** tab, leave defaults and select **Create**. 1. The Pull Request will show some pending requirements, based on the policies applied to the target **main** branch. - At least 1 user should review and approve the changes. - Build validation, you will see that the build **eshoponweb-ci-pr** was triggered automatically -1. After all validations are successful, on the top-right click on **Approve**. Now from the **Set auto-complete** dropdown you can click on **Complete**. -1. On the **Complete Pull Request** tab, click on **Complete Merge** +1. After all validations are successful, on the top-right select **Approve**. Now from the **Set auto-complete** dropdown you can select **Complete**. +1. On the **Complete Pull Request** tab, select **Complete Merge** ## Configure CI Pipeline as Code with YAML @@ -153,11 +153,11 @@ In this task, you will add the YAML build definition that will be used to implem Let's start by importing the CI pipeline named [eshoponweb-ci.yml](https://github.com/MicrosoftLearning/eShopOnWeb/blob/main/.ado/eshoponweb-ci.yml). 1. Go to **Pipelines > Pipelines**. -1. Click on **New Pipeline** button. +1. Select **New Pipeline** button. 1. Select **Azure Repos Git (YAML)**. 1. Select the **eShopOnWeb** repository. 1. Select **Existing Azure Pipelines YAML File**. -1. Select the **main** branch and the **/.ado/eshoponweb-ci.yml** file, then click on **Continue**. +1. Select the **main** branch and the **/.ado/eshoponweb-ci.yml** file, then select **Continue**. The CI definition consists of the following tasks: @@ -168,13 +168,13 @@ Let's start by importing the CI pipeline named [eshoponweb-ci.yml](https://githu - **Publish Artifact - Website**: Publish the app artifact (created in the previous step) and make it available as a pipeline artifact. - **Publish Artifact - Bicep**: Publish the infrastructure artifact (Bicep file) and make it available as a pipeline artifact. -1. Click on **Run** and wait for the pipeline to execute successfully. +1. Select **Run** and wait for the pipeline to execute successfully. ### Enable Continuous Integration The default build pipeline definition doesn't enable Continuous Integration. -1. Click on the **Edit pipeline** option under the ellipsis menu near **Run new** button in the top-right +1. Select the **Edit pipeline** option under the ellipsis menu near **Run new** button in the top-right 1. Now, you need to replace the **# trigger:** and **# - main** lines with the following code: ```YAML @@ -191,40 +191,40 @@ The default build pipeline definition doesn't enable Continuous Integration. Since you enabled Branch Policies, you need to pass by a Pull Request in order to update your code. -1. Click the **Validate and save** button to validate and save the pipeline definition. +1. Select the **Validate and save** button to validate and save the pipeline definition. 1. Select **Create a new branch for this commit**. 1. Keep the default branch name and **Start a pull request** checked. -1. Click on **Save**. -1. Your pipeline will take a name based on the project name. Let's **rename** it for identifying the pipeline better. Go to **Pipelines > Pipelines** and click on the recently created pipeline. Click on the ellipsis and **Rename/Move** option. Name it **eshoponweb-ci** and click on **Save**. +1. Select **Save**. +1. Your pipeline will take a name based on the project name. Let's **rename** it for identifying the pipeline better. Go to **Pipelines > Pipelines** and select the recently created pipeline. Select the ellipsis and **Rename/Move** option. Name it **eshoponweb-ci** and select **Save**. 1. Go to **Repos > Pull Requests**. -1. Click on the **"Update eshoponweb-ci.yml for Azure Pipelines"** pull request. -1. After all validations are successful, on the top-right click on **Approve**. Now you can click on **Complete**. -1. On the **Complete Pull Request** tab, Click on **Complete Merge** +1. Select the **"Update eshoponweb-ci.yml for Azure Pipelines"** pull request. +1. After all validations are successful, on the top-right select **Approve**. Now you can select **Complete**. +1. On the **Complete Pull Request** tab, Select **Complete Merge** ### Test the CI pipeline In this task, you will create a Pull Request, using a new branch to merge a change into the protected **main** branch and automatically trigger the CI pipeline. -1. Navigate to the **Repos** section, and click on **Branches**. +1. Navigate to the **Repos** section, and select **Branches**. 1. Create a new branch named **Feature02** based on the **main** branch. -1. Click the new **Feature02** branch. -1. Navigate to the **/eShopOnWeb/src/Web/Program.cs** file and click **Edit** in the top-right. +1. Select the new **Feature02** branch. +1. Navigate to the **/eShopOnWeb/src/Web/Program.cs** file and select **Edit** in the top-right. 1. Remove the first line: ```csharp // Testing my PR ``` -1. Click on **Commit > Commit** (leave default commit message). +1. Select **Commit > Commit** (leave default commit message). 1. A message will pop-up, proposing to create a Pull Request (as your **Feature02** branch is now ahead in changes, compared to **main**). -1. Click on **Create a Pull Request**. -1. In the **New pull request** tab, leave defaults and click on **Create**. +1. Select **Create a Pull Request**. +1. In the **New pull request** tab, leave defaults and select **Create**. 1. The Pull Request will show some pending requirements, based on the policies applied to the target **main** branch. -1. After all validations are successful, on the top-right click on **Approve**. Now from the **Set auto-complete** dropdown you can click on **Complete**. -1. On the **Complete Pull Request** tab, Click on **Complete Merge** +1. After all validations are successful, on the top-right select **Approve**. Now from the **Set auto-complete** dropdown you can select **Complete**. +1. On the **Complete Pull Request** tab, Select **Complete Merge** 1. Go back to **Pipelines > Pipelines**, you will notice that the build **eshoponweb-ci** was triggered automatically after the code was merged. -1. Click on the **eshoponweb-ci** build then select the last run. -1. After its successful execution, click on **Related > Published** to check the published artifacts: +1. Select the **eshoponweb-ci** build then select the last run. +1. After its successful execution, select **Related > Published** to check the published artifacts: - Bicep: the infrastructure artifact. - Website: the app artifact. @@ -236,7 +236,7 @@ If you want to delete the project, you can do so by following these steps: 1. In your browser navigate to the Azure DevOps portal at `https://aex.dev.azure.com`. 1. Navigate to the **eShopOnWeb** project you created. -1. On the project settings page, go to **Overview** and click **Delete** at the bottom of the page. -1. Type the project name to confirm deletion and click **Delete**. +1. On the project settings page, go to **Overview** and select **Delete** at the bottom of the page. +1. Type the project name to confirm deletion and select **Delete**. > **CAUTION:** Deleting a project deletes all work items, repositories, builds, and other project artifacts. If you used an existing project for this exercise, any existing resources outside the scope of this exercise will also be deleted. diff --git a/Instructions/intermediate/06-implement-github-actions-ci-cd.md b/Instructions/intermediate/06-implement-github-actions-ci-cd.md index efbf1b7..cef39ae 100644 --- a/Instructions/intermediate/06-implement-github-actions-ci-cd.md +++ b/Instructions/intermediate/06-implement-github-actions-ci-cd.md @@ -44,11 +44,11 @@ The repository is organized the following way: In this task, you will create an empty public GitHub repository and import the existing [eShopOnWeb](https://github.com/MicrosoftLearning/eShopOnWeb) repository. -1. From the lab computer, start a web browser, navigate to the [GitHub website](https://github.com/), sign in using your account and click on **New** to create new repository. +1. From the lab computer, start a web browser, navigate to the [GitHub website](https://github.com/), sign in using your account and select **New** to create new repository. ![Screenshot of the create new repository button.](media/github-new.png) -1. On the **Create a new repository** page, click on **Import a repository** link (below the page title). +1. On the **Create a new repository** page, select **Import a repository** link (below the page title). > **Note**: you can also open the import website directly at @@ -61,9 +61,9 @@ In this task, you will create an empty public GitHub repository and import the e | Repository Name | eShopOnWeb | | Privacy | **Public** | -1. Click on **Begin Import** and wait for your repository to be ready. +1. Select **Begin Import** and wait for your repository to be ready. -1. On the repository page, go to **Settings**, click on **Actions > General** and choose the option **Allow all actions and reusable workflows**. Click on **Save**. +1. On the repository page, go to **Settings**, select **Actions > General** and choose the option **Allow all actions and reusable workflows**. Select **Save**. ![Screenshot of the enable GitHub Actions option.](media/enable-actions.png) @@ -76,12 +76,12 @@ In this section, you will create an Azure Service Principal to authorize GitHub In this task, you will create the Azure Service Principal used by GitHub to deploy the desired resources. As an alternative, you could also use [OpenID connect in Azure](https://docs.github.com/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-azure), as a secretless authentication mechanism. 1. On your lab computer, in a browser window, open the Azure Portal at `https://portal.azure.com`. -1. In the portal, look for **Resource Groups** and click on it. -1. Click on **+ Create** to create a new Resource Group for the exercise. -1. On the **Create a resource group** tab, give the following name to your Resource Group: **rg-eshoponweb-NAME** (replace NAME for some unique alias). Click on **Review + Create > Create**. +1. In the portal, look for **Resource Groups** and select it. +1. Select **+ Create** to create a new Resource Group for the exercise. +1. On the **Create a resource group** tab, give the following name to your Resource Group: **rg-eshoponweb-NAME** (replace NAME for some unique alias). Select **Review + Create > Create**. 1. In the Azure Portal, open the **Cloud Shell** (next to the search bar). - > **Note**: if the Azure portal asks you to create a storage, you can choose **No storage account required** options, select your subscription and click on **Apply** button + > **Note**: if the Azure portal asks you to create a storage, you can choose **No storage account required** options, select your subscription and select **Apply** button 1. Make sure the terminal is running in **Bash** mode and execute the following command, replacing **SUBSCRIPTION-ID** and **RESOURCE-GROUP** with your own identifiers (both can be found on the **Overview** page of the Resource Group): @@ -112,12 +112,12 @@ In this task, you will create the Azure Service Principal used by GitHub to depl ``` 1. In a browser window, go back to your **eShopOnWeb** GitHub repository. -1. On the repository page, go to **Settings**, click on **Secrets and variables > Actions**. Click on **New repository secret** +1. On the repository page, go to **Settings**, select **Secrets and variables > Actions**. Select **New repository secret** - Name : **`AZURE_CREDENTIALS`** - Secret: **paste the previously copied JSON object** (GitHub is able to keep multiple secrets under same name, used by [azure/login](https://github.com/Azure/login) action ) -1. Click on **Add secret**. Now GitHub Actions will be able to reference the service principal, using the repository secret. +1. Select **Add secret**. Now GitHub Actions will be able to reference the service principal, using the repository secret. ### Modify and execute the GitHub workflow @@ -133,22 +133,22 @@ In this task, you will modify the given GitHub workflow and execute it to deploy - Replace **NAME** in **WEBAPP-NAME** with some unique alias. It will be used to create a globally unique website using Azure App Service. 1. Read the workflow carefully, comments are provided to help understand. -1. Click on **Commit changes...** on top right and **Commit changes** leaving defaults (changing the main branch). The workflow will get automatically executed. +1. Select **Commit changes...** on top right and **Commit changes** leaving defaults (changing the main branch). The workflow will get automatically executed. ### Review GitHub Workflow execution In this task, you will review the GitHub workflow execution: 1. In a browser window, go back to your **eShopOnWeb** GitHub repository. -1. On the repository page, go to **Actions**, you will see the workflow setup before executing. Click on it. +1. On the repository page, go to **Actions**, you will see the workflow setup before executing. Select it. ![Screenshot of the GitHub workflow in progress.](media/gh-actions.png) -1. Wait for the workflow to finish. From the **Summary** you can see the two workflow jobs, the status and Artifacts retained from the execution. You can click in each job to review logs. +1. Wait for the workflow to finish. From the **Summary** you can see the two workflow jobs, the status and Artifacts retained from the execution. You can select in each job to review logs. ![Screenshot of the successful workflow.](media/gh-action-success.png) -1. In a browser window, go back to the Azure Portal at `https://portal.azure.com`. Open the resource group created before. You will see that the GitHub Action, using a bicep template, has created an Azure App Service Plan + App Service. You can see the published website opening the App Service and clicking **Browse**. +1. In a browser window, go back to the Azure Portal at `https://portal.azure.com`. Open the resource group created before. You will see that the GitHub Action, using a bicep template, has created an Azure App Service Plan + App Service. You can see the published website by opening the App Service and selecting **Browse**. ![Screenshot of the browse WebApp.](media/browse-webapp.png) @@ -159,19 +159,19 @@ In this task, you will use GitHub environments to ask for manual approval before 1. On the repository page, go to **Code** and open the following file: **eShopOnWeb/.github/workflows/eshoponweb-cicd.yml**. 1. In the **deploy** job section, you can find a reference to an **environment** called **Development**. GitHub used [environments](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment) add protection rules (and secrets) for your targets. -1. On the repository page, go to **Settings**, open **Environments** and click **New environment**. -1. Give it **`Development`** name and click on **Configure Environment**. +1. On the repository page, go to **Settings**, open **Environments** and select **New environment**. +1. Give it **`Development`** name and select **Configure Environment**. - > **Note**: If an environment called **Development** already exists in the **Environments** list, open its configuration by clicking on the environment name. + > **Note**: If an environment called **Development** already exists in the **Environments** list, open its configuration by selecting on the environment name. -1. In the **Configure Development** tab, check the option **Required Reviewers** and your GitHub account as a reviewer. Click on **Save protection rules**. -1. Now lets test the protection rule. On the repository page, go to **Actions**, click on **eShopOnWeb Build and Test** workflow and click on **Run workflow > Run workflow** to execute manually. +1. In the **Configure Development** tab, check the option **Required Reviewers** and your GitHub account as a reviewer. Select **Save protection rules**. +1. Now lets test the protection rule. On the repository page, go to **Actions**, select **eShopOnWeb Build and Test** workflow and select **Run workflow > Run workflow** to execute manually. ![Screenshot of the manual trigger workflow.](media/gh-manual-run.png) -1. Click on the started execution of the workflow and wait for **buildandtest** job to finish. You will see a review request when **deploy** job is reached. +1. Select the started execution of the workflow and wait for **buildandtest** job to finish. You will see a review request when **deploy** job is reached. -1. Click on **Review deployments**, check **Development** and click on **Approve and deploy**. +1. Select **Review deployments**, check **Development** and select **Approve and deploy**. ![Screenshot of the Actions approval.](media/gh-approve.png) @@ -185,8 +185,8 @@ When you complete the lab, it's important to clean up your Azure resources to av 1. In the Azure Portal at `https://portal.azure.com`, navigate to the **Resource groups** section. 1. Find and select the **rg-eshoponweb-NAME** resource group you created. -1. On the resource group page, click **Delete resource group**. -1. Type the resource group name to confirm deletion and click **Delete**. +1. On the resource group page, select **Delete resource group**. +1. Type the resource group name to confirm deletion and select **Delete**. 1. Wait for the deletion process to complete. ### Clean up GitHub resources (optional) @@ -195,7 +195,7 @@ If you want to clean up your GitHub repository: 1. Navigate to your **eShopOnWeb** repository on GitHub. 1. Go to **Settings** and scroll down to the **Danger Zone**. -1. Click **Delete this repository** and follow the prompts to confirm deletion. +1. Select **Delete this repository** and follow the prompts to confirm deletion. > **CAUTION:** Deleting the repository will permanently remove all code, issues, pull requests, and other repository data. diff --git a/Instructions/intermediate/07-deploy-docker-containers-azure-app-service.md b/Instructions/intermediate/07-deploy-docker-containers-azure-app-service.md index 5694eb0..a42df2c 100644 --- a/Instructions/intermediate/07-deploy-docker-containers-azure-app-service.md +++ b/Instructions/intermediate/07-deploy-docker-containers-azure-app-service.md @@ -34,13 +34,13 @@ If you don't already have an Azure DevOps organization, follow these steps: 1. Use a private browser session to get a new **personal Microsoft Account (MSA)** at `https://account.microsoft.com` (skip if you already have one). 1. Using the same browser session, sign up for a free Azure subscription at `https://azure.microsoft.com/free` (skip if you already have one). -1. Open a browser and navigate to Azure portal at `https://portal.azure.com`, then search at the top of the Azure portal screen for **Azure DevOps**. In the resulting page, click **Azure DevOps organizations**. -1. Next, click on the link labelled **My Azure DevOps Organizations** or navigate directly to `https://aex.dev.azure.com`. +1. Open a browser and navigate to Azure portal at `https://portal.azure.com`, then search at the top of the Azure portal screen for **Azure DevOps**. In the resulting page, select **Azure DevOps organizations**. +1. Next, select the link labelled **My Azure DevOps Organizations** or navigate directly to `https://aex.dev.azure.com`. 1. On the **We need a few more details** page, select **Continue**. 1. In the drop-down box on the left, choose **Default Directory**, instead of **Microsoft Account**. -1. If prompted (_"We need a few more details"_), provide your name, e-mail address, and location and click **Continue**. -1. Back at `https://aex.dev.azure.com` with **Default Directory** selected click the blue button **Create new organization**. -1. Accept the _Terms of Service_ by clicking **Continue**. +1. If prompted (_"We need a few more details"_), provide your name, e-mail address, and location and select **Continue**. +1. Back at `https://aex.dev.azure.com` with **Default Directory** selected select the blue button **Create new organization**. +1. Accept the _Terms of Service_ by selecting **Continue**. 1. If prompted (_"Almost done"_), leave the name for the Azure DevOps organization at default (it needs to be a globally unique name) and pick a hosting location close to you from the list. 1. Once the newly created organization opens in **Azure DevOps**, select **Organization settings** in the bottom left corner. 1. At the **Organization settings** screen select **Billing** (opening this screen takes a few seconds). @@ -49,9 +49,9 @@ If you don't already have an Azure DevOps organization, follow these steps: > **Note**: You may **wait a couple of minutes before using the CI/CD capabilities** so that the new settings are reflected in the backend. Otherwise, you will still see the message _"No hosted parallelism has been purchased or granted"_. -1. In **Organization Settings**, go to section **Pipelines** and click **Settings**. +1. In **Organization Settings**, go to section **Pipelines** and select **Settings**. 1. Toggle the switch to **Off** for **Disable creation of classic build pipelines** and **Disable creation of classic release pipelines**. -1. In **Organization Settings**, go to section **Security** and click **Policies**. +1. In **Organization Settings**, go to section **Security** and select **Policies**. 1. Toggle the switch to **On** for **Allow public projects**. ### Create and configure the Azure DevOps project (if needed) @@ -80,8 +80,8 @@ If you don't already have an Azure DevOps organization, follow these steps: 1. Leave the web browser window open. 1. Go to **Repos > Branches**. -1. Hover on the **main** branch then click the ellipsis on the right of the column. -1. Click on **Set as default branch**. +1. Hover on the **main** branch then select the ellipsis on the right of the column. +1. Select **Set as default branch**. ## Import and run the CI pipeline @@ -90,11 +90,11 @@ In this section, you will configure the service connection with your Azure Subsc ### Import and run the CI pipeline 1. Go to **Pipelines > Pipelines** -1. Click on **New pipeline** button (or **Create Pipeline** if you don't have other pipelines previously created) +1. Select **New pipeline** button (or **Create Pipeline** if you don't have other pipelines previously created) 1. Select **Azure Repos Git (YAML)** 1. Select the **eShopOnWeb** repository 1. Select **Existing Azure Pipelines YAML file** -1. Select the **main** branch and the **/.ado/eshoponweb-ci-docker.yml** file, then click on **Continue** +1. Select the **main** branch and the **/.ado/eshoponweb-ci-docker.yml** file, then select **Continue** 1. In the YAML pipeline definition, customize: - **YOUR-SUBSCRIPTION-ID** with your Azure subscription ID. @@ -108,15 +108,15 @@ In this section, you will configure the service connection with your Azure Subsc - [**Docker**](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/docker-v0?view=azure-pipelines) **- Build**: Build the Docker image and create two tags (Latest and current BuildID) - **Docker - Push**: Push the images to Azure Container Registry -1. Click on **Save and Run**. +1. Select **Save and Run**. -1. Open the pipeline execution. If you see a warning message "This pipeline needs permission to access a resource before this run can continue to Build", click on **View** and then **Permit** and **Permit** again. This will allow the pipeline to access the Azure subscription. +1. Open the pipeline execution. If you see a warning message "This pipeline needs permission to access a resource before this run can continue to Build", select **View** and then **Permit** and **Permit** again. This will allow the pipeline to access the Azure subscription. > **Note**: The deployment may take a few minutes to complete. -1. Your pipeline will take a name based on the project name. Let's **rename** it for identifying the pipeline better. Go to **Pipelines > Pipelines** and click on the recently created pipeline. Click on the ellipsis and **Rename/move** option. Name it **eshoponweb-ci-docker** and click on **Save**. +1. Your pipeline will take a name based on the project name. Let's **rename** it for identifying the pipeline better. Go to **Pipelines > Pipelines** and select the recently created pipeline. Select the ellipsis and **Rename/move** option. Name it **eshoponweb-ci-docker** and select **Save**. -1. Navigate to the [**Azure Portal**](https://portal.azure.com), search for the Azure Container Registry in the recently created Resource Group (it should be named **AZ400-RG1**). On the left-hand side click **Repositories** under **Services** and make sure that the repository **eshoponweb/web** was created. When you click the repository link, you should see two tags (one of them is **latest**), these are the pushed images. If you don't see this, check the status of your pipeline. +1. Navigate to the [**Azure Portal**](https://portal.azure.com), search for the Azure Container Registry in the recently created Resource Group (it should be named **AZ400-RG1**). On the left-hand side select **Repositories** under **Services** and make sure that the repository **eshoponweb/web** was created. When you select the repository link, you should see two tags (one of them is **latest**), these are the pushed images. If you don't see this, check the status of your pipeline. ## Import and run the CD pipeline @@ -127,11 +127,11 @@ In this section, you will configure the service connection with your Azure Subsc In this task, you will import and run the CD pipeline. 1. Go to **Pipelines > Pipelines** -1. Click on **New pipeline** button +1. Select **New pipeline** button 1. Select **Azure Repos Git (YAML)** 1. Select the **eShopOnWeb** repository 1. Select **Existing Azure Pipelines YAML File** -1. Select the **main** branch and the **/.ado/eshoponweb-cd-webapp-docker.yml** file, then click on **Continue** +1. Select the **main** branch and the **/.ado/eshoponweb-cd-webapp-docker.yml** file, then select **Continue** 1. In the YAML pipeline definition, customize: - **YOUR-SUBSCRIPTION-ID** with your Azure subscription ID. @@ -144,18 +144,18 @@ In this task, you will import and run the CD pipeline. - **AzureResourceManagerTemplateDeployment**: Deploys the Azure App Service using bicep template. - **AzureResourceManagerTemplateDeployment**: Add role assignment using Bicep -1. Click on **Save and Run**. +1. Select **Save and Run**. -1. Open the pipeline execution. If you see a warning message "This pipeline needs permission to access a resource before this run can continue to Deploy", click on **View** and then **Permit** and **Permit** again. This will allow the pipeline to access the Azure subscription. +1. Open the pipeline execution. If you see a warning message "This pipeline needs permission to access a resource before this run can continue to Deploy", select **View** and then **Permit** and **Permit** again. This will allow the pipeline to access the Azure subscription. - > **Important**: If you do not authorize the pipeline when configuring, you will encounter permission errors during execution. Common error messages include "This pipeline needs permission to access a resource" or "Pipeline run failed due to insufficient permissions". To resolve this, navigate to the pipeline run, click **View** next to the permission request, then click **Permit** to grant the necessary access to your Azure subscription and resources. + > **Important**: If you do not authorize the pipeline when configuring, you will encounter permission errors during execution. Common error messages include "This pipeline needs permission to access a resource" or "Pipeline run failed due to insufficient permissions". To resolve this, navigate to the pipeline run, select **View** next to the permission request, then select **Permit** to grant the necessary access to your Azure subscription and resources. > **Note**: The deployment may take a few minutes to complete. > [!IMPORTANT] > If you receive the error message "TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.", you need to uncheck the "Require a minimum number of reviewers" Branch protection rule enabled in the previous labs. -1. Your pipeline will take a name based on the project name. Let's **rename** it for identifying the pipeline better. Go to **Pipelines > Pipelines** and hover on the recently created pipeline. Click on the ellipsis and **Rename/move** option. Name it **eshoponweb-cd-webapp-docker** and click on **Save**. +1. Your pipeline will take a name based on the project name. Let's **rename** it for identifying the pipeline better. Go to **Pipelines > Pipelines** and hover on the recently created pipeline. Select the ellipsis and **Rename/move** option. Name it **eshoponweb-cd-webapp-docker** and select **Save**. > **Note 1**: The use of the **/infra/webapp-docker.bicep** template creates an app service plan, a web app with system assigned managed identity enabled, and references the Docker image pushed previously: **${acr.properties.loginServer}/eshoponweb/web:latest**. @@ -165,7 +165,7 @@ In this task, you will import and run the CD pipeline. 1. In the Azure Portal, navigate to the recently created Resource Group, you should now see three resources (App Service, App Service Plan and Container Registry). -1. Navigate to the App Service, then click **Browse**, this will take you to the website. +1. Navigate to the App Service, then select **Browse**, this will take you to the website. 1. Verify that the eShopOnWeb application is running successfully. Once confirmed, you have completed the lab successfully. @@ -177,8 +177,8 @@ When you complete the lab, it's important to clean up your Azure resources to av 1. In the Azure Portal at `https://portal.azure.com`, navigate to the **Resource groups** section. 1. Find and select the **AZ400-RG1** resource group (or the name you used). -1. On the resource group page, click **Delete resource group**. -1. Type the resource group name to confirm deletion and click **Delete**. +1. On the resource group page, select **Delete resource group**. +1. Type the resource group name to confirm deletion and select **Delete**. 1. Wait for the deletion process to complete. ### Clean up Azure DevOps resources @@ -189,8 +189,8 @@ If you want to delete the project, you can do so by following these steps: 1. In your browser navigate to the Azure DevOps portal at `https://aex.dev.azure.com`. 1. Navigate to the **eShopOnWeb** project you created. -1. On the project settings page, go to **Overview** and click **Delete** at the bottom of the page. -1. Type the project name to confirm deletion and click **Delete**. +1. On the project settings page, go to **Overview** and select **Delete** at the bottom of the page. +1. Type the project name to confirm deletion and select **Delete**. > **CAUTION:** Deleting a project deletes all work items, repositories, builds, and other project artifacts. If you used an existing project for this exercise, any existing resources outside the scope of this exercise will also be deleted. diff --git a/Instructions/intermediate/08-set-up-run-functional-tests.md b/Instructions/intermediate/08-set-up-run-functional-tests.md index a79bccb..39ab3d9 100644 --- a/Instructions/intermediate/08-set-up-run-functional-tests.md +++ b/Instructions/intermediate/08-set-up-run-functional-tests.md @@ -35,21 +35,21 @@ For more information about testing types, see [Test ASP.NET Core MVC apps](https First, you'll create an Azure DevOps project for this lab. 1. In your browser, open your Azure DevOps organization -2. Click **New Project** +2. Select **New Project** 3. Give your project the name **eShopOnWeb** 4. Leave other fields with defaults -5. Click **Create** +5. Select **Create** ## Import the eShopOnWeb Git Repository Next, you'll import the sample repository that contains the application code and test projects. 1. In your Azure DevOps organization, open the **eShopOnWeb** project -2. Click **Repos > Files** -3. Click **Import a Repository** +2. Select **Repos > Files** +3. Select **Import a Repository** 4. Select **Import** 5. In the **Import a Git Repository** window, paste this URL: `https://github.com/MicrosoftLearning/eShopOnWeb.git` -6. Click **Import** +6. Select **Import** The repository is organized this way: @@ -61,8 +61,8 @@ The repository is organized this way: - **tests** folder contains the different test projects (Unit, Integration, Functional) 7. Go to **Repos > Branches** -8. Hover on the **main** branch then click the ellipsis on the right -9. Click **Set as default branch** +8. Hover on the **main** branch then select the ellipsis on the right +9. Select **Set as default branch** ## Setup Tests in CI pipeline @@ -73,12 +73,12 @@ You'll configure a CI pipeline that includes different types of tests. You'll add the YAML build definition that implements Continuous Integration. 1. Go to **Pipelines > Pipelines** -2. Click **New Pipeline** (or **Create Pipeline** if you don't have any pipelines) +2. Select **New Pipeline** (or **Create Pipeline** if you don't have any pipelines) 3. Select **Azure Repos Git (YAML)** 4. Select the **eShopOnWeb** repository 5. Select **Existing Azure Pipelines YAML File** 6. Select the **main** branch and the **/.ado/eshoponweb-ci.yml** file -7. Click **Continue** +7. Select **Continue** The CI definition consists of these tasks: @@ -89,9 +89,9 @@ The CI definition consists of these tasks: - **Publish Artifact - Website:** Publishes the app artifact and makes it available as a pipeline artifact - **Publish Artifact - Bicep:** Publishes the infrastructure artifact and makes it available as a pipeline artifact -8. Click the **Save** button (not **Save and run**) to save the pipeline definition +8. Select the **Save** button (not **Save and run**) to save the pipeline definition -You can find the **Save** button by clicking on the arrow to the right of the **Save and Run** button. +You can find the **Save** button by selecting on the arrow to the right of the **Save and Run** button. ### Add tests to the CI pipeline @@ -122,18 +122,18 @@ You'll add integration and functional tests to the CI Pipeline. Notice that Unit **Functional Tests** are written from the user's perspective and verify the correctness of the system based on its requirements. Unlike integration tests that are written from the developer's perspective to verify that components work correctly together, functional tests validate the system's behavior from an end-user standpoint. -4. Click **Validate and Save** -5. If validation is successful, click **Save** again to commit the changes directly to the main branch +4. Select **Validate and Save** +5. If validation is successful, select **Save** again to commit the changes directly to the main branch ### Check the tests summary Now you'll run the pipeline and examine the test results. -1. Click **Run** -2. From the **Run pipeline** tab, click **Run** again +1. Select **Run** +2. From the **Run pipeline** tab, select **Run** again 3. Wait for the pipeline to start and complete the Build Stage successfully 4. Once completed, the **Tests** tab will appear as part of the pipeline run -5. Click on it to check the summary +5. Select it to check the summary ![Screenshot of the tests summary](media/AZ400_M05_L09_Tests_Summary.png) diff --git a/Instructions/intermediate/09-package-management-azure-artifacts.md b/Instructions/intermediate/09-package-management-azure-artifacts.md index 8d5c5cf..7135511 100644 --- a/Instructions/intermediate/09-package-management-azure-artifacts.md +++ b/Instructions/intermediate/09-package-management-azure-artifacts.md @@ -41,21 +41,21 @@ Key benefits: First, you'll create an Azure DevOps project for this lab. 1. In your browser, open your Azure DevOps organization -2. Click **New Project** +2. Select **New Project** 3. Give your project the name **eShopOnWeb** 4. Leave other fields with defaults -5. Click **Create** +5. Select **Create** ## Import the eShopOnWeb Git Repository Next, you'll import the sample repository that contains the application code. 1. In your Azure DevOps organization, open the **eShopOnWeb** project -2. Click **Repos > Files** -3. Click **Import a Repository** +2. Select **Repos > Files** +3. Select **Import a Repository** 4. Select **Import** 5. In the **Import a Git Repository** window, paste this URL: `https://github.com/MicrosoftLearning/eShopOnWeb.git` -6. Click **Import** +6. Select **Import** The repository is organized this way: @@ -63,8 +63,8 @@ The repository is organized this way: - **src** folder contains the .NET 8 website used in the lab scenarios 7. Go to **Repos > Branches** -8. Hover on the **main** branch then click the ellipsis on the right -9. Click **Set as default branch** +8. Hover on the **main** branch then select the ellipsis on the right +9. Select **Set as default branch** ## Configure the eShopOnWeb solution in Visual Studio @@ -74,12 +74,12 @@ You'll configure Visual Studio to prepare for the lab. > **Note**: You can access the project page directly by navigating to the https://dev.azure.com/``/eShopOnWeb URL, where the `` placeholder represents your Azure DevOps Organization name. -2. In the vertical menu on the left side of the **eShopOnWeb** pane, click **Repos** -3. On the **Files** pane, click **Clone** +2. In the vertical menu on the left side of the **eShopOnWeb** pane, select **Repos** +3. On the **Files** pane, select **Clone** 4. Select the drop-down arrow next to **Clone in VS Code**, and in the dropdown menu, select **Visual Studio** -5. If prompted whether to proceed, click **Open** +5. If prompted whether to proceed, select **Open** 6. If prompted, sign in with the user account you used to set up your Azure DevOps organization -7. Within the Visual Studio interface, in the **Azure DevOps** pop-up window, accept the default local path (C:\eShopOnWeb) and click **Clone** +7. Within the Visual Studio interface, in the **Azure DevOps** pop-up window, accept the default local path (C:\eShopOnWeb) and select **Clone** 8. This will automatically import the project into Visual Studio 9. Leave Visual Studio window open for use in your lab @@ -97,25 +97,25 @@ You'll learn how to work with Azure Artifacts using the following steps: A feed is a collection of packages. You'll create a feed to store your NuGet packages. 1. In the web browser window displaying your Azure DevOps project, in the vertical navigational pane, select the **Artifacts** icon -2. With the **Artifacts** hub displayed, click **+ Create Feed** at the top of the pane +2. With the **Artifacts** hub displayed, select **+ Create Feed** at the top of the pane > **Note**: This feed will be a collection of NuGet packages available to users within the organization and will sit alongside the public NuGet feed as a peer. 3. On the **Create new feed** pane, in the **Name** textbox, type **eShopOnWebShared** 4. In the **Visibility** section, select **People in my organization** 5. In the **Upstream sources** section, select **Include packages from common public sources** -6. Click **Create** +6. Select **Create** > **Note**: Any user who wants to connect to this NuGet feed must configure their environment. -7. Back on the **Artifacts** hub, click **Connect to Feed** +7. Back on the **Artifacts** hub, select **Connect to Feed** 8. On the **Connect to feed** pane, in the **NuGet** section, select **Visual Studio** and copy the **Source** URL 9. Switch back to the **Visual Studio** window -10. In the Visual Studio window, click **Tools** menu header and, in the dropdown menu, select **NuGet Package Manager** and, in the cascading menu, select **Package Manager Settings** -11. In the **Options** dialog box, click **Package Sources** and click the plus sign to add a new package source +10. In the Visual Studio window, select **Tools** menu header and, in the dropdown menu, select **NuGet Package Manager** and, in the cascading menu, select **Package Manager Settings** +11. In the **Options** dialog box, select **Package Sources** and select the plus sign to add a new package source 12. At the bottom of the dialog box, in the **Name** textbox, replace **Package source** with **eShopOnWebShared** 13. In the **Source** textbox, paste the URL you copied from Azure DevOps -14. Click **Update** and then **OK** +14. Select **Update** and then **OK** > **Note**: Visual Studio is now connected to the new feed. @@ -123,25 +123,25 @@ A feed is a collection of packages. You'll create a feed to store your NuGet pac You'll create a custom NuGet package and publish it to the feed. -1. In the Visual Studio window you used to configure the new package source, in the main menu, click **File**, in the dropdown menu, click **New** and then, in the cascading menu, click **Project** -2. On the **Create a new project** pane of the **New Project** dialog box, in the list of project templates, locate the **Class Library** template, select the **Class Library (.NET Standard)** template, and click **Next** -3. On the **Configure your new project** pane of the **New Project** dialog box, specify the following settings and click **Create**: +1. In the Visual Studio window you used to configure the new package source, in the main menu, select **File**, in the dropdown menu, select **New** and then, in the cascading menu, select **Project** +1. On the **Create a new project** pane of the **New Project** dialog box, in the list of project templates, locate the **Class Library** template, select the **Class Library (.NET Standard)** template, and select **Next** +1. On the **Configure your new project** pane of the **New Project** dialog box, specify the following settings and select **Next**: - Project name: **eShopOnWeb.Shared** - Location: accept the default value - Solution: **Create new solution** - Solution name: **eShopOnWeb.Shared** -4. Click **Create** -5. In the Visual Studio interface, in the **Solution Explorer** pane, right-click **Class1.cs**, in the right-click menu, select **Delete**, and, when prompted for confirmation, click **OK** -6. Press **Ctrl+Shift+B** or **right-click on the eShopOnWeb.Shared project** and select **Build** to build the project +1. In the **Additional information** dialog box, select the framework **.NET 8.0 (Long Term Support)**, then select **Create**. +1. In the Visual Studio interface, in the **Solution Explorer** pane, right-click **Class1.cs**, in the right-click menu, select **Delete**, and, when prompted for confirmation, select **OK** +1. Press **Ctrl+Shift+B** or **right-click on the eShopOnWeb.Shared project** and select **Build** to build the project > **Note**: Next you'll use MSBuild to generate a NuGet package directly from the project. This approach is common for shared libraries to include all the metadata and dependencies in the package. -7. Switch to the Azure DevOps web portal and navigate to the **Artifacts** section -8. Click on the **eShopOnWebShared** feed -9. Click **Connect to Feed** and select **NuGet.exe** under the **NuGet** section -10. Copy the **Project setup** commands for later use +1. Switch to the Azure DevOps web portal and navigate to the **Artifacts** section +1. Select the **eShopOnWebShared** feed +1. Select **Connect to Feed** and select **NuGet.exe** under the **NuGet** section +1. Copy the **Project setup** commands for later use ### Publish the package using dotnet CLI @@ -179,8 +179,8 @@ You'll use the .NET CLI to pack and publish your package. ``` 10. Switch back to the Azure DevOps web portal displaying the **Artifacts** tab -11. Click **Refresh** -12. In the list of packages, click the **eShopOnWeb.Shared** package +11. Select **Refresh** +12. In the list of packages, select the **eShopOnWeb.Shared** package 13. On the **eShopOnWeb.Shared** pane, review its metadata ### Import a NuGet package @@ -189,17 +189,17 @@ You'll now import the package you created into another project. 1. Switch back to Visual Studio 2. In the **Solution Explorer**, right-click on the **eShopOnWeb.Shared** solution and select **Add > New Project** -3. Select **Console App (.NET Core)** template and click **Next** +3. Select **Console App (.NET Core)** template and select **Next** 4. Configure the project: - Project name: **eShopOnWeb.Shared.Client** - Location: accept the default value - Solution: **Add to solution** -5. Click **Create** +5. Select **Create** 6. In the **Solution Explorer**, right-click on the **eShopOnWeb.Shared.Client** project and select **Manage NuGet Packages** -7. In the **NuGet Package Manager** pane, click the **Browse** tab +7. In the **NuGet Package Manager** pane, select the **Browse** tab 8. In the **Package source** dropdown, select **eShopOnWebShared** 9. In the search box, type **eShopOnWeb.Shared** and press Enter -10. Select the **eShopOnWeb.Shared** package and click **Install** +10. Select the **eShopOnWeb.Shared** package and select **Install** 11. Accept any license agreements if prompted 12. The package is now installed and can be used in your project @@ -208,7 +208,7 @@ You'll now import the package you created into another project. You'll update the package by modifying the original project and publishing a new version. 1. In the **Solution Explorer**, right-click on the **eShopOnWeb.Shared** project and select **Add > Class** -2. Name the class **ProductHelper** and click **Add** +2. Name the class **ProductHelper** and select **Add** 3. Add some sample code to the class: ```csharp @@ -253,9 +253,9 @@ You'll update the package by modifying the original project and publishing a new 1. Switch back to Visual Studio 2. In the **Solution Explorer**, right-click on the **eShopOnWeb.Shared.Client** project and select **Manage NuGet Packages** -3. Click the **Updates** tab +3. Select the **Updates** tab 4. You should see that **eShopOnWeb.Shared** has an update available -5. Select the package and click **Update** +5. Select the package and select **Update** 6. Accept any license agreements if prompted 7. The package is now updated to the latest version