Skip to content

Commit 6d89c20

Browse files
authored
Move common logic from Build node to library (#205)
* Move common logic from Build node to library (#185) * Fix WrappedGitRepo class does not have archive method Update build library to new 0.1.1 version Fixes: AlmaLinux/build-system#417 * Fix tests
1 parent 7f429a3 commit 6d89c20

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+500
-5963
lines changed

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ RUN <<EOT
77
dnf upgrade -y
88
dnf install -y \
99
gcc gcc-c++ make cmake git mock mock-rpmautospec keyrings-filesystem sudo \
10-
libicu libicu-devel kernel-rpm-macros createrepo_c cpio \
10+
libicu libicu-devel kernel-rpm-macros createrepo_c cpio e2fsprogs \
1111
python3-devel python3-lxml python3-createrepo_c python3-libmodulemd \
1212
centpkg \
1313
fedpkg

almalinux_build_node.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@
1010
from threading import Event
1111

1212
import sentry_sdk
13+
from albs_build_lib.builder.mock.mock_environment import MockError
14+
from albs_common_lib.errors import BuildError, BuildExcluded
15+
from albs_common_lib.utils.file_utils import chown_recursive, rm_sudo
16+
from albs_common_lib.utils.spec_parser import SpecParseError
1317

1418
import build_node.build_node_globals as node_globals
1519
from build_node.build_node_builder import BuildNodeBuilder
1620
from build_node.build_node_config import BuildNodeConfig
17-
from build_node.build_node_errors import BuildError, BuildExcluded
1821
from build_node.build_node_supervisor import BuilderSupervisor
19-
from build_node.mock.mock_environment import MockError
2022
from build_node.utils.config import locate_config_file
21-
from build_node.utils.file_utils import chown_recursive, rm_sudo
22-
from build_node.utils.spec_parser import SpecParseError
2323

2424
running = True
2525

@@ -34,7 +34,7 @@ def init_args_parser():
3434
"""
3535
parser = argparse.ArgumentParser(
3636
prog='castor_build_node',
37-
description='CloudLinux Build System build node',
37+
description='AlmaLinux Build System build node',
3838
)
3939
parser.add_argument('-c', '--config', help='configuration file path')
4040
parser.add_argument('-i', '--id', help='build node unique identifier')

build_node/build_node_builder.py

Lines changed: 40 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
1-
# -*- mode:python; coding:utf-8; -*-
2-
# author: Eugene Zamriy <[email protected]>
3-
# created: 2017-10-19
4-
51
"""
6-
CloudLinux Build System build thread implementation.
2+
AlmaLinux Build System build thread implementation.
73
"""
84

95
import datetime
@@ -13,31 +9,30 @@
139
import platform
1410
import pprint
1511
import random
16-
import threading
1712
import typing
1813
import urllib.parse
1914

2015
import requests
2116
import requests.adapters
17+
from albs_build_lib.builder.base_builder import measure_stage
18+
from albs_build_lib.builder.base_thread_slave_builder import BaseSlaveBuilder
19+
from albs_build_lib.builder.models import Task
20+
from albs_common_lib.errors import BuildError, BuildExcluded
21+
from albs_common_lib.utils.file_utils import (
22+
filter_files,
23+
rm_sudo,
24+
)
2225
from immudb_wrapper import ImmudbWrapper
2326
from requests.packages.urllib3.util.retry import Retry
2427
from sentry_sdk import capture_exception
2528

2629
from build_node import constants
27-
from build_node.build_node_errors import BuildError, BuildExcluded
28-
from build_node.builders.base_builder import measure_stage
2930
from build_node.builders.base_rpm_builder import BaseRPMBuilder
30-
from build_node.models import Task
3131
from build_node.uploaders.pulp import PulpRpmUploader
3232
from build_node.utils.codenotary import notarize_build_artifacts
33-
from build_node.utils.file_utils import (
34-
clean_dir,
35-
filter_files,
36-
rm_sudo,
37-
)
3833

3934

40-
class BuildNodeBuilder(threading.Thread):
35+
class BuildNodeBuilder(BaseSlaveBuilder):
4136
"""Build thread."""
4237

4338
def __init__(
@@ -62,19 +57,23 @@ def __init__(
6257
graceful_terminated_event : threading.Event
6358
Shows, if process got "kill -10" signal.
6459
"""
65-
super(BuildNodeBuilder, self).__init__(name=f'Builder-{thread_num}')
60+
super().__init__(
61+
thread_num=thread_num,
62+
)
6663
self.__config = config
64+
# current task processing start timestamp
65+
self.__start_ts = None
6766
self.__working_dir = os.path.join(
6867
config.working_dir, 'builder-{0}'.format(thread_num)
6968
)
7069
self.init_working_dir(self.__working_dir)
71-
self.__logger = None
72-
self.__current_task_id = None
73-
# current task processing start timestamp
74-
self.__start_ts = None
70+
self.__terminated_event = terminated_event
71+
self.__graceful_terminated_event = graceful_terminated_event
7572
# current task builder object
7673
self.__builder = None
7774
self.__session = None
75+
self.__logger = None
76+
self.__current_task_id = None
7877
self._immudb_wrapper = None
7978
self._codenotary_enabled = self.__config.codenotary_enabled
8079
self._build_stats: typing.Optional[
@@ -87,9 +86,6 @@ def __init__(
8786
self.__config.pulp_chunk_size,
8887
self.__config.pulp_uploader_max_workers,
8988
)
90-
91-
self.__terminated_event = terminated_event
92-
self.__graceful_terminated_event = graceful_terminated_event
9389
self.__hostname = platform.node()
9490
self.__task_queue = task_queue
9591

@@ -149,8 +145,12 @@ def run(self):
149145
)
150146
capture_exception(e)
151147
finally:
152-
only_logs = not bool(
153-
filter_files(artifacts_dir, lambda f: f.endswith('.rpm'))
148+
only_logs = not (
149+
bool(
150+
filter_files(
151+
artifacts_dir, lambda f: f.endswith('.rpm')
152+
)
153+
)
154154
)
155155
if success is False:
156156
only_logs = True
@@ -220,7 +220,9 @@ def run(self):
220220
self.__report_excluded_task(task, build_artifacts)
221221
else:
222222
self.__report_done_task(
223-
task, success=success, artifacts=build_artifacts
223+
task,
224+
success=success,
225+
artifacts=build_artifacts,
224226
)
225227
except Exception:
226228
self.__logger.exception(
@@ -258,7 +260,7 @@ def __cas_notarize_artifacts(
258260

259261
def __build_packages(self, task, task_dir, artifacts_dir):
260262
"""
261-
Creates a suitable builder instance and builds RPM or Debian packages.
263+
Creates a suitable builder instance and builds RPM packages.
262264
263265
Parameters
264266
----------
@@ -309,7 +311,12 @@ def __report_excluded_task(self, task, artifacts):
309311
**kwargs,
310312
)
311313

312-
def __report_done_task(self, task, success=True, artifacts=None):
314+
def __report_done_task(
315+
self,
316+
task,
317+
success=True,
318+
artifacts=None,
319+
):
313320
if not artifacts:
314321
artifacts = []
315322
kwargs = {
@@ -350,15 +357,18 @@ def __call_master(
350357
**parameters,
351358
):
352359
full_url = urllib.parse.urljoin(
353-
self.__config.master_url, f'build_node/{endpoint}'
360+
self.__config.master_url,
361+
f'build_node/{endpoint}',
354362
)
355363
if endpoint in ('build_done', 'get_task'):
356364
session_method = self.__session.post
357365
else:
358366
session_method = self.__session.get
359367
try:
360368
response = session_method(
361-
full_url, json=parameters, timeout=self.__config.request_timeout
369+
full_url,
370+
json=parameters,
371+
timeout=self.__config.request_timeout,
362372
)
363373
# Special case when build was already done
364374
if response.status_code == requests.codes.conflict:
@@ -370,19 +380,6 @@ def __call_master(
370380
except Exception:
371381
self.__logger.exception('%s', err_msg)
372382

373-
@staticmethod
374-
def init_working_dir(working_dir):
375-
"""
376-
Creates a non-existent working directory or cleans it up from previous
377-
builds.
378-
"""
379-
if os.path.exists(working_dir):
380-
logging.debug('cleaning the %s working directory', working_dir)
381-
clean_dir(working_dir)
382-
else:
383-
logging.debug('creating the %s working directory', working_dir)
384-
os.makedirs(working_dir, 0o750)
385-
386383
def __init_task_logger(self, log_file):
387384
"""
388385
Task logger initialization, configures a build thread logger to write
@@ -423,35 +420,6 @@ def __close_task_logger(self, task_handler):
423420
task_handler.close()
424421
self.__logger.handlers.remove(task_handler)
425422

426-
@staticmethod
427-
def init_thread_logger(log_file):
428-
"""
429-
Build thread logger initialization.
430-
431-
Parameters
432-
----------
433-
log_file : str
434-
Log file path.
435-
436-
Returns
437-
-------
438-
logging.Logger
439-
Build thread logger.
440-
"""
441-
logger = logging.getLogger(
442-
'bt-{0}-logger'.format(threading.current_thread().name)
443-
)
444-
logger.handlers = []
445-
logger.setLevel(logging.DEBUG)
446-
formatter = logging.Formatter(
447-
"%(asctime)s %(levelname)-8s: %(message)s", "%H:%M:%S %d.%m.%y"
448-
)
449-
handler = logging.FileHandler(log_file)
450-
handler.setLevel(logging.DEBUG)
451-
handler.setFormatter(formatter)
452-
logger.addHandler(handler)
453-
return logger
454-
455423
@property
456424
def current_task_id(self):
457425
return self.__current_task_id

build_node/build_node_config.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
1-
# -*- mode:python; coding:utf-8; -*-
2-
# author: Eugene Zamriy <[email protected]>
3-
# created: 2017-10-19
4-
51
"""
6-
CloudLinux Build System build node configuration storage.
2+
AlmaLinux Build System build node configuration storage.
73
"""
84

95
import os

build_node/build_node_errors.py

Lines changed: 0 additions & 26 deletions
This file was deleted.

build_node/build_node_globals.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
1-
# -*- mode:python; coding:utf-8; -*-
2-
# author: Eugene Zamriy <[email protected]>
3-
# created: 2019-04-19
1+
"""AlmaLinux Build System node global variables."""
42

5-
"""CloudLinux Build System node global variables."""
6-
7-
from build_node.mock.supervisor import MockSupervisor
3+
from albs_build_lib.builder.mock.supervisor import MockSupervisor
84

95
__all__ = ['init_supervisors', 'MOCK_SUPERVISOR']
106

@@ -23,4 +19,7 @@ def init_supervisors(config):
2319
Build node configuration file.
2420
"""
2521
global MOCK_SUPERVISOR
26-
MOCK_SUPERVISOR = MockSupervisor(config.mock_configs_storage_dir, config.base_arch)
22+
MOCK_SUPERVISOR = MockSupervisor(
23+
storage_dir=config.mock_configs_storage_dir,
24+
host_arch=config.base_arch,
25+
)

build_node/build_node_supervisor.py

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,31 @@
11
import logging
2-
import threading
32
import traceback
43
import urllib.parse
54

65
import requests
76
import requests.adapters
8-
from urllib3 import Retry
97
from cachetools import TTLCache
8+
from albs_build_lib.builder.base_supervisor import BaseSupervisor
9+
from albs_common_lib.utils.file_utils import file_url_exists
10+
from urllib3 import Retry
1011

1112
from build_node import constants
12-
from build_node.utils.file_utils import file_url_exists
1313

1414

15-
class BuilderSupervisor(threading.Thread):
15+
class BuilderSupervisor(BaseSupervisor):
1616

17-
def __init__(
18-
self,
19-
config,
20-
builders,
21-
terminated_event,
22-
task_queue,
23-
):
24-
self.config = config
25-
self.builders = builders
26-
self.terminated_event = terminated_event
17+
def __init__(self, config, builders, terminated_event, task_queue):
2718
self.__session = None
2819
self.__task_queue = task_queue
2920
self.__cached_config = TTLCache(
3021
maxsize=config.cache_size,
3122
ttl=config.cache_update_interval,
32-
)
33-
super(BuilderSupervisor, self).__init__(name='BuildersSupervisor')
23+
)
24+
super().__init__(
25+
config=config,
26+
builders=builders,
27+
terminated_event=terminated_event,
28+
)
3429

3530
def __generate_request_session(self):
3631
retry_strategy = Retry(
@@ -75,11 +70,6 @@ def __request_build_task(self):
7570
traceback.format_exc(),
7671
)
7772

78-
def get_active_tasks(self):
79-
return set([b.current_task_id for b in self.builders]) - set([
80-
None,
81-
])
82-
8373
def __report_active_tasks(self):
8474
active_tasks = self.get_active_tasks()
8575
logging.debug('Sending active tasks: {}'.format(active_tasks))

0 commit comments

Comments
 (0)