diff --git a/endpoints/api/build.py b/endpoints/api/build.py index 69e23efae..e52962416 100644 --- a/endpoints/api/build.py +++ b/endpoints/api/build.py @@ -94,7 +94,11 @@ def build_status_view(build_obj, can_write=False): 'is_writer': can_write, 'trigger': trigger_view(build_obj.trigger), 'resource_key': build_obj.resource_key, - 'pull_robot': user_view(build_obj.pull_robot) if build_obj.pull_robot else None + 'pull_robot': user_view(build_obj.pull_robot) if build_obj.pull_robot else None, + 'repository': { + 'namespace': build_obj.repository.namespace_user.username, + 'name': build_obj.repository.name + } } if can_write: @@ -215,6 +219,18 @@ class RepositoryBuildList(RepositoryParamResource): @path_param('build_uuid', 'The UUID of the build') class RepositoryBuildResource(RepositoryParamResource): """ Resource for dealing with repository builds. """ + @require_repo_read + @nickname('getRepoBuild') + def get(self, namespace, repository, build_uuid): + """ Returns information about a build. """ + try: + build = model.get_repository_build(build_uuid) + except model.InvalidRepositoryBuildException: + raise NotFound() + + can_write = ModifyRepositoryPermission(namespace, repository).can() + return build_status_view(build, can_write) + @require_repo_admin @nickname('cancelRepoBuild') def delete(self, namespace, repository, build_uuid): diff --git a/endpoints/api/trigger.py b/endpoints/api/trigger.py index 1c59be1ee..4788a6e65 100644 --- a/endpoints/api/trigger.py +++ b/endpoints/api/trigger.py @@ -421,7 +421,8 @@ class ActivateBuildTrigger(RepositoryParamResource): pull_robot_name = model.get_pull_robot_name(trigger) build_request = start_build(repo, dockerfile_id, tags, name, subdir, True, - pull_robot_name=pull_robot_name, trigger_metadata=metadata) + trigger=trigger, pull_robot_name=pull_robot_name, + trigger_metadata=metadata) except TriggerStartException as tse: raise InvalidRequest(tse.message) diff --git a/endpoints/common.py b/endpoints/common.py index 9bebbd0c2..e8f49b087 100644 --- a/endpoints/common.py +++ b/endpoints/common.py @@ -224,7 +224,8 @@ def start_build(repository, dockerfile_id, tags, build_name, subdir, manual, 'docker_tags': tags, 'registry': host, 'build_subdir': subdir, - 'trigger_metadata': trigger_metadata or {} + 'trigger_metadata': trigger_metadata or {}, + 'is_manual': manual } with app.config['DB_TRANSACTION_FACTORY'](db): diff --git a/endpoints/trigger.py b/endpoints/trigger.py index cc248f798..bfd9f8ce7 100644 --- a/endpoints/trigger.py +++ b/endpoints/trigger.py @@ -310,6 +310,30 @@ class GithubBuildTrigger(BuildTrigger): message = ge.data.get('message', 'Unable to read Dockerfile: %s' % source) raise RepositoryReadException(message) + @staticmethod + def _build_commit_info(repo, commit_sha): + try: + commit = repo.get_commit(commit_sha) + except GithubException: + logger.exception('Could not load data for commit') + return + + return { + 'url': commit.html_url, + 'message': commit.commit.message, + 'author': { + 'username': commit.author.login, + 'avatar_url': commit.author.avatar_url, + 'url': commit.author.html_url + }, + 'committer': { + 'username': commit.committer.login, + 'avatar_url': commit.committer.avatar_url, + 'url': commit.committer.html_url + }, + 'date': commit.last_modified + } + @staticmethod def _prepare_build(config, repo, commit_sha, build_name, ref): # Prepare the download and upload URLs @@ -360,9 +384,14 @@ class GithubBuildTrigger(BuildTrigger): metadata = { 'commit_sha': commit_sha, 'ref': ref, - 'default_branch': repo.default_branch + 'default_branch': repo.default_branch, } + # add the commit info. + commit_info = GithubBuildTrigger._build_commit_info(repo, commit_sha) + if commit_info is not None: + metadata['commit_info'] = commit_info + return dockerfile_id, list(tags), build_name, joined_subdir, metadata @staticmethod @@ -417,6 +446,7 @@ class GithubBuildTrigger(BuildTrigger): branch_name = run_parameters.get('branch_name') or repo.default_branch branch = repo.get_branch(branch_name) branch_sha = branch.commit.sha + commit_info = branch.commit short_sha = GithubBuildTrigger.get_display_name(branch_sha) ref = 'refs/heads/%s' % (branch_name) diff --git a/initdb.py b/initdb.py index f18093a1b..4076eff09 100644 --- a/initdb.py +++ b/initdb.py @@ -418,6 +418,11 @@ def populate_database(): 'repository': repo, 'docker_tags': ['latest'], 'build_subdir': '', + 'trigger_metadata': { + 'commit_sha': '3482adc5822c498e8f7db2e361e8d57b3d77ddd9', + 'ref': 'refs/heads/master', + 'default_branch': 'master' + } } record = model.create_email_authorization_for_repo(new_user_1.username, 'simple', diff --git a/static/css/core-ui.css b/static/css/core-ui.css index 50b934647..91c0b6607 100644 --- a/static/css/core-ui.css +++ b/static/css/core-ui.css @@ -733,4 +733,24 @@ .cor-container { padding-left: 15px; padding-right: 15px; -} \ No newline at end of file +} + +.cor-title-link { + line-height: 30px; + margin-top: 22px; + margin-bottom: 10px; + font-size: 16px; +} + +.cor-title-link a { + color: lightblue; +} + +.cor-title-link a.back-link:before { + content: "\f060"; + color: white; + display: inline-block; + margin-right: 10px; + vertical-align: middle; + font-family: FontAwesome; +} diff --git a/static/css/directives/ui/build-info-bar.css b/static/css/directives/ui/build-info-bar.css new file mode 100644 index 000000000..2421b89a9 --- /dev/null +++ b/static/css/directives/ui/build-info-bar.css @@ -0,0 +1,34 @@ +.build-info-bar-element { + position: relative; + padding: 6px; + padding-left: 20px; +} + +.build-info-bar-element .phase-icon { + position: absolute; + top: 4px; + left: 4px; + bottom: 0px; + height: auto; + border-radius: 0px; + width: 5px; +} + +.build-info-bar-element .build-side-info { + float: right; +} + +.build-info-bar-element .build-side-info .build-side-id { + font-size: 12px; + color: #ccc; + margin-bottom: 10px; +} + +.build-info-bar-element .build-side-info .timing .fa { + display: inline-block; + margin-right: 4px; +} + +.build-info-bar-element .build-side-info .timing { + text-align: right; +} \ No newline at end of file diff --git a/static/css/directives/ui/build-logs-view.css b/static/css/directives/ui/build-logs-view.css new file mode 100644 index 000000000..dca63e410 --- /dev/null +++ b/static/css/directives/ui/build-logs-view.css @@ -0,0 +1,179 @@ +.build-logs-view { + position: relative; + color: white; + padding: 10px; + overflow: auto; + box-shadow: inset 10px 10px 5px -9px rgba(0,0,0,0.75); + background-color: #263945; + + min-height: 100px; +} + +.build-logs-view .no-logs { + color: #8C8C8C; +} + +.build-logs-view .container-header { + padding: 2px; +} + +.build-logs-view .container-logs { + margin: 4px; + padding-bottom: 4px; +} + +.build-logs-view .command-title, +.build-logs-view .log-entry .message, +.build-logs-view .log-entry .message span { + font-family: Consolas, "Lucida Console", Monaco, monospace; + font-size: 13px; +} + +.build-logs-view .container-header { + cursor: pointer; + position: relative; +} + +.build-logs-view .container-header i.fa.chevron { + color: #666; + margin-right: 4px; + width: 14px; + text-align: center; + + position: absolute; + top: 6px; + left: 0px; +} + +.build-logs-view .log-container.command { + margin-left: 22px; +} + +.build-logs-view .container-header.building { + margin-bottom: 10px; +} + +.build-logs-view .container-header.pushing { + margin-top: 10px; +} + +.build-logs-view .build-log-error-element .error-message-container { + position: relative; + display: inline-block; + margin: 10px; + padding: 10px; + background: rgba(255, 0, 0, 0.17); + border-radius: 10px; + margin-left: 22px; +} + +.build-logs-view .build-log-error-element .error-message-container i.fa { + color: red; + position: absolute; + top: 13px; + left: 11px; +} + +.build-logs-view .build-log-error-element .error-message { + display: inline-block; + margin-left: 25px; +} + +.build-logs-view .container-header .label { + padding-top: 4px; + text-align: right; + margin-right: 4px; + width: 86px; + display: inline-block; + + border-right: 4px solid #aaa; + background-color: #717171; + + position: absolute; + top: 4px; + left: 24px; +} + +.build-logs-view .dockerfile-command { + position: inherit; +} + +.build-logs-view .dockerfile-command .command-title { + padding-left: 0px; +} + +.build-logs-view .container-header .container-content { + display: block; + padding-left: 20px; +} + +.build-logs-view .container-header .container-content.build-log-command { + padding-left: 120px; +} + +.build-logs-view .log-entry { + position: relative; +} + +.build-logs-view .log-entry:hover { + background: rgba(0, 0, 0, 0.2); + cursor: pointer; +} + +.build-logs-view .log-entry:hover .timestamp { + visibility: visible; +} + +.build-logs-view .log-entry .timestamp { + float: right; + visibility: hidden; + color: #aaa; + margin-right: 10px; +} + +.build-logs-view .log-entry .message { + display: inline-block; + margin-left: 46px; +} + +.build-logs-view .log-entry .id { + color: #aaa; + padding-right: 6px; + margin-right: 10px; + text-align: right; + font-size: 12px; + width: 40px; + + position: absolute; + top: 1px; + left: 4px; +} + +.build-logs-view .copy-button { + position: absolute; + top: 6px; + right: 6px; + z-index: 2; + transition: all 0.15s ease-in-out; +} + +.build-logs-view .copy-button:not(.zeroclipboard-is-hover) { + background: transparent; + border: 1px solid transparent; + color: #ddd; +} + +.build-logs-view .copy-button i.fa { + margin-right: 10px; +} + +.build-logs-view-element.with-timestamps .log-entry .message { + display: inline-block; + margin-left: 146px; +} + +.build-logs-view-element.with-timestamps .log-entry .id { + width: 140px; + white-space: nowrap; + padding-right: 10px; +} diff --git a/static/css/directives/ui/source-commit-link.css b/static/css/directives/ui/source-commit-link.css new file mode 100644 index 000000000..55966d164 --- /dev/null +++ b/static/css/directives/ui/source-commit-link.css @@ -0,0 +1,4 @@ +.source-commit-link-element .fa { + margin-right: 4px; + display: inline-block; +} \ No newline at end of file diff --git a/static/css/directives/ui/source-ref-link.css b/static/css/directives/ui/source-ref-link.css new file mode 100644 index 000000000..cf593ec07 --- /dev/null +++ b/static/css/directives/ui/source-ref-link.css @@ -0,0 +1,4 @@ +.source-ref-link-element .fa { + margin-right: 4px; + display: inline-block; +} \ No newline at end of file diff --git a/static/css/directives/ui/triggered-build-description.css b/static/css/directives/ui/triggered-build-description.css new file mode 100644 index 000000000..2ef4914e3 --- /dev/null +++ b/static/css/directives/ui/triggered-build-description.css @@ -0,0 +1,44 @@ +.triggered-build-description-element .commit-message { + font-size: 16px; + display: block; +} + +.triggered-build-description-element .commit-message a { + color: black; +} + +.triggered-build-description-element .commit-who img { + width: 16px; + height: 16px; + margin-left: 2px; + margin-right: 2px; + border-radius: 50%; +} + +.triggered-build-description-element .fa-github { + display: inline-block; + margin-left: 6px; + margin-right: 4px; +} + +.triggered-build-description-element .commit-information { + margin-top: 6px; + font-size: 14px; + color: #999; +} + +.triggered-build-description-element .source-commit-link a { + color: #999; +} + +.triggered-build-description-element .source-ref-link a { + color: #999; +} + +.triggered-build-description-element .commit-information > span { + margin-right: 20px; +} + +.triggered-build-description-element .commit-who:before { + content: "by "; +} \ No newline at end of file diff --git a/static/css/pages/build-view.css b/static/css/pages/build-view.css new file mode 100644 index 000000000..649f0005a --- /dev/null +++ b/static/css/pages/build-view.css @@ -0,0 +1,51 @@ +.build-view .build-header .repo-breadcrumb { + font-size: 18px; + margin-left: 12px; +} + +.build-view .build-status-header { + padding: 4px; +} + +.build-view .build-status-header .cor-loader-inline { + margin-right: 10px; +} + +.build-view .build-logs-view { + margin-top: 10px; +} + +.build-view .build-status-header { + font-size: 17px; + margin-top: 10px; +} + +.build-view .build-status-header .fa { + margin-right: 6px; +} + +.build-view .build-icon-message.error { + color: red; +} + +.build-view .build-icon-message.internalerror { + color: #DFFF00; +} + +.build-view .build-icon-message.complete { + color: #2fcc66; +} + +.build-view .build-status-header .cor-options-menu { + float: right; + margin-left: 20px; +} + +.build-view .build-status-header .timing { + float: right; +} + +.build-view .build-status-header .timing .fa { + margin-left: 10px; + margin-right: 4px; +} diff --git a/static/css/quay.css b/static/css/quay.css index bc6e172e9..3062f95e2 100644 --- a/static/css/quay.css +++ b/static/css/quay.css @@ -912,7 +912,7 @@ i.toggle-icon:hover { } .phase-icon.complete { - background-color: rgba(66, 139, 202, 1); + background-color: #2fcc66; } .build-status { diff --git a/static/directives/build-info-bar.html b/static/directives/build-info-bar.html new file mode 100644 index 000000000..4a970d727 --- /dev/null +++ b/static/directives/build-info-bar.html @@ -0,0 +1,18 @@ +
\ No newline at end of file diff --git a/static/directives/build-logs-view.html b/static/directives/build-logs-view.html new file mode 100644 index 000000000..285a8b141 --- /dev/null +++ b/static/directives/build-logs-view.html @@ -0,0 +1,37 @@ +