UNPKG

@gravityforms/gulp-tasks

Version:
136 lines (120 loc) 4.67 kB
#!/usr/bin/env node 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();