def put(self, request, *args, **kwargs): """ 修改组件触发自动部署关键字 """ try: keyword = request.data.get("keyword", None) if not keyword: return Response(general_message(400, "param error", "参数错误"), status=400) is_pass, msg = app_service.check_service_cname( self.tenant, keyword, self.service.service_region) if not is_pass: return Response(general_message(400, "param error", msg), status=400) service_webhook = service_webhooks_repo.get_service_webhooks_by_service_id_and_type( self.service.service_id, "code_webhooks") if not service_webhook: return Response(general_message(412, "keyword is null", "组件自动部署属性不存在"), status=412) service_webhook.deploy_keyword = keyword service_webhook.save() result = general_message(200, "success", "修改成功", bean=service_webhook.to_dict()) except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result, status=result["code"])
def post(self, request, service_id, *args, **kwargs): try: service_obj = TenantServiceInfo.objects.get(service_id=service_id) if not service_obj: result = general_message(400, "failed", "服务不存在") return Response(result, status=400) tenant_obj = Tenants.objects.get(tenant_id=service_obj.tenant_id) service_webhook = service_webhooks_repo.get_service_webhooks_by_service_id_and_type( service_obj.service_id, "image_webhooks") if not service_webhook.state: result = general_message(400, "failed", "服务关闭了自动构建") return Response(result, status=400) # 校验 repository = request.data.get("repository") if not repository: logger.debug("缺少repository信息") result = general_message(400, "failed", "缺少repository信息") return Response(result, status=400) push_data = request.data.get("push_data") pusher = push_data.get("pusher") tag = push_data.get("tag") repo_name = repository.get("repo_name") if not repo_name: repo_name = repository.get("repo_full_name") if not repo_name: result = general_message(400, "failed", "缺少repository名称信息") return Response(result, status=400) ref = reference.Reference.parse(service_obj.image) hostname, name = ref.split_hostname() if repo_name != name: result = general_message(400, "failed", "镜像名称与服务构建源不符") return Response(result, status=400) if tag != ref['tag']: result = general_message(400, "failed", "镜像tag与服务构建源不符") return Response(result, status=400) # 获取应用状态 status_map = app_service.get_service_status( tenant_obj, service_obj) status = status_map.get("status", None) user_obj = Users.objects.get(user_id=service_obj.creater) committer_name = pusher if status != "undeploy" and status != "closed" \ and status != "closed": return user_services.deploy_service( tenant_obj=tenant_obj, service_obj=service_obj, user=user_obj, committer_name=committer_name) else: result = general_message(400, "failed", "应用状态处于关闭中,不支持自动构建") return Response(result, status=400) except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result, status=500)
def post(self, request, service_id, *args, **kwargs): try: import json logger.debug( "----------========imagewebhooks==============>{0}".format( json.dumps(request.data))) logger.debug('--------------request.META-------->{0}'.format( request.META)) service_obj = TenantServiceInfo.objects.get(service_id=service_id) tenant_obj = Tenants.objects.get(tenant_id=service_obj.tenant_id) service_webhook = service_webhooks_repo.get_service_webhooks_by_service_id_and_type( service_obj.service_id, "image_webhooks") if not service_webhook.state: logger.debug("没开启webhooks自动部署") result = general_message(400, "failed", "没有开启此功能") return Response(result, status=400) # 校验 repository = request.data.get("repository") if not repository: logger.debug("缺少repository信息") result = general_message(400, "failed", "缺少repository信息") return Response(result, status=400) push_data = request.data.get("push_data") pusher = push_data.get("pusher") tag = push_data.get("tag") repo_name = repository.get("repo_name") image = repo_name + ":" + tag if image != service_obj.image: result = general_message(400, "failed", "镜像不相符") return Response(result, status=400) # 获取应用状态 status_map = app_service.get_service_status( tenant_obj, service_obj) status = status_map.get("status", None) logger.debug(status) user_obj = Users.objects.get(user_id=service_obj.creater) # committer_name = commits_info.get("author").get("username") committer_name = pusher if status == "running" or status == "abnormal": return user_services.deploy_service( tenant_obj=tenant_obj, service_obj=service_obj, user=user_obj, committer_name=committer_name) else: logger.debug("应用状态异常") result = general_message(400, "failed", "应用状态不支持") return Response(result, status=400) except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result, status=500)
def post(self, request, *args, **kwargs): """ 开启或关闭自动部署功能 --- parameters: - name: tenantName description: 租户名 required: true type: string paramType: path - name: serviceAlias description: 服务别名 required: true type: string paramType: path - name: action description: 操作 打开:open 关闭:close required: true type: string 格式:{"action":"open"} paramType: body """ try: action = request.data.get("action", None) deployment_way = request.data.get("deployment_way", None) if not action or not deployment_way: result = general_message(400, "Parameter cannot be empty", "缺少参数") return Response(result, status=400) if action != "open" and action != "close": result = general_message(400, "action error", "操作类型不存在") return Response(result, status=400) service_webhook = service_webhooks_repo.get_service_webhooks_by_service_id_and_type( self.service.service_id, deployment_way) if not service_webhook: service_webhook = service_webhooks_repo.create_service_webhooks( self.service.service_id, deployment_way) if action == "open": service_webhook.state = True service_webhook.save() result = general_message(200, "success", "开启成功") else: service_webhook.state = False service_webhook.save() result = general_message(200, "success", "关闭成功") except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result, status=500) return Response(result, status=200)
def get(self, request, *args, **kwargs): """ 判断该应用是否有webhooks自动部署功能,有则返回URL """ try: deployment_way = request.GET.get("deployment_way", None) if not deployment_way: result = general_message(400, "Parameter cannot be empty", "缺少参数") return Response(result, status=400) tenant_id = self.tenant.tenant_id service_alias = self.service.service_alias service_obj = TenantServiceInfo.objects.filter( tenant_id=tenant_id, service_alias=service_alias)[0] if service_obj.service_source == AppConstants.MARKET: result = general_message(200, "failed", "该应用不符合要求", bean={"display": False}) return Response(result, status=200) if service_obj.service_source == AppConstants.SOURCE_CODE: support_type = 1 else: support_type = 2 service_id = service_obj.service_id # 从环境变量中获取域名,没有在从请求中获取 host = os.environ.get('DEFAULT_DOMAIN', request.get_host()) service_webhook = service_webhooks_repo.get_service_webhooks_by_service_id_and_type( self.service.service_id, deployment_way) if not service_webhook: service_webhook = service_webhooks_repo.create_service_webhooks( self.service.service_id, deployment_way) # api处发自动部署 if deployment_way == "api_webhooks": # 生成秘钥 deploy = deploy_repo.get_deploy_relation_by_service_id( service_id=service_id) secret_key = pickle.loads( base64.b64decode(deploy)).get("secret_key") url = "http://" + host + "/console/" + "custom/deploy/" + service_obj.service_id status = service_webhook.state result = general_message(200, "success", "获取URl及开启状态成功", bean={ "url": url, "secret_key": secret_key, "status": status, "display": True, "support_type": support_type }) # 镜像处发自动部署 elif deployment_way == "image_webhooks": url = "http://" + host + "/console/" + "image/webhooks/" + service_obj.service_id status = service_webhook.state result = general_message(200, "success", "获取URl及开启状态成功", bean={ "url": url, "status": status, "display": True, "support_type": support_type }) # 源码处发自动部署 else: url = "http://" + host + "/console/" + "webhooks/" + service_obj.service_id status = service_webhook.state deploy_keyword = service_webhook.deploy_keyword result = general_message(200, "success", "获取URl及开启状态成功", bean={ "url": url, "status": status, "display": True, "support_type": support_type, "deploy_keyword": deploy_keyword }) return Response(result, status=200) except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result, status=500)
def post(self, request, service_id, *args, **kwargs): """ github,gitlab 回调接口 触发自动部署 """ try: service_obj = TenantServiceInfo.objects.get(service_id=service_id) tenant_obj = Tenants.objects.get(tenant_id=service_obj.tenant_id) service_webhook = service_webhooks_repo.get_service_webhooks_by_service_id_and_type( service_obj.service_id, "code_webhooks") if not service_webhook.state: logger.debug("没开启webhooks自动部署") result = general_message(400, "failed", "没有开启此功能") return Response(result, status=400) # github github_event = request.META.get("HTTP_X_GITHUB_EVENT", None) user_agent = request.META.get("HTTP_USER_AGENT", None) if user_agent: user_agent = user_agent.split("/")[0] if github_event and user_agent == "GitHub-Hookshot": if github_event == "ping": logger.debug("支持此事件类型") result = general_message(200, "success", "支持测试连接") return Response(result, status=200) if github_event != "push" and github_event != "ping": logger.debug("不支持此事件类型") result = general_message(400, "failed", "不支持此事件类型") return Response(result, status=400) commits_info = request.data.get("head_commit") if not commits_info: logger.debug("提交信息获取失败") result = general_message(400, "failed", "提交信息获取失败") return Response(result, status=400) message = commits_info.get("message") keyword = "@" + service_webhook.deploy_keyword if keyword not in message: logger.debug("提交信息无效") result = general_message(200, "failed", "提交信息无效") return Response(result, status=200) # signature = request.META.get("HTTP_X_HUB_SIGNATURE", None) ref = request.data.get("ref") if not ref: logger.debug("获取分支信息失败") result = general_message(200, "failed", "获取分支信息失败") return Response(result, status=200) ref = ref.split("/")[2] if not service_obj.code_version == ref: logger.debug("当前分支与部署分支不同") result = general_message(200, "failed", "提交分支与部署分支不同") return Response(result, status=200) repository = request.data.get("repository") if not repository: logger.debug("却少repository信息") result = general_message(200, "failed", "却少repository信息") return Response(result, status=200) clone_url = repository.get("clone_url") ssh_url = repository.get("ssh_url") logger.debug("git_url", service_obj.git_url) logger.debug("clone_url", clone_url) logger.debug("ssh_url", ssh_url) if not (service_obj.git_url == clone_url or service_obj.git_url == ssh_url): logger.debug("github地址不相符") result = general_message(200, "failed", "仓库地址不相符") return Response(result, status=200) # 获取应用状态 status_map = app_service.get_service_status( tenant_obj, service_obj) status = status_map.get("status", None) logger.debug(status) user_obj = Users.objects.get(user_id=service_obj.creater) committer_name = commits_info.get("author").get("username") if status == "running" or status == "abnormal": return user_services.deploy_service( tenant_obj=tenant_obj, service_obj=service_obj, user=user_obj, committer_name=committer_name) else: logger.debug("应用状态异常") result = general_message(400, "failed", "应用状态不支持") return Response(result, status=400) # gitlab elif request.META.get("HTTP_X_GITLAB_EVENT", None): logger.debug(request.data) commits_info = request.data.get("commits") if not commits_info: logger.debug("提交信息获取失败") result = general_message(400, "failed", "提交信息获取失败") return Response(result, status=400) message = commits_info[-1].get("message") keyword = "@" + service_webhook.deploy_keyword if keyword not in message: logger.debug("提交信息无效") result = general_message(200, "failed", "提交信息无效") return Response(result, status=200) event_name = request.data.get("object_kind", None) logger.debug("kind", event_name) if event_name == "ping": logger.debug("支持此事件类型") result = general_message(200, "success", "支持测试连接") return Response(result, status=200) if event_name != "push" and event_name != "ping": logger.debug("不支持此事件类型") result = general_message(200, "failed", "不支持此事件类型") return Response(result, status=200) ref = request.data.get("ref") if not ref: logger.debug("获取分支信息失败") result = general_message(200, "failed", "获取分支信息失败") return Response(result, status=200) ref = ref.split("/")[2] if not service_obj.code_version == ref: logger.debug("当前分支与部署分支不同") result = general_message(200, "failed", "提交分支与部署分支不同") return Response(result, status=200) repository = request.data.get("repository") if not repository: logger.debug("却少repository信息") result = general_message(200, "failed", "却少repository信息") return Response(result, status=200) git_http_url = repository.get("git_http_url") gitlab_ssh_url = repository.get("git_ssh_url") git_ssh_url = gitlab_ssh_url.split("//", 1)[-1] logger.debug("service_url", service_obj.git_url) logger.debug("git_ssh_url", git_ssh_url) logger.debug("http_url", git_http_url) if not (service_obj.git_url == git_http_url or service_obj.git_url == git_ssh_url): logger.debug("github地址不相符") result = general_message(200, "failed", "仓库地址不相符") return Response(result, status=200) # 获取应用状态 status_map = app_service.get_service_status( tenant_obj, service_obj) status = status_map.get("status", None) user = Users.objects.get(user_id=service_obj.creater) committer_name = commits_info[-1].get("author").get("name") logger.debug("status", status_map) if status == "running" or status == "abnormal": return user_services.deploy_service( tenant_obj=tenant_obj, service_obj=service_obj, user=user, committer_name=committer_name) else: logger.debug("应用状态异常") result = general_message(200, "failed", "应用状态不支持") return Response(result, status=200) # gitee elif request.META.get("HTTP_X_GITEE_EVENT", None) or request.META.get( "HTTP_X_GIT_OSCHINA_EVENT", None): logger.debug(request.data) commits_info = request.data.get("head_commit") if not commits_info: logger.debug("提交信息获取失败") result = general_message(400, "failed", "提交信息获取失败") return Response(result, status=400) message = commits_info.get("message") keyword = "@" + service_webhook.deploy_keyword if keyword not in message: logger.debug("提交信息无效") result = general_message(200, "failed", "提交信息无效") return Response(result, status=200) ref = request.data.get("ref") if not ref: logger.debug("获取分支信息失败") result = general_message(200, "failed", "获取分支信息失败") return Response(result, status=200) ref = ref.split("/")[2] if not service_obj.code_version == ref: logger.debug("当前分支与部署分支不同") result = general_message(200, "failed", "提交分支与部署分支不同") return Response(result, status=200) repository = request.data.get("repository") if not repository: logger.debug("却少repository信息") result = general_message(200, "failed", "却少repository信息") return Response(result, status=200) clone_url = repository.get("clone_url") ssh_url = repository.get("ssh_url") logger.debug("git_url", service_obj.git_url) logger.debug("clone_url", clone_url) logger.debug("ssh_url", ssh_url) if not (service_obj.git_url == clone_url or service_obj.git_url == ssh_url): logger.debug("gitee地址不相符") result = general_message(200, "failed", "仓库地址不相符") return Response(result, status=200) # 获取应用状态 status_map = app_service.get_service_status( tenant_obj, service_obj) status = status_map.get("status", None) logger.debug(status) user_obj = Users.objects.get(user_id=service_obj.creater) committer_name = commits_info.get("author").get("username") if status == "running" or status == "abnormal": return user_services.deploy_service( tenant_obj=tenant_obj, service_obj=service_obj, user=user_obj, committer_name=committer_name) else: logger.debug("应用状态异常") result = general_message(200, "failed", "应用状态不支持") return Response(result, status=200) # gogs elif request.META.get("HTTP_X_GOGS_EVENT", None): logger.debug(request.data) commits_info = request.data.get("commits") if not commits_info: logger.debug("提交信息获取失败") result = general_message(400, "failed", "提交信息获取失败") return Response(result, status=400) message = commits_info[0].get("message") keyword = "@" + service_webhook.deploy_keyword if keyword not in message: logger.debug("提交信息无效") result = general_message(200, "failed", "提交信息无效") return Response(result, status=200) ref = request.data.get("ref") if not ref: logger.debug("获取分支信息失败") result = general_message(200, "failed", "获取分支信息失败") return Response(result, status=200) ref = ref.split("/")[2] if not service_obj.code_version == ref: logger.debug("当前分支与部署分支不同") result = general_message(200, "failed", "提交分支与部署分支不同") return Response(result, status=200) repository = request.data.get("repository") if not repository: logger.debug("却少repository信息") result = general_message(200, "failed", "却少repository信息") return Response(result, status=200) clone_url = repository.get("clone_url") ssh_url = repository.get("ssh_url") logger.debug("git_url", service_obj.git_url) logger.debug("clone_url", clone_url) logger.debug("ssh_url", ssh_url) if not (service_obj.git_url == clone_url or service_obj.git_url == ssh_url): logger.debug("gogs地址不相符") result = general_message(200, "failed", "仓库地址不相符") return Response(result, status=200) # 获取应用状态 status_map = app_service.get_service_status( tenant_obj, service_obj) status = status_map.get("status", None) logger.debug(status) user_obj = Users.objects.get(user_id=service_obj.creater) committer_name = commits_info[0].get("author").get("username") if status == "running" or status == "abnormal": return user_services.deploy_service( tenant_obj=tenant_obj, service_obj=service_obj, user=user_obj, committer_name=committer_name) else: logger.debug("应用状态异常") result = general_message(200, "failed", "应用状态不支持") return Response(result, status=200) else: logger.debug("暂时仅支持github与gitlab") result = general_message(400, "failed", "暂时仅支持github与gitlab哦~") return Response(result, status=400) except Tenants.DoesNotExist as e: logger.exception(e) logger.error(e) return Response(e.message, status=400) except TenantServiceInfo.DoesNotExist as e: logger.exception(e) logger.error(e) return Response(e.message, status=400) except Exception as e: logger.exception(e) logger.error(e) return Response(e.message, status=500)
def post(self, request, service_id, *args, **kwargs): try: service_obj = TenantServiceInfo.objects.get(service_id=service_id) if not service_obj: result = general_message(400, "failed", "组件不存在") return Response(result, status=400) tenant_obj = Tenants.objects.get(tenant_id=service_obj.tenant_id) service_webhook = service_webhooks_repo.get_service_webhooks_by_service_id_and_type( service_obj.service_id, "image_webhooks") if not service_webhook.state: result = general_message(400, "failed", "组件关闭了自动构建") return Response(result, status=400) # 校验 repository = request.data.get("repository") if not repository: logger.debug("缺少repository信息") result = general_message(400, "failed", "缺少repository信息") return Response(result, status=400) push_data = request.data.get("push_data") pusher = push_data.get("pusher") tag = push_data.get("tag") repo_name = repository.get("repo_name") if not repo_name: repository_namespace = repository.get("namespace") repository_name = repository.get("name") if repository_namespace and repository_name: # maybe aliyun repo add fake host repo_name = "fake.repo.aliyun.com/" + repository_namespace + "/" + repository_name else: repo_name = repository.get("repo_full_name") if not repo_name: result = general_message(400, "failed", "缺少repository名称信息") return Response(result, status=400) repo_ref = reference.Reference.parse(repo_name) _, repo_name = repo_ref.split_hostname() ref = reference.Reference.parse(service_obj.image) hostname, name = ref.split_hostname() if repo_name != name: result = general_message(400, "failed", "镜像名称与组件构建源不符") return Response(result, status=400) # 标签匹配 if service_webhook.trigger: # 如果有正则表达式根据正则触发 if not re.match(service_webhook.trigger, tag): result = general_message(400, "failed", "镜像tag与正则表达式不匹配") return Response(result, status=400) service_repo.change_service_image_tag(service_obj, tag) else: # 如果没有根据标签触发 if tag != ref['tag']: result = general_message(400, "failed", "镜像tag与组件构建源不符") return Response(result, status=400) # 获取组件状态 status_map = app_service.get_service_status( tenant_obj, service_obj) status = status_map.get("status", None) user_obj = user_services.init_webhook_user(service_obj, "ImageWebhook", pusher) committer_name = pusher if status != "closed": return user_services.deploy_service( tenant_obj=tenant_obj, service_obj=service_obj, user=user_obj, committer_name=committer_name) else: result = general_message(400, "failed", "组件状态处于关闭中,不支持自动构建") return Response(result, status=400) except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result, status=500)
def post(self, request, service_id, *args, **kwargs): """ github,gitlab 回调接口 触发自动部署 """ try: service_obj = TenantServiceInfo.objects.get(service_id=service_id) tenant_obj = Tenants.objects.get(tenant_id=service_obj.tenant_id) service_webhook = service_webhooks_repo.get_service_webhooks_by_service_id_and_type( service_obj.service_id, "code_webhooks") if not service_webhook.state: logger.debug("没开启webhooks自动部署") result = general_message(400, "failed", "没有开启此功能") return Response(result, status=400) # github github_event = request.META.get("HTTP_X_GITHUB_EVENT", None) user_agent = request.META.get("HTTP_USER_AGENT", None) if user_agent: user_agent = user_agent.split("/")[0] if github_event and user_agent == "GitHub-Hookshot": if github_event == "ping": logger.debug("支持此事件类型") result = general_message(200, "success", "支持测试连接") return Response(result, status=200) if github_event != "push" and github_event != "ping": logger.debug("不支持此事件类型") result = general_message(400, "failed", "不支持此事件类型") return Response(result, status=400) commits_info = request.data.get("head_commit") if not commits_info: result = general_message(400, "can not get commit info", "提交信息获取失败") return Response(result, status=400) message = commits_info.get("message") keyword = "@" + service_webhook.deploy_keyword if keyword not in message: result = general_message( 200, "commit message not include {0}".format( service_webhook.deploy_keyword), "提交信息无效") return Response(result, status=200) ref = request.data.get("ref") if not ref: result = general_message(200, "can not read branch info", "获取分支信息失败") return Response(result, status=200) ref = ref.split("/")[2] if not service_obj.code_version == ref: result = general_message( 200, "current branch is different event branch", "提交分支与部署分支不同") return Response(result, status=200) repository = request.data.get("repository") if not repository: result = general_message(200, "can not read repository info", "却少repository信息") return Response(result, status=200) clone_url = repository.get("clone_url") ssh_url = repository.get("ssh_url") code, msg, msg_show = self._check_warehouse( service_obj.git_url, clone_url, ssh_url) if code != 200: return Response(general_message(200, msg, msg_show), status=200) # 获取组件状态 status_map = app_service.get_service_status( tenant_obj, service_obj) status = status_map.get("status", None) logger.debug(status) committer_name = commits_info.get("author").get("username") user_obj = user_services.init_webhook_user( service_obj, "Webhook", committer_name) if status != "closed": return user_services.deploy_service( tenant_obj=tenant_obj, service_obj=service_obj, user=user_obj, committer_name=committer_name) else: result = general_message( 200, "component is closed, not support", "组件状态不支持") return Response(result, status=400) # gitlab elif request.META.get("HTTP_X_GITLAB_EVENT", None): logger.debug(request.data) commits_info = request.data.get("commits") if not commits_info: result = general_message(400, "can not get commit info", "提交信息获取失败") return Response(result, status=400) message = commits_info[-1].get("message") keyword = "@" + service_webhook.deploy_keyword if keyword not in message: result = general_message( 200, "commit message not include {0}".format( service_webhook.deploy_keyword), "提交信息无效") return Response(result, status=200) event_name = request.data.get("object_kind", None) logger.debug("kind", event_name) if event_name == "ping": logger.debug("支持此事件类型") result = general_message(200, "success", "支持测试连接") return Response(result, status=200) if event_name != "push" and event_name != "ping": result = general_message(200, "event type not support", "不支持此事件类型") return Response(result, status=200) ref = request.data.get("ref") if not ref: result = general_message(200, "can not read branch info", "获取分支信息失败") return Response(result, status=200) ref = ref.split("/")[2] if not service_obj.code_version == ref: result = general_message( 200, "current branch is different event branch", "提交分支与部署分支不同") return Response(result, status=200) repository = request.data.get("repository") if not repository: result = general_message(200, "can not read repository info", "却少repository信息") return Response(result, status=200) git_http_url = repository.get("git_http_url") gitlab_ssh_url = repository.get("git_ssh_url") code, msg, msg_show = self._check_warehouse( service_obj.git_url, git_http_url, gitlab_ssh_url) if code != 200: return Response(general_message(200, msg, msg_show), status=200) # 获取组件状态 status_map = app_service.get_service_status( tenant_obj, service_obj) status = status_map.get("status", None) committer_name = commits_info[-1].get("author").get("name") user = user_services.init_webhook_user(service_obj, "Webhook", committer_name) logger.debug("status", status_map) if status != "closed": return user_services.deploy_service( tenant_obj=tenant_obj, service_obj=service_obj, user=user, committer_name=committer_name) else: result = general_message( 200, "component is closed, not support", "组件状态不支持") return Response(result, status=200) # gitee elif request.META.get("HTTP_X_GITEE_EVENT", None) or \ request.META.get("HTTP_X_GIT_OSCHINA_EVENT", None): logger.debug(request.data) commits_info = request.data.get("head_commit") if not commits_info: result = general_message(400, "can not get commit info", "提交信息获取失败") return Response(result, status=400) message = commits_info.get("message") keyword = "@" + service_webhook.deploy_keyword if keyword not in message: result = general_message( 200, "commit message not include {0}".format( service_webhook.deploy_keyword), "提交信息无效") return Response(result, status=200) ref = request.data.get("ref") if not ref: result = general_message(200, "can not read branch info", "获取分支信息失败") return Response(result, status=200) ref = ref.split("/")[-1] if not service_obj.code_version == ref: result = general_message( 200, "current branch is different event branch", "提交分支与部署分支不同") return Response(result, status=200) repository = request.data.get("repository") if not repository: result = general_message(200, "can not read repository info", "却少repository信息") return Response(result, status=200) clone_url = repository.get("clone_url") ssh_url = repository.get("ssh_url") code, msg, msg_show = self._check_warehouse( service_obj.git_url, clone_url, ssh_url) if code != 200: return Response(general_message(200, msg, msg_show), status=200) # 获取组件状态 status_map = app_service.get_service_status( tenant_obj, service_obj) status = status_map.get("status", None) logger.debug(status) committer_name = commits_info.get("author").get("username") user_obj = user_services.init_webhook_user( service_obj, "Webhook", committer_name) if status != "closed": return user_services.deploy_service( tenant_obj=tenant_obj, service_obj=service_obj, user=user_obj, committer_name=committer_name) else: result = general_message( 200, "component is closed, not support", "组件状态不支持") return Response(result, status=200) # gogs elif request.META.get("HTTP_X_GOGS_EVENT", None): logger.debug(request.data) commits_info = request.data.get("commits") if not commits_info: result = general_message(400, "can not get commit info", "提交信息获取失败") return Response(result, status=400) message = commits_info[0].get("message") keyword = "@" + service_webhook.deploy_keyword if keyword not in message: result = general_message( 200, "commit message not include {0}".format( service_webhook.deploy_keyword), "提交信息无效") return Response(result, status=200) ref = request.data.get("ref") if not ref: result = general_message(200, "can not read branch info", "获取分支信息失败") return Response(result, status=200) ref = ref.split("/")[2] if not service_obj.code_version == ref: result = general_message( 200, "current branch is different event branch", "提交分支与部署分支不同") return Response(result, status=200) repository = request.data.get("repository") if not repository: result = general_message(200, "can not read repository info", "却少repository信息") return Response(result, status=200) clone_url = repository.get("clone_url") ssh_url = repository.get("ssh_url") code, msg, msg_show = self._check_warehouse( service_obj.git_url, clone_url, ssh_url) if code != 200: return Response(general_message(200, msg, msg_show), status=200) # 获取组件状态 status_map = app_service.get_service_status( tenant_obj, service_obj) status = status_map.get("status", None) logger.debug(status) committer_name = commits_info[0].get("author").get("username") user_obj = user_services.init_webhook_user( service_obj, "Webhook", committer_name) if status != "closed": return user_services.deploy_service( tenant_obj=tenant_obj, service_obj=service_obj, user=user_obj, committer_name=committer_name) else: result = general_message( 200, "component is closed, not support", "组件状态不支持") return Response(result, status=200) # coding elif request.META.get("HTTP_X_CODING_EVENT", None): coding_event = request.META.get("HTTP_X_CODING_EVENT", None) if coding_event == "ping": logger.debug("支持此事件类型") result = general_message(200, "success", "支持测试连接") return Response(result, status=200) if coding_event != "push" and coding_event != "ping": logger.debug("不支持此事件类型") result = general_message(400, "failed", "不支持此事件类型") return Response(result, status=400) commits_info = request.data.get("head_commit") if not commits_info: result = general_message(400, "can not get commit info", "提交信息获取失败") return Response(result, status=400) message = commits_info.get("message") keyword = "@" + service_webhook.deploy_keyword if keyword not in message: result = general_message( 200, "commit message not include {0}".format( service_webhook.deploy_keyword), "提交信息无效") return Response(result, status=200) ref = request.data.get("ref") if not ref: result = general_message(200, "can not read branch info", "获取分支信息失败") return Response(result, status=200) ref = ref.split("/")[2] if not service_obj.code_version == ref: result = general_message( 200, "current branch is different event branch", "提交分支与部署分支不同") return Response(result, status=200) repository = request.data.get("repository") if not repository: result = general_message(200, "can not read repository info", "却少repository信息") return Response(result, status=200) clone_url = repository.get("clone_url") ssh_url = repository.get("ssh_url") code, msg, msg_show = self._check_warehouse( service_obj.git_url, clone_url, ssh_url) if code != 200: return Response(general_message(200, msg, msg_show), status=200) # 获取组件状态 status_map = app_service.get_service_status( tenant_obj, service_obj) status = status_map.get("status", None) logger.debug(status) committer_name = commits_info.get("author").get("username") user_obj = user_services.init_webhook_user( service_obj, "Webhook", committer_name) if status != "closed": return user_services.deploy_service( tenant_obj=tenant_obj, service_obj=service_obj, user=user_obj, committer_name=committer_name) else: result = general_message( 200, "component is closed, not support", "组件状态不支持") return Response(result, status=400) else: logger.debug("暂时仅支持github与gitlab") result = general_message(400, "failed", "暂时仅支持github与gitlab哦~") return Response(result, status=400) except Tenants.DoesNotExist as e: logger.exception(e) logger.error(e) return Response(e.message, status=400) except TenantServiceInfo.DoesNotExist as e: logger.exception(e) logger.error(e) return Response(e.message, status=400) except Exception as e: logger.exception(e) logger.error(e) return Response(e.message, status=500)