abstruse
Version:
Abstruse CI
330 lines (301 loc) • 17.5 kB
HTML
<app-header></app-header>
<nav class="nav sub-nav">
<div class="container">
<div class="nav-left">
<span class="nav-item">
<h1>{{ repo?.full_name }}</h1>
<span *ngIf="statusBadge" [innerHTML]="statusBadge | safeHtml" class="status-badge-repo"></span>
</span>
</div>
<div class="nav-center"></div>
<div class="nav-right">
<div class="group-buttons bright" *ngIf="userId">
<button class="group-button" name="btn-builds" [class.is-active]="tab === 'builds'" (click)="switchTab('builds')">
<i class="ionicon ion-hammer"></i>
Builds
</button>
<button class="group-button" name="btn-settings" [class.is-active]="tab === 'settings'" (click)="switchTab('settings')">
<i class="ionicon ion-wrench"></i>
Settings
</button>
</div>
</div>
</div>
</nav>
<div class="container">
<div class="columns">
<div class="column is-12">
<div class="content">
<div class="container" *ngIf="loading">
<img src="/assets/images/icons/flickr.svg" class="main-loader">
</div>
<div class="columns is-multiline" *ngIf="!loading">
<div class="column is-12">
<div class="columns repository-details">
<div class="column is-8">
<span>
<i class="ion ion-network"></i>
<a [href]="repo?.html_url">{{ repo?.html_url }}</a>
</span>
<span>
<i class="ion ion-merge"></i>
{{ repo?.default_branch }}
</span>
<span *ngIf="repo?.private">
<i class="ion ion-ios-locked-outline"></i>
Private Repository
</span>
<span *ngIf="!repo?.private">
<i class="ion ion-ios-unlocked-outline"></i>
Public Repository
</span>
</div>
<div class="column is-4"></div>
</div>
</div>
<div class="column is-12" *ngIf="!repo?.builds?.length && tab === 'builds'">
<div class="message is-info">
No builds have been run yet.
</div>
</div>
<div class="column is-12" *ngIf="repo?.builds?.length && tab === 'builds'">
<div class="columns list-item" *ngFor="let build of repo.builds; let i = index;" [ngClass]="{ 'is-queued': build.status === 'queued', 'is-success': build.status === 'success', 'is-running': build.status === 'running', 'is-errored': build.status === 'failed' }" (click)="gotoBuild(build.id)">
<app-build-item [build]="build"></app-build-item>
</div>
<div layout-align="center" *ngIf="repo?.builds?.length" align="center" class="more-button-container">
<button type="button" class="button" name="btn-loadmore" (click)="fetchBuilds($event)" [class.is-loading]="fetching" [class.is-hidden]="hideMoreButton">
<img src="/assets/images/icons/more.svg">
Load more builds
</button>
</div>
</div>
<div class="column is-12" *ngIf="tab === 'settings' && repo.hasPermission">
<div class="columns">
<div class="column is-12">
<div class="settings-container">
<div class="columns is-multiline">
<div class="column is-12 is-marginless is-paddingless">
<h2>Repository Settings</h2>
</div>
<div class="column is-6">
<form class="form" #repoForm="ngForm" (ngSubmit)="saveRepoSettings($event)">
<h4>General Settings</h4>
<div class="columns">
<div class="column is-9">
<div class="form-field">
<label class="form-label">Repository Provider</label>
<app-selectbox [data]="repositoryProviders" [(ngModel)]="form.repository_provider" name="repository_provider" ngDefaultControl></app-selectbox>
<p class="helper">Set git provider where this repository is hosted.</p>
</div>
<div class="form-field">
<label class="form-label">API URL</label>
<input type="text" placeholder="https://api.github.com" name="api_url" [(ngModel)]="form.api_url" class="form-input">
<p class="helper">Set API URL for git repository provider. Example for GitHub (not GHE) is https://api.github.com</p>
</div>
</div>
<div class="column is-3">
<div class="form-field">
<label class="form-label">Is Public</label>
<app-toggle [(ngModel)]="form.public" name="public"></app-toggle>
</div>
</div>
</div>
<hr/>
<h4>Access Token</h4>
<div class="message">
<div class="columns">
<div class="column is-1">
<i class="ion ion-information"></i>
</div>
<div class="column is-11">
<p>It is important to set access token so abstruse can:</p>
<ul>
<li>access and clone repository</li>
<li>send build status to repository</li>
</ul>
</div>
</div>
</div>
<div class="form-field">
<app-selectbox [data]="accessTokensOptions" [(ngModel)]="form.access_tokens_id" name="access_tokens_id" ngDefaultControl></app-selectbox>
<p class="helper">
If you cannot find access token that is suitable for this repository then create new one <a routerLink="/settings">here</a>.
</p>
</div>
<input type="hidden" name="id" [(ngModel)]="form.id">
<div class="form-field">
<button type="submit" name="save-settings" class="button float-right" [class.is-loading]="saving" [disabled]="!repoForm.form.valid">Save Settings</button>
</div>
</form>
</div>
<div class="column is-6">
<form class="form" (ngSubmit)="addEnvironmentVariable()" #envVarForm="ngForm">
<h4>Environment Variables</h4>
<div class="env-variables-list" *ngIf="repo?.variables?.length">
<div class="columns list-item list-item-mini" *ngFor="let v of repo?.variables; let i = index;">
<div class="column is-9">
<span class="bold">{{ v.name }}: {{ v.value }}</span>
</div>
<div class="column is-2">
<span *ngIf="v.encrypted">(encrypted)</span>
<span *ngIf="!v.encrypted">(public)</span>
</div>
<div class="column is-1 justify-center">
<span class="icon" name="remove-variable" (click)="removeVariable(v.id)">
<img src="/assets/images/icons/remove.svg">
</span>
</div>
</div>
</div>
<div class="message">
<div class="columns">
<div class="column is-1">
<i class="ion ion-information"></i>
</div>
<div class="column is-11">
<p>Environment variables are the way to customize the build process. They can be accessed from any stage of the build.</p>
<p>If the variable contain, for example SSH token then you need to encrypt it with Abstruse CLI tool.</p>
</div>
</div>
</div>
<div class="form-field">
<label class="form-label">Name</label>
<input class="form-input" type="text" placeholder="VARIABLE_NAME" name="name" required [(ngModel)]="environmentVariableForm.name">
<p class="helper">
Name of the variable, please use uppercase letters. Example: DEPLOY_KEY
</p>
</div>
<div class="form-field">
<label class="form-label">Value</label>
<input class="form-input" type="text" placeholder="Value" name="value" required [(ngModel)]="environmentVariableForm.value">
<p class="helper">
Variable value. Make sure you encrypt it if includes sensitive data.
</p>
</div>
<div class="form-field">
<label class="form-label">Encrypted</label>
<app-selectbox [data]="yesNoOptions" name="encrypted" required [(ngModel)]="environmentVariableForm.encrypted" ngDefaultControl></app-selectbox>
</div>
<div class="form-field">
<button type="submit" class="button float-right" name="btn-add-variable" [class.is-loading]="addingEnvVar" [disabled]="!envVarForm.form.valid" required>Add Variable</button>
</div>
</form>
</div>
<div class="column is-12 is-marginless is-paddingless">
<h2>Repository Cache</h2>
</div>
<div class="column is-6">
<form class="form">
<h4>Cached Dependencies and Directories</h4>
<p>Using cache can speed up builds as it stores contents that does not often change.</p>
<div *ngIf="cache?.length && !fetchingCache">
<div class="columns cache-item" *ngFor="let c of cache">
<div class="column is-9">
<span>{{ c.filename }}</span>
</div>
<div class="column is-3 justify-center">
<span>{{ c.size }}</span>
</div>
</div>
</div>
<div class="message" *ngIf="!cache?.length">
<p>
<i class="ion ion-information"></i>
No cached files or folders found for this repository.
</p>
</div>
<div class="message green" *ngIf="cacheDeleted">
<p>
<i class="ion ion-checkmark-round"></i>
Cache has been deleted.
</p>
</div>
<button type="button" class="button is-fullwidth mtb20" *ngIf="cache?.length" [class.is-loading]="deletingCache" (click)="deleteCache()">Delete Cache</button>
</form>
</div>
<div class="column is-6"></div>
<div class="column is-12 is-marginless is-paddingless">
<h2>Repository Configuration</h2>
</div>
<div class="column is-6">
<form class="form">
<h4>Check Configuration</h4>
<p>Here you can make test if settings provided works in the wild.</p>
<p>Tests includes access to repository and checking presence of .abstruse.yml config file inside repository.</p>
<div class="message green" *ngIf="checkConfigResult && (checkConfigResult.read || checkConfigResult.config)">
<p *ngIf="checkConfigResult.read">
<i class="ion ion-checkmark-round"></i>
Has read permissions on repository
</p>
<p *ngIf="checkConfigResult.config">
<i class="ion ion-checkmark-round"></i>
Repository includes .abstruse.yml configuration
</p>
<p *ngIf="checkConfigResult.parsedcfg">
<i class="ion ion-checkmark-round"></i>
Abstruse can parse .abstruse.yml configuration
</p>
</div>
<div class="message red" *ngIf="checkConfigResult && (!checkConfigResult.read || !checkConfigResult.config)">
<p *ngIf="!checkConfigResult.read">
<i class="ion ion-close-round"></i>
Has read permissions on repository (clone)
</p>
<p *ngIf="!checkConfigResult.config">
<i class="ion ion-close-round"></i>
Repository includes .abstruse.yml configuration
</p>
<p *ngIf="!checkConfigResult.parsedcfg">
<i class="ion ion-close-round"></i>
Abstruse cannot parse .abstruse.yml configuration
</p>
</div>
<button type="button" name="check-repository-configuration" class="button is-fullwidth mtb20" [class.is-loading]="checkingConfig" (click)="checkRepositoryConfig()">Check Repository Configuration</button>
<hr/>
<h4>Test Build</h4>
<p>To see if everything works as expected you can trigger new build here. Build will be run from the last commit and default branch.</p>
<div class="message green" *ngIf="buildSuccessfullyTriggered && !triggeringBuild">
<p>
<i class="ion ion-checkmark-round"></i>
Build successfully triggered.
</p>
</div>
<div class="message red" *ngIf="buildTriggerError && !triggeringBuild">
<p>
<i class="ion ion-close-round"></i>
Error triggering build. Please check your configuration.
</p>
</div>
<button type="button" name="trigger-test-build" class="button is-fullwidth mtb20" [class.is-loading]="triggeringBuild" (click)="triggerTestBuild()">Trigger Test Build</button>
</form>
</div>
<div class="column is-6">
<form class="form">
<h4>Check Build Configuration File</h4>
<p>If you want to check how <code>.abstruse.yml</code> config file behaves on abstruse, here you can fetch it from repository and adopt changes then run build from it.</p>
<button type="button" name="fetch-config" class="button is-fullwidth mtb20" [class.is-loading]="fetchingConfig" (click)="fetchConfigFile()">Fetch Config</button>
<div *ngIf="configFile">
<div class="form-field">
<label class="form-label">.abstruse.yml config file</label>
<textarea class="form-input" rows="25" [(ngModel)]="configFile" [ngModelOptions]="{ standalone: true }"></textarea>
</div>
<button type="button" name="run-build-from-config" class="button is-fullwidth mtb20" [class.is-loading]="runningConfigBuild" (click)="runConfigBuild()">Run Build From Config</button>
<div class="message green" *ngIf="configBuildStatus">
<p>
<i class="ion ion-checkmark-round"></i>
Build has been run successfully.
</p>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>