333 lines
No EOL
17 KiB
HTML
333 lines
No EOL
17 KiB
HTML
<div class="manage-trigger-githost-element manage-trigger-control">
|
|
<div class="linear-workflow" workflow-state="currentState" done-title="Create Trigger"
|
|
workflow-complete="createTrigger()">
|
|
|
|
<!-- Section: Namespace -->
|
|
<div class="linear-workflow-section row"
|
|
section-id="namespace"
|
|
section-title="{{ 'Select ' + namespaceTitle }}"
|
|
section-valid="local.selectedNamespace">
|
|
<div class="col-lg-7 col-md-7 col-sm-12 main-col" ng-show="local.namespaces">
|
|
<h3>Select {{ namespaceTitle }}</h3>
|
|
<strong>
|
|
Please select the {{ namespaceTitle }} under which the repository lives
|
|
</strong>
|
|
|
|
<div class="co-top-bar">
|
|
<div class="co-filter-box">
|
|
<span class="page-controls" total-count="local.orderedNamespaces.entries.length" current-page="local.namespaceOptions.page" page-size="namespacesPerPage"></span>
|
|
<input class="form-control" type="text" ng-model="local.namespaceOptions.filter" placeholder="Filter {{ namespaceTitle }}s...">
|
|
</div>
|
|
</div>
|
|
|
|
<table class="co-table" style="margin-top: 20px;">
|
|
<thead>
|
|
<td class="checkbox-col"></td>
|
|
<td ng-class="TableService.tablePredicateClass('id', local.namespaceOptions.predicate, local.namespaceOptions.reverse)">
|
|
<a ng-click="TableService.orderBy('id', local.namespaceOptions)">{{ namespaceTitle }}</a>
|
|
</td>
|
|
<td ng-class="TableService.tablePredicateClass('score', local.namespaceOptions.predicate, local.namespaceOptions.reverse)"
|
|
class="importance-col hidden-xs">
|
|
<a ng-click="TableService.orderBy('score', local.namespaceOptions)">Importance</a>
|
|
</td>
|
|
</thead>
|
|
|
|
<tr class="co-checkable-row"
|
|
ng-repeat="namespace in local.orderedNamespaces.visibleEntries | slice:(namespacesPerPage * local.namespaceOptions.page):(namespacesPerPage * (local.namespaceOptions.page + 1))"
|
|
ng-class="local.selectedNamespace == namespace ? 'checked' : ''"
|
|
bindonce>
|
|
<td>
|
|
<input type="radio" ng-model="local.selectedNamespace" ng-value="namespace">
|
|
</td>
|
|
<td>
|
|
<img class="namespace-avatar" ng-src="{{ namespace.avatar_url }}">
|
|
<span class="anchor" href="{{ namespace.url }}" is-text-only="!namespace.url">{{ namespace.id }}</span>
|
|
</td>
|
|
<td class="importance-col hidden-xs">
|
|
<span class="strength-indicator" value="::namespace.score" maximum="::local.maxScore"
|
|
log-base="10"></span>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<div class="empty" ng-if="local.namespaces.length && !local.orderedNamespaces.entries.length"
|
|
style="margin-top: 20px;">
|
|
<div class="empty-primary-msg">No matching {{ namespaceTitle }} found.</div>
|
|
<div class="empty-secondary-msg">Try expanding your filtering terms.</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-lg-8 col-md-8 col-sm-12 main-col" ng-show="!local.namespaces">
|
|
<span class="cor-loader-inline"></span> Retrieving {{ namespaceTitle }}s
|
|
</div>
|
|
<div class="col-lg-4 col-md-4 hidden-sm hidden-xs help-col" ng-show="local.namespaces">
|
|
<p>
|
|
<span class="registry-name"></span> has been granted access to read and view these {{ namespaceTitle }}s.
|
|
</p>
|
|
<p>
|
|
Don't see an expected {{ namespaceTitle }} here? Please make sure third-party access is enabled for <span class="registry-name"></span> under that {{ namespaceTitle }}.
|
|
</p>
|
|
</div>
|
|
</div><!-- /Section: Namespace -->
|
|
|
|
<!-- Section: Repository -->
|
|
<div class="linear-workflow-section row"
|
|
section-id="repo"
|
|
section-title="Select Repository"
|
|
section-valid="local.selectedRepository">
|
|
|
|
<div class="col-lg-7 col-md-7 col-sm-12 main-col" ng-show="local.repositories">
|
|
<h3>Select Repository</h3>
|
|
<strong>
|
|
Select a repository in
|
|
<img class="namespace-avatar" ng-src="{{ local.selectedNamespace.avatar_url }}">
|
|
{{ local.selectedNamespace.id }}
|
|
</strong>
|
|
|
|
<div class="co-top-bar">
|
|
<div class="co-filter-box">
|
|
<span class="page-controls" total-count="local.orderedRepositories.entries.length" current-page="local.repositoryOptions.page" page-size="repositoriesPerPage"></span>
|
|
<input class="form-control" type="text" ng-model="local.repositoryOptions.filter" placeholder="Filter repositories...">
|
|
<div class="filter-options">
|
|
<label><input type="checkbox" ng-model="local.repositoryOptions.hideStale">Hide stale repositories</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<table class="co-table" style="margin-top: 20px;">
|
|
<thead>
|
|
<td class="checkbox-col"></td>
|
|
<td ng-class="TableService.tablePredicateClass('name', local.repositoryOptions.predicate, local.repositoryOptions.reverse)" class="nowrap-col">
|
|
<a ng-click="TableService.orderBy('name', local.repositoryOptions)">Repository Name</a>
|
|
</td>
|
|
<td ng-class="TableService.tablePredicateClass('last_updated_datetime', local.repositoryOptions.predicate, local.repositoryOptions.reverse)"
|
|
class="last-updated-col nowrap-col">
|
|
<a ng-click="TableService.orderBy('last_updated_datetime', local.namespaceOptions)">Last Updated</a>
|
|
</td>
|
|
<td class="hidden-xs">Description</td>
|
|
</thead>
|
|
|
|
<tr class="co-checkable-row"
|
|
ng-repeat="repository in local.orderedRepositories.visibleEntries | slice:(repositoriesPerPage * local.repositoryOptions.page):(repositoriesPerPage * (local.repositoryOptions.page + 1))"
|
|
ng-class="local.selectedRepository == repository ? 'checked' : ''"
|
|
bindonce>
|
|
<td>
|
|
<span ng-if="!repository.has_admin_permissions">
|
|
<i class="fa fa-exclamation-triangle"
|
|
data-title="Admin access is required to add the webhook trigger to this repository" bs-tooltip></i>
|
|
</span>
|
|
<input type="radio" ng-model="local.selectedRepository" ng-value="repository"
|
|
ng-if="repository.has_admin_permissions">
|
|
</td>
|
|
<td class="nowrap-col">
|
|
<i class="service-icon fa {{ getTriggerIcon() }}"></i>
|
|
<span class="anchor" href="{{ repository.url }}" is-text-only="!repository.url">{{ repository.name }}</span>
|
|
</td>
|
|
<td class="last-updated-col nowrap-col">
|
|
<span am-time-ago="repository.last_updated_datetime"></span>
|
|
</td>
|
|
<td class="hidden-xs">
|
|
<span ng-if="repository.description">{{ repository.description }}</span>
|
|
<span class="empty-description" ng-if="!repository.description">(None)</span>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<div class="empty" ng-if="local.repositories.length && !local.orderedRepositories.entries.length"
|
|
style="margin-top: 20px;">
|
|
<div class="empty-primary-msg">No matching repositories found.</div>
|
|
<div class="empty-secondary-msg">Try expanding your filtering terms.</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-lg-8 col-md-8 col-sm-12 main-col" ng-show="!local.repositories">
|
|
<span class="cor-loader-inline"></span> Retrieving repositories
|
|
</div>
|
|
<div class="col-lg-4 col-md-4 hidden-sm hidden-xs help-col" ng-show="local.repositories">
|
|
<p>
|
|
A webhook will be added to the selected repository in order to detect when new commits are made.
|
|
</p>
|
|
<p>
|
|
Don't see an expected repository here? Please make sure you have admin access on that repository.
|
|
</p>
|
|
</div>
|
|
|
|
</div><!-- /Section: Repository -->
|
|
|
|
<!-- Section: Trigger Options -->
|
|
<div class="linear-workflow-section row"
|
|
section-id="triggeroptions"
|
|
section-title="Configure Trigger"
|
|
section-valid="local.triggerOptions">
|
|
<div class="col-lg-7 col-md-7 col-sm-12 main-col" ng-show="local.repositoryRefs">
|
|
<h3>Configure Trigger</h3>
|
|
<strong>
|
|
Configure trigger options for
|
|
<img class="namespace-avatar" ng-src="{{ local.selectedNamespace.avatar_url }}">
|
|
{{ local.selectedNamespace.id }}/{{ local.selectedRepository.name }}
|
|
</strong>
|
|
|
|
<div class="radio" style="margin-top: 20px;">
|
|
<label>
|
|
<input type="radio" name="optionRadio" ng-model="local.triggerOptions.hasBranchTagFilter" ng-value="false">
|
|
<div class="title">Trigger for all branches and tags <span class="weak">(default)</span></div>
|
|
<div class="description">Build a container image for each commit across all branches and tags</div>
|
|
</label>
|
|
</div>
|
|
<div class="radio">
|
|
<label>
|
|
<input type="radio" name="optionRadio" ng-model="local.triggerOptions.hasBranchTagFilter" ng-value="true">
|
|
<div class="title">Trigger only on branches and tags matching a regular expression</div>
|
|
<div class="description">Only build container images for a subset of branches and/or tags.</div>
|
|
<div class="extended" ng-if="local.triggerOptions.hasBranchTagFilter">
|
|
<table>
|
|
<tr>
|
|
<td style="white-space: nowrap;">Regular Expression:</td>
|
|
<td>
|
|
<input type="text" class="form-control" ng-model="local.triggerOptions.branchTagFilter" required>
|
|
<div class="description">Examples: heads/master, tags/tagname, heads/.+</div>
|
|
<regex-match-view
|
|
items="local.repositoryFullRefs"
|
|
regex="local.triggerOptions.branchTagFilter"
|
|
ng-if="local.triggerOptions.branchTagFilter"></regex-match-view>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-lg-8 col-md-8 col-sm-12 main-col" ng-show="!local.repositoryRefs">
|
|
<span class="cor-loader-inline"></span> Retrieving repository refs
|
|
</div>
|
|
<div class="col-lg-4 col-md-4 hidden-sm hidden-xs help-col">
|
|
<p>Do you want to build a new container image for commits across all branches and tags, or limit to a subset?</p>
|
|
<p>For example, if you use release branches instead of <code>master</code> for building versions of your software, you can configure the trigger to only build images for these branches.</p>
|
|
<p>All images built will be tagged with the name of the branch or tag whose change invoked the trigger</p>
|
|
</div>
|
|
</div><!-- /Section: Trigger Options -->
|
|
|
|
<!-- Section: Dockerfile Location -->
|
|
<div class="linear-workflow-section row"
|
|
section-id="dockerfilelocation"
|
|
section-title="Select Dockerfile"
|
|
section-valid="local.hasValidDockerfilePath">
|
|
<div class="col-lg-7 col-md-7 col-sm-12 main-col" ng-show="local.dockerfileLocations.status == 'error'">
|
|
<div class="co-alert co-alert-warning">
|
|
{{ local.dockerfileLocations.message }}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-lg-7 col-md-7 col-sm-12 main-col" ng-show="local.dockerfileLocations.status == 'success'">
|
|
<h3>Select Dockerfile</h3>
|
|
<strong>
|
|
Please select the location of the Dockerfile to build when this trigger is invoked {{ local.paths }}
|
|
</strong>
|
|
|
|
<dockerfile-path-select
|
|
current-path="local.dockerfilePath"
|
|
paths="local.dockerfileLocations.subdir"
|
|
supports-full-listing="true"
|
|
is-valid-path="local.hasValidDockerfilePath"></dockerfile-path-select>
|
|
</div>
|
|
|
|
<div class="col-lg-8 col-md-8 col-sm-12 main-col" ng-show="!local.dockerfileLocations">
|
|
<span class="cor-loader-inline"></span> Retrieving Dockerfile locations
|
|
</div>
|
|
<div class="col-lg-4 col-md-4 hidden-sm hidden-xs help-col">
|
|
<p>Please select the location containing the Dockerfile to be built.</p>
|
|
<p>The build context will start at the location selected.</p>
|
|
</div>
|
|
</div><!-- /Section: Dockerfile Location -->
|
|
|
|
<!-- Section: Verification and Robot Account -->
|
|
<div class="linear-workflow-section row"
|
|
section-id="verification"
|
|
section-title="Confirm"
|
|
section-valid="local.triggerAnalysis.status != 'error' && (local.triggerAnalysis.status != 'requiresrobot' || local.robotAccount != null)">
|
|
<!-- Error -->
|
|
<div class="col-lg-7 col-md-7 col-sm-12 main-col" ng-show="local.triggerAnalysis.status == 'error'">
|
|
<h3 class="error"><i class="fa fa-exclamation-circle"></i> Verification Error</h3>
|
|
<strong>
|
|
There was an error when verifying the state of <img class="namespace-avatar" ng-src="{{ local.selectedNamespace.avatar_url }}">
|
|
{{ local.selectedNamespace.id }}/{{ local.selectedRepository.name }}
|
|
</strong>
|
|
|
|
{{ local.triggerAnalysis.message }}
|
|
</div>
|
|
|
|
<!-- Warning -->
|
|
<div class="col-lg-7 col-md-7 col-sm-12 main-col" ng-show="local.triggerAnalysis.status == 'warning'">
|
|
<h3 class="warning"><i class="fa fa-exclamation-triangle"></i> Verification Warning</h3>
|
|
{{ local.triggerAnalysis.message }}
|
|
</div>
|
|
|
|
<!-- Public base -->
|
|
<div class="col-lg-7 col-md-7 col-sm-12 main-col" ng-show="local.triggerAnalysis.status == 'publicbase'">
|
|
<h3 class="success"><i class="fa fa-check-circle"></i> Ready to go!</h3>
|
|
<strong>Click "Create Trigger" to complete setup of this build trigger</strong>
|
|
</div>
|
|
|
|
<!-- Requires robot and is not admin -->
|
|
<div class="col-lg-7 col-md-7 col-sm-12 main-col" ng-show="local.triggerAnalysis.status == 'requiresrobot' && !local.triggerAnalysis.is_admin">
|
|
<h3>Robot Account Required</h3>
|
|
<p>The selected Dockerfile in the selected repository depends upon a private base image</p>
|
|
<p>A robot account with access to the base image is required to setup this trigger, but you are not the administrator of this namespace.</p>
|
|
<p>Administrative access is required to continue to ensure security of the robot credentials.</p>
|
|
</div>
|
|
|
|
<!-- Requires robot and is admin -->
|
|
<div class="col-lg-7 col-md-7 col-sm-12 main-col" ng-show="local.triggerAnalysis.status == 'requiresrobot' && local.triggerAnalysis.is_admin">
|
|
<h3>Select Robot Account</h3>
|
|
<strong>
|
|
The selected Dockerfile in the selected repository depends upon a private base image. Select a robot account with access:
|
|
</strong>
|
|
|
|
<div class="co-top-bar">
|
|
<div class="co-filter-box">
|
|
<span class="page-controls" total-count="local.orderedRobotAccounts.entries.length" current-page="local.robotOptions.page" page-size="robotsPerPage"></span>
|
|
<input class="form-control" type="text" ng-model="local.robotOptions.filter" placeholder="Filter robot accounts...">
|
|
</div>
|
|
</div>
|
|
|
|
<table class="co-table" style="margin-top: 20px;">
|
|
<thead>
|
|
<td class="checkbox-col"></td>
|
|
<td ng-class="TableService.tablePredicateClass('name', local.robotOptions.predicate, local.robotOptions.reverse)">
|
|
<a ng-click="TableService.orderBy('name', local.robotOptions)">Robot Account</a>
|
|
</td>
|
|
<td ng-class="TableService.tablePredicateClass('can_read', local.robotOptions.predicate, local.robotOptions.reverse)">
|
|
<a ng-click="TableService.orderBy('can_read', local.robotOptions)">Has Read Access</a>
|
|
</td>
|
|
</thead>
|
|
|
|
<tr class="co-checkable-row"
|
|
ng-repeat="robot in local.orderedRobotAccounts.visibleEntries | slice:(robotsPerPage * local.namespaceOptions.page):(robotsPerPage * (local.robotOptions.page + 1))"
|
|
ng-class="local.robotAccount == robot ? 'checked' : ''"
|
|
bindonce>
|
|
<td>
|
|
<input type="radio" ng-model="local.robotAccount" ng-value="robot">
|
|
</td>
|
|
<td>
|
|
<span class="entity-reference" entity="robot"></span>
|
|
</td>
|
|
<td>
|
|
<span ng-if="robot.can_read" class="success">Can Read</span>
|
|
<span ng-if="!robot.can_read">Read access will be added if selected</span>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<div class="empty" ng-if="local.triggerAnalysis.robots.length && !local.orderedRobotAccounts.entries.length"
|
|
style="margin-top: 20px;">
|
|
<div class="empty-primary-msg">No matching robot accounts found.</div>
|
|
<div class="empty-secondary-msg">Try expanding your filtering terms.</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-lg-4 col-md-4 hidden-sm hidden-xs help-col" ng-if="local.triggerAnalysis.status == 'requiresrobot' && local.triggerAnalysis.is_admin">
|
|
<p>The Dockerfile you selected utilizes a private base image.</p>
|
|
<p>In order for the <span class="registry-name"></span> to pull the base image during the build process, a robot account with access must be selected.</p>
|
|
<p>Robot accounts that already have access to this base image are listed first. If you select a robot account that does not currently have access, read permission will be granted to that robot account on trigger creation.</p>
|
|
</div>
|
|
</div><!-- /Section: Robot Account -->
|
|
|
|
</div> |