From 46490113a2b10ab06e2938d4fa30a6dd08027ce2 Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Wed, 23 Feb 2022 09:02:13 +0000 Subject: [PATCH] Tools: Make server build more configurable --- .github/scripts/run_ci.sh | 6 ++++-- .github/workflows/github-actions-main.yml | 4 +++- packages/tools/buildServerDocker.test.ts | 2 -- packages/tools/buildServerDocker.ts | 18 +++++++++++++----- packages/tools/git-changelog.ts | 7 +++++-- packages/tools/tool-utils.ts | 10 ++++++---- 6 files changed, 31 insertions(+), 16 deletions(-) diff --git a/.github/scripts/run_ci.sh b/.github/scripts/run_ci.sh index 820fcccb0..6a7410189 100755 --- a/.github/scripts/run_ci.sh +++ b/.github/scripts/run_ci.sh @@ -38,6 +38,8 @@ echo "GITHUB_REF=$GITHUB_REF" echo "RUNNER_OS=$RUNNER_OS" echo "GIT_TAG_NAME=$GIT_TAG_NAME" echo "BUILD_SEQUENCIAL=$BUILD_SEQUENCIAL" +echo "SERVER_REPOSITORY=$SERVER_REPOSITORY" +echo "SERVER_TAG_PREFIX=$SERVER_TAG_PREFIX" echo "IS_CONTINUOUS_INTEGRATION=$IS_CONTINUOUS_INTEGRATION" echo "IS_PULL_REQUEST=$IS_PULL_REQUEST" @@ -169,10 +171,10 @@ cd "$ROOT_DIR/packages/app-desktop" if [[ $GIT_TAG_NAME = v* ]]; then echo "Step: Building and publishing desktop application..." USE_HARD_LINKS=false yarn run dist -elif [[ $GIT_TAG_NAME = server-v* ]] && [[ $IS_LINUX = 1 ]]; then +elif [[ $IS_LINUX = 1 ]] && [[ $GIT_TAG_NAME = $SERVER_TAG_PREFIX-* ]]; then echo "Step: Building Docker Image..." cd "$ROOT_DIR" - yarn run buildServerDocker --tag-name $GIT_TAG_NAME --push-images + yarn run buildServerDocker --tag-name $GIT_TAG_NAME --push-images --repository $SERVER_REPOSITORY else echo "Step: Building but *not* publishing desktop application..." USE_HARD_LINKS=false yarn run dist --publish=never diff --git a/.github/workflows/github-actions-main.yml b/.github/workflows/github-actions-main.yml index 3334366f4..936157742 100644 --- a/.github/workflows/github-actions-main.yml +++ b/.github/workflows/github-actions-main.yml @@ -98,6 +98,8 @@ jobs: env: IS_CONTINUOUS_INTEGRATION: 1 BUILD_SEQUENCIAL: 1 + SERVER_REPOSITORY: joplin/server + SERVER_TAG_PREFIX: server run: | yarn install && cd packages/app-desktop && yarn run dist --publish=never @@ -138,5 +140,5 @@ jobs: BUILD_SEQUENCIAL: 1 run: | yarn install - yarn run buildServerDocker --tag-name server-v0.0.0 + yarn run buildServerDocker --tag-name server-v0.0.0 --repository joplin/server \ No newline at end of file diff --git a/packages/tools/buildServerDocker.test.ts b/packages/tools/buildServerDocker.test.ts index 6bddb1df7..da4d102c9 100644 --- a/packages/tools/buildServerDocker.test.ts +++ b/packages/tools/buildServerDocker.test.ts @@ -15,8 +15,6 @@ describe('buildServerDocker', function() { const actual = getVersionFromTag(tagName, isPreRelease); expect(actual).toBe(expected); } - - expect(() => getVersionFromTag('app-cli-v1.0.0', false)).toThrow(); }); test('should check if it is a pre-release', async () => { diff --git a/packages/tools/buildServerDocker.ts b/packages/tools/buildServerDocker.ts index 4e80e6d92..4838a96cb 100644 --- a/packages/tools/buildServerDocker.ts +++ b/packages/tools/buildServerDocker.ts @@ -1,8 +1,14 @@ import { execCommand2, rootDir } from './tool-utils'; import * as moment from 'moment'; +interface Argv { + dryRun?: boolean; + pushImages?: boolean; + repository?: string; + tagName?: string; +} + export function getVersionFromTag(tagName: string, isPreRelease: boolean): string { - if (tagName.indexOf('server-') !== 0) throw new Error(`Invalid tag: ${tagName}`); const s = tagName.split('-'); const suffix = isPreRelease ? '-beta' : ''; return s[1].substr(1) + suffix; @@ -16,11 +22,13 @@ export function getIsPreRelease(_tagName: string): boolean { } async function main() { - const argv = require('yargs').argv; + const argv = require('yargs').argv as Argv; if (!argv.tagName) throw new Error('--tag-name not provided'); + if (!argv.repository) throw new Error('--repository not provided'); const dryRun = !!argv.dryRun; const pushImages = !!argv.pushImages; + const repository = argv.repository; const tagName = argv.tagName; const isPreRelease = getIsPreRelease(tagName); const imageVersion = getVersionFromTag(tagName, isPreRelease); @@ -48,7 +56,7 @@ async function main() { console.info('isPreRelease:', isPreRelease); console.info('Docker tags:', dockerTags.join(', ')); - const dockerCommand = `docker build --progress=plain -t "joplin/server:${imageVersion}" ${buildArgs} -f Dockerfile.server .`; + const dockerCommand = `docker build --progress=plain -t "${repository}:${imageVersion}" ${buildArgs} -f Dockerfile.server .`; if (dryRun) { console.info(dockerCommand); return; @@ -57,8 +65,8 @@ async function main() { await execCommand2(dockerCommand); for (const tag of dockerTags) { - await execCommand2(`docker tag "joplin/server:${imageVersion}" "joplin/server:${tag}"`); - if (pushImages) await execCommand2(`docker push joplin/server:${tag}`); + await execCommand2(`docker tag "${repository}:${imageVersion}" "${repository}:${tag}"`); + if (pushImages) await execCommand2(`docker push ${repository}:${tag}`); } } diff --git a/packages/tools/git-changelog.ts b/packages/tools/git-changelog.ts index f103aff94..82968a275 100644 --- a/packages/tools/git-changelog.ts +++ b/packages/tools/git-changelog.ts @@ -16,6 +16,7 @@ enum Platform { Desktop = 'desktop', Clipper = 'clipper', Server = 'server', + Cloud = 'cloud', Cli = 'cli', PluginGenerator = 'plugin-generator', PluginRepoCli = 'plugin-repo-cli', @@ -84,6 +85,7 @@ function platformFromTag(tagName: string): Platform { if (tagName.indexOf('clipper') === 0) return Platform.Clipper; if (tagName.indexOf('cli') === 0) return Platform.Cli; if (tagName.indexOf('server') === 0) return Platform.Server; + if (tagName.indexOf('cloud') === 0) return Platform.Cloud; if (tagName.indexOf('plugin-generator') === 0) return Platform.PluginGenerator; if (tagName.indexOf('plugin-repo-cli') === 0) return Platform.PluginRepoCli; throw new Error(`Could not determine platform from tag: "${tagName}"`); @@ -115,7 +117,7 @@ function filterLogs(logs: LogEntry[], platform: Platform) { let addIt = false; // "All" refers to desktop, CLI and mobile app. Clipper and Server are not included. - if (prefix.indexOf('all') >= 0 && (platform !== 'clipper' && platform !== 'server')) addIt = true; + if (prefix.indexOf('all') >= 0 && (platform !== 'clipper' && platform !== 'server' && platform !== 'cloud')) addIt = true; if ((platform === 'android' || platform === 'ios') && prefix.indexOf('mobile') >= 0) addIt = true; if (platform === 'android' && prefix.indexOf('android') >= 0) addIt = true; if (platform === 'ios' && prefix.indexOf('ios') >= 0) addIt = true; @@ -124,6 +126,7 @@ function filterLogs(logs: LogEntry[], platform: Platform) { if (platform === 'cli' && prefix.indexOf('cli') >= 0) addIt = true; if (platform === 'clipper' && prefix.indexOf('clipper') >= 0) addIt = true; if (platform === 'server' && prefix.indexOf('server') >= 0) addIt = true; + if (platform === 'cloud' && prefix.indexOf('cloud') >= 0) addIt = true; // Translation updates often comes in format "Translation: Update pt_PT.po" // but that's not useful in a changelog especially since most people @@ -155,7 +158,7 @@ function formatCommitMessage(commit: string, msg: string, author: Author, option const isPlatformPrefix = (prefixString: string) => { const prefix = prefixString.split(',').map(p => p.trim().toLowerCase()); for (const p of prefix) { - if (['android', 'mobile', 'ios', 'desktop', 'cli', 'clipper', 'all', 'api', 'plugins', 'server'].indexOf(p) >= 0) return true; + if (['android', 'mobile', 'ios', 'desktop', 'cli', 'clipper', 'all', 'api', 'plugins', 'server', 'cloud'].indexOf(p) >= 0) return true; } return false; }; diff --git a/packages/tools/tool-utils.ts b/packages/tools/tool-utils.ts index 11fa88eb5..7f12a750c 100644 --- a/packages/tools/tool-utils.ts +++ b/packages/tools/tool-utils.ts @@ -37,7 +37,9 @@ function commandToString(commandName: string, args: string[] = []) { return output.join(' '); } -async function insertChangelog(tag: string, changelogPath: string, changelog: string, isPrerelease: boolean) { +async function insertChangelog(tag: string, changelogPath: string, changelog: string, isPrerelease: boolean, repoTagUrl: string = '') { + repoTagUrl = repoTagUrl || 'https://github.com/laurent22/joplin/releases/tag'; + const currentText = await fs.readFile(changelogPath, 'UTF-8'); const lines = currentText.split('\n'); @@ -60,7 +62,7 @@ async function insertChangelog(tag: string, changelogPath: string, changelog: st const header = [ '##', - `[${tag}](https://github.com/laurent22/joplin/releases/tag/${tag})`, + `[${tag}](${repoTagUrl}/${tag})`, ]; if (isPrerelease) header.push('(Pre-release)'); header.push('-'); @@ -91,10 +93,10 @@ export function releaseFinalGitCommands(appName: string, newVersion: string, new return finalCmds.join(' && '); } -export async function completeReleaseWithChangelog(changelogPath: string, newVersion: string, newTag: string, appName: string, isPreRelease: boolean) { +export async function completeReleaseWithChangelog(changelogPath: string, newVersion: string, newTag: string, appName: string, isPreRelease: boolean, repoTagUrl = '') { const changelog = (await execCommand2(`node ${rootDir}/packages/tools/git-changelog ${newTag} --publish-format full`, { })).trim(); - const newChangelog = await insertChangelog(newTag, changelogPath, changelog, isPreRelease); + const newChangelog = await insertChangelog(newTag, changelogPath, changelog, isPreRelease, repoTagUrl); await fs.writeFile(changelogPath, newChangelog);