@gravityforms/gulp-tasks
Version:
Configurable Gulp tasks for use in Gravity Forms projects.
143 lines (125 loc) • 4.83 kB
JavaScript
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();