/techdocs/rpm.txt (644a5ab1b65adb22bbabc8bae144fa4a02c5df04) (5187 bytes) (mode 100644) (type blob)
Try to describe what happens when a build hook is present,
a .spec file is present in the repo and the user pushes.
== Scenario 1 ==
- User pushes
- Web hook will trigger event 'rg_wh_build_send'
- 'rg_wh_build_send' will trigger event 'rg_wh_build_send_one' for each enabled environments
- 'rg_wh_build_send_one' will
- get the pkg_maps, repo and subrepo info
- sets exec:prepare_pkgs
- will call 'rg_pkg_prepare_for_rgfs' to add rgfs details
- will call 'rg_pkg_prepare_for_dotrepo' to add info to create user repositories
- will call 'rg_builder_add'
- Builer will send the job to a worker
- Worker will start the VM
- Inside VM, script rg.sh is started
- Checkout correct branch
- .spec file is searched and BuildRequires are installed
- 'build.sh' starts [as user 'build']
- Secrets are exported
- The commands defined in the webhook are run
- 'build_rpms.sh' starts [as user 'build']
- 'rg_build_rpm' shell function is called for '/mnt/target'
- for each job[rpm_repo_files] 'rg_build_dotrepo /mnt/target-dotrepo-<subrepo_id>' is called
- 'build_rgfs.sh' starts [as user 'root']
- 'build_repo.sh' starts [as user 'build2']
- If no pkg mapping is defined, exit
- gpg keys are stored in /mnt/build2
- Search for .rpm packages in /mnt/rpmbuild
- Imports gpg keys
- If flag exec:prepare_pkgs is set:
- .rpms are copied into /mnt/build2/rpms/<pkg_repo_id}/{debug,os,src}[/username]
- A file A, containing the rpms, is created and rpms are signed
- For each mapping
- a rgfs is mounted
- if '+pending' dir is found, we add the rpms to the file A
- if file A is empty, continue with next mapping
- If a rpm file is already in the repo, remove the name from file A
- if the build is done as uid 0, sign the '+pending' rpms
- copy the signed rpms to rgfs dir
- if uid is not 0 and pkg_repo uid != job_uid, save the pkg_subrepo_id into /mnt/build2/pkg_subrepo_dirty
- If uid is 0 or pkg_repo_uid == job_uid, call rg_rpm_createrepo
- Unmount all rgfs dirs
- VM is shutdown and logs and timings are collected
- Worker notifies the Builder
- Builder calls 'builder_done' function which will trigger 'wh_build_job_done' event
== Scenario 2 ==
- User, from the web interface, edits a pkg_repo/subrepo:
- 'pkg_subrepo_edit' event is triggered (user edited a pkg subrepo)
triggers 'rg_pkg_subrepo_event_edit' event
- or 'rg_pkg_subrepo_event_pkg_repo_changed' event is triggered (user edited a pkg repo)
triggers 'rg_pkg_subrepo_event_edit' event
== Events called from the scenarios ==
- Event 'wh_build_job_done' [function rg_wh_build_job_done]
If callbacks are present, add events for all of them
- Event 'rg_pkg_subrepo_event_edit':
- flag force_regenerate_dotrepo is set to 1 because version was incremented
- only for environments which already have a dotrepo (no build for empty pkg repos)
- calls 'pkg_generate_dotrepo_rpm' event for all enabled envs
- Event 'pkg_generate_dotrepo_rpm' [function rg_pkg_event_generate_dotrepo_rpm]:
- sets 'exec:worker_must_be_global' flag - we do not trust user workers
- prepares a fake pkg_maps from the pkg_repo/subrepo passed in the event
- calls 'rg_pkg_prepare_for_rgfs' function
- calls 'rg_pkg_prepare_for_dotrepo' function
- calls 'rg_builder_add'
- Event 'pkg_subrepo_regenerate' [function rg_pkg_subrepo_event_regenerate]:
- 'uid' is set to 0
- for each subrepo passed in the event a fake pkg_maps is created
- calls 'rg_pkg_prepare_for_rgfs' function
- calls 'rg_pkg_prepare_for_dotrepo' function
- calls 'rg_builder_add'
- Function 'rg_pkg_prepare_for_dotrepo':
- it avoids not enabled environments (state::distros)
- for each pkg mapping:
- if (event uid != pkg_repo uid) skip (we do not allow a user to influence other repos)
TODO: what if event uid is 0?!
- if (!force_regenerate_dotrepo && we already generated the last version of dotrepo) skip
- adds files which will go in /etc/yum.repos.d and gpg keys
- it will add an event callback: 'pkg_generate_dotrepo_rpm_callback'
- Event 'rg_pkg_subrepo_update_distro_info' [function rg_pkg_event_generate_dotrepo_rpm_callback function]
it calls: rg_pkg_subrepo_update_distro_info and
triggers pkg_subrepo_regenerate if ev[status][pkg_subrepo_dirty'] is present
this flag is set when build_repo.sh is copying something to +pending
- Event 'pkg_generate_dotrepo_rpm_callback' [function rg_pkg_event_generate_dotrepo_rpm_callback]:
- called when a dotrepo was done
- for each (subrepo, ver), call 'rg_pkg_subrepo_update_distro_info'
- if 'status:pkg_subrepo_dirty' is present, trigger 'pkg_subrepo_regenerate' event
Set by the 'worker', based on /root/build2/pkg_subrepo_dirty file
Set by build_repo.sh when some .rpm are copied on rgfs
== old ==
- The .spec file is found and .rpm files are generated.
- The .rpm files are moved to '+pending folder'.
We do not create directly the repo because we do not trust the
environment anymore.
- The finish of the job will trigger the rebuild of the repo.
- If a "dotrepo" .rpm file (containing files which will be put in
/etc/yum.repos.d) is not built for that repo/distro/major/arch
the build is triggered.
== old end ==
Mode |
Type |
Size |
Ref |
File |
100644 |
blob |
9 |
f3c7a7c5da68804a1bdf391127ba34aed33c3cca |
.exclude |
100644 |
blob |
108 |
acc2186b1d357966e09df32afcea14933f5f0c78 |
.gitignore |
100644 |
blob |
375 |
1f425bcd2049c526744d449511094fc045ceac74 |
AUTHORS |
100644 |
blob |
1847 |
fd1f7a627adc85dec9ebd72ae9e6b4c941b82f8f |
History.txt |
100644 |
blob |
34520 |
dba13ed2ddf783ee8118c6a581dbf75305f816a3 |
LICENSE |
100644 |
blob |
3624 |
1c4ccf9cceb2e56ae71334442aff3183b242c333 |
Makefile.in |
100644 |
blob |
5325 |
96c40d868ce10b715299085ccffb30f96a730cf3 |
README |
100644 |
blob |
190331 |
0418946bd5fc97da80f0bbd2e918c657536c01e6 |
TODO |
100644 |
blob |
1294 |
f22911eb777f0695fcf81ad686eac133eb11fcc4 |
TODO-plans |
100644 |
blob |
203 |
a2863c67c3da44126b61a15a6f09738c25e0fbe0 |
TODO.perf |
100644 |
blob |
967 |
56bbaa7c937381fb10a2907b6bbe056ef8cc824a |
TODO.vm |
040000 |
tree |
- |
21928e906ad2907a55c2e81c2a8b0502b586b8a0 |
artwork |
100644 |
blob |
5328 |
d5be4cc3f15d059ad8d267d800c602e9774816a8 |
compare.csv |
100755 |
blob |
30 |
92c4bc48245c00408cd7e1fd89bc1a03058f4ce4 |
configure |
040000 |
tree |
- |
811af39b8be55c3a36147dd06b040e86de4e9d4a |
debian |
040000 |
tree |
- |
7108e9538d908ff384482155efcaef836a057a2c |
docker |
040000 |
tree |
- |
f67d3605efbd6422a8acdd953578991139266391 |
docs |
100755 |
blob |
18252 |
e2438615edba7066a730ed6a796a5302263f1f37 |
duilder |
100644 |
blob |
536 |
b791516f9ec08c038e61269e0c5f38446a61e59b |
duilder.conf |
040000 |
tree |
- |
e330b65f3c3eea427853842a05410579de6175bd |
hooks |
040000 |
tree |
- |
e6ef0396dd7f12664ea681377807bdedf09ad13f |
inc |
040000 |
tree |
- |
e255ce234c3993998edc12bc7e93fff555376eda |
misc |
100644 |
blob |
6012 |
7cf5090db19ef7b7a1a4d962f2588464ff4f1c1f |
rocketgit.spec |
040000 |
tree |
- |
85421cbfb018ff4b0eebb1741e2dcfcc72f81ada |
root |
040000 |
tree |
- |
870e96f0afc7d85c97505a878609d386f81748d8 |
samples |
040000 |
tree |
- |
589b9039f8bbb597747e4e78cdfc26be35ead352 |
scripts |
040000 |
tree |
- |
454044f7e286fe13ec18598fce6b613190f52e5e |
selinux |
100755 |
blob |
256 |
462ccd108c431f54e380cdac2329129875a318b5 |
spell_check.sh |
040000 |
tree |
- |
d9260d3cf0d6490be720312893600a8041bf991b |
techdocs |
040000 |
tree |
- |
5dbc11970335b2e208d92e525d2b6ef49dcce3c3 |
tests |
040000 |
tree |
- |
e810d7397575886ef495708d571eb3675f6928ba |
tools |
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"
Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/catalinux/rocketgit
Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/catalinux/rocketgit
Clone this repository using git:
git clone git://git.rocketgit.com/user/catalinux/rocketgit
You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a
merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main