Refactor a lot of the build create code out into a common method. Add an endpoint for manually starting triggers.
This commit is contained in:
parent
a6128978cb
commit
011490d36d
4 changed files with 150 additions and 84 deletions
|
@ -12,7 +12,6 @@ from collections import defaultdict
|
|||
from urllib import quote
|
||||
|
||||
from data import model
|
||||
from data.queue import dockerfile_build_queue
|
||||
from data.plans import PLANS, get_plan
|
||||
from app import app
|
||||
from util.email import (send_confirmation_email, send_recovery_email,
|
||||
|
@ -28,9 +27,11 @@ from auth.permissions import (ReadRepositoryPermission,
|
|||
OrganizationMemberPermission,
|
||||
ViewTeamPermission,
|
||||
UserPermission)
|
||||
from endpoints.common import common_login, get_route_data, truthy_param
|
||||
from endpoints.common import (common_login, get_route_data, truthy_param,
|
||||
start_build)
|
||||
from endpoints.trigger import (BuildTrigger, TriggerActivationException,
|
||||
TriggerDeactivationException, EmptyRepositoryException)
|
||||
TriggerDeactivationException,
|
||||
EmptyRepositoryException)
|
||||
|
||||
from util.cache import cache_control
|
||||
from datetime import datetime, timedelta
|
||||
|
@ -1247,28 +1248,10 @@ def request_repo_build(namespace, repository):
|
|||
|
||||
# Start the build.
|
||||
repo = model.get_repository(namespace, repository)
|
||||
token = model.create_access_token(repo, 'write')
|
||||
display_name = user_files.get_file_checksum(dockerfile_id)
|
||||
logger.debug('**********Md5: %s' % display_name)
|
||||
|
||||
host = urlparse.urlparse(request.url).netloc
|
||||
repo_tag_base = '%s/%s/%s' % (host, repo.namespace, repo.name)
|
||||
job_config = {
|
||||
'docker_tags': ['latest'],
|
||||
'build_subdir': '',
|
||||
'repository': repo_tag_base,
|
||||
}
|
||||
build_request = model.create_repository_build(repo, token, job_config,
|
||||
dockerfile_id, display_name)
|
||||
dockerfile_build_queue.put(json.dumps({
|
||||
'build_uuid': build_request.uuid,
|
||||
'namespace': namespace,
|
||||
'repository': repository,
|
||||
}), retries_remaining=1)
|
||||
|
||||
log_action('build_dockerfile', namespace,
|
||||
{'repo': repository, 'namespace': namespace,
|
||||
'fileid': dockerfile_id}, repo=repo)
|
||||
build_request = start_build(repo, dockerfile_id, ['latest'], display_name,
|
||||
'', True)
|
||||
|
||||
resp = jsonify(build_status_view(build_request, True))
|
||||
repo_string = '%s/%s' % (namespace, repository)
|
||||
|
@ -1441,8 +1424,8 @@ def activate_build_trigger(namespace, repository, trigger_uuid):
|
|||
try:
|
||||
repository_path = '%s/%s' % (trigger.repository.namespace,
|
||||
trigger.repository.name)
|
||||
path = url_for('webhooks.build_trigger_webhook', repository=repository_path,
|
||||
trigger_uuid=trigger.uuid)
|
||||
path = url_for('webhooks.build_trigger_webhook',
|
||||
repository=repository_path, trigger_uuid=trigger.uuid)
|
||||
authed_url = _prepare_webhook_url(app.config['URL_SCHEME'], '$token',
|
||||
token.code, app.config['URL_HOST'],
|
||||
path)
|
||||
|
@ -1471,6 +1454,44 @@ def activate_build_trigger(namespace, repository, trigger_uuid):
|
|||
abort(403) # Permission denied
|
||||
|
||||
|
||||
@api.route('/repository/<path:repository>/trigger/<trigger_uuid>/start',
|
||||
methods=['POST'])
|
||||
@api_login_required
|
||||
@parse_repository_name
|
||||
def manually_start_build_trigger(namespace, repository, trigger_uuid):
|
||||
permission = AdministerRepositoryPermission(namespace, repository)
|
||||
if permission.can():
|
||||
try:
|
||||
trigger = model.get_build_trigger(namespace, repository, trigger_uuid)
|
||||
except model.InvalidBuildTriggerException:
|
||||
abort(404)
|
||||
return
|
||||
|
||||
handler = BuildTrigger.get_trigger_for_service(trigger.service.name)
|
||||
existing_config_dict = json.loads(trigger.config)
|
||||
if handler.is_active(existing_config_dict):
|
||||
abort(400)
|
||||
return
|
||||
|
||||
specs = handler.manual_start(trigger.auth_token,
|
||||
json.loads(trigger.config))
|
||||
dockerfile_id, tags, name, subdir = specs
|
||||
|
||||
repo = model.get_repository(namespace, repository)
|
||||
|
||||
build_request = start_build(repo, dockerfile_id, tags, name, subdir, True)
|
||||
|
||||
resp = jsonify(build_status_view(build_request, True))
|
||||
repo_string = '%s/%s' % (namespace, repository)
|
||||
resp.headers['Location'] = url_for('api.get_repo_build_status',
|
||||
repository=repo_string,
|
||||
build_uuid=build_request.uuid)
|
||||
resp.status_code = 201
|
||||
return resp
|
||||
|
||||
abort(403) # Permission denied
|
||||
|
||||
|
||||
@api.route('/repository/<path:repository>/trigger/<trigger_uuid>/builds',
|
||||
methods=['GET'])
|
||||
@api_login_required
|
||||
|
|
Reference in a new issue