Change-Id: I72c06e169f9ebed59eab44d119b7bd44075c2b12
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/1343
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Divya Thaluru <dthaluru@vmware.com>
... | ... |
@@ -41,18 +41,29 @@ else |
41 | 41 |
PHOTON_PUBLISH_RPMS := publish-rpms |
42 | 42 |
endif |
43 | 43 |
|
44 |
-ifdef PHOTON_ENABLE_RPMCHECK |
|
45 |
-PHOTON_RPMCHECK_OPTION := -u |
|
44 |
+# Tri state RPMCHECK: |
|
45 |
+# 1) RPMCHECK is not specified: just build |
|
46 |
+# 2) RPMCHECK=enable: build and run %check section. do not stop on error. will generate report file. |
|
47 |
+# 3) RPMCHECK=enable_stop_on_error: build and run %check section. stop on first error. |
|
48 |
+# |
|
49 |
+# We use 2 parameters: |
|
50 |
+# -u: enable checking. |
|
51 |
+# -q: quit on error. if -q is not specified it will keep going |
|
52 |
+ |
|
53 |
+ifeq ($(RPMCHECK),enable) |
|
54 |
+PHOTON_RPMCHECK_FLAGS := -u |
|
55 |
+else ifeq ($(RPMCHECK),enable_stop_on_error) |
|
56 |
+PHOTON_RPMCHECK_FLAGS := -u -q |
|
46 | 57 |
else |
47 |
-PHOTON_RPMCHECK_OPTION := |
|
58 |
+PHOTON_RPMCHECK_FLAGS := |
|
48 | 59 |
endif |
49 | 60 |
|
50 | 61 |
TOOLS_BIN := $(SRCROOT)/tools/bin |
51 | 62 |
CONTAIN := $(TOOLS_BIN)/contain |
52 | 63 |
|
53 | 64 |
.PHONY : all iso clean photon-build-machine photon-vagrant-build photon-vagrant-local cloud-image \ |
54 |
-check check-docker check-bison check-g++ check-gawk check-createrepo check-vagrant check-packer check-packer-ovf-plugin check-sanity \ |
|
55 |
-clean-install clean-chroot build-updated-packages |
|
65 |
+check-tools check-docker check-bison check-g++ check-gawk check-createrepo check-vagrant check-packer check-packer-ovf-plugin check-sanity \ |
|
66 |
+clean-install clean-chroot build-updated-packages check |
|
56 | 67 |
|
57 | 68 |
THREADS?=1 |
58 | 69 |
|
... | ... |
@@ -61,7 +72,7 @@ all: iso minimal-iso docker-image ostree-host-iso live-iso cloud-image-all src-i |
61 | 61 |
micro: micro-iso |
62 | 62 |
@: |
63 | 63 |
|
64 |
-micro-iso: check $(PHOTON_STAGE) $(PHOTON_PACKAGES_MICRO) |
|
64 |
+micro-iso: check-tools $(PHOTON_STAGE) $(PHOTON_PACKAGES_MICRO) |
|
65 | 65 |
@echo "Building Photon Micro ISO..." |
66 | 66 |
@cd $(PHOTON_INSTALLER_DIR) && \ |
67 | 67 |
$(PHOTON_INSTALLER) \ |
... | ... |
@@ -75,7 +86,7 @@ micro-iso: check $(PHOTON_STAGE) $(PHOTON_PACKAGES_MICRO) |
75 | 75 |
-f > \ |
76 | 76 |
$(PHOTON_LOGS_DIR)/installer.log 2>&1 |
77 | 77 |
|
78 |
-packages-micro: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) generate-dep-lists |
|
78 |
+packages-micro: check-tools $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) generate-dep-lists |
|
79 | 79 |
@echo "Building all Micro RPMS..." |
80 | 80 |
@cd $(PHOTON_PKG_BUILDER_DIR) && \ |
81 | 81 |
$(PHOTON_PACKAGE_BUILDER) -o full \ |
... | ... |
@@ -90,13 +101,13 @@ packages-micro: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) g |
90 | 90 |
-d $(PHOTON_DIST_TAG) \ |
91 | 91 |
-n $(PHOTON_BUILD_NUMBER) \ |
92 | 92 |
-v $(PHOTON_RELEASE_VERSION) \ |
93 |
- $(PHOTON_RPMCHECK_OPTION) \ |
|
93 |
+ $(PHOTON_RPMCHECK_FLAGS) \ |
|
94 | 94 |
-t ${THREADS} |
95 | 95 |
|
96 | 96 |
minimal: minimal-iso |
97 | 97 |
@: |
98 | 98 |
|
99 |
-minimal-iso: check $(PHOTON_STAGE) $(PHOTON_PACKAGES_MINIMAL) |
|
99 |
+minimal-iso: check-tools $(PHOTON_STAGE) $(PHOTON_PACKAGES_MINIMAL) |
|
100 | 100 |
@echo "Building Photon Minimal ISO..." |
101 | 101 |
@cd $(PHOTON_INSTALLER_DIR) && \ |
102 | 102 |
$(PHOTON_INSTALLER) \ |
... | ... |
@@ -110,7 +121,7 @@ minimal-iso: check $(PHOTON_STAGE) $(PHOTON_PACKAGES_MINIMAL) |
110 | 110 |
-f > \ |
111 | 111 |
$(PHOTON_LOGS_DIR)/installer.log 2>&1 |
112 | 112 |
|
113 |
-ostree-host-iso: check $(PHOTON_STAGE) ostree-repo |
|
113 |
+ostree-host-iso: check-tools $(PHOTON_STAGE) ostree-repo |
|
114 | 114 |
@echo "Building Photon OSTree Host ISO..." |
115 | 115 |
@cd $(PHOTON_INSTALLER_DIR) && \ |
116 | 116 |
$(PHOTON_INSTALLER) \ |
... | ... |
@@ -124,7 +135,7 @@ ostree-host-iso: check $(PHOTON_STAGE) ostree-repo |
124 | 124 |
-f > \ |
125 | 125 |
$(PHOTON_LOGS_DIR)/installer.log 2>&1 |
126 | 126 |
|
127 |
-live-iso: check $(PHOTON_STAGE) $(PHOTON_PACKAGES_MINIMAL) minimal-iso |
|
127 |
+live-iso: check-tools $(PHOTON_STAGE) $(PHOTON_PACKAGES_MINIMAL) minimal-iso |
|
128 | 128 |
@echo "Building Photon Minimal LIVE ISO..." |
129 | 129 |
@cd $(PHOTON_INSTALLER_DIR) && \ |
130 | 130 |
$(PHOTON_INSTALLER) \ |
... | ... |
@@ -138,7 +149,7 @@ live-iso: check $(PHOTON_STAGE) $(PHOTON_PACKAGES_MINIMAL) minimal-iso |
138 | 138 |
-f > \ |
139 | 139 |
$(PHOTON_LOGS_DIR)/installer.log 2>&1 |
140 | 140 |
|
141 |
-packages-minimal: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) generate-dep-lists |
|
141 |
+packages-minimal: check-tools $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) generate-dep-lists |
|
142 | 142 |
@echo "Building all RPMS..." |
143 | 143 |
@cd $(PHOTON_PKG_BUILDER_DIR) && \ |
144 | 144 |
$(PHOTON_PACKAGE_BUILDER) -o full \ |
... | ... |
@@ -153,10 +164,10 @@ packages-minimal: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) |
153 | 153 |
-d $(PHOTON_DIST_TAG) \ |
154 | 154 |
-n $(PHOTON_BUILD_NUMBER) \ |
155 | 155 |
-v $(PHOTON_RELEASE_VERSION) \ |
156 |
- $(PHOTON_RPMCHECK_OPTION) \ |
|
156 |
+ $(PHOTON_RPMCHECK_FLAGS) \ |
|
157 | 157 |
-t ${THREADS} |
158 | 158 |
|
159 |
-iso: check $(PHOTON_STAGE) $(PHOTON_PACKAGES) ostree-repo |
|
159 |
+iso: check-tools $(PHOTON_STAGE) $(PHOTON_PACKAGES) ostree-repo |
|
160 | 160 |
@echo "Building Photon Full ISO..." |
161 | 161 |
@cd $(PHOTON_INSTALLER_DIR) && \ |
162 | 162 |
sudo $(PHOTON_INSTALLER) \ |
... | ... |
@@ -171,7 +182,7 @@ iso: check $(PHOTON_STAGE) $(PHOTON_PACKAGES) ostree-repo |
171 | 171 |
-f > \ |
172 | 172 |
$(PHOTON_LOGS_DIR)/installer.log 2>&1 |
173 | 173 |
|
174 |
-custom-iso: check $(PHOTON_STAGE) $(PHOTON_PACKAGES) |
|
174 |
+custom-iso: check-tools $(PHOTON_STAGE) $(PHOTON_PACKAGES) |
|
175 | 175 |
@echo "Building Photon custom ISO..." |
176 | 176 |
@cd $(PHOTON_INSTALLER_DIR) && \ |
177 | 177 |
sudo $(PHOTON_INSTALLER) \ |
... | ... |
@@ -186,7 +197,7 @@ custom-iso: check $(PHOTON_STAGE) $(PHOTON_PACKAGES) |
186 | 186 |
-f > \ |
187 | 187 |
$(PHOTON_LOGS_DIR)/installer.log 2>&1 |
188 | 188 |
|
189 |
-src-iso: check $(PHOTON_STAGE) $(PHOTON_PACKAGES) |
|
189 |
+src-iso: check-tools $(PHOTON_STAGE) $(PHOTON_PACKAGES) |
|
190 | 190 |
@echo "Building Photon Full Source ISO..." |
191 | 191 |
@cd $(PHOTON_INSTALLER_DIR) && \ |
192 | 192 |
sudo $(PHOTON_INSTALLER) \ |
... | ... |
@@ -215,7 +226,7 @@ who-needs: |
215 | 215 |
@cd $(PHOTON_SPECDEPS_DIR) && \ |
216 | 216 |
$(PHOTON_SPECDEPS) -s $(PHOTON_SPECS_DIR) -i who-needs -p $(pkg) |
217 | 217 |
|
218 |
-packages: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) generate-dep-lists |
|
218 |
+packages: check-tools $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) generate-dep-lists |
|
219 | 219 |
@echo "Building all RPMS..." |
220 | 220 |
@cd $(PHOTON_PKG_BUILDER_DIR) && \ |
221 | 221 |
$(PHOTON_PACKAGE_BUILDER) -o full \ |
... | ... |
@@ -233,10 +244,10 @@ packages: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTA |
233 | 233 |
-v $(PHOTON_RELEASE_VERSION) \ |
234 | 234 |
-w $(PHOTON_DATA_DIR)/pkg_info.json \ |
235 | 235 |
-g $(PHOTON_DATA_DIR)/pkg_build_options.json \ |
236 |
- $(PHOTON_RPMCHECK_OPTION) \ |
|
236 |
+ $(PHOTON_RPMCHECK_FLAGS) \ |
|
237 | 237 |
-t ${THREADS} |
238 | 238 |
|
239 |
-updated-packages: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) generate-dep-lists |
|
239 |
+updated-packages: check-tools $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) generate-dep-lists |
|
240 | 240 |
@echo "Building only updated RPMS..." |
241 | 241 |
@cd $(PHOTON_PKG_BUILDER_DIR) && \ |
242 | 242 |
$(PHOTON_PACKAGE_BUILDER) -o full \ |
... | ... |
@@ -252,10 +263,10 @@ updated-packages: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) |
252 | 252 |
-n $(PHOTON_BUILD_NUMBER) \ |
253 | 253 |
-v $(PHOTON_RELEASE_VERSION) \ |
254 | 254 |
-k $(PHOTON_INPUT_RPMS_DIR) \ |
255 |
- $(PHOTON_RPMCHECK_OPTION) \ |
|
255 |
+ $(PHOTON_RPMCHECK_FLAGS) \ |
|
256 | 256 |
-t ${THREADS} |
257 | 257 |
|
258 |
-tool-chain-stage1: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) generate-dep-lists |
|
258 |
+tool-chain-stage1: check-tools $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) generate-dep-lists |
|
259 | 259 |
@echo "Building all RPMS..." |
260 | 260 |
@cd $(PHOTON_PKG_BUILDER_DIR) && \ |
261 | 261 |
$(PHOTON_PACKAGE_BUILDER) -o full \ |
... | ... |
@@ -272,10 +283,10 @@ tool-chain-stage1: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES |
272 | 272 |
-d $(PHOTON_DIST_TAG) \ |
273 | 273 |
-n $(PHOTON_BUILD_NUMBER) \ |
274 | 274 |
-v $(PHOTON_RELEASE_VERSION) \ |
275 |
- $(PHOTON_RPMCHECK_OPTION) \ |
|
275 |
+ $(PHOTON_RPMCHECK_FLAGS) \ |
|
276 | 276 |
-m stage1 |
277 | 277 |
|
278 |
-tool-chain-stage2: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) generate-dep-lists |
|
278 |
+tool-chain-stage2: check-tools $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) generate-dep-lists |
|
279 | 279 |
@echo "Building all RPMS..." |
280 | 280 |
@cd $(PHOTON_PKG_BUILDER_DIR) && \ |
281 | 281 |
$(PHOTON_PACKAGE_BUILDER) -o full \ |
... | ... |
@@ -292,7 +303,7 @@ tool-chain-stage2: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES |
292 | 292 |
-d $(PHOTON_DIST_TAG) \ |
293 | 293 |
-n $(PHOTON_BUILD_NUMBER) \ |
294 | 294 |
-v $(PHOTON_RELEASE_VERSION) \ |
295 |
- $(PHOTON_RPMCHECK_OPTION) \ |
|
295 |
+ $(PHOTON_RPMCHECK_FLAGS) \ |
|
296 | 296 |
-m stage2 |
297 | 297 |
|
298 | 298 |
|
... | ... |
@@ -453,7 +464,7 @@ cloud-image-all: $(PHOTON_STAGE) iso |
453 | 453 |
$(PHOTON_CLOUD_IMAGE_BUILDER) $(PHOTON_CLOUD_IMAGE_BUILDER_DIR) ova $(SRCROOT) $(PHOTON_GENERATED_DATA_DIR) $(PHOTON_STAGE)/photon-$(PHOTON_RELEASE_VERSION)-$(PHOTON_BUILD_NUMBER).iso $(ADDITIONAL_RPMS_PATH) |
454 | 454 |
|
455 | 455 |
|
456 |
-check: check-bison check-g++ check-gawk check-createrepo check-texinfo check-sanity check-docker |
|
456 |
+check-tools: check-bison check-g++ check-gawk check-createrepo check-texinfo check-sanity check-docker |
|
457 | 457 |
|
458 | 458 |
check-docker: |
459 | 459 |
@command -v docker >/dev/null 2>&1 || { echo "Package docker not installed. Aborting." >&2; exit 1; } |
... | ... |
@@ -491,7 +502,32 @@ endif |
491 | 491 |
check-packer-ovf-plugin: |
492 | 492 |
@[[ -e ~/.packer.d/plugins/packer-post-processor-vagrant-vmware-ovf ]] || { echo "Packer OVF post processor not installed. Aborting" >&2; exit 1; } |
493 | 493 |
|
494 |
-%: check $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) |
|
494 |
+check: packages |
|
495 |
+ ifeq ($(RPMCHECK),enable_stop_on_error) |
|
496 |
+ $(eval rpmcheck_stop_on_error = -q) |
|
497 |
+ endif |
|
498 |
+ @echo "Testing all RPMS ..." |
|
499 |
+ @cd $(PHOTON_PKG_BUILDER_DIR) && \ |
|
500 |
+ $(PHOTON_PACKAGE_BUILDER) -o full \ |
|
501 |
+ -s $(PHOTON_SPECS_DIR) \ |
|
502 |
+ -r $(PHOTON_RPMS_DIR) \ |
|
503 |
+ -a $(PHOTON_SRPMS_DIR) \ |
|
504 |
+ -x $(PHOTON_SRCS_DIR) \ |
|
505 |
+ -b $(PHOTON_CHROOT_PATH) \ |
|
506 |
+ -l $(PHOTON_LOGS_DIR) \ |
|
507 |
+ -p $(PHOTON_PUBLISH_RPMS_DIR) \ |
|
508 |
+ -j $(PHOTON_GENERATED_DATA_DIR)/$(FULL_PACKAGE_LIST_FILE) \ |
|
509 |
+ -c $(PHOTON_BINTRAY_CONFIG) \ |
|
510 |
+ -d $(PHOTON_DIST_TAG) \ |
|
511 |
+ -n $(PHOTON_BUILD_NUMBER) \ |
|
512 |
+ -v $(PHOTON_RELEASE_VERSION) \ |
|
513 |
+ -w $(PHOTON_DATA_DIR)/pkg_info.json \ |
|
514 |
+ -g $(PHOTON_DATA_DIR)/pkg_build_options.json \ |
|
515 |
+ -u \ |
|
516 |
+ $(rpmcheck_stop_on_error) \ |
|
517 |
+ -t ${THREADS} |
|
518 |
+ |
|
519 |
+%: check-tools $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) |
|
495 | 520 |
$(eval PKG_NAME = $@) |
496 | 521 |
@echo "Building package $(PKG_NAME) ..." |
497 | 522 |
@cd $(PHOTON_PKG_BUILDER_DIR) && \ |
... | ... |
@@ -507,7 +543,7 @@ check-packer-ovf-plugin: |
507 | 507 |
-n $(PHOTON_BUILD_NUMBER) \ |
508 | 508 |
-v $(PHOTON_RELEASE_VERSION) \ |
509 | 509 |
-g $(PHOTON_DATA_DIR)/pkg_build_options.json \ |
510 |
- $(PHOTON_RPMCHECK_OPTION) \ |
|
510 |
+ $(PHOTON_RPMCHECK_FLAGS) \ |
|
511 | 511 |
-l $(PHOTON_LOGS_DIR) |
512 | 512 |
|
513 | 513 |
$(TOOLS_BIN): |
... | ... |
@@ -32,9 +32,6 @@ class PackageBuilder(object): |
32 | 32 |
if not returnVal: |
33 | 33 |
raise Exception("Unable to prepare build root") |
34 | 34 |
tUtils=ToolChainUtils(self.logName,self.logPath) |
35 |
-# if isToolChainPackage: |
|
36 |
-# tUtils.installCoreToolChainPackages(chrootID) |
|
37 |
-# else: |
|
38 | 35 |
tUtils.installToolChain(chrootID) |
39 | 36 |
except Exception as e: |
40 | 37 |
if chrootID is not None: |
... | ... |
@@ -87,9 +84,15 @@ class PackageBuilder(object): |
87 | 87 |
|
88 | 88 |
def buildPackage(self,package): |
89 | 89 |
#do not build if RPM is already built |
90 |
+ #test only if the package is in the testForceRPMS with rpmCheck |
|
91 |
+ #build only if the package is not in the testForceRPMS with rpmCheck |
|
90 | 92 |
if self.checkIfPackageIsAlreadyBuilt(package): |
91 |
- self.logger.info("Skipping building the package:"+package) |
|
92 |
- return |
|
93 |
+ if not constants.rpmCheck: |
|
94 |
+ self.logger.info("Skipping building the package:"+package) |
|
95 |
+ return |
|
96 |
+ elif constants.rpmCheck and package not in constants.testForceRPMS: |
|
97 |
+ self.logger.info("Skipping testing the package:"+package) |
|
98 |
+ return |
|
93 | 99 |
|
94 | 100 |
#should initialize a logger based on package name |
95 | 101 |
chrUtils = ChrootUtils(self.logName,self.logPath) |
... | ... |
@@ -104,12 +107,13 @@ class PackageBuilder(object): |
104 | 104 |
if not os.path.isdir(destLogPath): |
105 | 105 |
cmdUtils = CommandUtils() |
106 | 106 |
cmdUtils.runCommandInShell("mkdir -p "+destLogPath) |
107 |
- |
|
107 |
+ |
|
108 | 108 |
listInstalledPackages=self.findInstalledPackages(chrootID) |
109 |
- self.logger.info("List of installed packages") |
|
110 |
- self.logger.info(listInstalledPackages) |
|
111 | 109 |
listDependentPackages=self.findBuildTimeRequiredPackages(package) |
112 |
- |
|
110 |
+ if constants.rpmCheck and package in constants.testForceRPMS: |
|
111 |
+ testPackages=set(constants.listMakeCheckRPMPkgtoInstall)-set(listInstalledPackages)-set([package]) |
|
112 |
+ listDependentPackages.extend(testPackages) |
|
113 |
+ |
|
113 | 114 |
pkgUtils = PackageUtils(self.logName,self.logPath) |
114 | 115 |
if len(listDependentPackages) != 0: |
115 | 116 |
self.logger.info("Installing the build time dependent packages......") |
... | ... |
@@ -117,6 +121,7 @@ class PackageBuilder(object): |
117 | 117 |
self.installPackage(pkgUtils, pkg,chrootID,destLogPath,listInstalledPackages) |
118 | 118 |
pkgUtils.installRPMSInAOneShot(chrootID,destLogPath) |
119 | 119 |
self.logger.info("Finished installing the build time dependent packages......") |
120 |
+ |
|
120 | 121 |
pkgUtils.adjustGCCSpecs(package, chrootID, destLogPath) |
121 | 122 |
pkgUtils.buildRPMSForGivenPackage(package,chrootID,self.listBuildOptionPackages,self.pkgBuildOptionFile,destLogPath) |
122 | 123 |
self.logger.info("Successfully built the package:"+package) |
... | ... |
@@ -162,3 +167,4 @@ class PackageBuilder(object): |
162 | 162 |
if pkg in listInstalledPackages: |
163 | 163 |
continue |
164 | 164 |
self.installPackage(pkgUtils,pkg,chrootID,destLogPath,listInstalledPackages) |
165 |
+ |
... | ... |
@@ -86,16 +86,16 @@ class PackageManager(object): |
86 | 86 |
needToRebuild = True |
87 | 87 |
if needToRebuild: |
88 | 88 |
self.listOfPackagesAlreadyBuilt.remove(pkg) |
89 |
- |
|
89 |
+ |
|
90 | 90 |
listPackagesToBuild=listPackages[:] |
91 | 91 |
for pkg in listPackages: |
92 |
- if pkg in self.listOfPackagesAlreadyBuilt: |
|
92 |
+ if pkg in self.listOfPackagesAlreadyBuilt and not constants.rpmCheck: |
|
93 | 93 |
listPackagesToBuild.remove(pkg) |
94 |
- |
|
94 |
+ |
|
95 | 95 |
if not self.readPackageBuildData(listPackagesToBuild): |
96 | 96 |
return False |
97 | 97 |
return True |
98 |
- |
|
98 |
+ |
|
99 | 99 |
def buildToolChain(self): |
100 | 100 |
try: |
101 | 101 |
tUtils=ToolChainUtils() |
... | ... |
@@ -104,17 +104,28 @@ class PackageManager(object): |
104 | 104 |
self.logger.error("Unable to build tool chain") |
105 | 105 |
self.logger.error(e) |
106 | 106 |
raise e |
107 |
- |
|
107 |
+ |
|
108 | 108 |
def buildToolChainPackages(self, listBuildOptionPackages, pkgBuildOptionFile, buildThreads): |
109 | 109 |
self.buildToolChain() |
110 | 110 |
self.buildGivenPackages(constants.listToolChainPackages, buildThreads) |
111 |
- |
|
111 |
+ |
|
112 |
+ def buildTestPackages(self, listBuildOptionPackages, pkgBuildOptionFile, buildThreads): |
|
113 |
+ self.buildToolChain() |
|
114 |
+ self.buildGivenPackages(constants.listMakeCheckRPMPkgtoInstall, buildThreads) |
|
115 |
+ |
|
112 | 116 |
def buildPackages(self,listPackages, listBuildOptionPackages, pkgBuildOptionFile, buildThreads): |
113 | 117 |
self.listBuildOptionPackages = listBuildOptionPackages |
114 | 118 |
self.pkgBuildOptionFile = pkgBuildOptionFile |
115 |
- self.buildToolChainPackages(listBuildOptionPackages, pkgBuildOptionFile, buildThreads) |
|
116 |
- self.buildGivenPackages(listPackages, buildThreads) |
|
117 |
- |
|
119 |
+ if constants.rpmCheck: |
|
120 |
+ constants.rpmCheck=False |
|
121 |
+ self.buildToolChainPackages(listBuildOptionPackages, pkgBuildOptionFile, buildThreads) |
|
122 |
+ self.buildTestPackages(listBuildOptionPackages, pkgBuildOptionFile, buildThreads) |
|
123 |
+ constants.rpmCheck=True |
|
124 |
+ self.buildGivenPackages(listPackages, buildThreads) |
|
125 |
+ else: |
|
126 |
+ self.buildToolChainPackages(listBuildOptionPackages, pkgBuildOptionFile, buildThreads) |
|
127 |
+ self.buildGivenPackages(listPackages, buildThreads) |
|
128 |
+ |
|
118 | 129 |
def initializeThreadPool(self,statusEvent): |
119 | 130 |
ThreadPool.clear() |
120 | 131 |
ThreadPool.mapPackageToCycle=self.mapPackageToCycle |
... | ... |
@@ -123,46 +134,49 @@ class PackageManager(object): |
123 | 123 |
ThreadPool.pkgBuildOptionFile=self.pkgBuildOptionFile |
124 | 124 |
ThreadPool.logger=self.logger |
125 | 125 |
ThreadPool.statusEvent=statusEvent |
126 |
- |
|
126 |
+ |
|
127 | 127 |
def initializeScheduler(self,statusEvent): |
128 | 128 |
Scheduler.setLog(self.logName, self.logPath) |
129 | 129 |
Scheduler.setParams(self.sortedPackageList, self.listOfPackagesAlreadyBuilt) |
130 | 130 |
Scheduler.setEvent(statusEvent) |
131 | 131 |
Scheduler.stopScheduling=False |
132 |
- |
|
132 |
+ |
|
133 | 133 |
def buildGivenPackages (self, listPackages, buildThreads): |
134 |
+ if constants.rpmCheck: |
|
135 |
+ alreadyBuiltRPMS=self.readAlreadyAvailablePackages() |
|
136 |
+ listPackages=list(set(listPackages)|(set(constants.listMakeCheckRPMPkgtoInstall)-set(alreadyBuiltRPMS))) |
|
137 |
+ |
|
134 | 138 |
returnVal=self.calculateParams(listPackages) |
135 | 139 |
if not returnVal: |
136 | 140 |
self.logger.error("Unable to set paramaters. Terminating the package manager.") |
137 | 141 |
raise Exception("Unable to set paramaters") |
138 |
- |
|
142 |
+ |
|
139 | 143 |
statusEvent=threading.Event() |
140 | 144 |
self.initializeScheduler(statusEvent) |
141 | 145 |
self.initializeThreadPool(statusEvent) |
142 |
- |
|
146 |
+ |
|
143 | 147 |
i=0 |
144 | 148 |
while i < buildThreads: |
145 | 149 |
workerName="WorkerThread"+str(i) |
146 | 150 |
ThreadPool.addWorkerThread(workerName) |
147 | 151 |
ThreadPool.startWorkerThread(workerName) |
148 | 152 |
i = i + 1 |
149 |
- |
|
153 |
+ |
|
150 | 154 |
statusEvent.wait() |
151 | 155 |
Scheduler.stopScheduling=True |
152 | 156 |
self.logger.info("Waiting for all remaining worker threads") |
153 | 157 |
listWorkerObjs=ThreadPool.getAllWorkerObjects() |
154 | 158 |
for w in listWorkerObjs: |
155 | 159 |
w.join() |
156 |
- |
|
160 |
+ |
|
157 | 161 |
setFailFlag=False |
158 | 162 |
allPackagesBuilt=False |
159 |
- |
|
160 | 163 |
if Scheduler.isAnyPackagesFailedToBuild(): |
161 | 164 |
setFailFlag=True |
162 |
- |
|
165 |
+ |
|
163 | 166 |
if Scheduler.isAllPackagesBuilt(): |
164 | 167 |
allPackagesBuilt=True |
165 |
- |
|
168 |
+ |
|
166 | 169 |
if setFailFlag: |
167 | 170 |
self.logger.error("Some of the packages failed:") |
168 | 171 |
self.logger.error(Scheduler.listOfFailedPackages) |
... | ... |
@@ -174,6 +188,6 @@ class PackageManager(object): |
174 | 174 |
else: |
175 | 175 |
self.logger.error("Build stopped unexpectedly.Unknown error.") |
176 | 176 |
raise Exception("Unknown error") |
177 |
- |
|
177 |
+ |
|
178 | 178 |
self.logger.info("Terminated") |
179 | 179 |
|
... | ... |
@@ -28,6 +28,7 @@ class PackageUtils(object): |
28 | 28 |
self.rpmbuildBinary = "rpmbuild" |
29 | 29 |
self.rpmbuildBuildallOption = "-ba --clean" |
30 | 30 |
self.rpmbuildNocheckOption = "--nocheck" |
31 |
+ self.rpmbuildCheckOption ="-bi --clean" |
|
31 | 32 |
self.rpmbuildDistOption = '--define \\\"dist %s\\\"' % constants.dist |
32 | 33 |
self.queryRpmPackageOptions = "-qa" |
33 | 34 |
self.forceRpmPackageOptions = "--force" |
... | ... |
@@ -68,7 +69,7 @@ class PackageUtils(object): |
68 | 68 |
rpmfile=self.findRPMFileForGivenPackage(package) |
69 | 69 |
if rpmfile is None: |
70 | 70 |
self.logger.error("No rpm file found for package:"+package) |
71 |
- raise Exception("Missing rpm file") |
|
71 |
+ raise Exception("Missing rpm file: "+package) |
|
72 | 72 |
|
73 | 73 |
rpmDestFile = self.copyRPM(rpmfile, chrootID+constants.topDirPath+"/RPMS") |
74 | 74 |
rpmFile=rpmDestFile.replace(chrootID,"") |
... | ... |
@@ -197,10 +198,16 @@ class PackageUtils(object): |
197 | 197 |
raise e |
198 | 198 |
finally: |
199 | 199 |
if destLogPath is not None: |
200 |
- shutil.copy2(chrootLogsFilePath, destLogPath) |
|
200 |
+ if constants.rpmCheck and package in constants.testForceRPMS and constants.specData.isCheckAvailable(package): |
|
201 |
+ cmd="sed -i '/^Executing(%check):/,/^Processing files:/{//!b};d' "+ chrootLogsFilePath |
|
202 |
+ logFile = destLogPath+"/adjustTestFile.log" |
|
203 |
+ returnVal = CommandUtils().runCommandInShell(cmd, logFile) |
|
204 |
+ testLogFile = destLogPath+"/"+package+"-test.log" |
|
205 |
+ shutil.copyfile(chrootLogsFilePath, testLogFile) |
|
206 |
+ else: |
|
207 |
+ shutil.copy2(chrootLogsFilePath, destLogPath) |
|
201 | 208 |
self.logger.info("RPM build is successful") |
202 |
- arch = self.getRPMArch(listRPMFiles[0]) |
|
203 |
- |
|
209 |
+ |
|
204 | 210 |
for rpmFile in listRPMFiles: |
205 | 211 |
self.copyRPM(chrootID+"/"+rpmFile, constants.rpmPath) |
206 | 212 |
|
... | ... |
@@ -208,14 +215,26 @@ class PackageUtils(object): |
208 | 208 |
self.copyRPM(chrootID+"/"+srpmFile, constants.sourceRpmPath) |
209 | 209 |
srpmName = os.path.basename(srpmFile) |
210 | 210 |
package,version,release = self.findPackageInfoFromSourceRPMFile(srpmFile) |
211 |
+ arch = self.getRPMArch(listRPMFiles[0]) |
|
211 | 212 |
SourcePackageInfo.addSRPMData(package,version,release,arch,srpmName) |
212 | 213 |
|
213 | 214 |
|
214 | 215 |
def buildRPM(self,specFile,logFile,chrootCmd,package,macros): |
215 | 216 |
|
216 |
- rpmBuildcmd= self.rpmbuildBinary+" "+self.rpmbuildBuildallOption+" "+self.rpmbuildDistOption |
|
217 |
- if not constants.rpmCheck: |
|
218 |
- rpmBuildcmd+=" "+self.rpmbuildNocheckOption |
|
217 |
+ rpmBuildcmd=self.rpmbuildBinary+" "+self.rpmbuildBuildallOption+" "+self.rpmbuildDistOption |
|
218 |
+ |
|
219 |
+ if constants.rpmCheck and package in constants.testForceRPMS: |
|
220 |
+ self.logger.info("#"*(68+2*len(package))) |
|
221 |
+ if not constants.specData.isCheckAvailable(package): |
|
222 |
+ self.logger.info("####### "+package+" MakeCheck is not available. Skipping MakeCheck TEST for "+package+ " #######") |
|
223 |
+ rpmBuildcmd=self.rpmbuildBinary+" --clean" |
|
224 |
+ else: |
|
225 |
+ self.logger.info("####### "+package+" MakeCheck is available. Running MakeCheck TEST for "+package+ " #######") |
|
226 |
+ rpmBuildcmd=self.rpmbuildBinary+" "+self.rpmbuildCheckOption |
|
227 |
+ self.logger.info("#"*(68+2*len(package))) |
|
228 |
+ else: |
|
229 |
+ rpmBuildcmd+=" "+self.rpmbuildNocheckOption |
|
230 |
+ |
|
219 | 231 |
for macro in macros: |
220 | 232 |
rpmBuildcmd+=' --define \\\"%s\\\"' % macro |
221 | 233 |
rpmBuildcmd+=" "+specFile |
... | ... |
@@ -224,10 +243,23 @@ class PackageUtils(object): |
224 | 224 |
self.logger.info("Building rpm....") |
225 | 225 |
self.logger.info(rpmBuildcmd) |
226 | 226 |
returnVal = cmdUtils.runCommandInShell(rpmBuildcmd, logFile, chrootCmd) |
227 |
- if not returnVal: |
|
228 |
- self.logger.error("Building rpm is failed "+specFile) |
|
229 |
- raise Exception("RPM Build failed") |
|
230 |
- |
|
227 |
+ if constants.rpmCheck and package in constants.testForceRPMS: |
|
228 |
+ if not constants.specData.isCheckAvailable(package): |
|
229 |
+ constants.testLogger.info(package+" : N/A") |
|
230 |
+ elif returnVal: |
|
231 |
+ constants.testLogger.info(package+" : PASS") |
|
232 |
+ else: |
|
233 |
+ constants.testLogger.error(package+" : FAIL" ) |
|
234 |
+ |
|
235 |
+ if constants.rpmCheck: |
|
236 |
+ if not returnVal and constants.rpmCheckStopOnError: |
|
237 |
+ self.logger.error("Checking rpm is failed "+specFile) |
|
238 |
+ raise Exception("RPM check failed") |
|
239 |
+ else: |
|
240 |
+ if not returnVal: |
|
241 |
+ self.logger.error("Building rpm is failed "+specFile) |
|
242 |
+ raise Exception("RPM build failed") |
|
243 |
+ |
|
231 | 244 |
#Extracting rpms created from log file |
232 | 245 |
logfile=open(logFile,'r') |
233 | 246 |
fileContents=logfile.readlines() |
... | ... |
@@ -29,7 +29,7 @@ class Scheduler(object): |
29 | 29 |
Scheduler.sortedList=sortedList |
30 | 30 |
Scheduler.listOfAlreadyBuiltPackages=listOfAlreadyBuiltPackages |
31 | 31 |
for x in Scheduler.sortedList: |
32 |
- if x not in Scheduler.listOfAlreadyBuiltPackages: |
|
32 |
+ if x not in Scheduler.listOfAlreadyBuiltPackages or x in constants.testForceRPMS: |
|
33 | 33 |
Scheduler.listOfPackagesToBuild.append(x) |
34 | 34 |
Scheduler.listOfPackagesCurrentlyBuilding=[] |
35 | 35 |
Scheduler.listOfPackagesNextToBuild=[] |
... | ... |
@@ -42,6 +42,7 @@ class Scheduler(object): |
42 | 42 |
listRequiredRPMPackages.extend(constants.specData.getRequiresAllForPackage(package)) |
43 | 43 |
|
44 | 44 |
listRequiredPackages=[] |
45 |
+ |
|
45 | 46 |
for pkg in listRequiredRPMPackages: |
46 | 47 |
basePkg=constants.specData.getSpecName(pkg) |
47 | 48 |
if basePkg not in listRequiredPackages: |
... | ... |
@@ -46,6 +46,7 @@ class SerializableSpecObjectsUtils(object): |
46 | 46 |
specObj.checksums=spec.getChecksums() |
47 | 47 |
specObj.listPatches=spec.getPatchNames() |
48 | 48 |
specObj.securityHardening=spec.getSecurityHardeningOption() |
49 |
+ specObj.isCheckAvailable=spec.isCheckAvailable() |
|
49 | 50 |
for specPkg in specObj.listPackages: |
50 | 51 |
if specPkg in self.mapPackageToSpec: |
51 | 52 |
existingObj = self.mapSerializableSpecObjects[self.mapPackageToSpec[specPkg]] |
... | ... |
@@ -163,18 +164,22 @@ class SerializableSpecObjectsUtils(object): |
163 | 163 |
return specName |
164 | 164 |
self.logger.error("Could not able to find "+package+" package from specs") |
165 | 165 |
raise Exception("Invalid package:"+package) |
166 |
- |
|
166 |
+ |
|
167 | 167 |
def isRPMPackage(self,package): |
168 | 168 |
if self.mapPackageToSpec.has_key(package): |
169 | 169 |
specName=self.mapPackageToSpec[package] |
170 | 170 |
if self.mapSerializableSpecObjects.has_key(specName): |
171 | 171 |
return True |
172 | 172 |
return False |
173 |
- |
|
173 |
+ |
|
174 | 174 |
def getSecurityHardeningOption(self, package): |
175 | 175 |
specName=self.getSpecName(package) |
176 | 176 |
return self.mapSerializableSpecObjects[specName].securityHardening |
177 | 177 |
|
178 |
+ def isCheckAvailable(self, package): |
|
179 |
+ specName=self.getSpecName(package) |
|
180 |
+ return self.mapSerializableSpecObjects[specName].isCheckAvailable |
|
181 |
+ |
|
178 | 182 |
def printAllObjects(self): |
179 | 183 |
listSpecs=self.mapSerializableSpecObjects.keys() |
180 | 184 |
for spec in listSpecs: |
... | ... |
@@ -210,6 +210,12 @@ class Specutils(object): |
210 | 210 |
def getSecurityHardeningOption(self): |
211 | 211 |
return self.spec.globalSecurityHardening |
212 | 212 |
|
213 |
+ def isCheckAvailable(self): |
|
214 |
+ check=False |
|
215 |
+ if self.spec.checkMacro is not None: |
|
216 |
+ check=True |
|
217 |
+ return check |
|
218 |
+ |
|
213 | 219 |
def main(): |
214 | 220 |
spec = Specutils("/workspace1/myrepos/photon/SPECS/docker/docker.spec") |
215 | 221 |
print "packages",spec.getPackageNames() |
... | ... |
@@ -38,6 +38,7 @@ def main(): |
38 | 38 |
parser.add_option("-a", "--source-rpm-path", dest="sourceRpmPath", default="../../stage/SRPMS") |
39 | 39 |
parser.add_option("-w", "--pkginfo-file", dest="pkgInfoFile", default="../../common/data/pkg_info.json") |
40 | 40 |
parser.add_option("-g", "--pkg-build-option-file", dest="pkgBuildOptionFile", default="../../common/data/pkg_build_options.json") |
41 |
+ parser.add_option("-q", "--rpmcheck-stop-on-error", dest="rpmCheckStopOnError", default=False, action ="store_true") |
|
41 | 42 |
|
42 | 43 |
(options, args) = parser.parse_args() |
43 | 44 |
cmdUtils=CommandUtils() |
... | ... |
@@ -103,6 +104,7 @@ def main(): |
103 | 103 |
logger.info("Log Path :" + options.logPath) |
104 | 104 |
logger.info("Top Dir Path :" + options.topDirPath) |
105 | 105 |
logger.info("Publish RPMS Path :" + options.publishRPMSPath) |
106 |
+ |
|
106 | 107 |
if not options.installPackage: |
107 | 108 |
logger.info("JSON File :" + options.inputJSONFile) |
108 | 109 |
else: |
... | ... |
@@ -281,6 +283,8 @@ def buildAPackage(package, listBuildOptionPackages, pkgBuildOptionFile, buildThr |
281 | 281 |
listPackages=[] |
282 | 282 |
listPackages.append(package) |
283 | 283 |
pkgManager = PackageManager() |
284 |
+ if constants.rpmCheck: |
|
285 |
+ constants.setTestForceRPMS(listPackages[:]) |
|
284 | 286 |
pkgManager.buildPackages(listPackages, listBuildOptionPackages, pkgBuildOptionFile, buildThreads) |
285 | 287 |
|
286 | 288 |
def buildPackagesFromGivenJSONFile(inputJSONFile, buildOption, listBuildOptionPackages, pkgBuildOptionFile, logger, buildThreads): |
... | ... |
@@ -292,6 +296,8 @@ def buildPackagesFromGivenJSONFile(inputJSONFile, buildOption, listBuildOptionPa |
292 | 292 |
listPackagesToBuild.append(str(p)) |
293 | 293 |
logger.info("List of packages to build:") |
294 | 294 |
logger.info(listPackagesToBuild) |
295 |
+ if constants.rpmCheck: |
|
296 |
+ constants.setTestForceRPMS(listPackagesToBuild[:]) |
|
295 | 297 |
pkgManager = PackageManager() |
296 | 298 |
pkgManager.buildPackages(listPackagesToBuild, listBuildOptionPackages, pkgBuildOptionFile, buildThreads) |
297 | 299 |
|
... | ... |
@@ -1,4 +1,5 @@ |
1 | 1 |
from SpecData import SerializableSpecObjectsUtils |
2 |
+from Logger import Logger |
|
2 | 3 |
|
3 | 4 |
class constants(object): |
4 | 5 |
specPath="" |
... | ... |
@@ -251,6 +252,44 @@ class constants(object): |
251 | 251 |
"man-pages", |
252 | 252 |
"cpio"] |
253 | 253 |
|
254 |
+ listMakeCheckRPMPkgtoInstall=[ |
|
255 |
+ "python2", |
|
256 |
+ "python2-devel", |
|
257 |
+ "python2-libs", |
|
258 |
+ "python2-tools", |
|
259 |
+ "libffi", |
|
260 |
+ "python-setuptools", |
|
261 |
+ "ca-certificates", |
|
262 |
+ "linux", |
|
263 |
+ "createrepo", |
|
264 |
+ "sudo", |
|
265 |
+ "ruby", |
|
266 |
+ "curl", |
|
267 |
+ "pcre-devel", |
|
268 |
+ "boost-devel", |
|
269 |
+ "which", |
|
270 |
+ "go", |
|
271 |
+ "e2fsprogs-devel", |
|
272 |
+ "shadow", |
|
273 |
+ "check", |
|
274 |
+ "libacl-devel", |
|
275 |
+ "device-mapper", |
|
276 |
+ "wget", |
|
277 |
+ "tar", |
|
278 |
+ "pkg-config", |
|
279 |
+ "git", |
|
280 |
+ "openssl", |
|
281 |
+ "net-tools", |
|
282 |
+ "less", |
|
283 |
+ "yum-metadata-parser", |
|
284 |
+ "yum", |
|
285 |
+ "rpm-devel", |
|
286 |
+ "rpm", |
|
287 |
+ "libxml2", |
|
288 |
+ "python-xml", |
|
289 |
+ "libacl", |
|
290 |
+ "tzdata", |
|
291 |
+ "Linux-PAM"] |
|
254 | 292 |
|
255 | 293 |
@staticmethod |
256 | 294 |
def initialize(options): |
... | ... |
@@ -269,9 +308,13 @@ class constants(object): |
269 | 269 |
constants.specData.readSpecsAndConvertToSerializableObjects(constants.specPath) |
270 | 270 |
constants.pullsourcesConfig = options.pullsourcesConfig |
271 | 271 |
constants.inputRPMSPath=options.inputRPMSPath |
272 |
- constants.rpmCheck = options.rpmCheck |
|
273 | 272 |
constants.updateRPMMacros() |
274 |
- |
|
273 |
+ constants.testForceRPMS=[] |
|
274 |
+ constants.rpmCheck = options.rpmCheck |
|
275 |
+ constants.rpmCheckStopOnError = options.rpmCheckStopOnError |
|
276 |
+ if constants.rpmCheck: |
|
277 |
+ constants.testLogger=Logger.getLogger("MakeCheckTest",constants.logPath) |
|
278 |
+ |
|
275 | 279 |
@staticmethod |
276 | 280 |
def updateRPMMacros(): |
277 | 281 |
#adding distribution rpm macro |
... | ... |
@@ -299,4 +342,8 @@ class constants(object): |
299 | 299 |
kernelsubrelease = kernelsubrelease.replace(constants.dist,"") |
300 | 300 |
if kernelsubrelease: |
301 | 301 |
kernelsubrelease = "."+kernelsubrelease |
302 |
- constants.specData.addMacro("kernelsubrelease",kernelsubrelease) |
|
302 |
+ constants.specData.addMacro("kernelsubrelease",kernelsubrelease) |
|
303 |
+ |
|
304 |
+ @staticmethod |
|
305 |
+ def setTestForceRPMS(listsPackages): |
|
306 |
+ constants.testForceRPMS=listsPackages |