Archive

Archive for the ‘Azure’ Category

Azure DevOps (ADO) | Pipelines | Publish and Access Build Artifacts from Staging Directory

September 23, 2021 Leave a comment

In this article, Lets see how to Publish and Access Build Artifacts using ADO Pipeline.

What are Build Artifacts:

  • Build artifacts are the files generated by your build.
  • In ADO Pipelines, We can use Build.ArtifactStagingDirectory Predefined Variable, on the agent where any artifacts are copied to.

Below are the steps to Publish and Download the Build Artefacts in a ADO Pipeline.

Steps to Publish the Build Artefacts:

  • Lets see how to Publish a file to Build Artifacts folder, using following ‘Power Platform Export Solution’ Task.
  • In the below Task, I am exporting a Solution from CRM Instance and publishing as $(Build.ArtifactStagingDirectory)\$(SolutionName)_managed.zip by using the ‘Solution Output File’ property.
  • In the above the ‘Solution Output File’ property, $(SolutionName) is my custom defined ‘Pipeline Variable’ contains Solution name.
    • ‘ALM_Base’ is my Dynamics Instance Solution name.
  • And $(Build.ArtifactStagingDirectory) is Predefined Variable.
  • Once the pipeline runs successfully, you can download the published artefacts (i.e., Solution folder) as follows.

Steps to Download the Build Artefacts:

  • Go to Pipeline Runs and select the last run.
  • Click on the below highlighted link.
  • Select the folder you want to download.
  • We also have an option to commit these files to Git using ‘Command Line Script’ task.

🙂

Categories: DevOps Tags: , ,

Azure DevOps (ADO) | Pipeline failure | You need the Git ‘GenericContribute’ permission

September 17, 2021 Leave a comment

While pushing the code to Repo using ‘Command Line Script’ task in ADO pipeline, got the following permission issue.

  • Following is the script used in ‘Command Line Script’ task to push the code to main branch.
echo commit all changes
git config user.email "rajeevpentyala@live.com"
git config user.name "Rajeev Pentyala"
git checkout main
git add --all
git commit -m "solution init"

echo push code to new repo
git  -c http.extraheader="AUTHORIZATION: bearer $(System.AccessToken)" push origin main

Reason for the issue:

  • Account under which the ADO pipeline running, does not have required permissions to Push the code.

Fix:

  • Go to Settings -> Repositories
  • Under ‘Security’ tab, select the ‘ALM Build Service(User_Name)‘ and grant highlighted privileges.

🙂

Azure DevOps (ADO) | Pipeline failure | Failed to connect to Dataverse

September 16, 2021 Leave a comment

One of my ADO pipelines ‘Power Platform Publish Customizations’ task failed with “Failed to connect to Dataverse” error.

Reason:

  • ‘Power Platform Publish Customizations’ task’s ‘Authentication type’ was selected as ‘Username/password’ which does not have MFA support.
  • MFA (Multi Factor Authentication) was enabled on the Environment, which I was trying to connect from the Pipeline.
  • Since the ‘Power Platform Publish Customizations’ task’s ‘Authentication type’ was selected as ‘Username/password’ which does not support MFA, pipeline could not connect to the Dataverse environment.

Fix:

  • Create an ‘Application User’ by completing App Registration in Azure Active Directory and grant a Security Role.
  • In the ADO pipeline’s ‘Power Platform Publish Customizations’ task, select ‘Authentication type’ as ‘Service Principal’.
  • Make sure the ‘Service Connection’ configured properly with Azure App Registration details (i.e., Tenant ID, Application ID and Client Secret).
    • My connection name is ‘SP_ExpAugust21’ and details are as follows.
  • Save and run the pipeline and it should work now.

🙂

Azure DevOps (ADO) | Pipeline failure | Could not get the latest source version

September 15, 2021 1 comment

I’ve created a new ADO project and configured a Pipeline to export Power Apps solution. While running the Pipeline it failed in immediately with following exception.

The pipeline is not valid. Could not get the latest source version for repository…

Reason:

  • Under the ‘Get sources’ step of the Pipeline, ‘Default branch for manual and scheduled builds’ was auto selected as master.
  • However my existing Branch Name was main.
What is the difference between master and main branches:
  • In ADO, default ‘Branch Name’ used to be master until October 2020. Post that default ‘Branch Name’ changed to main.
  • This Branch name change was not taken affect in Pipelines. New Pipeline defaults the Branch Name to master which is invalid. It has to be main.
  • Refer this ADF product blog for more details.

Fix:

  • In the ‘Get sources’ step of the pipeline, change the Default Branch from master to main.
  • Save and Rerun the pipeline.

🙂

Categories: Azure, CRM Tags: , , ,

Azure DevOps – Unable to ‘Pull’ changes from Visual Studio

I have an Azure DevOps Repo cloned to VS 2017 and ‘Pull’ command was not download and merging the remote repo.

‘Pull’ command update the code in your local repo with the changes from other members of your team. To know more about ‘Pull’ command refer here

Following steps worked as workaround for me.

  • Download and install the Git tools from here
  • From the Visual Studio’s ‘Team Explorer’, go to ‘Sync’.

git_5

  • From ‘Actions’ menu select ‘Open Command Prompt’, which opens up ‘Command Prompt’ where we can run ‘git’ commands.

git_

  • Run the command ‘git pull origin master‘ to fetch and merge the chages of other team members from the default repo ‘Master’. Change the repo name if you want.
  • System would fetch all the code commits by your team members and merge to your local repo.

git_3

  • Run the command again to make sure all the commits were merged to your local repo. You would get ‘Already up to date.’ message as below.

git_4

🙂

Categories: Azure Tags: , ,

Azure DevOps – Getting started by committing a C# console project to Repo and set Policies

February 23, 2019 Leave a comment

Those who are hearing ‘Azure DevOps Services’ for the first time, its formerly known as ‘Visual Studio Team Services (VSTS)’.

And Team Foundation Server (TFS) is now called ‘Azure DevOps Server’.

Below table gives the glimpse of how VSTS features represents in Azure DevOps.

DevOps_14

To know more about Azure DevOps refer this link

In this article, I am going provide the steps to sign-up for ‘Azure DevOps’ and explain how to on board a C# console project.

Pre-Requisite:

  • Microsoft account.
    • You can also use your 30 days trail Dynamics Account to login.
    • If you’re a Visual Studio subscriber and you get Azure DevOps as a benefit, use the Microsoft account associated with your subscription

Sign up for Azure DevOps:

  • Navigate to the VS Portal and click on ‘Get started for free’ as highlighted below

DevOps_15

  • Log in with your ‘Microsoft Account’

DevOps_1

  • Once you complete the registration, you will be redirected to Azure DevOps portal.

DevOps_2

  • A new Organization would have got created by now and to sign in to your organization at any time, go to https://dev.azure.com/{yourorganization}.

Create a New Project:

Once you got your Organization ready, next you need to create a new ‘Project’.

  • On the ‘Create a Project to get started’ form, provide your project name and set the Visibility.
    • Set the Visibility to ‘Private’ if you are working on a customer project which you would not want to expose to Public.
    • ‘Public’ visibility is meant for Open Source projects.

DevOps_17

  • Under ‘Advanced’ tab, I am going with ‘Git’ as my Version Control and ‘Agile’ as Work item process.
  • Your ready with Project and we are close to on board our C# console project.

Repos:

After you create a new Organization and Project, you can begin coding with Git using Repos.

  • Click on ‘Repos’.
  • As a first step in Repos, add ‘README’ or ‘gitignore’, as shown in below.Note that this step is optional but very effective house keeping step.
    • README – You can provide description and objective of your project.
    • gitignore – Will ignore unwanted files to be added to repos.
      • As an example you don’t need components like (Actual nuGet packages, .suo files which comes with VS).
      • I’ve added ‘VisualStudio’ option to the ‘gitignore’ which ignores all unwanted VS files.

DevOps_3

  • Click ‘Initialize’
  • Now you would see 2 files added to your Repo.
  • As mentioned, ‘.gitignore’ contain unwanted file extensions, auto populated. You can add/remove if you want.

DevOps_4

  • ‘README.md’, is a Mark Down file which is a combination of Text and HTML tags. Add your project description.
    • Denotes <H1> tag; ## denotes <H2> tag.

DevOps_5

Clone the Repo to your computer:

To work with a Git repo, you clone it to your computer. Cloning a repo creates a complete local copy of the repo for you to work with.

In this article, I am going to use ‘Visual Studio’ to Clone the Repo. You can also use ‘Command line’ commands using ‘Command Prompt’

  • Click ‘Clone’ and select ‘Clone in Visual Studio’ option under ‘IDE’.

DevOps_6

  • Now Visual Studio opens up and you might need to provide your Microsoft Account credentials.
  • In case if you get ‘Unauthorization’ error, you can connect as below from your VS ‘Team Explorer’.

DevOps_16

  • Once you complete the clone, the 2 files (i.e., .gitignore, README.md) would synced to your computer folder.

Commit C# Console Project to Repo:

Once you Cloned of your DevOps ‘Project’ to your local computer folder, below are the steps to add a new C# console project to Repo.

  • Create a new C# console application project and save at the same folder location where you cloned your Azure Project.
  • Now you would see the Console project in your Visual Studio.
  • You would notice #5 in the Visual Studio footer, which denotes 5 new files are new and not synced to your Repo.

DevOps_7

  • You need to commit the files to sync with your Repo.
  • Click on #5 icon and provide mandatory ‘Commit comments’ and choose ‘Commit All and Push’ option to commit and upload the C# console project to Repo.

DevOps_8

  • Now, go to your Azure DevOps portal and you would see your C# console project.

DevOps_9

  • You can also Edit the class files directly from DevOps portal.

Branch Policies:

As you would have noticed, Visual Studio did not allow me to commit the files until I provide the ‘Comments’. Its a policy implied by default by DevOps.

Lets see how to configure the policies.

  • Once you create a new Project, DevOps will create a default ‘master’ branch.
    • Refer article for more details on ‘Branch’.
  • Under Repos->Branches, select ‘Branch Policies’ from the Branch menu.

DevOps_10

  • You can configure appropriate policies mainly to improve the code quality.
    • Refer link to know more details on Policies.

DevOps_11

Grant access on Project to Users:

For every new project you add to DevOps Organization, a new Team gets created with naming convention {Project Name} Team.

  • Click on ‘Teams’ tab as shown in screen below and pick your Project team.
  • ‘+Add’ to add users

DevOps_13.PNG

  • Refer this link to know more details on managing Teams.

Service Hooks:

  • Service hooks let you run tasks on other services when events happen in your Azure DevOps Services projects.
  • For example, you can create an entry in Azure Service Bus when there Code commit happens.

DevOps_12

  • Refer this article for more details on ‘Service Hooks’

In my next article I will share the details on how to implement Build activities using Pipelines

🙂

[Logic App and HTTP Request Trigger] Create a record in D365

December 20, 2018 Leave a comment

We got an ask from client that they should be able to Insert contacts in D365 from their Java application and requested our help.

To fulfill the ask, one option would be configuring S2S authentication so that Java application can connect to D365 using ADAL library and insert contacts.

Another option is using “Logic App” with “Http Request Trigger”.

High level approach:

  • Create a Logic App with ‘When a HTTP request is received’ trigger
  • Pass Contact record information in Json format as Request
    • Use ObjGen site to generate desired Json data.
    • This site seamlessly generates Json data based on our input. As I am going to create a Contact record, I generated below JSon data.

LogicApp_3

  • From Logic App, read the Json data and create Contact record using D365 connector
  • Finally capture the created Contact GUID in ‘Response’

Lets see the step by step approach to create Logic App and test.

Pre-requisites:

  • Dynamics 365 instance. Subscribe for trail if you have’t already
  • Azure Subscription.Subscribe for trail if you have’t already

Once you got the D365 and Azure Portal subscriptions below are the steps to create LogicApp.

Create a Logic App:

  • Connect to your Azure Portal and create a new ‘Logic Apps’. Refer article for steps to create Logic App.
  • From the list select ‘When a HTTP request is received’ trigger

LogicApp_4

  • In the next screen, click on “Use sample payload to generate schema” to generate the Json schema.

LogicApp_5

  • Paste the Json format prepared in ObjGen site

LogicApp_6

  • Click on ‘Done’ so that LogicApp generates “Request Body jSON Schema”

LogicApp_7

  • Next, we need to connect to D365 to save the Contact

LogicApp_8

  • Click ‘New Step’ and select ‘Dynamics 365’ connector. From the ‘Actions’ select ‘Create a new record’ and provide credentials and connect to your Instance

LogicApp_9

  • From the ‘Entity Name’, select ‘Contacts’
  • Map the Contact entity fields with the fields from ‘Dynamic content’ popup.
    • As ‘Company Name’ is a Look up to ‘Account’ entity, make sure you map
      • ‘Company Name Type’ = ‘accounts’
      • ‘Company Name’ = ‘id’ passed from Json

LogicApp_10

  • Next we need to capture the ‘Response’, choose ‘Response’ from ‘Actions’

LogicApp_11

  • In the ‘Response’ control,
    • In the ‘Headers’, add ‘Content-Type’ as key and ‘application/json’ as Value.
    • In the ‘Body’, form your output string and ‘Contact’ field from ‘Dynamic Content’ to capture the GUID

LogicApp_12

  • Save the Logic App

Test the Logic App:

  • Copy the “HTTP POST URL” from the “When a HTTP request is received” control.

LogicApp_13

Using Post Man:

  • Create a ‘POST’ request and paste the URL copied from Logic APP
  • In the ‘Headers’, add ‘Content-Type’ as key and ‘application/json’ as Value.

LogicApp_14

  • In the ‘Body’, paste the Json (You can copy the Json format prepared in ObjGen site)
  • Click ‘Send’ to call Logic App and capture the Response.

LogicApp_2

Using jScript and HTML:

  •  Below the jScript to call the Logic APP URL by passing JSon and capture the response

<html lang=”en” xmlns=”http://www.w3.org/1999/xhtml”&gt;
<head>
<meta charset=”utf-8″ />
<title>Test Logic App</title>

function TestLogicApp() {
try {
var xhr = new XMLHttpRequest();
var url = “Logic App URL“;
xhr.open(“POST”, url, true);
xhr.setRequestHeader(“Content-Type”, “application/json”);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
alert(xhr.responseText);
}
};
var data = JSON.stringify({
“firstname”: “Rajeev”,
“lastname”: “Pentyala”,
“Account”: {
“id”: “A16B3F4B-1BE7-E611-8101-E0071B6AF231”,
“Name”: “A Datum Corporation”
}
});
xhr.send(data);
} catch (e) {
alert(“Error – ” + e.description);
}
}

</head>
<body>
<input type=”button” value=”Post” onclick=”TestLogicApp()” />
</body>
</html>

  • Open the HTML page and click the ‘Post’ button to capture the Response returned from LogicApp

LogicApp_1

Troubleshoot and track the history:

  • To troubleshoot and track the Requests, from the ‘Logic App’, click on ‘Overview’ and check under ‘Run history’

LogicApp_15

🙂

Web API Helper Code Compilation Error

September 18, 2018 Leave a comment

I was creating a console application to connect to Dynamics 365 Web API, and downloaded “Microsoft.CrmSdk.WebApi.Samples.HelperCode” NuGet package.

Compilation Error_1

I got “AcquireToken method is no longer available” compilation error, when I build the project

Compilation Error

Reason & Fix:

  • We have to use UserPasswordCredential class in ADAL v3.
  • Below is the code snippet

var credentials = new UserPasswordCredential(userName, password);
var context = new AuthenticationContext(authorityUri);
authResult = context.AcquireTokenAsync(serviceUrl, applicationId, credentials).Result;

Refer my previous article for step by step to connect to Dynamics 365 Web API.

🙂

[Step by Step] Restore a Database from Azure Blob to Azure SQL Server

In one of the requirements, we had to move a Database uploaded to ‘Azure Blob Storage’ to Azure SQL Server.

If you got a question, why we need to move SQL Database file from Azure Blob to Azure SQL Server, like me, below is a sample scenario

  • Customer IT team, uploads their Database file to Azure Blob storage every week using AZcopy
  • To consume the Data, we either have to restore the Database file to Azure SQL Server or to your local SQL server.

Below are the steps to restore Database file from Azure Blob to Azure SQL Server.

Prerequisites:

  • Azure Subscription
  • Create a ‘Storage Account’ with ‘Blob’. Refer my previous article for steps to create
  • Database file uploaded in Azure Blob Storage

ABlob_1

  • SQL Server Management Studio (SSMS), as I am going to use this tool in next steps.

Steps to restore Database from Blob to Azure SQL Server:

  • Connect to ‘Azure SQL Server’ using SQL Server Management Studio (SSMS)
  • Right click on ‘Databases’ and choose ‘Import Data-tier Application…’

ABlob_3

  • In ‘Import Settings’ tab of the ‘Import Data-tier Application’ window
    • Select ‘Import from Windows Azure’
    • Click ‘Connect…’
    • Provide ‘Azure Storage account’ name
    • Account Key
    • Click ‘Connect’
    • In the next window, pick the Azure Database back up file upload in the Blob and click ‘OK’

ABlob_4

  • In ‘Database Settings’ tab, provide the ‘New database name’ and click ‘Next’

ABlob_5

  • That’s it, now the Restore process should start with ‘Progress’ window.
  • Give it some time and once the process completed, you will see ‘Success’ Status

ABlob_2

🙂

Dynamics 365 – Using WebHooks to post data from Plugin to Azure Function

July 15, 2018 2 comments

In my previous articles, I detailed the steps to create ‘Azure Functions’ and executing D365 SDK messages from ‘Azure Function’.

In this article, lets see how we fulfill Integration requirements using WebHooks model by submitting data to external WebAPIs and Services from D365.

What is a WebHook:

  • Webhooks is a lightweight HTTP pattern for connecting Web APIs and services with a publish/subscribe model.
  • Webhook senders notify receivers about events by making requests to receiver endpoints with some information about the events.

In this article, I am going to send data from Dynamics Plug-in to Azure Function using WebHooks model. So Plug-in acts as Webhook Sender and Azure Function acts as Receiver.

Below are the steps to create Azure Function and call Function from Plug-in by passing data.

Steps to create Azure Function:

  • Refer Create Azure Function article to create Azure Function Apps.
  • Create a new ‘Azure Function’ of type ‘Generic webhook’

wh1

  • Add below logic to Azure function which captures and logs the content posted from Plug-in

wh2

Get Azure Function URL:

Copy the ‘Azure Function’ URL along with key which will be used to communicate from Plugin.

  • Click on ‘Get function URL’ link and click ‘Copy’ to copy the URL

wh3

  • URL will have 3 parts
    • Endpoint URL
    • Code
    • ClientId
  • We would use only below 2 highlighted values while registering Plug-in.

wh4

Registering a WebHook:

  • Connect to Dynamics instance from Plug-in Registration tool
  • Click on ‘Register New Web Hook’

wh5

  • In the ‘WebHook Reistration’ page
    • Set ‘Endpoint URL’ as the ‘Endpoint URL’ value copied from ‘Azure Function URL’
    • Click ‘Add Property’
      • Set ‘Key’ as ‘x-functions-key’
      • Set ‘Values’ as ‘Code’ copied from ‘Azure Function URL’

wh6

Register Plug-in Step on WebHook

  • Register a Plug-in step on WebHook assembly

wh7

  • Create a step on ‘PostAccountCreation’

wh8

Test the WebHook:

  • Create an Account from D365
  • Check the Logs in Azure Function’s ‘Logs’ tab

🙂

 

Categories: Azure, CRM Tags: , ,