Added 3 more tasks and refactored code to use a standalone shared npm package (installed locally from a tarball).
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "copy-blob-task",
|
||||
"version": "1.0.1",
|
||||
"version": "1.0.2",
|
||||
"private": true,
|
||||
"author": "Slawomir Koszewski",
|
||||
"license": "MIT",
|
||||
|
||||
@@ -1,24 +1,9 @@
|
||||
import * as tl from 'azure-pipelines-task-lib/task';
|
||||
import {
|
||||
buildOidcUrl,
|
||||
exchangeOidcForScopedToken,
|
||||
getServiceConnectionMetadata,
|
||||
requireInput,
|
||||
requestOidcToken,
|
||||
requireVariable
|
||||
} from '../../_shared/src/oidc';
|
||||
const STORAGE_SCOPE = 'https://storage.azure.com/.default';
|
||||
|
||||
function buildBlobUrl(accountName: string, containerName: string, blobName: string): string {
|
||||
const trimmedBlobName = blobName.replace(/^\/+/, '');
|
||||
const encodedContainer = encodeURIComponent(containerName);
|
||||
const encodedBlobName = trimmedBlobName
|
||||
.split('/')
|
||||
.map((segment) => encodeURIComponent(segment))
|
||||
.join('/');
|
||||
|
||||
return `https://${accountName}.blob.core.windows.net/${encodedContainer}/${encodedBlobName}`;
|
||||
}
|
||||
buildBlobUrl,
|
||||
requestStorageAccessToken,
|
||||
requireInput
|
||||
} from '@skoszewski/ado-sk-toolkit-shared';
|
||||
|
||||
async function copyBlob(
|
||||
sourceUrl: string,
|
||||
@@ -53,33 +38,20 @@ async function copyBlob(
|
||||
|
||||
async function run(): Promise<void> {
|
||||
try {
|
||||
const endpointId = requireInput('serviceConnectionARM', tl.getInput);
|
||||
const srcStorageAccountName = requireInput('srcStorageAccountName', tl.getInput);
|
||||
const dstStorageAccountName = requireInput('dstStorageAccountName', tl.getInput);
|
||||
const srcContainerName = requireInput('srcContainerName', tl.getInput);
|
||||
const endpointId = requireInput('serviceConnectionARM');
|
||||
const srcStorageAccountName = requireInput('srcStorageAccountName');
|
||||
const dstStorageAccountName = requireInput('dstStorageAccountName');
|
||||
const srcContainerName = requireInput('srcContainerName');
|
||||
const dstContainerNameInput = tl.getInput('dstContainerName', false)?.trim() || '';
|
||||
const blobName = requireInput('blobName', tl.getInput);
|
||||
const blobName = requireInput('blobName');
|
||||
|
||||
const oidcBaseUrl = requireVariable('System.OidcRequestUri', tl.getVariable);
|
||||
const systemAccessToken = requireVariable('System.AccessToken', tl.getVariable);
|
||||
|
||||
const metadata = getServiceConnectionMetadata(
|
||||
endpointId,
|
||||
tl.getEndpointAuthorizationParameter,
|
||||
tl.getEndpointDataParameter
|
||||
);
|
||||
const oidcRequestUrl = buildOidcUrl(oidcBaseUrl, endpointId);
|
||||
|
||||
console.log('Requesting OIDC token for ARM authentication...');
|
||||
const oidcToken = await requestOidcToken(oidcRequestUrl, systemAccessToken, false);
|
||||
console.log('Requesting storage access token from Microsoft Entra ID...');
|
||||
const accessToken = await requestStorageAccessToken(endpointId);
|
||||
|
||||
const dstContainerName = dstContainerNameInput || srcContainerName;
|
||||
const srcUrl = buildBlobUrl(srcStorageAccountName, srcContainerName, blobName);
|
||||
const dstUrl = buildBlobUrl(dstStorageAccountName, dstContainerName, blobName);
|
||||
|
||||
console.log('Requesting storage access token from Microsoft Entra ID...');
|
||||
const accessToken = await exchangeOidcForScopedToken(metadata.tenantId, metadata.clientId, oidcToken, STORAGE_SCOPE);
|
||||
|
||||
console.log(`Copying blob ${srcStorageAccountName}/${srcContainerName}/${blobName} -> ${dstStorageAccountName}/${dstContainerName}/${blobName}...`);
|
||||
const copyResult = await copyBlob(srcUrl, dstUrl, accessToken);
|
||||
|
||||
@@ -87,10 +59,6 @@ async function run(): Promise<void> {
|
||||
throw new Error(`Copy operation completed with unexpected status: ${copyResult.copyStatus}`);
|
||||
}
|
||||
|
||||
if (copyResult.copyId) {
|
||||
tl.setVariable('COPY_BLOB_OPERATION_ID', copyResult.copyId);
|
||||
}
|
||||
|
||||
tl.setResult(tl.TaskResult.Succeeded, 'Blob copied successfully.');
|
||||
} catch (error) {
|
||||
const message = error instanceof Error ? error.message : String(error);
|
||||
|
||||
Reference in New Issue
Block a user