Skip to content

Commit e9e6b04

Browse files
committed
CI #Initial
1 parent 4ad9ce9 commit e9e6b04

File tree

7 files changed

+251
-4
lines changed

7 files changed

+251
-4
lines changed

client/autodeploy_client/Client.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,14 @@ def Deploy(self, workdir, configFile, owner=''):
8282
result = self._send(msg)
8383
return result
8484

85+
def Integrate(self, workdir, configFile, owner=''):
86+
global msg
87+
if owner == '':
88+
owner = Config.Owner
89+
msg = Job.createIntegrateMessage(workdir=workdir, configFile=configFile, scm=self.scm, owner=owner)
90+
result = self._send(msg)
91+
return result
92+
8593
def CheckUp(self):
8694
return Connect.connect(self.server, self.port, 5)
8795

client/autodeploy_client/ClientJob.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,24 @@ def createDeployMessage(owner, workdir, scm, configFile, options=None):
111111
f += '</job>'
112112
return f
113113

114+
def createIntegrateMessage(owner, workdir, scm, configFile, options=None):
115+
sec=base64.encodestring(importKey().encrypt(owner+scm+"INTEGRATE","")[0])
116+
f = '<job owner="%s" type="%s" sec="%s" scm="%s">\n'%(owner,"INTEGRATE",sec,scm)
117+
f += '<workdir>%s</workdir>'%workdir
118+
f += '<configFile>%s</configFile>'%configFile
119+
print(configFile)
120+
conf=open(str(configFile)).read()
121+
f += '<file>%s</file>'%(base64.encodestring(conf))
122+
123+
if options:
124+
f += '<options>'
125+
for option in list(options.keys()):
126+
f += "<option name='%s'>%s</option>" % (option, options[option])
127+
128+
f += "</options>"
129+
f += '</job>'
130+
return f
131+
114132
def createListCommitsMessage(owner, workdir, key, scm, options=None):
115133
sec=base64.encodestring(importKey().encrypt(owner+scm+"LIST-COMMITS","")[0])
116134
f = '<job owner="%s" type="%s" sec="%s" scm="%s">\n'%( owner,"LIST-COMMITS",sec,scm)

server/Request.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,25 @@ def parseDeployJob(message):
133133
"scm":scm,"options": optionsDict}
134134
return params
135135

136+
def parseIntegrateJob(message):
137+
params = {}
138+
optionsDict = {}
139+
doc = xml.dom.minidom.parseString(message)
140+
Job = doc.getElementsByTagName('job')[0]
141+
scm=Job.getAttribute("scm")
142+
workdir= getValue(Job, 'workdir')
143+
configFile=getValue(Job,"configFile")
144+
requestType = Job.getAttribute('type')
145+
owner = Job.getAttribute('owner')
146+
fileBase64=getValue(Job,"file")
147+
if not os.path.exists(os.path.dirname(configFile)):
148+
os.makedirs(os.path.dirname(configFile))
149+
open(configFile,"w").write(base64.decodestring(fileBase64))
150+
print('Recieved New Job from ' + owner + '.....')
151+
params = {"workdir": workdir,"owner": owner, "requestType": requestType,"configFile":configFile,
152+
"scm":scm,"options": optionsDict}
153+
return params
154+
136155
def parseGetCommitsJob(message):
137156
optionsDict={}
138157
doc = xml.dom.minidom.parseString(message)

server/autodeploy-server.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from . import Common
1010
from server.scm import Git as git
1111
from .deployer import autodeployer
12+
from .integrator import autointegrator
1213
import traceback
1314
import yaml
1415
JOBS = {}
@@ -175,6 +176,15 @@ def HandleClient(clientsock):
175176
res="Done"
176177
except Exception as e:
177178
res="ERR:"+traceback.format_exc()
179+
elif req["requestType"]=="INTEGRATE":
180+
print(msg)
181+
job = Request.parseIntegrateJob(msg)
182+
try:
183+
config=yaml.safe_load(open(job["configFile"]))
184+
autointegrator.runTest(config,job["workdir"])
185+
res="Done"
186+
except Exception as e:
187+
res="ERR:"+traceback.format_exc()
178188
if cmd!="":
179189
print(cmd)
180190
res=Common.run(cmd)
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
__author__ = 'mohamed'
2+
3+
import sys
4+
import os
5+
import yaml
6+
import subprocess
7+
8+
9+
EOM = "\n\n###"
10+
debug = False
11+
slient = False
12+
13+
14+
def run(executer, raiseError=True,exitcode=False, id=None, wait=True):
15+
PIPE = subprocess.PIPE
16+
p = subprocess.Popen(executer, stdout=PIPE, stderr=PIPE, shell=True)
17+
(stdout, stderr) = p.communicate()
18+
st = stderr
19+
if id:
20+
f = open("/tmp/" + id + ".err", 'w')
21+
f.write(st)
22+
f.flush()
23+
f.close()
24+
f = open("/tmp/" + id + ".out", 'w')
25+
f.write(stdout)
26+
f.flush()
27+
f.close()
28+
29+
if len(stderr) > 0 and "fatal" in str(stderr):
30+
return "ERR:" + str(stderr)
31+
if stdout == "": return "Done"
32+
if exitcode:
33+
return p.returncode
34+
return stdout
35+
36+
37+
def printNotication(message):
38+
if slient: return
39+
print(message)
40+
print("=" * len(message))
41+
42+
43+
def runEvents(config, workdir, event, raiseErrorOnStdErr=True):
44+
if event in config["events"].keys():
45+
for script in config["events"][event]:
46+
wait = True
47+
if not script["location"].startswith("/"):
48+
cmd = workdir + script["location"]
49+
else:
50+
cmd = script["location"]
51+
if "interpreter" in script.keys():
52+
cmd = "%s %s" % (script["interpreter"], cmd)
53+
if "run-as" in script.keys():
54+
if not script["run-as"] == "root":
55+
cmd = "su %s -c %s" % (script["run-as"], cmd)
56+
if not slient: print("Running:", cmd)
57+
if "wait" in script.keys():
58+
wait = script["wait"]
59+
if "ignore-stderr" in script.keys():
60+
if script["ignore-stderr"] in ("yes", "True", "true", "y", "True", True):
61+
raiseErrorOnStdErr = False
62+
run(cmd, raiseErrorOnStdErr, wait=wait)
63+
64+
65+
def handleRuns(tasks, workdir):
66+
for task in tasks:
67+
cmd = "%s %s" % (task['interpreter'], task["location"])
68+
task_reult = run(cmd,exitcode=True)
69+
if task_reult not in [0,'0']:
70+
print("Task Failed")
71+
break
72+
else:
73+
print("Task Success")
74+
75+
76+
def runTest(config, workdir=".", raiseErrorOnStdErr=True):
77+
printNotication("Running Before Run scripts:")
78+
runEvents(config, workdir, "beforeRun", raiseErrorOnStdErr)
79+
80+
printNotication("Starting Test Scripts")
81+
82+
if not "tasks" in config.keys():
83+
if not slient: print(" No tasks to run ... skipping")
84+
else:
85+
if not slient: print(" Running tasks")
86+
handleRuns(config['tasks'], workdir)
87+
if not slient: print(" Tasks done")
88+
printNotication("Test Scripts Done.......")
89+
90+
printNotication("Starting After Install Scripts")
91+
runEvents(config, workdir, "afterRun", raiseErrorOnStdErr)
92+
return "Done"
93+
94+
95+
if __name__ == "__main__":
96+
config = None
97+
workdir = None
98+
stdErr = True
99+
for arg in sys.argv[1:]:
100+
if "--config" in arg:
101+
yamlFile = arg.split("=")[1]
102+
config = yaml.safe_load(open(yamlFile))
103+
print(config)
104+
elif "--workdir" in arg:
105+
workdir = arg.split("=")[1]
106+
elif "--no-stderr" in arg:
107+
stdErr = False
108+
elif "--slient" in arg:
109+
slient = True
110+
elif "--debug" in arg:
111+
debug = True
112+
if not config:
113+
print("--config should be set")
114+
exit()
115+
runTest(config, workdir, stdErr)

webapp/autoDeploy/autoDeploy/api.py

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def cloneCD(request):
3131
project = CDModels.Project.objects.get(name=request.GET["project_name"])
3232
c = Client(scm, ip, port, project.sshKey.key)
3333
res = c.Clone(project.repo, project.working_dir)
34-
return HttpResponse(res)\
34+
return HttpResponse(res)
3535

3636
@csrf_protect
3737
def cloneCI(request):
@@ -121,5 +121,85 @@ def deploy(request):
121121
"Dear User,<br/> This is an automated notification that a new version of %s has been deployed at: %s.<br>%s" % (
122122
project.name, link, changes_text), fromUser=None, cc="", bcc="", )
123123
return HttpResponse(res + ",," + link)
124+
else:
125+
return HttpResponse(res)
126+
127+
@csrf_protect
128+
def integrate(request):
129+
from webapp.autoDeploy.autoDeploy import Common
130+
server = CDModels.Server.objects.get(name=request.session["integrate_server"])
131+
project = CIModels.Project.objects.get(name=request.session["integrate_project"])
132+
last_Integration = None
133+
try:
134+
last_Integration = CIModels.Integration_server.objects.filter(server=server, project=project).latest()
135+
except:
136+
pass
137+
D = CIModels.Integration_server()
138+
c = Client(str(project.repo_type), server.ip, server.port)
139+
D.project = project
140+
D.server = server
141+
if "tag" in request.GET:
142+
res = c.SwitchTag(project.working_dir, request.GET["tag"])
143+
D.update_type = "tag"
144+
D.update_version = request.GET["tag"]
145+
project.lastTag = request.GET["tag"]
146+
elif "commit" in request.GET:
147+
if request.GET["commit"] != "HEAD":
148+
res = c.SwitchCommit(project.working_dir, request.GET["commit"])
149+
D.update_type = "commit"
150+
D.update_version = request.GET["commit"]
151+
project.lastCommit = request.GET["commit"]
152+
res = c.Integrate(project.working_dir, project.configFile)
153+
if not "ERR:" in res:
154+
D.datetime = timezone.now()
155+
D.has_new_version = False
156+
D.save()
157+
project.lastUpdate = timezone.now()
158+
project.newVersion = False
159+
project.save()
160+
print(project.integration_link)
161+
if not "http://" in project.integration_link:
162+
print("in if")
163+
link = "http://" + server.DNS + project.integration_link
164+
print(link)
165+
if project.emailUsers != "" or project.emailUsers != " " and last_Integration != None:
166+
changes = c.getChangeLog(project.working_dir, since=last_Integration.update_version,
167+
to=request.GET["commit"])
168+
changes_text = "<h3>Changes</h3><ul>"
169+
found = False
170+
for change in changes:
171+
if change.endswith(":"): continue
172+
changes_text += "<li>%s</li>" % change
173+
found = True
174+
if found:
175+
changes_text += "</ul>"
176+
else:
177+
changes_text = ""
178+
Common.send(project.emailUsers.replace(",", ";"), "New version of %s integrated" % project.name,
179+
"Dear User,<br/> This is an automated notification that a new version of %s has been integrated at: %s<br/>%s" % (
180+
project.name, link, changes_text), fromUser=None, cc="", bcc="", )
181+
182+
return HttpResponse(res + ",," + link)
183+
else:
184+
print("in else")
185+
link = project.integration_link
186+
if project.emailUsers != "" or project.emailUsers != " ":
187+
changes = c.getChangeLog(project.working_dir, since=last_Integration.update_version,
188+
to=request.GET["commit"])
189+
changes_text = "<h3>Changes</h3><ul>"
190+
found = False
191+
for change in changes:
192+
if change.endswith(":"): continue
193+
changes_text += "<li>%s</li>" % change
194+
found = True
195+
if found:
196+
changes_text += "</ul>"
197+
else:
198+
changes_text = ""
199+
200+
Common.send(project.emailUsers.replace(",", ";"), "New version of %s integrated" % project.name,
201+
"Dear User,<br/> This is an automated notification that a new version of %s has been integrated at: %s.<br>%s" % (
202+
project.name, link, changes_text), fromUser=None, cc="", bcc="", )
203+
return HttpResponse(res + ",," + link)
124204
else:
125205
return HttpResponse(res)

webapp/autoDeploy/deployment/views.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@
44
from .tables import *
55
from django_tables2.export.export import TableExport
66
from django.views.decorators.csrf import csrf_protect
7-
from django_tables2_reports.config import RequestConfigReport
87
from django_tables2.config import RequestConfig
9-
import sys
10-
sys.path.append("../../../client")
118
from autodeploy_client import Client
129
from django.shortcuts import redirect
1310
from django.template.context_processors import csrf

0 commit comments

Comments
 (0)