-
Notifications
You must be signed in to change notification settings - Fork 30
feat: add reproducible central buildspec generation #1115
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
tests/build_spec_generator/reproducible_central/compare_rc_build_spec.py
Show resolved
Hide resolved
2547333 to
3014540
Compare
3014540 to
da329fe
Compare
src/macaron/build_spec_generator/reproducible_central/reproducible_central.py
Outdated
Show resolved
Hide resolved
src/macaron/build_spec_generator/reproducible_central/reproducible_central.py
Outdated
Show resolved
Hide resolved
|
Because we are providing the path to the database from CLI argument, we need to support mounting this database file into the container file system too. |
|
@tromai Instead of storing the build spec in |
|
@behnazh-w I only use I can definitely change it to a PURL based path format. The only downside of using a PURL based path here is that it would be a bit challenging for scripting in a CI/CD environment, if that is the targeted use case (you might need to compute the PURL based path from outside of Macaron). |
I think the VSA feature is a little different because it is generated by the policy engine that enforces a given policy, which is not applied to a PURL. The subject instead is specified in the policy itself.
Yes that's true, but I think overall it's less error-prone and we avoid over-writing previous results. |
src/macaron/build_spec_generator/cli_command_parser/gradle_cli_parser.py
Outdated
Show resolved
Hide resolved
c928fb1 to
4a4ac5d
Compare
0ff4d6c to
6a3fdb4
Compare
…spec script Signed-off-by: Trong Nhan Mai <trong.nhan.mai@oracle.com>
Signed-off-by: Trong Nhan Mai <trong.nhan.mai@oracle.com>
…check result was mistakenly joined on the checkfacts.id instead og checkfact.check_result_id
… because without repository no build tool is found This commit also add some useful debug messages for extracting values from the database for Reproducible Central buildspec generation.
… the get latest component for purl select statement
…D and repository from the lookup Component object instead of having their own SELECT query
…to a separated module and add tests for it
… the generation of reproducible central build spec
Signed-off-by: Ben Selwyn-Smith <benselwynsmith@googlemail.com>
Signed-off-by: behnazh-w <behnaz.hassanshahi@oracle.com>
Signed-off-by: behnazh-w <behnaz.hassanshahi@oracle.com>
Signed-off-by: behnazh-w <behnaz.hassanshahi@oracle.com>
489f979 to
a9be2e3
Compare
src/macaron/build_spec_generator/cli_command_parser/maven_cli_parser.py
Outdated
Show resolved
Hide resolved
b73c59c to
894461b
Compare
Signed-off-by: behnazh-w <behnaz.hassanshahi@oracle.com>
894461b to
211c23e
Compare
Summary
This Pull Request adds a new command called
gen-build-spec.This command generates a buildspec, which contains the build related information for a PURL that Macaron has analyzed. The output file will be stored within
output/<purl_based_path>/macaron.buildspec, where<purl_based_path>being the directory structure according to the input PackageURL.An example
In this example, the final path to the output buildspec file is
output/maven/org_apache_hugegraph/computer-k8s/macaron.buildspecThe content of
output/maven/org_apache_hugegraph/computer-k8s/macaron.buildspec, which uses the Reproducible Central buildspec format.
This Buildspec ideally can be used directly as part of the Reproducible Central rebuild infrastructure.
Description of changes
Macaron database extractor
The first step to generate a buildspec is to extract the build related information from an existing Macaron SQLite database. The module
macaron_db_extractor.pyadded in this commit does just that.It uses sqlalchemy SELECT statement for ORM Mapped Classes to extract the data from the database into equivalent ORM Mapped instances that we defined in src/macaron/database/table_definitions.py for example.
Maven and Gradle CLI Command Parser
We use the build commands obtained in CI/CD configuration (e.g. from github action workflow yaml file) for the final buildspec. However, those build commands cannot be used as is and they requires some additional patching to work as a rebuild command.
A proper way to patch any maven and gradle CLI build command is to first parse is. The maven and gradle CLI command parsers added in this commit leverage Python's builtin
argparselibrary.CLI Build Command Patcher
The modules added in this commit uses the Maven and GRadle CLI Command Parser to parse and patch the build commands obtained from the Macaron database.
Jdk version finding from java Maven Central artifacts
Macaron can obtain the JDK version for a given build command obtained from CI/CD configuration. In some cases, the CI/CD configuration doesn't have enough information for us to obtain the JDK version. Therefore, we also rely on the JDK version included in
META-INF/MANIFEST.MFin java artifacts from Maven Centralhttps://repo1.maven.org/.The module
jdk_finder.pyadded in this commit help download the java artifacts from Maven Central given a maven type PURL, then returns the JDK version if it is available inMETA-INF/MANIFEST.MF.In some cases, the JDK version string from
META-INF/MANIFEST.MFdon't only contain the JDK major version. For example:Because Reproducible Central Buildspec requires only the major version of JDK, we need to extract that major version only. The
jdk_version_normalizer.pymodule contains the logic to do just that. It is added this in commit.Generating the Reproducible Central Buildspec
The two commits
use all components listed above to generate the final Reproducible Central Buildspec
Testing
This feature includes unit tests for all components used in RC Buildspec generation (e.g. CLI parsers, CLI patchers, JDK version finder, etc.)
For integration tests, a new script called compare_rc_build_spec.py is added to compare the result Buildspec in the integration tests.
Checklist
verifiedlabel should appear next to all of your commits on GitHub.output/macaron.buildspec(could also be in a different PR).