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.