diff --git a/src/api-client.js b/src/api-client.js new file mode 100644 index 0000000..7978850 --- /dev/null +++ b/src/api-client.js @@ -0,0 +1,107 @@ +const core = require('@actions/core') +const github = require('@actions/github') +const hc = require('@actions/http-client') + +// All variables we need from the runtime are loaded here +const getContext = require('./context') +const { runTimeUrl: RUNTIME_URL } = getContext() + +async function getSignedArtifactUrl({ runtimeToken, workflowRunId, artifactName }) { + const artifactExchangeUrl = `${RUNTIME_URL}_apis/pipelines/workflows/${workflowRunId}/artifacts?api-version=6.0-preview` + + const httpClient = new hc.HttpClient() + let data = null + + try { + core.info(`Artifact exchange URL: ${artifactExchangeUrl}`) + const response = await httpClient.getJson(artifactExchangeUrl, { + Authorization: `Bearer ${runtimeToken}` + }) + + data = response?.result + core.info(JSON.stringify(data)) + } catch (error) { + core.error('Getting signed artifact URL failed', error) + throw error + } + + const artifactRawUrl = data?.value?.find(artifact => artifact.name === artifactName)?.url + if (!artifactRawUrl) { + throw new Error( + 'No uploaded artifact was found! Please check if there are any errors at build step, or uploaded artifact name is correct.' + ) + } + + const signedArtifactUrl = `${artifactRawUrl}&%24expand=SignedContent` + return signedArtifactUrl +} + +async function createPagesDeployment({ githubToken, artifactUrl, buildVersion, idToken, isPreview = false }) { + const octokit = github.getOctokit(githubToken) + + const payload = { + artifact_url: artifactUrl, + pages_build_version: buildVersion, + oidc_token: idToken + } + if (isPreview === true) { + payload.preview = true + } + core.info(`Creating Pages deployment with payload:\n${JSON.stringify(payload, null, '\t')}`) + + try { + const response = await octokit.rest.repos.createPagesDeployment({ + owner: github.context.repo.owner, + repo: github.context.repo.repo, + ...payload + }) + + return response.data + } catch (error) { + core.error('Creating Pages deployment failed', error) + throw error + } +} + +async function getPagesDeploymentStatus({ githubToken, deploymentId }) { + const octokit = github.getOctokit(githubToken) + + core.info('Getting Pages deployment status...') + try { + const response = await octokit.request('GET /repos/{owner}/{repo}/pages/deployment/status/{deploymentId}', { + owner: github.context.repo.owner, + repo: github.context.repo.repo, + deploymentId + }) + + return response.data + } catch (error) { + core.error('Getting Pages deployment status failed', error) + throw error + } +} + +async function cancelPagesDeployment({ githubToken, deploymentId }) { + const octokit = github.getOctokit(githubToken) + + core.info('Canceling Pages deployment...') + try { + const response = await octokit.request('PUT /repos/{owner}/{repo}/pages/deployment/cancel/{deploymentId}', { + owner: github.context.repo.owner, + repo: github.context.repo.repo, + deploymentId + }) + + return response.data + } catch (error) { + core.error('Canceling Pages deployment failed', error) + throw error + } +} + +module.exports = { + getSignedArtifactUrl, + createPagesDeployment, + getPagesDeploymentStatus, + cancelPagesDeployment +}