Added 3 more tasks and refactored code to use a standalone shared npm package (installed locally from a tarball).

This commit is contained in:
2026-02-25 08:10:03 +01:00
parent 1ef0999a3e
commit d08e6c8958
30 changed files with 3457 additions and 91 deletions

View File

@@ -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);