Skip to content

Commit 27b614e

Browse files
mads-hartmannroboquat
authored andcommitted
Refactor build.ts into multiple files
1 parent 42d529c commit 27b614e

9 files changed

+1244
-1113
lines changed

.werft/build.ts

Lines changed: 19 additions & 1113 deletions
Large diffs are not rendered by default.
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import * as semver from 'semver';
2+
import { exec } from '../../util/shell';
3+
import { Werft } from '../../util/werft';
4+
import { GCLOUD_SERVICE_ACCOUNT_PATH } from './const';
5+
import { JobConfig } from './job-config';
6+
7+
8+
export async function buildAndPublish(werft: Werft, jobConfig: JobConfig) {
9+
10+
const {
11+
publishRelease,
12+
dontTest,
13+
withContrib,
14+
retag,
15+
version,
16+
localAppVersion,
17+
publishToJBMarketplace,
18+
publishToNpm,
19+
coverageOutput
20+
} = jobConfig
21+
22+
const releaseBranch = jobConfig.repository.ref;
23+
24+
werft.phase("build", "build running");
25+
const imageRepo = publishRelease ? "gcr.io/gitpod-io/self-hosted" : "eu.gcr.io/gitpod-core-dev/build";
26+
27+
exec(`LICENCE_HEADER_CHECK_ONLY=true leeway run components:update-license-header || { echo "[build|FAIL] There are some license headers missing. Please run 'leeway run components:update-license-header'."; exit 1; }`)
28+
exec(`leeway vet --ignore-warnings`);
29+
exec(`leeway build --docker-build-options network=host --werft=true -c remote ${dontTest ? '--dont-test' : ''} --dont-retag --coverage-output-path=${coverageOutput} --save /tmp/dev.tar.gz -Dversion=${version} -DimageRepoBase=eu.gcr.io/gitpod-core-dev/dev dev:all`);
30+
31+
if (publishRelease) {
32+
exec(`gcloud auth activate-service-account --key-file "/mnt/secrets/gcp-sa-release/service-account.json"`);
33+
}
34+
if (withContrib || publishRelease) {
35+
exec(`leeway build --docker-build-options network=host --werft=true -c remote ${dontTest ? '--dont-test' : ''} -Dversion=${version} -DimageRepoBase=${imageRepo} contrib:all`);
36+
}
37+
exec(`leeway build --docker-build-options network=host --werft=true -c remote ${dontTest ? '--dont-test' : ''} ${retag} --coverage-output-path=${coverageOutput} -Dversion=${version} -DremoveSources=false -DimageRepoBase=${imageRepo} -DlocalAppVersion=${localAppVersion} -DSEGMENT_IO_TOKEN=${process.env.SEGMENT_IO_TOKEN} -DnpmPublishTrigger=${publishToNpm ? Date.now() : 'false'} -DjbMarketplacePublishTrigger=${publishToJBMarketplace ? Date.now() : 'false'}`);
38+
if (publishRelease) {
39+
try {
40+
werft.phase("publish", "checking version semver compliance...");
41+
if (!semver.valid(version)) {
42+
// make this an explicit error as early as possible. Is required by helm Charts.yaml/version
43+
throw new Error(`'${version}' is not semver compliant and thus cannot used for Self-Hosted releases!`)
44+
}
45+
46+
werft.phase("publish", "publishing Helm chart...");
47+
publishHelmChart(werft, "gcr.io/gitpod-io/self-hosted", version);
48+
49+
werft.phase("publish", `preparing GitHub release files...`);
50+
const releaseFilesTmpDir = exec("mktemp -d", { silent: true }).stdout.trim();
51+
const releaseTarName = "release.tar.gz";
52+
exec(`leeway build --docker-build-options network=host --werft=true chart:release-tars -Dversion=${version} -DimageRepoBase=${imageRepo} --save ${releaseFilesTmpDir}/${releaseTarName}`);
53+
exec(`cd ${releaseFilesTmpDir} && tar xzf ${releaseTarName} && rm -f ${releaseTarName}`);
54+
55+
werft.phase("publish", `publishing GitHub release ${version}...`);
56+
const prereleaseFlag = semver.prerelease(version) !== null ? "-prerelease" : "";
57+
const tag = `v${version}`;
58+
const description = `Gitpod Self-Hosted ${version}<br/><br/>Docs: https://www.gitpod.io/docs/self-hosted/latest/self-hosted/`;
59+
exec(`github-release ${prereleaseFlag} gitpod-io/gitpod ${tag} ${releaseBranch} '${description}' "${releaseFilesTmpDir}/*"`);
60+
61+
werft.done('publish');
62+
} catch (err) {
63+
werft.fail('publish', err);
64+
} finally {
65+
exec(`gcloud auth activate-service-account --key-file "${GCLOUD_SERVICE_ACCOUNT_PATH}"`);
66+
}
67+
}
68+
}
69+
70+
/**
71+
* Publish Charts
72+
*/
73+
async function publishHelmChart(werft: Werft, imageRepoBase: string, version: string) {
74+
werft.phase("publish-charts", "Publish charts");
75+
[
76+
"gcloud config set project gitpod-io",
77+
`leeway build --docker-build-options network=host -Dversion=${version} -DimageRepoBase=${imageRepoBase} --save helm-repo.tar.gz chart:helm`,
78+
"tar xzfv helm-repo.tar.gz",
79+
"mkdir helm-repo",
80+
"cp gitpod*tgz helm-repo/",
81+
"gsutil cp gs://charts-gitpod-io-public/index.yaml old-index.yaml",
82+
"cp gitpod*.tgz helm-repo/",
83+
"helm3 repo index --merge old-index.yaml helm-repo",
84+
"gsutil -m rsync -r helm-repo/ gs://charts-gitpod-io-public/"
85+
].forEach(cmd => {
86+
exec(cmd, { slice: 'publish-charts' });
87+
});
88+
}

.werft/jobs/build/const.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const GCLOUD_SERVICE_ACCOUNT_PATH = "/mnt/secrets/gcp-sa/service-account.json";

.werft/jobs/build/coverage.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import * as fs from 'fs';
2+
import * as util from 'util';
3+
import { exec } from '../../util/shell';
4+
import { Werft } from '../../util/werft';
5+
import { JobConfig } from './job-config';
6+
7+
const readDir = util.promisify(fs.readdir)
8+
9+
export async function coverage(werft: Werft, config: JobConfig) {
10+
// Configure codecov as docker: SOURCE_BRANCH, SOURCE_COMMIT, DOCKER_REPO
11+
// (there is no support for werft)
12+
// --parent The commit SHA of the parent for which you are uploading coverage
13+
// --dir Directory to search for coverage reports
14+
werft.phase('coverage', 'uploading code coverage to codecov');
15+
const parent_commit = exec(`git rev-parse HEAD^`, { silent: true }).stdout.trim();;
16+
try {
17+
// if we don't remove the go directory codecov will scan it recursively
18+
exec(`sudo rm -rf go`);
19+
const coverageFiles = await readDir(config.coverageOutput);
20+
for (let index = 0; index < coverageFiles.length; index++) {
21+
const file = coverageFiles[index];
22+
if (file.indexOf("-coverage.out") == -1) {
23+
continue
24+
}
25+
let flag = file.substring(0, file.length - "-coverage.out".length);
26+
exec(`codecov -N "${parent_commit}" --flags=${flag} --file "${config.coverageOutput}/${file}"`, { slice: "coverage" });
27+
}
28+
29+
werft.done('coverage');
30+
} catch (err) {
31+
werft.fail('coverage', err);
32+
}
33+
}

0 commit comments

Comments
 (0)