Messaging mit dem Service Bus ermöglicht die...

Read more

Sebastian Meyer, Microsoft & SAP...

Read more

Für Entwickler, Architekten, Projektleiter und...

Read more

In der Welt der Softwareentwicklung ist die...

Read more

QUIBIQ spendet für den guten Zweck – und für...

Read more

Eine bestimmte Antwort auf einen HTTP Request zu...

Read more

In einer Welt, die von stetigem Wandel geprägt...

Read more

In einem unserer Kundenprojekte, war das Ziel eine...

Read more

QUIBIQ Hamburg wird mit dem Hamburger...

Read more

Zwei Tage lang wurde vom 14.-15.11 wieder das...

Read more

How-to: Wie man eine Visual Studio Code-Extension entwickeln kann, die im Azure Portal erstellte Logic App (Standard) Workflows runterlädt und in ein Workflow-Projekt integriert

Ausgangslage: Es wurden diverse Logic App Workflows im Azure Portal Designer zusammengeklickt. Das Ganze ist in der Development Umgebung passiert. Jetzt sollen diese Workflows aber auf Staging und Production deployed werden...

Man kann nun den Code der einzelnen Workflows als workflow.json Dateien herunterladen und in ein Logic App Workflow Projekt integrieren. Das ist aber gerade bei vielen Workflows sehr unhandlich. Außerdem müssen zusätzlich die Parameter und Connections in die anderen Umgebungen übernommen werden. Diese werden ebenfalls als parameters.json und connections.json heruntergeladen.

Lösung

Wir bauen uns eine Visual Studio Code-Extension um diesen Prozess zu vereinfachen. Dafür nutzen wir den Generator namens  „yo“. Dazu muss man yo und den VS Code-Generator mit npm installieren:

npm i -g yo generator-code

Nun kann man mit yo code den Generator starten und sich durch den Assistenten navigieren, wobei wir New Extension (TypeScript) wählen:

Wie man genau eine Extension aufbaut, findet sich u.a. hier in der offiziellen Dokumentation.
Anschließend installieren wir folgende Azure-Packages:

npm i @azure/identity-vscode @azure/arm-subscriptions @azure/identity @azure/ms-rest-nodeauth

Die Lösung sieht dann so aus, dass wir per API (SubscriptionClient) auf das File-System der Logic App zugreifen und uns dort alle notwendigen Dateien rekursiv in das lokale Projekt downloaden.

 

public static importLogicApp = async (tenantId: string, logicAppUri: string, fileSystem: FileSystem,
    rootWorkspacePath: string): Promise<void> => {
 const subscriptionClient = new SubscriptionClient(new Token(tenantId));
    const baseUrl = `${logicAppUri}/hostruntime/admin/vfs/site/wwwroot`;

    await this.importImpl(subscriptionClient, baseUrl, fileSystem, rootWorkspacePath, "");
  };

  private static importImpl = async (client: SubscriptionClient, baseUrl: string, fileSystem: FileSystem,
    rootWorkspacePath: string, remoteFolder: string) => {
    const rootFolder = await client.sendRequest({
      pathTemplate: `${baseUrl}${remoteFolder.replace("//", "/")}`,
      method: "GET",
      queryParameters: { "api-version": "2021-03-01" }
    });
    const parsedBody = rootFolder.parsedBody;
    if (!parsedBody) {
      return;
    }
    await Promise.all(parsedBody.map(async (file: any) => {
      if (file.mime === "inode/directory") {
        await LogicAppApi.importImpl(client, baseUrl, fileSystem, rootWorkspacePath, `/${remoteFolder}/${file.name}`);
      } else {
        try {
          const rf = remoteFolder.replace("//", "/");
          const rfile = `/${rf}/${file.name}`.replace("//", "/");
          const fileContent = await client.sendRequest({
            pathTemplate: `${baseUrl}${rfile}`,
            method: "GET",
            queryParameters: { "api-version": "2021-03-01" }
          });

          const localDir = posix.join(rootWorkspacePath, rf);
          await fileSystem.createDirectory(Uri.file(localDir));
          const localFile = posix.join(rootWorkspacePath, rfile);
          await fileSystem.writeFile(Uri.file(localFile), Buffer.from(fileContent.bodyAsText!));
        }

        catch (e) {
          console.log(e);
        }

      }
    }));
  };


Verwendung

Um die entwickelte Extension zu nutzen, erstellen wir zunächst ein neues Logic App Workflow-Projekt in Visual Studio Code. Dazu benötigt man die „Azure Logic Apps (Standard)“ Extension aus dem Visual Studio Marketplace.

Nun ruft man mit STRG+SHIFT+P die Command Palette auf und erstellt ein neues Logic App Projekt:

Anschließend faltet sich folgende Projektstruktur auf, wobei „Stateful1“ der erste automatisch angelegte Workflow ist. Diesen können wir löschen.

Ab hier kann unsere neue Extension genutzt werden. Dazu rufen wir wieder die Command-Palette auf (STRG+SHIFT+P) und suchen nach unserem neuen Befehl:

Im nächsten Schritt wählen wir den Tenant, die Subscription und die Logic App aus, aus dem die Workflows importiert werden sollen. Die Authentifizierung erfolgt dabei durch die Azure Account Extension, die durch die Logic Apps Extension ebenfalls installiert wird.

Anschließend werden die Workflows inklusive der Parameter und den Connections importiert:

Fertig ist die Extension!

Wenn man dann nicht nur einen, sondern viele Workflows hat, ist das eine sehr gute Zeitersparnis.

Dieser quiteq-Tipp kommt von Marco Wiedemeyer, QUIBIQ Hamburg.

© QUIBIQ GmbH · Imprint · Data protection