diff --git a/spug_api/apps/deploy/utils.py b/spug_api/apps/deploy/utils.py
index 012aa9a..935f6f8 100644
--- a/spug_api/apps/deploy/utils.py
+++ b/spug_api/apps/deploy/utils.py
@@ -21,7 +21,7 @@ def deploy_dispatch(request, req, token):
try:
api_token = uuid.uuid4().hex
rds.setex(api_token, 60 * 60, f'{req.deploy.app_id},{req.deploy.env_id}')
- helper = Helper(rds, token)
+ helper = Helper(rds, token, req.id)
helper.send_step('local', 1, f'完成\r\n{human_time()} 发布准备... ')
env = AttrDict(
SPUG_APP_NAME=req.deploy.app.name,
@@ -177,9 +177,11 @@ def _deploy_ext2_host(helper, h_id, actions, env):
class Helper:
- def __init__(self, rds, token):
+ def __init__(self, rds, token, r_id):
self.rds = rds
self.token = token
+ self.log_key = f'{settings.REQUEST_KEY}:{r_id}'
+ self.rds.delete(self.log_key)
@staticmethod
def send_deploy_notify(req):
@@ -235,16 +237,20 @@ class Helper:
files.append(line)
return files
+ def _send(self, message):
+ self.rds.lpush(self.token, json.dumps(message))
+ self.rds.lpush(self.log_key, json.dumps(message))
+
def send_info(self, key, message):
- self.rds.lpush(self.token, json.dumps({'key': key, 'status': 'info', 'data': message}))
+ self._send({'key': key, 'status': 'info', 'data': message})
def send_error(self, key, message):
message = '\r\n' + message
- self.rds.lpush(self.token, json.dumps({'key': key, 'status': 'error', 'data': message}))
+ self._send({'key': key, 'status': 'error', 'data': message})
raise Exception(message)
def send_step(self, key, step, data):
- self.rds.lpush(self.token, json.dumps({'key': key, 'step': step, 'data': data}))
+ self._send({'key': key, 'step': step, 'data': data})
def local(self, command, env=None):
command = 'set -e\n' + command
diff --git a/spug_api/consumer/consumers.py b/spug_api/consumer/consumers.py
index cd0f12a..1b49dde 100644
--- a/spug_api/consumer/consumers.py
+++ b/spug_api/consumer/consumers.py
@@ -3,24 +3,17 @@
# Released under the MIT License.
from channels.generic.websocket import WebsocketConsumer
from django_redis import get_redis_connection
-from django.conf import settings
from apps.setting.utils import AppSetting
from apps.host.models import Host
from threading import Thread
-from urllib.parse import parse_qs
import json
class ExecConsumer(WebsocketConsumer):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
- query = parse_qs(self.scope['query_string'].decode())
- e_id = query.get('id', [None])[0]
self.token = self.scope['url_route']['kwargs']['token']
- self.log_key = f'{settings.REQUEST_KEY}:{e_id}' if e_id else None
self.rds = get_redis_connection()
- if self.log_key:
- self.rds.delete(self.log_key)
def connect(self):
self.accept()
@@ -29,11 +22,8 @@ class ExecConsumer(WebsocketConsumer):
self.rds.close()
def get_response(self):
- if self.log_key:
- return self.rds.brpoplpush(self.token, self.log_key, timeout=5)
- else:
- response = self.rds.brpop(self.token, timeout=5)
- return response[1] if response else None
+ response = self.rds.brpop(self.token, timeout=5)
+ return response[1] if response else None
def receive(self, **kwargs):
response = self.get_response()
diff --git a/spug_web/src/pages/deploy/do/Ext1Index.js b/spug_web/src/pages/deploy/do/Ext1Index.js
index 9d7b246..e409900 100644
--- a/spug_web/src/pages/deploy/do/Ext1Index.js
+++ b/spug_web/src/pages/deploy/do/Ext1Index.js
@@ -17,6 +17,8 @@ import lds from 'lodash';
class Ext1Index extends React.Component {
constructor(props) {
super(props);
+ this.id = props.match.params.id;
+ this.log = props.match.params.log;
this.state = {
fetching: true,
loading: false,
@@ -25,11 +27,21 @@ class Ext1Index extends React.Component {
}
componentDidMount() {
- this.id = this.props.match.params.id;
- this.log = this.props.match.params.log;
+ this.fetch()
+ }
+
+ componentWillUnmount() {
+ if (this.socket) this.socket.close();
+ store.request = {targets: [], host_actions: [], server_actions: []};
+ store.outputs = {};
+ }
+
+ fetch = () => {
+ this.setState({fetching: true});
http.get(`/api/deploy/request/${this.id}/`, {params: {log: this.log}})
.then(res => {
store.request = res;
+ store.outputs = {};
while (res.outputs.length) {
const msg = JSON.parse(res.outputs.pop());
if (!store.outputs.hasOwnProperty(msg.key)) {
@@ -40,13 +52,7 @@ class Ext1Index extends React.Component {
}
})
.finally(() => this.setState({fetching: false}))
- }
-
- componentWillUnmount() {
- if (this.socket) this.socket.close();
- store.request = {targets: [], host_actions: [], server_actions: []};
- store.outputs = {};
- }
+ };
_parse_message = (message) => {
const {key, data, step, status} = message;
@@ -62,7 +68,7 @@ class Ext1Index extends React.Component {
store.request.status = '2';
store.outputs = outputs;
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
- this.socket = new WebSocket(`${protocol}//${window.location.host}/api/ws/exec/${token}/?id=${this.id}`);
+ this.socket = new WebSocket(`${protocol}//${window.location.host}/api/ws/exec/${token}/`);
this.socket.onopen = () => {
this.socket.send('ok');
};
@@ -115,9 +121,13 @@ class Ext1Index extends React.Component {
subTitle={`${app_name} - ${env_name}`}
style={{padding: 0}}
tags={this.getStatusAlias()}
- extra={}
+ extra={this.log ? (
+
+ ) : (
+
+ )}
onBack={() => history.goBack()}/>
{
+ this.setState({fetching: true});
http.get(`/api/deploy/request/${this.id}/`, {params: {log: this.log}})
.then(res => {
store.request = res;
+ store.outputs = {};
while (res.outputs.length) {
const msg = JSON.parse(res.outputs.pop());
if (!store.outputs.hasOwnProperty(msg.key)) {
@@ -40,13 +53,7 @@ class Ext1Index extends React.Component {
}
})
.finally(() => this.setState({fetching: false}))
- }
-
- componentWillUnmount() {
- if (this.socket) this.socket.close();
- store.request = {targets: [], server_actions: [], host_actions: []};
- store.outputs = {};
- }
+ };
_parse_message = (message) => {
const {key, data, step, status} = message;
@@ -62,7 +69,7 @@ class Ext1Index extends React.Component {
store.request.status = '2';
store.outputs = outputs;
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
- this.socket = new WebSocket(`${protocol}//${window.location.host}/api/ws/exec/${token}/?id=${this.id}`);
+ this.socket = new WebSocket(`${protocol}//${window.location.host}/api/ws/exec/${token}/`);
this.socket.onopen = () => {
this.socket.send('ok');
};
@@ -115,8 +122,13 @@ class Ext1Index extends React.Component {
subTitle={`${app_name} - ${env_name}`}
style={{padding: 0}}
tags={this.getStatusAlias()}
- extra={}
+ extra={this.log ? (
+
+ ) : (
+
+ )}
onBack={() => history.goBack()}/>