Jedes Release birgt potentielle Fehler, die selbst durch ausgiebige Testphasen nicht gefunden werden. Um diese möglichst schnell zu erfassen, helfen sogenannte Error-Tracker (in unserem Fall Sentry) Fehler direkt während der Laufzeit zu loggen und wichtige systembezogene Informationen mitzuschicken.
Das Vergleichen der Codeänderungen ist eines der ersten Mittel, um die Fehlerursachen einzugrenzen. Dementsprechend sollte in dieser Nachricht die aktuelle Release-Version nicht fehlen. Um diese Eigenschaft kontinuierlich und möglichst automatisiert in Sentry einzustellen, lesen wir über die Git-Tags die aktuelle Version beim Jenkins-Rollout aus und legen sie in eine Datei ab.
Auslesen der SemVer Git-Tags
Da unsere Jenkins-Pipeline beim Rollout npm build ausführt, finden wir über den prebuild Script-Hook einen geeigneten Einstieg für ein Node-Script mit dem wir die Git-Version auslesen und in einer Version-Datei ablegen.
package.json
"scripts": {
…
"start": "npm install && ng serve",
"prebuild": "ts-node ./scripts/git.version.ts",
…
},
scripts/git.versions.ts
// ts-check
const chalk = require('chalk');
const git = require('git-describe');
const path = require('path');
const fs = require('fs-extra');
const info = git.gitDescribeSync({
longSemver: true,
dirtySemver: false
});
Zum Auslesen benutzen wir das npm module git-describe und installieren es.
npm install -–save-dev git-describe
Das Tool überprüft, ob es sich um ein korrektes SemVer-Tagging handelt, liefert aber idealerweise in beiden Fällen ein robustes Ergebnis. Die Version schreiben wir in eine Datei ab und importieren sie wo benötigt.
scripts/git.versions.ts
const file = path.resolve(__dirname, '..', 'src', 'environments', 'version.ts');
fs.writeFileSync(
file,
`export const VERSION = ${JSON.stringify(info)};`,
{ encoding: 'utf-8' }
);
console.log(chalk.green(`Schreibe Version ${info.raw} nach ${path.relative(path.resolve(__dirname, '..'), file)}`));
Sentry-Nachrichten einstellen
Zum Übermitteln der Tags geben wir zusätzlich zur Release-Version auch den exakten Git-Commit-Hash an. Sobald das Git mit Sentry verbunden ist, werden die Nachrichten automatisch mit den Commits verlinkt.
app/services/raven.service.ts
import {ErrorHandler, Injectable} from "@angular/core"; import * as Raven from "raven-js";
import {environment} from "../../environments/environment";
import {VERSION} from "../../environments/version";
@Injectable()
export class RavenErrorHandler extends ErrorHandler {
constructor() {
super(false);
if (environment.production) {
Raven
.config('https://avc.sentry.local', {
release: VERSION.semver.version,
tags: {git_commit: VERSION.hash},
environment: environment.env
}).install();
}
}
handleError(error: any): void {
if (environment.production) {
Raven.captureException(error);
} else {
super.handleError(error);
}
}
}
Version-File erzeugen
Mit dem Git-Tag-Versioning pushen wir eine neue Versionen und legen diese durch das Rollout bzw. dem Auführen von npm build in das Version-File, wo sie zur Laufzeit ausgelesen wird.
git tag v1.0.1-RELEASE
git push --tags
npm build
Nach dem Build-Befehl ist die Datei unter environments/version.ts angelegt.