Ejemplo n.º 1
0
def test_copr_and_koji_build_for_one_trigger(clean_before_and_after):
    pr1 = PullRequestModel.get_or_create(
        pr_id=1,
        namespace="the-namespace",
        repo_name="the-repo-name",
        project_url="https://github.com/the-namespace/the-repo-name",
    )
    # SRPMBuildModel is (sadly) not shared between Koji and Copr builds.
    srpm_build_for_copr, run_model_for_copr = SRPMBuildModel.create_with_new_run(
        trigger_model=pr1, commit_sha="687abc76d67d")
    srpm_build_for_copr.set_logs("asd\nqwe\n")
    srpm_build_for_copr.set_status("success")

    srpm_build_for_koji, run_model_for_koji = SRPMBuildModel.create_with_new_run(
        trigger_model=pr1, commit_sha="687abc76d67d")
    srpm_build_for_copr.set_logs("asd\nqwe\n")
    srpm_build_for_copr.set_status("success")

    copr_build = CoprBuildModel.create(
        build_id="123456",
        commit_sha="687abc76d67d",
        project_name="SomeUser-hello-world-9",
        owner="packit",
        web_url="https://copr.something.somewhere/123456",
        target=SampleValues.target,
        status="pending",
        run_model=run_model_for_copr,
    )
    koji_build = KojiBuildModel.create(
        build_id="987654",
        commit_sha="687abc76d67d",
        web_url="https://copr.something.somewhere/123456",
        target=SampleValues.target,
        status="pending",
        run_model=run_model_for_koji,
    )

    assert copr_build in pr1.get_copr_builds()
    assert koji_build in pr1.get_koji_builds()

    assert srpm_build_for_copr in pr1.get_srpm_builds()
    assert srpm_build_for_koji in pr1.get_srpm_builds()

    assert copr_build.get_job_trigger_model(
    ) == koji_build.get_job_trigger_model()

    assert srpm_build_for_copr.get_trigger_object() == pr1
    assert srpm_build_for_koji.get_trigger_object() == pr1
    assert copr_build.get_trigger_object() == pr1
    assert koji_build.get_trigger_object() == pr1

    assert len(koji_build.runs) == 1
    assert koji_build.runs[0] == run_model_for_koji
    assert len(copr_build.runs) == 1
    assert copr_build.runs[0] == run_model_for_copr
Ejemplo n.º 2
0
 def build_model(self) -> Optional[KojiBuildModel]:
     if not super().build_model:
         self._build_model = KojiBuildModel.create(
             build_id=str(self.build_id),
             commit_sha=self._commit_sha,
             web_url=self.web_url,
             target="noarch",  # TODO: where to get this info from?
             status=self.state.value,
             run_model=RunModel.create(
                 type=JobTriggerModelType.branch_push,
                 trigger_id=GitBranchModel.get_or_create(
                     branch_name=self.branch_name,
                     repo_name=self.repo_name,
                     namespace=self.namespace,
                     project_url=self.project_url,
                 ).id,
             ),
         )
     return self._build_model
Ejemplo n.º 3
0
class KojiBuildJobHelper(BaseBuildJobHelper):
    job_type_build = JobType.production_build
    job_type_test = None
    status_name_build: str = "production-build"
    status_name_test: str = None

    def __init__(
        self,
        service_config: ServiceConfig,
        package_config: PackageConfig,
        project: GitProject,
        metadata: EventData,
        db_trigger,
        job_config: JobConfig,
        targets_override: Optional[Set[str]] = None,
    ):
        super().__init__(
            service_config=service_config,
            package_config=package_config,
            project=project,
            metadata=metadata,
            db_trigger=db_trigger,
            job_config=job_config,
            targets_override=targets_override,
        )
        self.msg_retrigger: str = MSG_RETRIGGER.format(
            job="build", command="production-build", place="pull request"
        )

        # Lazy properties
        self._supported_koji_targets = None

    @property
    def is_scratch(self) -> bool:
        return self.job_build and self.job_build.metadata.scratch

    @property
    def build_targets_all(self) -> Set[str]:
        """
        Return all valid Koji targets/chroots from config.
        """
        return get_koji_targets(*self.configured_build_targets)

    @property
    def tests_targets_all(self) -> Set[str]:
        """
        [not used now]
        Return all valid test targets/chroots from config.
        """
        return get_koji_targets(*self.configured_tests_targets)

    @property
    def supported_koji_targets(self):
        if self._supported_koji_targets is None:
            self._supported_koji_targets = get_all_koji_targets()
        return self._supported_koji_targets

    def run_koji_build(self) -> TaskResults:
        self.report_status_to_all(
            description="Building SRPM ...", state=BaseCommitStatus.running
        )
        if results := self.create_srpm_if_needed():
            return results

        if self.srpm_model.status != PG_BUILD_STATUS_SUCCESS:
            msg = "SRPM build failed, check the logs for details."
            self.report_status_to_all(
                state=BaseCommitStatus.failure,
                description=msg,
                url=get_srpm_build_info_url(self.srpm_model.id),
            )
            return TaskResults(success=False, details={"msg": msg})

        try:
            # We need to do it manually
            # because we don't use PackitAPI.build, but PackitAPI.up.koji_build
            self.api.init_kerberos_ticket()
        except PackitCommandFailedError as ex:
            msg = f"Kerberos authentication error: {ex.stderr_output}"
            logger.error(msg)
            self.report_status_to_all(
                state=BaseCommitStatus.error,
                description=msg,
                url=get_srpm_build_info_url(self.srpm_model.id),
            )
            return TaskResults(success=False, details={"msg": msg})

        errors: Dict[str, str] = {}
        for target in self.build_targets:

            if target not in self.supported_koji_targets:
                msg = f"Target not supported: {target}"
                self.report_status_to_all_for_chroot(
                    state=BaseCommitStatus.error,
                    description=msg,
                    url=get_srpm_build_info_url(self.srpm_model.id),
                    chroot=target,
                )
                errors[target] = msg
                continue

            try:
                build_id, web_url = self.run_build(target=target)
            except Exception as ex:
                sentry_integration.send_to_sentry(ex)
                # TODO: Where can we show more info about failure?
                # TODO: Retry
                self.report_status_to_all_for_chroot(
                    state=BaseCommitStatus.error,
                    description=f"Submit of the build failed: {ex}",
                    url=get_srpm_build_info_url(self.srpm_model.id),
                    chroot=target,
                )
                errors[target] = str(ex)
                continue

            koji_build = KojiBuildModel.create(
                build_id=str(build_id),
                commit_sha=self.metadata.commit_sha,
                web_url=web_url,
                target=target,
                status="pending",
                run_model=self.run_model,
            )
            url = get_koji_build_info_url(id_=koji_build.id)
            self.report_status_to_all_for_chroot(
                state=BaseCommitStatus.running,
                description="Building RPM ...",
                url=url,
                chroot=target,
            )

        if errors:
            return TaskResults(
                success=False,
                details={
                    "msg": "Koji build submit was not successful for all chroots.",
                    "errors": errors,
                },
            )

        # TODO: release the hounds!
        """
        celery_app.send_task(
            "task.babysit_koji_build",
            args=(build_metadata.build_id,),
            countdown=120,  # do the first check in 120s
        )
        """

        return TaskResults(success=True, details={})