mirror of
https://github.com/jquery/jquery.git
synced 2024-11-23 02:54:22 +00:00
2cf659189e
*Authors* - Checking and updating authors has been migrated to a custom script in the repo *Changelog* - changelogplease is no longer maintained - generate changelog in markdown for GitHub releases - generate changelog in HTML for blog posts - generate contributors list in HTML for blog posts *dist* - clone dist repo, copy files, and commit/push - commit tag with dist files on main branch; remove dist files from main branch after release *cdn* - clone cdn repo, copy files, and commit/push - create versioned and unversioned copies in cdn/ - generate md5 sums and archives for Google and MSFT *build* - implement reproducible builds and verify release builds * uses the last modified date for the latest commit * See https://reproducible-builds.org/ - the verify workflow also ensures all files were properly published to the CDN and npm *docs* - the new release workflow is documented at build/release/README.md *verify* - use the last modified date of the commit before the tag - use versioned filenames when checking map files on the CDN - skip factory and package.json files when verifying CDN *misc* - now that we don't need the jquery-release script and now that we no longer need to build on Node 10, we can use ESM in all files in the build folder - limit certain workflows to the main repo (not forks) - version has been set to the previously released version 3.7.1, as release-it expects - release-it added the `preReleaseBase` option and we now always set it to `1` in the npm script. This is a noop for stable releases. - include post-release script to be run manually after a release, with further steps that should be verified manually Ref jquery/jquery-release#114 Closes gh-5522
129 lines
3.3 KiB
JavaScript
129 lines
3.3 KiB
JavaScript
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
import path from "node:path";
|
|
import { argv } from "node:process";
|
|
import util from "node:util";
|
|
import { exec as nodeExec } from "node:child_process";
|
|
import { rimraf } from "rimraf";
|
|
import archive from "./archive.js";
|
|
|
|
const exec = util.promisify( nodeExec );
|
|
|
|
const version = argv[ 2 ];
|
|
|
|
if ( !version ) {
|
|
throw new Error( "No version specified" );
|
|
}
|
|
|
|
const archivesFolder = "tmp/archives";
|
|
const versionedFolder = `${ archivesFolder }/versioned`;
|
|
const unversionedFolder = `${ archivesFolder }/unversioned`;
|
|
|
|
// The cdn repo is cloned during release
|
|
const cdnRepoFolder = "tmp/release/cdn";
|
|
|
|
// .min.js and .min.map files are expected
|
|
// in the same directory as the uncompressed files.
|
|
const sources = [
|
|
"dist/jquery.js",
|
|
"dist/jquery.slim.js"
|
|
];
|
|
|
|
const rminmap = /\.min\.map$/;
|
|
const rjs = /\.js$/;
|
|
|
|
function clean() {
|
|
console.log( "Cleaning any existing archives..." );
|
|
return rimraf( archivesFolder );
|
|
}
|
|
|
|
// Map files need to reference the new uncompressed name;
|
|
// assume that all files reside in the same directory.
|
|
// "file":"jquery.min.js" ... "sources":["jquery.js"]
|
|
// This is only necessary for the versioned files.
|
|
async function convertMapToVersioned( file, folder ) {
|
|
const mapFile = file.replace( /\.js$/, ".min.map" );
|
|
const filename = path
|
|
.basename( mapFile )
|
|
.replace( "jquery", "jquery-" + version );
|
|
|
|
const contents = JSON.parse( await readFile( mapFile, "utf8" ) );
|
|
|
|
return writeFile(
|
|
path.join( folder, filename ),
|
|
JSON.stringify( {
|
|
...contents,
|
|
file: filename.replace( rminmap, ".min.js" ),
|
|
sources: [ filename.replace( rminmap, ".js" ) ]
|
|
} )
|
|
);
|
|
}
|
|
|
|
async function makeUnversionedCopies() {
|
|
await mkdir( unversionedFolder, { recursive: true } );
|
|
|
|
return Promise.all(
|
|
sources.map( async( file ) => {
|
|
const filename = path.basename( file );
|
|
const minFilename = filename.replace( rjs, ".min.js" );
|
|
const mapFilename = filename.replace( rjs, ".min.map" );
|
|
|
|
await exec( `cp -f ${ file } ${ unversionedFolder }/${ filename }` );
|
|
await exec(
|
|
`cp -f ${ file.replace(
|
|
rjs,
|
|
".min.js"
|
|
) } ${ unversionedFolder }/${ minFilename }`
|
|
);
|
|
await exec(
|
|
`cp -f ${ file.replace(
|
|
rjs,
|
|
".min.map"
|
|
) } ${ unversionedFolder }/${ mapFilename }`
|
|
);
|
|
} )
|
|
);
|
|
}
|
|
|
|
async function makeVersionedCopies() {
|
|
await mkdir( versionedFolder, { recursive: true } );
|
|
|
|
return Promise.all(
|
|
sources.map( async( file ) => {
|
|
const filename = path
|
|
.basename( file )
|
|
.replace( "jquery", "jquery-" + version );
|
|
const minFilename = filename.replace( rjs, ".min.js" );
|
|
|
|
await exec( `cp -f ${ file } ${ versionedFolder }/${ filename }` );
|
|
await exec(
|
|
`cp -f ${ file.replace(
|
|
rjs,
|
|
".min.js"
|
|
) } ${ versionedFolder }/${ minFilename }`
|
|
);
|
|
await convertMapToVersioned( file, versionedFolder );
|
|
} )
|
|
);
|
|
}
|
|
|
|
async function copyToRepo( folder ) {
|
|
return exec( `cp -f ${ folder }/* ${ cdnRepoFolder }/cdn/` );
|
|
}
|
|
|
|
async function cdn() {
|
|
await clean();
|
|
|
|
await Promise.all( [ makeUnversionedCopies(), makeVersionedCopies() ] );
|
|
|
|
await copyToRepo( versionedFolder );
|
|
|
|
await Promise.all( [
|
|
archive( { cdn: "googlecdn", folder: unversionedFolder, version } ),
|
|
archive( { cdn: "mscdn", folder: versionedFolder, version } )
|
|
] );
|
|
|
|
console.log( "Files ready for CDNs." );
|
|
}
|
|
|
|
cdn();
|