Skip to content

Commit

Permalink
Add publishing of webview content to pipeline (#80069)
Browse files Browse the repository at this point in the history
* Experimental publish step of webview contents

* Move webview publish into product compile

* Move test step first

* More script after install

* Move script after build

* Debug

* Add env var

* Don't log env
  • Loading branch information
mjbvz authored Aug 29, 2019
1 parent 7e5adb5 commit 8065712
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 0 deletions.
9 changes: 9 additions & 0 deletions build/azure-pipelines/common/publish-webview.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/usr/bin/env bash
set -e
REPO="$(pwd)"

# Publish webview contents
PACKAGEJSON="$REPO/package.json"
VERSION=$(node -p "require(\"$PACKAGEJSON\").version")

This comment has been minimized.

Copy link
@joaomoreno

joaomoreno Sep 5, 2019

Member

@mjbvz Are these two lines necessary?

This comment has been minimized.

Copy link
@joaomoreno

joaomoreno Sep 5, 2019

Member

Even, is this script necessary? Can we just call the JS from the Yaml?


node build/azure-pipelines/common/publish-webview.js "$REPO/src/vs/workbench/contrib/webview/browser/pre/"
87 changes: 87 additions & 0 deletions build/azure-pipelines/common/publish-webview.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import * as azure from 'azure-storage';
import * as mime from 'mime';
import * as minimist from 'minimist';
import { basename, join } from 'path';

const fileNames = [
'fake.html',
'host.js',
'index.html',
'main.js',
'service-worker.js'
];

async function assertContainer(blobService: azure.BlobService, container: string): Promise<void> {
await new Promise((c, e) => blobService.createContainerIfNotExists(container, { publicAccessLevel: 'blob' }, err => err ? e(err) : c()));
}

async function doesBlobExist(blobService: azure.BlobService, container: string, blobName: string): Promise<boolean | undefined> {
const existsResult = await new Promise<azure.BlobService.BlobResult>((c, e) => blobService.doesBlobExist(container, blobName, (err, r) => err ? e(err) : c(r)));
return existsResult.exists;
}

async function uploadBlob(blobService: azure.BlobService, container: string, blobName: string, file: string): Promise<void> {
const blobOptions: azure.BlobService.CreateBlockBlobRequestOptions = {
contentSettings: {
contentType: mime.lookup(file),
cacheControl: 'max-age=31536000, public'
}
};

await new Promise((c, e) => blobService.createBlockBlobFromLocalFile(container, blobName, file, blobOptions, err => err ? e(err) : c()));
}

async function publish(commit: string, files: readonly string[]): Promise<void> {

console.log('Publishing...');
console.log('Commit:', commit);
const storageAccount = process.env['AZURE_WEBVIEW_STORAGE_ACCOUNT']!;

const blobService = azure.createBlobService(storageAccount, process.env['AZURE_WEBVIEW_STORAGE_ACCESS_KEY']!)
.withFilter(new azure.ExponentialRetryPolicyFilter(20));

await assertContainer(blobService, commit);

for (const file of files) {
const blobName = basename(file);
const blobExists = await doesBlobExist(blobService, commit, blobName);
if (blobExists) {
console.log(`Blob ${commit}, ${blobName} already exists, not publishing again.`);
continue;
}
console.log('Uploading blob to Azure storage...');
await uploadBlob(blobService, commit, blobName, file);
}

console.log('Blobs successfully uploaded.');
}

function main(): void {
const commit = process.env['BUILD_SOURCEVERSION'];

if (!commit) {
console.warn('Skipping publish due to missing BUILD_SOURCEVERSION');
return;
}

const opts = minimist(process.argv.slice(2));
const [directory] = opts._;

const files = fileNames.map(fileName => join(directory, fileName));

publish(commit, files).catch(err => {
console.error(err);
process.exit(1);
});
}

if (process.argv.length < 3) {
console.error('Usage: node publish.js <directory>');
process.exit(-1);
}
main();
6 changes: 6 additions & 0 deletions build/azure-pipelines/product-compile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,12 @@ steps:
displayName: Extract Telemetry
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))

- script: |
set -e
AZURE_WEBVIEW_STORAGE_ACCESS_KEY="$(vscode-webview-storage-key)" \
./build/azure-pipelines/common/publish-webview.sh
displayName: Publish Webview

- script: |
set -e
yarn gulp compile-build
Expand Down

0 comments on commit 8065712

Please sign in to comment.