@gravityforms/gulp-tasks
Version:
Configurable Gulp tasks for use in Gravity Forms projects.
136 lines (120 loc) • 4.67 kB
JavaScript
const path = require( 'path' );
const { Octokit } = require( '@octokit/rest' );
const fs = require( 'fs' );
const getPluginVersion = require( '../utils/get-plugin-version' );
const sendSlackMessage = require( '../utils/send-slack-message' );
const getConfig = require('../../config');
const { getLatestChangelogEntry } = require( './util' );
const generateSha1 = require( '../utils/generate-sha-1' );
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 octokit = new Octokit( { auth: githubToken } );
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 {
// Check if a release with the tag already exists
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 ) {
// Update existing release with new body/name
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;
}
// Get existing assets to check for overwrites
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 );
// Delete existing asset if it exists so we can upload the new one
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 ) {
console.error( 'Failed to create release or upload assets:', error );
await sendSlackMessage( `Failed to create GitHub release or upload assets during build: ${ error.message }`, 'error' );
process.exit( 1 );
}
};
uploadRelease();