Browse Source

fixing releases

Daniel Zlotin 7 years ago
parent
commit
4b80ceb3d7
1 changed files with 44 additions and 37 deletions
  1. 44
    37
      scripts/release.js

+ 44
- 37
scripts/release.js View File

@@ -8,6 +8,15 @@ const ONLY_ON_BRANCH = 'v2';
8 8
 const VERSION_TAG = 'alpha';
9 9
 const VERSION_INC = 'patch';
10 10
 
11
+function run() {
12
+  // if (!validateEnv()) {
13
+  //   return;
14
+  // }
15
+  // setupGit();
16
+  // createNpmRc();
17
+  versionTagAndPublish();
18
+}
19
+
11 20
 function validateEnv() {
12 21
   if (!process.env.CI || !process.env.TRAVIS) {
13 22
     throw new Error(`releasing is only available from Travis CI`);
@@ -35,55 +44,53 @@ function setupGit() {
35 44
   exec.execSync(`git checkout ${ONLY_ON_BRANCH}`);
36 45
 }
37 46
 
38
-function getNextVersion() {
47
+function createNpmRc() {
48
+  const content = `
49
+email=\${NPM_EMAIL}
50
+//registry.npmjs.org/:_authToken=\${NPM_TOKEN}
51
+`;
52
+  fs.writeFileSync(`.npmrc`, content);
53
+}
54
+
55
+function versionTagAndPublish() {
39 56
   const packageVersion = semver.clean(process.env.npm_package_version);
40 57
   console.log(`package version: ${packageVersion}`);
41
-  const current = exec.execSyncRead(`npm view ${process.env.npm_package_name} dist-tags.${VERSION_TAG}`);
42
-  console.log(`current published version: ${current}`);
43 58
 
44
-  if (semver.gt(packageVersion, current)) {
45
-    return packageVersion;
46
-  } else {
47
-    return semver.inc(current, VERSION_INC);
48
-  }
49
-}
59
+  const currentPublished = findCurrentPublishedVersion();
60
+  console.log(`current published version: ${currentPublished}`);
50 61
 
51
-function calcNewVersion() {
52
-  let candidate = getNextVersion();
53
-  while (isAlreadyPublished(candidate)) {
54
-    console.log(`${candidate} already published`);
55
-    candidate = semver.inc(candidate, VERSION_INC);
56
-  }
57
-  return candidate;
62
+  const version = semver.gt(packageVersion, currentPublished) ? packageVersion : semver.inc(currentPublished, VERSION_INC);
63
+  tryPublishAndTag(version);
58 64
 }
59 65
 
60
-function isAlreadyPublished(version) {
61
-  return exec.execSyncRead(`npm view ${process.env.npm_package_name}@${version} version`).length > 0;
66
+function findCurrentPublishedVersion() {
67
+  return exec.execSyncRead(`npm view ${process.env.npm_package_name} dist-tags.${VERSION_TAG}`);
62 68
 }
63 69
 
64
-function createNpmRc() {
65
-  const content = `
66
-email=\${NPM_EMAIL}
67
-//registry.npmjs.org/:_authToken=\${NPM_TOKEN}
68
-`;
69
-  fs.writeFileSync(`.npmrc`, content);
70
+function tryPublishAndTag(version) {
71
+  let theCandidate = version;
72
+  let retry = 0;
73
+  while (retry < 5) { //eslint-disable-line
74
+    try {
75
+      tagAndPublish(theCandidate);
76
+      console.log(`Released ${theCandidate}`);
77
+      return;
78
+    } catch (e) {
79
+      const alreadyPublished = _.includes(e.message, 'You cannot publish over the previously published version');
80
+      if (!alreadyPublished) {
81
+        throw e;
82
+      }
83
+      retry++;
84
+      theCandidate = semver.inc(theCandidate, VERSION_INC);
85
+    }
86
+  }
70 87
 }
71 88
 
72 89
 function tagAndPublish(newVersion) {
73
-  exec.execSync(`npm version ${newVersion} -m "v${newVersion} [ci skip]"`);
90
+  exec.execSync(`npm --no-git-tag-version version ${newVersion}`);
74 91
   exec.execSync(`npm publish --tag ${VERSION_TAG}`);
75
-  exec.execSyncSilent(`git push deploy --tags || true`);
76
-}
77
-
78
-function run() {
79
-  if (!validateEnv()) {
80
-    return;
81
-  }
82
-  setupGit();
83
-  createNpmRc();
84
-  const newVersion = calcNewVersion();
85
-  console.log(`new version is: ${newVersion}`);
86
-  tagAndPublish(newVersion);
92
+  exec.execSync(`git tag -a ${newVersion} -m "${newVersion}"`);
93
+  exec.execSyncSilent(`git push deploy ${newVersion} || true`);
87 94
 }
88 95
 
89 96
 run();