445 lines
13 KiB
Python
Raw Normal View History

2019-10-06 16:13:50 +03:00
# This Python file uses the following encoding: utf-8
2019-10-06 20:17:52 +03:00
from BuildBotLib.basemodule import BaseModule
2019-10-06 19:15:02 +03:00
2019-12-26 11:29:22 +03:00
from buildbot.plugins import util, steps
from BuildBotLib.secretManager import SecretManager
2020-02-03 14:48:36 +03:00
import hashlib
2022-10-21 20:56:44 +03:00
import os
2019-10-06 16:13:50 +03:00
2019-10-06 19:15:02 +03:00
class Make(BaseModule):
2020-01-31 14:55:49 +03:00
def __init__(self, platform):
2021-04-15 21:33:26 +03:00
BaseModule.__init__(self,
platform,
2021-04-16 10:47:28 +03:00
self.getProject())
2020-02-03 14:48:36 +03:00
self.tempRepoDir = ""
2019-10-06 19:15:02 +03:00
2021-04-16 10:47:28 +03:00
def getProject(self):
@util.renderer
def cmdWraper(step):
repository = step.getProperty('repository')
2021-04-16 23:45:57 +03:00
project = self.getNameProjectFromGitUrl(repository)
if not len(project):
2021-04-16 10:47:28 +03:00
return "build"
return project
return cmdWraper
2020-06-19 13:43:02 +03:00
def isSupport(self, step):
2020-06-19 18:22:01 +03:00
return True
2020-06-19 13:43:02 +03:00
2019-10-06 19:15:02 +03:00
def isDeploy(self, step):
2019-12-26 11:29:22 +03:00
return step.getProperty('deploy')
2019-10-06 16:13:50 +03:00
2022-10-21 20:56:44 +03:00
def isCopyArtefact(self, step):
2022-10-22 14:31:55 +03:00
val = step.getProperty('copyCustomArtifact')
return type(val) == str and len(val) > 0
2022-10-21 20:56:44 +03:00
def isCopyCustomFolder(self, step):
2022-10-22 14:31:55 +03:00
val = step.getProperty('copyCustomFolder')
return type(val) == str and len(val) > 0
2022-10-21 20:56:44 +03:00
2019-10-06 19:15:02 +03:00
def isRelease(self, step):
return step.getProperty('release') and step.getProperty('stopOnErrors')
2019-10-06 16:13:50 +03:00
2021-10-27 17:23:19 +03:00
def isProdDeploer(self, step):
return step.getProperty('prodDeploer')
2024-05-26 12:32:47 +02:00
def isWebDeploer(self, step):
return step.getProperty('webDeploer')
2019-10-06 19:15:02 +03:00
def isTest(self, step):
2019-12-26 11:29:22 +03:00
return step.getProperty('test')
2019-10-06 16:13:50 +03:00
2021-04-16 23:45:57 +03:00
def getNameProjectFromGitUrl(self, repository):
if not len(repository):
return ""
repository = repository.replace('.git', '')
begin = repository.rfind('/')
begin = max(repository.rfind('/', 0, begin),
repository.rfind(':', 0, begin))
if begin < 0:
return ""
project = repository[begin + 1:len(repository)]
return project
2020-02-05 14:53:02 +03:00
2021-04-19 09:10:26 +03:00
def getLastRepoName(self, url):
fullName = self.getNameProjectFromGitUrl(url)
array = fullName.split('/')
2021-04-19 09:10:26 +03:00
if len(array) <= 0:
return ""
return array[-1]
2019-10-06 19:15:02 +03:00
def destDirPrivate(self, props):
2019-12-26 11:29:22 +03:00
repo = str(props.getProperty('repository'))
2021-04-16 23:45:57 +03:00
got_revision = str(props.getProperty('got_revision'))
2019-10-06 16:13:50 +03:00
2021-04-27 15:04:43 +03:00
name = got_revision
2021-04-16 23:45:57 +03:00
return self.getNameProjectFromGitUrl(repo) + "/" + name
2019-10-06 16:13:50 +03:00
2020-02-03 14:48:36 +03:00
def tempDirPrivate(self, props):
repo = str(props.getProperty('repository'))
2021-04-16 23:45:57 +03:00
got_revision = str(props.getProperty('got_revision'))
2021-04-27 15:04:43 +03:00
name = got_revision
2020-02-03 14:48:36 +03:00
m = hashlib.md5()
repoPath = self.getLastRepoName(repo) + "/" + name
2020-02-05 15:05:17 +03:00
m.update(repoPath.encode('utf-8'))
2020-02-03 14:48:36 +03:00
return m.hexdigest()
2019-10-06 19:15:02 +03:00
def destDir(self, props):
2020-12-23 23:41:57 +03:00
return '/var/www/builds/' + self.destDirPrivate(props)
2019-10-06 16:13:50 +03:00
2022-10-22 15:10:39 +03:00
def destDirCustoArtefactFile(self, props):
if self.isCopyArtefact(props):
return self.destDir(props) + "/" + os.path.basename(props.getProperty('copyCustomArtifact'))
return ""
2020-02-03 14:48:36 +03:00
def tempDir(self, props):
self.tempRepoDir = self.home + '/rTemp/' + self.tempDirPrivate(props)
return self.tempRepoDir
2019-10-06 19:15:02 +03:00
def destDirUrl(self, props):
2021-01-10 12:37:51 +03:00
return "https://quasarapp.ddns.net:3031/" + self.destDirPrivate(props)
2019-10-06 16:13:50 +03:00
2019-12-27 14:03:46 +03:00
def permission(self):
2020-12-23 23:41:57 +03:00
return ["chmod", "-R", "775", '/var/www/builds/']
2019-10-06 16:13:50 +03:00
2019-10-06 19:15:02 +03:00
def linuxXmakeCmd(self, props):
2019-10-06 16:13:50 +03:00
command = [
'qmake-linux',
"-r",
"CONFIG+=qtquickcompiler",
'ONLINE="~/repo"'
2019-12-26 11:29:22 +03:00
]
2019-10-06 16:13:50 +03:00
2019-12-26 11:29:22 +03:00
return command
2019-10-06 16:13:50 +03:00
2020-10-08 15:35:25 +03:00
def wasmXmakeCmd(self, props):
return []
2019-10-06 19:15:02 +03:00
def windowsXmakeCmd(self, props):
command = [
'qmake-windows',
'-spec', 'win32-g++',
"-r",
"CONFIG+=qtquickcompiler",
'ONLINE="~/repo"'
2019-12-26 11:29:22 +03:00
]
2019-10-06 16:13:50 +03:00
2019-12-26 11:29:22 +03:00
return command
2019-10-06 16:13:50 +03:00
2019-10-06 19:15:02 +03:00
def androidXmakeCmd(self, props):
2021-04-06 00:33:46 +03:00
file = self.home + "/buildBotSecret/secret.json"
secret = SecretManager(file, props)
2019-10-06 16:13:50 +03:00
2019-10-06 19:15:02 +03:00
command = [
'qmake-android',
'-spec', 'android-clang',
"-r",
"CONFIG+=qtquickcompiler",
'SIGN_PATH="' + secret.getValue('SIGPATH') + '"',
'SIGN_ALIES="quasarapp"',
'SIGN_STORE_PASSWORD="' + secret.getValue('SIGPASS') + '"'
2019-10-06 16:13:50 +03:00
2019-12-26 11:29:22 +03:00
]
2019-10-06 16:13:50 +03:00
2019-12-26 11:29:22 +03:00
return command
2019-10-06 19:15:02 +03:00
2022-01-21 00:32:25 +03:00
def iosXmakeCmd(self, props):
return ""
def macXmakeCmd(self, props):
return ""
2019-12-26 11:29:22 +03:00
def androidXmakeEnv(self, props):
2019-12-24 22:40:58 +03:00
return {}
2020-10-08 15:35:25 +03:00
def wasmXmakeEnv(self, props):
return {}
2019-12-26 11:29:22 +03:00
def windowsXmakeEnv(self, props):
2019-12-24 22:40:58 +03:00
return {}
2019-12-26 11:29:22 +03:00
def linuxXmakeEnv(self, props):
2019-12-24 22:40:58 +03:00
return {}
2022-01-21 00:32:25 +03:00
def iosXmakeEnv(self, props):
return {}
def macXmakeEnv(self, props):
return {}
2019-12-26 11:29:22 +03:00
def makePrefix(self):
2019-12-27 12:55:39 +03:00
return "X"
2019-12-24 22:40:58 +03:00
2020-02-10 14:56:35 +03:00
def generateStep(self, cmd, platform, desc, checkFunc, log=False):
2019-12-24 22:40:58 +03:00
2019-12-26 17:51:44 +03:00
@util.renderer
def envWraper(step):
platformEnv = {
2020-01-31 14:55:49 +03:00
BaseModule.P_Linux: self.linuxXmakeEnv,
BaseModule.P_Windows: self.windowsXmakeEnv,
BaseModule.P_Android: self.androidXmakeEnv,
2020-10-08 15:35:25 +03:00
BaseModule.P_Wasm: self.wasmXmakeEnv,
2022-01-21 00:32:25 +03:00
BaseModule.P_iOS: self.iosXmakeEnv,
BaseModule.P_Mac: self.macXmakeEnv,
2020-10-08 15:35:25 +03:00
2019-12-26 17:51:44 +03:00
}
2019-12-26 18:05:13 +03:00
return platformEnv[platform](step)
2019-12-24 22:40:58 +03:00
2019-12-26 11:29:22 +03:00
def dustepIf(step):
2020-06-19 13:43:02 +03:00
return checkFunc(step) and self.isSupport(step)
2019-12-26 11:29:22 +03:00
2020-01-03 12:00:49 +03:00
res = steps.Compile(
2019-12-27 15:13:59 +03:00
command=self.getWraper(cmd),
haltOnFailure=util.Interpolate('%(prop:stopOnErrors)s') == "True",
2019-12-26 11:29:22 +03:00
doStepIf=lambda step: dustepIf(step),
2020-06-19 14:59:01 +03:00
hideStepIf=lambda results, step: not dustepIf(step),
2019-12-27 12:55:39 +03:00
name=desc + ' ' + platform,
2019-12-26 17:51:44 +03:00
env=envWraper,
2020-02-10 14:30:23 +03:00
want_stdout=True,
want_stderr=True,
2020-01-05 15:07:41 +03:00
warningPattern=".*[Ww]arning[: ].*",
2019-12-26 11:29:22 +03:00
description=desc,
2019-12-24 22:40:58 +03:00
)
2020-02-10 14:56:35 +03:00
if log:
res = steps.Compile(
command=self.getWraper(cmd),
haltOnFailure=util.Interpolate('%(prop:stopOnErrors)s') == "True",
2020-02-10 14:56:35 +03:00
doStepIf=lambda step: dustepIf(step),
hideStepIf=lambda results, step: not dustepIf(step),
name=desc + ' ' + platform,
env=envWraper,
want_stdout=True,
want_stderr=True,
logfiles={"LogFile": "buildLog.log"},
warningPattern=".*[Ww]arning[: ].*",
description=desc,
)
2019-12-26 11:29:22 +03:00
return res
2019-12-24 22:40:58 +03:00
2019-12-26 11:29:22 +03:00
def generatePlatformSteps(self, platform):
2019-12-25 19:35:31 +03:00
platformXcmd = {
2020-01-31 14:55:49 +03:00
BaseModule.P_Linux: self.linuxXmakeCmd,
BaseModule.P_Windows: self.windowsXmakeCmd,
BaseModule.P_Android: self.androidXmakeCmd,
2020-10-08 15:35:25 +03:00
BaseModule.P_Wasm: self.wasmXmakeCmd,
2022-01-21 00:32:25 +03:00
BaseModule.P_iOS: self.iosXmakeCmd,
BaseModule.P_Mac: self.macXmakeCmd,
2020-10-08 15:35:25 +03:00
2019-12-25 19:35:31 +03:00
}
res = []
2019-12-26 11:29:22 +03:00
res += [self.generateStep(platformXcmd[platform],
platform,
2019-12-27 12:55:39 +03:00
self.makePrefix() + 'Make',
2020-06-19 14:51:14 +03:00
lambda step: True)]
2019-10-06 19:15:02 +03:00
2019-12-26 11:29:22 +03:00
res += [self.generateStep(self.makeCommand,
platform,
2019-12-27 12:55:39 +03:00
'Make',
2019-12-26 11:29:22 +03:00
lambda step: True)]
2019-10-06 19:15:02 +03:00
2020-02-04 16:40:15 +03:00
res += [self.generateStep(self.makeTarget('deploy'),
2019-12-26 11:29:22 +03:00
platform,
'deploy project',
self.isDeploy)]
2019-10-06 19:15:02 +03:00
2020-02-04 16:40:15 +03:00
res += [self.generateStep(self.makeTarget('test'),
2019-12-26 11:29:22 +03:00
platform,
'test project',
2020-02-10 14:56:35 +03:00
self.isTest,
True)]
2019-10-06 19:15:02 +03:00
2020-02-04 16:40:15 +03:00
res += [self.generateStep(self.makeTarget('release'),
2019-12-26 11:29:22 +03:00
platform,
'release project',
self.isRelease)]
2019-10-06 19:15:02 +03:00
2019-12-26 11:29:22 +03:00
return res
2019-10-06 19:15:02 +03:00
def getFactory(self):
2019-12-26 11:29:22 +03:00
factory = super().getFactory()
2019-10-06 19:15:02 +03:00
2021-03-30 18:24:33 +03:00
factory.addStep(
steps.Git(
repourl=util.Interpolate('%(prop:repository)s'),
branch=util.Interpolate('%(prop:branch)s'),
mode='full',
2021-04-15 21:10:14 +03:00
method='fresh',
2021-03-31 20:21:35 +03:00
clobberOnFailure=True,
2021-03-30 18:24:33 +03:00
submodules=True,
retryFetch=True,
name='git operations',
description='operations of git like pull clone fetch',
)
2019-12-26 11:29:22 +03:00
)
2019-10-06 19:15:02 +03:00
2020-06-19 18:22:01 +03:00
# factory.addStep(self.checkSupportedBuildSystems())
2020-01-31 14:55:49 +03:00
factory.addSteps(self.generatePlatformSteps(self.platform))
2019-10-06 19:15:02 +03:00
factory.addStep(
steps.DirectoryUpload(
2019-12-26 11:29:22 +03:00
workersrc=util.Interpolate('%(prop:copyFolder)s'),
2019-12-27 15:13:59 +03:00
masterdest=self.getWraper(self.destDir),
url=self.getWraper(self.destDirUrl),
doStepIf=self.getWraper(self.isDeploy),
2019-12-26 11:29:22 +03:00
name='copy buildet files',
description='copy buildet files to shared folder',
2019-10-06 16:13:50 +03:00
)
2019-12-26 11:29:22 +03:00
)
2019-10-06 16:13:50 +03:00
2022-10-21 20:56:44 +03:00
factory.addStep(
steps.DirectoryUpload(
workersrc=util.Interpolate('%(prop:copyCustomFolder)s'),
masterdest=self.getWraper(self.destDir),
url=self.getWraper(self.destDirUrl),
doStepIf=self.getWraper(self.isCopyCustomFolder),
2022-10-22 14:31:55 +03:00
name='copy extra artefact files',
description='copy extra artefact files (DirectoryUpload)',
2022-10-21 20:56:44 +03:00
)
)
factory.addStep(
2022-10-21 21:32:51 +03:00
steps.FileUpload(
2022-10-21 20:56:44 +03:00
workersrc=util.Interpolate('%(prop:copyCustomArtifact)s'),
2022-10-22 15:10:39 +03:00
masterdest=self.getWraper(self.destDirCustoArtefactFile),
2022-10-21 20:56:44 +03:00
url=self.getWraper(self.destDirUrl),
doStepIf=self.getWraper(self.isCopyArtefact),
name='copy custom artifact file',
2022-10-22 14:31:55 +03:00
description='copy custom artifact file (FileUpload)',
2022-10-21 20:56:44 +03:00
)
)
2021-10-28 10:48:57 +03:00
if self.platform == BaseModule.P_Linux:
factory.addStep(
steps.Trigger(schedulerNames=['releaser'],
doStepIf=lambda step:
self.isProdDeploer(step),
set_properties={
'copyFolder': 'Distro',
'prodName': 'prod.deb'
}
)
)
2024-05-26 12:32:47 +02:00
factory.addStep(
steps.Trigger(schedulerNames=['releaserweb'],
doStepIf=lambda step:
self.isWebDeploer(step),
set_properties={
'copyFolder': 'Distro',
'prodName': 'prod.deb'
}
)
)
2021-04-22 17:42:12 +03:00
factory.addStep(
self.generateStep("git clean -xdf",
2021-04-22 17:49:09 +03:00
self.platform,
2021-04-22 17:42:12 +03:00
'Clean',
lambda step: True)
)
2021-10-28 10:48:57 +03:00
clearCmd = "git submodule foreach --recursive git clean -xdf"
2021-04-22 17:42:12 +03:00
factory.addStep(
2021-10-28 10:48:57 +03:00
self.generateStep(clearCmd,
2021-04-22 17:49:09 +03:00
self.platform,
2021-04-22 17:42:12 +03:00
'Clean submodules',
lambda step: True)
)
2019-10-06 19:15:02 +03:00
return factory
2021-05-11 11:55:27 +03:00
def getDefinesList(self, props):
2021-05-11 17:35:56 +03:00
return str(props.getProperty('defines', '')).split(' ')
2021-05-11 11:55:27 +03:00
2019-12-26 16:18:17 +03:00
def getPropertyes(self):
2019-10-06 19:15:02 +03:00
2019-12-26 16:18:17 +03:00
base = super().getPropertyes()
2019-10-06 19:15:02 +03:00
2019-12-26 16:18:17 +03:00
return base + [
2019-10-06 19:15:02 +03:00
util.BooleanParameter(
2019-12-26 11:29:22 +03:00
name='deploy',
label='deploy project',
default=True
2019-10-06 19:15:02 +03:00
),
util.BooleanParameter(
2019-12-26 11:29:22 +03:00
name='test',
label='test project ',
default=True
2019-10-06 19:15:02 +03:00
),
2022-10-21 21:46:32 +03:00
util.BooleanParameter(
name='stopOnErrors',
label='stop build order when step failde',
default=True
2022-10-21 21:46:32 +03:00
),
2019-10-06 19:15:02 +03:00
util.BooleanParameter(
2019-12-26 11:29:22 +03:00
name='release',
label='release project',
default=False
2019-10-06 19:15:02 +03:00
),
2021-10-27 17:23:19 +03:00
util.BooleanParameter(
name='prodDeploer',
label='release prod project',
default=False
),
2024-05-26 12:32:47 +02:00
util.BooleanParameter(
name='webDeploer',
label='release web project',
default=False
),
2019-10-06 19:15:02 +03:00
util.StringParameter(
2019-12-26 11:29:22 +03:00
name='copyFolder',
label='Folder with buildet data',
default="Distro"
2019-10-06 19:15:02 +03:00
),
2022-10-21 20:56:44 +03:00
util.StringParameter(
name='copyCustomArtifact',
label='File of extra data (will be copied)',
default=""
),
util.StringParameter(
name='copyCustomFolder',
label='Folder of extra data (will be copied)',
default=""
),
2020-02-03 14:48:36 +03:00
util.StringParameter(
name='repoFolder',
label='Folder with repository data',
default="Repo"
),
2022-10-21 20:56:44 +03:00
2021-05-11 11:55:27 +03:00
util.StringParameter(
name='defines',
label='Custom Defines list: Example: -DHANOI_ADMOD=1',
default=""
),
2019-10-06 19:15:02 +03:00
]