Skip to content

Commit

Permalink
Add srpm-build to replace tito build
Browse files Browse the repository at this point in the history
  • Loading branch information
ehelms committed Aug 11, 2020
1 parent 2893602 commit f50b6a1
Show file tree
Hide file tree
Showing 8 changed files with 150 additions and 34 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ env:

jobs:
build:
runs-on: ubuntu-latest
runs-on: ubuntu-20.04
strategy:
fail-fast: false
matrix:
Expand Down
16 changes: 16 additions & 0 deletions obal/data/module_utils/obal.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
Ansible module helper functions for obal modules
"""
import subprocess
import os
from contextlib import contextmanager


def specfile_macro_lookup(specfile, macro_str, scl=None, dist=None, macros=None):
Expand Down Expand Up @@ -75,3 +77,17 @@ def get_whitelist_status(build_command, tag, package):
]
retcode = subprocess.call(cmd)
return retcode == 0


@contextmanager
def chdir(directory):
"""
Change the directory in a context manager. Automatically switches back even if an exception
occurs.
"""
old = os.getcwd()
os.chdir(directory)
try:
yield
finally:
os.chdir(old)
16 changes: 1 addition & 15 deletions obal/data/module_utils/tito_wrapper.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,9 @@
"""
A tito wrapper
"""
import os
from contextlib import contextmanager
from subprocess import STDOUT, check_output


@contextmanager
def chdir(directory):
"""
Change the directory in a context manager. Automatically switches back even if an exception
occurs.
"""
old = os.getcwd()
os.chdir(directory)
try:
yield
finally:
os.chdir(old)
from ansible.module_utils.chdir import chdir # pylint:disable=import-error,no-name-in-module


def tito(command, directory):
Expand Down
121 changes: 121 additions & 0 deletions obal/data/modules/srpm.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
"""
Build SRPM
"""

import shutil
import os
import subprocess
from tempfile import mkdtemp

from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.obal import chdir # pylint:disable=import-error,no-name-in-module

def run_command(command):
"""
Run a system command
"""
return subprocess.check_output(
command,
universal_newlines=True,
stderr=subprocess.STDOUT
)


def copy_sources(spec_file, package_dir, sources_dir):
"""
Copy RPM sources to rpmbuild environment
"""
command = ["spectool", "--list-files", spec_file]
sources = run_command(command)

for source in sources.split("\n"):
if not source:
continue

source_link = source.split(' ')[1]

if not source_link.startswith('http'):
shutil.copy(os.path.join(package_dir, source_link), sources_dir)

with chdir(package_dir):
run_command(["git-annex", "lock"])
annexed_files = run_command(["git-annex", "find", "--include", "*"])
annexed_files = annexed_files.splitlines()

if not annexed_files:
return

run_command(["git-annex", "get"])

try:
run_command(["git-annex", "unlock"])
finally:
for annex in annexed_files:
shutil.copy(annex, sources_dir)

run_command(["git-annex", "lock", "--force"])


def main():
"""
Build a package using tito
"""
module = AnsibleModule(
argument_spec=dict(
package=dict(type='str', required=False),
scl=dict(type='str', required=False),
output=dict(type='path', required=False),
)
)

package = module.params['package']
output = module.params['output']
scl = module.params['scl']

spec_file = os.path.join(package, '%s.spec' % os.path.basename(package))

try:
base_dir = mkdtemp()
sources_dir = os.path.join(base_dir, 'SOURCES')
build_dir = os.path.join(base_dir, 'BUILD')

os.mkdir(sources_dir)
os.mkdir(build_dir)

copy_sources(spec_file, package, sources_dir)
shutil.copy(spec_file, base_dir)

command = ['rpmbuild', '-bs']
command += ['--define', '_topdir %s' % base_dir]
command += ['--define', '_sourcedir %s' % sources_dir]
command += ['--define', '_builddir %s' % build_dir]
command += ['--define', '_srcrpmdir %s' % base_dir]
command += ['--define', '_rpmdir %s' % base_dir]
command += ['--undefine', 'dist']

if scl:
command += ['--define', 'scl %s' % scl]

command += [os.path.join(base_dir, '%s.spec' % os.path.basename(package))]

try:
result = run_command(command)
result = result.split("Wrote: ")[-1].rstrip()

if not os.path.exists(output):
os.mkdir(output)

shutil.copy(result, output)
path = os.path.join(output, os.path.basename(result))

module.exit_json(changed=True, path=path)
except subprocess.CalledProcessError as error:
module.fail_json(msg='Failed to srpm build', command=' '.join(command), output=error.output)
except subprocess.CalledProcessError as error:
module.fail_json(msg='Failed to build srpm', output=error.output)
finally:
shutil.rmtree(base_dir)


if __name__ == '__main__':
main()
14 changes: 4 additions & 10 deletions obal/data/roles/build_srpm/tasks/main.yaml
Original file line number Diff line number Diff line change
@@ -1,18 +1,12 @@
---
- name: 'Build SRPM'
tito_build:
directory: "{{ inventory_dir }}/{{ package_base_dir }}/{{ inventory_hostname }}"
build_arguments: "{{ build_srpm_tito_build_args }}"
srpm: true
offline: true
dist: "{{ build_srpm_dist }}"
scl: "{{ build_srpm_scl }}"
srpm:
package: "{{ inventory_dir }}/{{ package_base_dir }}/{{ inventory_hostname }}"
output: "{{ build_srpm_output_dir }}"
arguments: "{{ build_srpm_tito_args }}"
builder: "{{ build_srpm_tito_builder }}"
scl: "{{ scl | default(omit) }}"
register: srpm_build

- name: 'Built SRPM'
- name: 'Built srpm path'
debug:
msg: "Built {{ srpm_build.path }}"
when: srpm_build is successful
2 changes: 2 additions & 0 deletions tests/fixtures/testrepo/upstream/packages/foo/foo-source
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
Bar!
Baz!
No Foo!
2 changes: 1 addition & 1 deletion tests/fixtures/testrepo/upstream/packages/foo/foo.spec
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ A fake RPM for foos and bars.
%install
cp . %{buildroot}/

%files foo
%files
foo-source

%changelog
Expand Down
11 changes: 4 additions & 7 deletions tests/test_functional.py
Original file line number Diff line number Diff line change
Expand Up @@ -657,19 +657,16 @@ def test_obal_changelog_custom():
@obal_cli_test(repotype='upstream')
def test_obal_srpm():
assert_obal_success(['srpm', 'hello', 'foo'])
assert_mockbin_log([
'tito build --srpm --offline --output {pwd}/SRPMs',
'tito build --srpm --offline --output {pwd}/SRPMs'
])

assert os.path.exists('SRPMs/foo-1.0-1.src.rpm')
assert os.path.exists('SRPMs/hello-2.10-2.src.rpm')


@obal_cli_test(repotype='upstream')
def test_obal_mock():
assert_obal_success(['mock', 'hello', 'foo', '--config', 'mock/el7.cfg'])

expected_log = [
"tito build --srpm --offline --output {pwd}/SRPMs",
"tito build --srpm --offline --output {pwd}/SRPMs",
"mock --recurse --chain -r mock/el7.cfg --localrepo {pwd}/mock_builds SRPMs/foo-1.0-1.src.rpm SRPMs/hello-2.10-1.src.rpm"
"mock --recurse --chain -r mock/el7.cfg --localrepo {pwd}/mock_builds SRPMs/foo-1.0-1.src.rpm SRPMs/hello-2.10-2.src.rpm"
]
assert_mockbin_log(expected_log)

0 comments on commit f50b6a1

Please sign in to comment.