1 (* This goal script is responsible for:
2 * - testing each new commit to the libguestfs source repo
3 * - checking for new upstream releases of libguestfs
4 * - testing new upstream releases
5 * - packaging them as a source tarball
6 * - testing the source tarball on a variety of systems
7 * - if all the above works, uploading the external website
8 * Note this doesn't build the Fedora releases. See 'libguestfs_fedora.ml'.
16 (* Enable debugging. *)
18 Unix.putenv "LIBGUESTFS_DEBUG" "1";
19 Unix.putenv "LIBGUESTFS_TRACE" "1"
21 (* Log program output. *)
22 let from = "rjones@redhat.com"
23 let to_ = "rjones@redhat.com"
25 let logfile = log_program_output ()
26 let () = eprintf "logging to %s\n%!" logfile
29 let package = "libguestfs"
31 (* Goal: the website has been updated to 'version'. *)
32 let rec goal website_updated version =
33 target (url_exists version.url);
35 require (tarball_created version);
36 require (tarball_tested version);
38 (* We only update the website for the development releases. *)
39 if not version.is_stable then
40 require (website_built version);
42 require (website_checked_in version);
43 require (website_rsync_done version)
45 (* Goal: website has been rsync'd. *)
46 and website_rsync_done version =
47 target (url_contains_string "http://libguestfs.org" version.version &&
48 url_exists version.url);
53 " libguestfs_website_repo
55 (* Goal: Tarball added to repository and checked in. *)
56 and website_checked_in version =
57 let key = sprintf "libguestfs_website_checked_in_%s" version.version in
58 target (memory_exists key);
59 onrun (fun () -> memory_set key "1");
61 require (tarball_created version);
62 require (tarball_tested version);
69 git commit -m \"Version %s\"
70 " libguestfs_website_repo
71 buildtmp version.tarball version.urlpath
75 (* Goal: website (local copy) has been built. *)
76 and website_built version =
77 let index_file = sprintf "%s/index.html" libguestfs_website_repo in
78 target (file_contains_string index_file version.version);
80 require (tarball_created version);
81 require (tarball_tested version);
83 (* We should only update the website on development releases. *)
84 assert (not version.is_stable);
87 tar zxf %s/tarballs/%s
90 echo %s > localconfigure
91 chmod +x localconfigure
96 make maintainer-upload-website WEBSITEDIR=%s
97 " buildtmp version.tarball
98 version.package_version
99 (quote (libguestfs_localconfigure `Tarball))
100 (quote (libguestfs_localenv (supermin version)))
101 (quote libguestfs_website_repo)
103 (* Goal: the tarball has passed the required set of tests before
104 * a release is allowed.
106 and tarball_tested version =
107 let key = sprintf "libguestfs_tarball_tested_%s" version.version in
108 target (memory_exists key);
109 onrun (fun () -> memory_set key "1");
111 require (tarball_created version);
114 tar zxf %s/tarballs/%s
117 echo %s > localconfigure
118 chmod +x localconfigure
124 " buildtmp version.tarball
125 version.package_version
126 (quote (libguestfs_localconfigure `Tarball))
127 (quote (libguestfs_localenv (supermin version)))
129 (* Goal: the tarball has been created from git. *)
130 and tarball_created version =
131 let filename = sprintf "%s/tarballs/%s" buildtmp version.tarball in
132 target (file_exists filename);
134 require (repo_up_to_date version.branch);
136 let repodir = sprintf "%s/repos/%s-%s" buildtmp package version.branch in
138 (* Branches <= 1.32 are tagged with "1.32.11",
139 * branches >= 1.33 are tagged with "v1.33.11".
142 if version.minor >= 33 then "v" ^ version.version
143 else version.version in
150 echo %s > localconfigure
151 chmod +x localconfigure
156 # Ensure the po-docs are updated. Grrr this is ugly ...
159 make -C po-docs update-po
164 # Ensure redhat hardening flags didn't leak into the tarball.
165 # https://bugzilla.redhat.com/show_bug.cgi?id=1214506
166 if zcat %s | grep -q redhat-hardened; then exit 1; fi
171 (quote (libguestfs_localconfigure `Git))
172 (quote (libguestfs_localenv (supermin version)))
174 version.tarball buildtmp version.tarball
176 (* Goal: test a commit. *)
177 and commit_tested branch commit =
180 let subject = sprintf "goal: %s: FAILED" goalname in
181 mailto ~from ~subject (*~attach:[logfile]*) to_
184 let key = sprintf "libguestfs_commit_tested_%s" commit in
185 target (memory_exists key);
186 onrun (fun () -> memory_set key "1");
188 require (repo_up_to_date branch);
190 let repodir = sprintf "%s/repos/%s-%s" buildtmp package branch in
197 echo %s > localconfigure
198 chmod +x localconfigure
206 (quote (libguestfs_localconfigure `Git))
207 (quote (libguestfs_localenv None))
209 and repo_up_to_date branch =
213 (* Add a periodic job to check for new git commits and test them. *)
214 every libguestfs_query_mins minutes ~name:"new libguestfs commit" (
216 require (repo_up_to_date "master");
217 let commit = git_latest_commit "master" in
218 require (commit_tested "master" commit);
221 (* Periodic job to build new tarballs. *)
222 every libguestfs_query_mins minutes ~name:"new libguestfs version" (
224 require (repo_up_to_date "master");
225 let version = git_latest_version "master" in
226 require (website_updated version)
229 (* Allow these jobs to run from the command line. *)
233 | [commit] -> require (commit_tested "master" commit)
234 | [branch; commit] -> require (commit_tested branch commit)
236 failwith "use './libguestfs_upstream commit [<branch>] <commit>'"
240 | [version] -> require (website_updated (vernames version))
242 failwith "use './libguestfs_upstream release <version>'"