437 lines
24 KiB
HTML
437 lines
24 KiB
HTML
<div class="manage-trigger-githost-element manage-trigger-control">
|
|
<linear-workflow done-title="Create Trigger"
|
|
(on-workflow-complete)="$ctrl.createTrigger($event)">
|
|
<!-- Section: Namespace -->
|
|
<linear-workflow-section class="row"
|
|
section-id="namespace"
|
|
section-title="::{{ 'Select ' + $ctrl.namespaceTitle }}"
|
|
section-valid="$ctrl.local.selectedNamespace"
|
|
skip-section="$ctrl.githost == 'custom-git'">
|
|
<div class="col-lg-7 col-md-7 col-sm-12 main-col"
|
|
ng-if="$ctrl.local.namespaces">
|
|
<h3>Select {{ ::$ctrl.namespaceTitle }}</h3>
|
|
<strong>Please select the {{ ::$ctrl.namespaceTitle }} under which the repository lives</strong>
|
|
|
|
<cor-table table-data="$ctrl.local.namespaces"
|
|
table-item-title="namespaces"
|
|
max-display-count="$ctrl.namespacesPerPage"
|
|
filter-fields="::['title', 'id']">
|
|
<cor-table-col datafield="title"
|
|
style="width: 30px;"
|
|
sortfield="title"
|
|
bind-model="$ctrl.local.selectedNamespace"
|
|
templateurl="/static/js/directives/ui/manage-trigger-githost/namespace-radio-input.html">
|
|
<script type="text/ng-template" id="/static/js/directives/ui/manage-trigger-githost/namespace-radio-input.html">
|
|
<input type="radio"
|
|
ng-model="col.bindModel" ng-value="item"
|
|
ng-dblclick="col.bindModel = null">
|
|
</script>
|
|
</cor-table-col>
|
|
<cor-table-col title="{{ ::$ctrl.namespaceTitle }}"
|
|
datafield="id"
|
|
sortfield="id"
|
|
templateurl="/static/js/directives/ui/manage-trigger-githost/namespace-name.html">
|
|
<script type="text/ng-template" id="/static/js/directives/ui/manage-trigger-githost/namespace-name.html">
|
|
<img class="namespace-avatar" ng-src="{{ ::item.avatar_url }}" ng-if="::item.avatar_url">
|
|
<span class="anchor"
|
|
href="{{ ::item.url }}"
|
|
is-text-only="::!item.url">{{ ::item.title }}</span>
|
|
</script>
|
|
</cor-table-col>
|
|
<cor-table-col title="Importance"
|
|
datafield="score"
|
|
bind-model="$ctrl.local.maxScore"
|
|
style="display: flex; justify-content: flex-end"
|
|
templateurl="/static/js/directives/ui/manage-trigger-githost/namespace-score.html">
|
|
<script type="text/ng-template" id="/static/js/directives/ui/manage-trigger-githost/namespace-score.html">
|
|
<div style="padding-right: 40px;">
|
|
<span class="strength-indicator"
|
|
value="::item.score" maximum="::col.bindModel" log-base="10"></span>
|
|
</div>
|
|
</script>
|
|
</cor-table-col>
|
|
</cor-table>
|
|
</div>
|
|
|
|
<div class="col-lg-8 col-md-8 col-sm-12 main-col"
|
|
ng-if="!$ctrl.local.namespaces">
|
|
<span class="cor-loader-inline"></span> Retrieving {{ $ctrl.namespaceTitle }}s
|
|
</div>
|
|
<div class="col-lg-4 col-md-4 hidden-sm hidden-xs help-col" ng-if="$ctrl.local.namespaces">
|
|
<p>
|
|
<span class="registry-name"></span> has been granted access to read and view these {{ $ctrl.namespaceTitle }}s.
|
|
</p>
|
|
<p class="co-alert co-alert-info gh-grant-message" ng-if="$ctrl.githost == 'github'">
|
|
<b>Don't see an expected organization here?</b>Please visit <a href="{{ $ctrl.githubTriggerEndpoint }}settings/connections/applications/{{ $ctrl.githubTriggerClientId }}" target="_blank" rel="nofollow noopener">Connections with <span class="registry-name"></span></a> and choose <span class="gh-button">Grant</span> or <span class="gh-button">Request</span> before reloading this page.
|
|
</p>
|
|
</div>
|
|
</linear-workflow-section><!-- /Section: Namespace -->
|
|
|
|
<!-- Section: Githost Repository -->
|
|
<linear-workflow-section class="row"
|
|
section-id="repo"
|
|
section-title="Select Repository"
|
|
section-valid="$ctrl.local.selectedRepository.full_name"
|
|
skip-section="$ctrl.githost == 'custom-git'">
|
|
<div class="col-lg-7 col-md-7 col-sm-12 main-col"
|
|
ng-if="$ctrl.local.repositories">
|
|
<h3>Select Repository</h3>
|
|
<strong>
|
|
Select a repository in
|
|
<img class="namespace-avatar"
|
|
ng-src="{{ $ctrl.local.selectedNamespace.avatar_url }}"
|
|
ng-if="$ctrl.local.selectedNamespace.avatar_url">
|
|
{{ $ctrl.local.selectedNamespace.title }}
|
|
</strong>
|
|
|
|
<div style="display: flex; justify-content: flex-end;">
|
|
<div class="filter-options">
|
|
<label>
|
|
<input type="checkbox"
|
|
ng-model="$ctrl.local.repositoryOptions.hideStale"
|
|
ng-change="$ctrl.buildOrderedRepositories()">
|
|
Hide stale repositories
|
|
</label>
|
|
</div>
|
|
</div>
|
|
|
|
<cor-table table-data="$ctrl.local.orderedRepositories.entries"
|
|
table-item-title="repositories"
|
|
max-display-count="$ctrl.repositoriesPerPage"
|
|
filter-fields="['name', 'description']">
|
|
<cor-table-col bind-model="$ctrl.local.selectedRepository"
|
|
templateurl="/static/js/directives/ui/manage-trigger-githost/repository-radio-input.html"
|
|
style="width: 30px;">
|
|
<script type="text/ng-template" id="/static/js/directives/ui/manage-trigger-githost/repository-radio-input.html">
|
|
<span ng-if="!item.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>
|
|
<div ng-if="item.has_admin_permissions">
|
|
<input type="radio"
|
|
ng-model="col.bindModel" ng-value="item"
|
|
ng-dblclick="col.bindModel = null">
|
|
</div>
|
|
</script>
|
|
</cor-table-col>
|
|
<cor-table-col title="Repository Name"
|
|
datafield="name"
|
|
sortfield="name"
|
|
bind-model="$ctrl.getTriggerIcon()"
|
|
templateurl="/static/js/directives/ui/manage-trigger-githost/repository-name.html">
|
|
<script type="text/ng-template" id="/static/js/directives/ui/manage-trigger-githost/repository-name.html">
|
|
<i class="service-icon fa {{ ::col.bindModel }}"></i>
|
|
<span class="anchor"
|
|
href="{{ item.url }}"
|
|
is-text-only="!item.url">{{ item.name }}</span>
|
|
</script>
|
|
</cor-table-col>
|
|
<cor-table-col title="Updated"
|
|
datafield="last_updated_datetime"
|
|
templateurl="/static/js/directives/ui/manage-trigger-githost/repository-last-updated.html">
|
|
<script type="text/ng-template" id="/static/js/directives/ui/manage-trigger-githost/repository-last-updated.html">
|
|
<time-ago datetime="item.last_updated_datetime"></time-ago>
|
|
</script>
|
|
</cor-table-col>
|
|
<cor-table-col title="Description"
|
|
datafield="description"
|
|
sortfield="description"
|
|
templateurl="/static/js/directives/ui/manage-trigger-githost/repository-description.html"
|
|
class="co-flowing-col">
|
|
<script type="text/ng-template" id="/static/js/directives/ui/manage-trigger-githost/repository-description.html">
|
|
<span ng-if="item.description" class="repo-description">
|
|
{{ item.description }}
|
|
</span>
|
|
<span ng-if="!item.description" class="empty-description">(None)</span>
|
|
</script>
|
|
</cor-table-col>
|
|
</cor-table>
|
|
</div>
|
|
|
|
<div class="col-lg-8 col-md-8 col-sm-12 main-col"
|
|
ng-if="!$ctrl.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-if="$ctrl.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>
|
|
</linear-workflow-section><!-- /Section: Githost Repository -->
|
|
|
|
<!-- Section: Custom Git Repository -->
|
|
<linear-workflow-section class="row"
|
|
section-id="repo"
|
|
section-title="Git Repository"
|
|
section-valid="$ctrl.local.selectedRepository.full_name"
|
|
skip-section="$ctrl.githost != 'custom-git'">
|
|
|
|
<div class="col-lg-7 col-md-7 col-sm-12 main-col">
|
|
<h3>Enter repository</h3>
|
|
<strong>Please enter the HTTP or SSH style URL used to clone your git repository</strong>
|
|
<input class="form-control" type="text" placeholder="git@example.com:namespace/repository.git"
|
|
ng-model="$ctrl.buildSource"
|
|
ng-change="$ctrl.checkBuildSource($ctrl.buildSource)"
|
|
ng-pattern="/(((http|https):\/\/)(.+)|\w+@(.+):(.+))/">
|
|
</div>
|
|
<div class="col-lg-5 col-md-5 hidden-sm hidden-xs help-col">
|
|
<p>Custom git triggers support any externally accessible git repository, via either the normal git protocol or HTTP.</p>
|
|
|
|
<p><b>It is the responsibility of the git repository to invoke a webhook to tell <span class="registry-name" short="true"></span> that a commit has been added.</b></p>
|
|
</div>
|
|
</linear-workflow-section><!-- /Section: Repository -->
|
|
|
|
<!-- Section: Trigger Options -->
|
|
<linear-workflow-section class="row"
|
|
section-id="triggeroptions"
|
|
section-title="Configure Trigger"
|
|
section-valid="$ctrl.local.triggerOptions"
|
|
skip-section="$ctrl.githost == 'custom-git'">
|
|
<div class="col-lg-7 col-md-7 col-sm-12 main-col" ng-if="$ctrl.local.repositoryRefs">
|
|
<h3>Configure Trigger</h3>
|
|
<strong>
|
|
Configure trigger options for
|
|
<img class="namespace-avatar"
|
|
ng-src="{{ $ctrl.local.selectedNamespace.avatar_url }}"
|
|
ng-if="$ctrl.local.selectedNamespace.avatar_url">
|
|
{{ $ctrl.local.selectedNamespace.title }}/{{ $ctrl.local.selectedRepository.name }}
|
|
</strong>
|
|
|
|
<div class="radio" style="margin-top: 20px;">
|
|
<label>
|
|
<input type="radio" name="optionRadio"
|
|
ng-model="$ctrl.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="$ctrl.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="$ctrl.local.triggerOptions.hasBranchTagFilter">
|
|
<table>
|
|
<tr>
|
|
<td style="white-space: nowrap;">Regular Expression:</td>
|
|
<td>
|
|
<input type="text" class="form-control"
|
|
ng-model="$ctrl.local.triggerOptions.branchTagFilter"
|
|
required>
|
|
<div class="description">Examples: heads/master, tags/tagname, heads/.+</div>
|
|
<regex-match-view items="$ctrl.local.repositoryFullRefs"
|
|
regex="$ctrl.local.triggerOptions.branchTagFilter"
|
|
ng-if="$ctrl.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-if="!$ctrl.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>
|
|
</linear-workflow-section><!-- /Section: Trigger Options -->
|
|
|
|
<!-- Section: Dockerfile Location -->
|
|
<linear-workflow-section class="row"
|
|
section-id="dockerfilelocation"
|
|
section-title="Select Dockerfile"
|
|
section-valid="$ctrl.local.hasValidDockerfilePath">
|
|
<div class="col-lg-7 col-md-7 col-sm-12 main-col"
|
|
ng-if="$ctrl.local.dockerfileLocations.status == 'error'">
|
|
<div class="co-alert co-alert-warning">
|
|
{{ $ctrl.local.dockerfileLocations.message }}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-lg-7 col-md-7 col-sm-12 main-col"
|
|
ng-if="$ctrl.githost == 'custom-git' || $ctrl.local.dockerfileLocations.status == 'success'">
|
|
<h3>Select Dockerfile</h3>
|
|
<strong>Please select the location of the Dockerfile to build when this trigger is invoked</strong>
|
|
<dockerfile-path-select current-path="$ctrl.local.dockerfilePath"
|
|
paths="$ctrl.local.dockerfileLocations.dockerfile_paths"
|
|
supports-full-listing="true"
|
|
(path-changed)="$ctrl.checkDockerfilePath($event)"></dockerfile-path-select>
|
|
<span ng-if="$ctrl.local.dockerfilePath.split('/').splice(-1)[0] == ''"
|
|
style="color: #D64456;">
|
|
Dockerfile path must end with a file, probably named <code>Dockerfile</code>
|
|
</span>
|
|
</div>
|
|
|
|
<div class="col-lg-8 col-md-8 col-sm-12 main-col"
|
|
ng-if="$ctrl.githost != 'custom-git' && !$ctrl.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 Dockerfile path starts with the context and ends with the path to the Dockefile that you would like to build</p>
|
|
<p>If the Dockerfile is located at the root of the git repository and named Dockerfile, enter <code>/Dockerfile</code> as the Dockerfile path.</p>
|
|
</div>
|
|
</linear-workflow-section><!-- /Section: Dockerfile Location -->
|
|
|
|
<!-- Section: Context Location -->
|
|
<linear-workflow-section class="row"
|
|
section-id="contextlocation"
|
|
section-title="Select Docker Context"
|
|
section-valid="$ctrl.local.hasValidContextLocation">
|
|
<div class="col-lg-7 col-md-7 col-sm-12 main-col"
|
|
ng-if="$ctrl.local.dockerfileLocations.status == 'error'">
|
|
<div class="co-alert co-alert-warning">
|
|
{{ $ctrl.local.dockerfileLocations.message }}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-lg-7 col-md-7 col-sm-12 main-col"
|
|
ng-if="$ctrl.githost == 'custom-git' || $ctrl.local.dockerfileLocations.status == 'success'">
|
|
<h3>Select Context</h3>
|
|
<strong>Please select the context for the Docker build</strong>
|
|
|
|
<context-path-select current-context="$ctrl.local.dockerContext"
|
|
contexts="$ctrl.local.contexts"
|
|
(context-changed)="$ctrl.checkBuildContext($event)"></context-path-select>
|
|
</div>
|
|
|
|
<div class="col-lg-8 col-md-8 col-sm-12 main-col"
|
|
ng-if="$ctrl.githost != 'custom-git' && !$ctrl.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 a Docker context.</p>
|
|
<p>The build context directory is the path of the directory containing the Dockerfile and any other files to be made available when the build is triggered.</p>
|
|
<p>If the Dockerfile is located at the root of the git repository, enter <code>/</code> as the build context directory.</p>
|
|
</div>
|
|
</linear-workflow-section><!-- /Section: Context Location -->
|
|
|
|
<!-- Section: Robot Account -->
|
|
<linear-workflow-section class="row"
|
|
section-id="robot"
|
|
section-title="Robot Account"
|
|
section-valid="$ctrl.local.triggerAnalysis.status != 'error' &&
|
|
($ctrl.local.triggerAnalysis.status != 'requiresrobot' || $ctrl.local.robotAccount)">
|
|
<!-- Error -->
|
|
<div class="col-lg-7 col-md-7 col-sm-12 main-col"
|
|
ng-if="$ctrl.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="{{ $ctrl.local.selectedNamespace.avatar_url }}"
|
|
ng-if="$ctrl.local.selectedNamespace.avatar_url">
|
|
{{ $ctrl.local.selectedNamespace.title }}/{{ $ctrl.local.selectedRepository.name }}
|
|
</strong>
|
|
|
|
{{ $ctrl.local.triggerAnalysis.message }}
|
|
</div>
|
|
|
|
<!-- Robot display for non-error cases -->
|
|
<div class="col-lg-7 col-md-7 col-sm-12 main-col"
|
|
ng-if="$ctrl.local.triggerAnalysis.status != 'error'">
|
|
<!-- Warning -->
|
|
<div ng-if="$ctrl.local.triggerAnalysis.status == 'warning'">
|
|
<h3 class="warning"><i class="fa fa-exclamation-triangle"></i> Verification Warning</h3>
|
|
{{ $ctrl.local.triggerAnalysis.message }}
|
|
</div>
|
|
|
|
<!-- Public base -->
|
|
<div ng-if="$ctrl.local.triggerAnalysis.status == 'publicbase'">
|
|
<h3>Optional Robot Account</h3>
|
|
<strong>
|
|
<span ng-if="$ctrl.local.triggerAnalysis.is_admin">Choose an optional robot account below or click "Continue" to complete setup of this build trigger.</span>
|
|
</strong>
|
|
</div>
|
|
|
|
<!-- Requires robot and is not admin -->
|
|
<div ng-if="$ctrl.local.triggerAnalysis.status == 'requiresrobot' && !$ctrl.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 ng-if="$ctrl.local.triggerAnalysis.status == 'requiresrobot' && $ctrl.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.</p>
|
|
</div>
|
|
|
|
<!-- Robots view -->
|
|
<div ng-if="$ctrl.local.triggerAnalysis.is_admin">
|
|
<cor-table table-data="$ctrl.local.triggerAnalysis.robots"
|
|
table-item-title="robot accounts"
|
|
filter-fields="['name']"
|
|
max-display-count="$ctrl.robotsPerPage">
|
|
<cor-table-col datafield="name"
|
|
bind-model="$ctrl.local.robotAccount"
|
|
style="width: 30px;"
|
|
templateurl="/static/js/directives/ui/manage-trigger-custom-git/robot-radio-input.html">
|
|
<script type="text/ng-template" id="/static/js/directives/ui/manage-trigger-custom-git/robot-radio-input.html">
|
|
<input type="radio"
|
|
ng-model="col.bindModel" ng-value="item"
|
|
ng-dblclick="col.bindModel = null">
|
|
</script>
|
|
</cor-table-col>
|
|
<cor-table-col title="Robot Account"
|
|
sortfield="name"
|
|
templateurl="/static/js/directives/ui/manage-trigger-custom-git/robot-name.html">
|
|
<script type="text/ng-template" id="/static/js/directives/ui/manage-trigger-custom-git/robot-name.html">
|
|
<span class="entity-reference" entity="item"></span>
|
|
</script>
|
|
</cor-table-col>
|
|
<cor-table-col ng-if="$ctrl.local.triggerAnalysis.status == 'requiresrobot' || true"
|
|
datafield="can_read"
|
|
templateurl="/static/js/directives/ui/manage-trigger-custom-git/can-read.html">
|
|
<script type="text/ng-template" id="/static/js/directives/ui/manage-trigger-custom-git/can-read.html">
|
|
<span ng-if="item.can_read" class="success">Can Read</span>
|
|
<span ng-if="!item.can_read">Read access will be added if selected</span>
|
|
</script>
|
|
</cor-table-col>
|
|
</cor-table>
|
|
</div> <!-- /Robots view -->
|
|
</div>
|
|
|
|
<div class="col-lg-4 col-md-4 hidden-sm hidden-xs help-col"
|
|
ng-if="$ctrl.local.triggerAnalysis.is_admin">
|
|
<p>
|
|
In order for the <span class="registry-name"></span> to pull a <b>private base image</b> during the build
|
|
process, a robot account with access must be selected.
|
|
</p>
|
|
<p ng-if="$ctrl.local.triggerAnalysis.status != 'requiresrobot'">
|
|
If you know that a private base image is not used, you can skip this step.
|
|
</p>
|
|
<p ng-if="$ctrl.local.triggerAnalysis.status == 'requiresrobot'">
|
|
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>
|
|
</linear-workflow-section><!-- /Section: Verification and Robot Account -->
|
|
|
|
<!-- Verification -->
|
|
<linear-workflow-section class="row"
|
|
section-id="verification"
|
|
section-title="Verification"
|
|
section-valid="true">
|
|
<span>
|
|
<h3 class="success"><i class="fa fa-check-circle"></i> Ready to go!</h3>
|
|
Click "Continue" to complete setup of this build trigger.
|
|
</span>
|
|
</linear-workflow-section><!-- /Section: Verification -->
|
|
</linear-workflow>
|
|
</div>
|