UNPKG

@gravityforms/gulp-tasks

Version:
143 lines (125 loc) 4.83 kB
#!/usr/bin/env node import fs from 'node:fs'; import path from 'node:path'; import { createRequire } from 'node:module'; import getConfig from '../../config.js'; import generateSha1 from '../utils/generate-sha-1.js'; import getPluginVersion from '../utils/get-plugin-version.js'; import sendSlackMessage from '../utils/send-slack-message.js'; import { getLatestChangelogEntry } from './util.js'; const cjsRequire = createRequire( import.meta.url ); const { Octokit } = cjsRequire( '@octokit/rest' ); const { retry } = cjsRequire( '@octokit/plugin-retry' ); const { config } = getConfig(); const rootPath = config?.paths?.root || ''; const fileName = config?.settings?.rootPluginFile || ''; const friendlyName = config?.settings?.friendlyName || ''; const githubToken = process.env.GITHUB_TOKEN; const owner = process.env.ORG; const repo = process.env.REPO; const RetryOctokit = Octokit.plugin( retry ); const retryCount = parseInt( process.env.GITHUB_RETRY_COUNT, 10 ) || 3; const octokit = new RetryOctokit( { auth: githubToken, retry: { retries: retryCount }, } ); const uploadRelease = async () => { if ( process.env.GULP_PRODUCTION_MODE !== 'true' ) { console.log( 'Skipping uploading release because GULP_PRODUCTION_MODE is not set to true.' ); return; } const version = process.env.GRAVITY_PLUGIN_VERSION || getPluginVersion( rootPath, fileName ); const tagName = `v${ version }`; const changelogPath = path.join( config.paths.root, 'change_log.txt' ); const latestChangelogEntry = getLatestChangelogEntry( changelogPath ); const changelogMarkdownList = latestChangelogEntry ? latestChangelogEntry .split( '\n' ) .map( ( entry ) => entry.trim() ) .filter( Boolean ) .map( ( entry ) => `- ${ entry }` ) .join( '\n' ) : ''; const zipFileName = `${ config.settings.slug }_${ version }.zip`; const zipFilePath = path.join( config.paths.root, zipFileName ); const sha1FileName = `${ zipFileName }.sha1`; const sha1FilePath = path.join( config.paths.root, sha1FileName ); const sha1Hash = await generateSha1( zipFilePath ); fs.writeFileSync( sha1FilePath, `${ sha1Hash } ${ zipFileName }` ); let uploadUrl; let releaseId; try { const { data: releases } = await octokit.repos.listReleases( { owner, repo } ); const existingRelease = releases.find( ( release ) => release.tag_name === tagName ); const releaseBody = changelogMarkdownList.length ? `Release version ${ version } for ${ friendlyName }.\n\n${ changelogMarkdownList }` : `Release version ${ version } for ${ friendlyName }.`; if ( existingRelease ) { console.log( `Release ${ tagName } already exists. Updating release.` ); await octokit.repos.updateRelease( { owner, repo, release_id: existingRelease.id, tag_name: tagName, name: `Release ${ tagName }`, body: releaseBody, } ); uploadUrl = existingRelease.upload_url; releaseId = existingRelease.id; } else { const releaseResponse = await octokit.repos.createRelease( { owner, repo, tag_name: tagName, name: `Release ${ tagName }`, body: releaseBody, draft: false, prerelease: false, } ); uploadUrl = releaseResponse.data.upload_url; releaseId = releaseResponse.data.id; } const { data: existingAssets } = await octokit.repos.listReleaseAssets( { owner, repo, release_id: releaseId, } ); const filePaths = [ zipFilePath, path.join( config.paths.root, 'change_log.txt' ), sha1FilePath, path.join( config.paths.root, 'checksums', `${ config.settings.slug }_${ version }.md5` ), path.join( config.paths.root, 'languages', `${ config.settings.slug }.pot` ), ]; for ( const filePath of filePaths ) { const assetFileName = path.basename( filePath ); const existingAsset = existingAssets.find( ( asset ) => asset.name === assetFileName ); if ( existingAsset ) { console.log( `Deleting existing asset: ${ assetFileName }` ); await octokit.repos.deleteReleaseAsset( { owner, repo, asset_id: existingAsset.id, } ); } const fileContent = fs.readFileSync( filePath ); await octokit.repos.uploadReleaseAsset( { url: uploadUrl, headers: { 'content-type': 'application/octet-stream', 'content-length': fileContent.length, }, name: assetFileName, data: fileContent, } ); console.log( `Uploaded asset: ${ assetFileName }` ); } console.log( `Release ${ tagName } created/updated and assets uploaded successfully.` ); } catch ( error ) { const retryInfo = error.attempts ? ` after ${ error.attempts } attempts` : ''; console.error( `Failed to create release or upload assets${ retryInfo }:`, error ); await sendSlackMessage( `GitHub release upload failed${ retryInfo } during build: ${ error.message }`, 'error' ); process.exit( 1 ); } }; uploadRelease();