ci: Fix cached MacPorts installation management
authorAndres Freund <andres@anarazel.de>
Wed, 27 Nov 2024 16:30:08 +0000 (11:30 -0500)
committerAndres Freund <andres@anarazel.de>
Wed, 27 Nov 2024 16:30:08 +0000 (11:30 -0500)
1.  The error reporting of "port setrequested list-of-packages..."
changed, hiding errors we were relying on to know if all packages in our
list were already installed.  Use a loop instead.

2.  The cached MacPorts installation was shared between PostgreSQL
major branches, though each branch wanted different packages.  Add the
list of packages to cache key, so that different branches, when tested
in one github account/repo such as postgres/postgres, stop fighting with
each other, adding and removing packages.

Back-patch to 15 where CI began.

Author: Thomas Munro <thomas.munro@gmail.com>
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Suggested-by: Andres Freund <andres@anarazel.de>
Discussion: https://postgr.es/m/au2uqfuy2nf43nwy2txmc5t2emhwij7kzupygto3d2ffgtrdgr%40ckvrlwyflnh2

.cirrus.tasks.yml
src/tools/ci/ci_macports_packages.sh

index d8b7f9d32ab7dcd48d0ecaf0c171895c84b44ae4..197270feeaaec2249b1b383903fc58881d6dff0d 100644 (file)
@@ -424,6 +424,20 @@ task:
     CCACHE_DIR: ${HOME}/ccache
     MACPORTS_CACHE: ${HOME}/macports-cache
 
+    MACOS_PACKAGE_LIST: >-
+      ccache
+      icu
+      kerberos5
+      lz4
+      meson
+      openldap
+      openssl
+      p5.34-io-tty
+      p5.34-ipc-run
+      python312
+      tcl
+      zstd
+
     CC: ccache cc
     CXX: ccache c++
     CFLAGS: -Og -ggdb
@@ -457,26 +471,14 @@ task:
   macports_cache:
     folder: ${MACPORTS_CACHE}
     fingerprint_script: |
-      # Include the OS major version in the cache key.  If the OS image changes
-      # to a different major version, we need to reinstall.
+      # Reinstall packages if the OS major version, the list of the packages
+      # to install or the MacPorts install script changes.
       sw_vers -productVersion | sed 's/\..*//'
-      # Also start afresh if we change our MacPorts install script.
+      echo $MACOS_PACKAGE_LIST
       md5 src/tools/ci/ci_macports_packages.sh
     reupload_on_changes: true
   setup_additional_packages_script: |
-    sh src/tools/ci/ci_macports_packages.sh \
-      ccache \
-      icu \
-      kerberos5 \
-      lz4 \
-      meson \
-      openldap \
-      openssl \
-      p5.34-io-tty \
-      p5.34-ipc-run \
-      python312 \
-      tcl \
-      zstd
+    sh src/tools/ci/ci_macports_packages.sh $MACOS_PACKAGE_LIST
     # system python doesn't provide headers
     sudo /opt/local/bin/port select python3 python312
     # Make macports install visible for subsequent steps
index 692fa88c3257711c43730c946b79cbbd3f41c5b3..8aa60f701cf3b87b6dcb00543b19e47d4cfd22b7 100755 (executable)
@@ -59,11 +59,18 @@ if [ -n "$(port -q installed installed)" ] ; then
     sudo port unsetrequested installed
 fi
 
-# if setting all the required packages as requested fails, we need
-# to install at least one of them
-if ! sudo port setrequested $packages > /dev/null 2>&1 ; then
-    echo not all required packages installed, doing so now
+# If setting all the required packages as requested fails, we need
+# to install at least one of them. Need to do so one-by-one as
+# port setrequested only reports failures for the first package.
+echo "checking if all required packages are installed"
+for package in $packages ; do
+  if ! sudo port setrequested $package > /dev/null 2>&1 ; then
     update_cached_image=1
+  fi
+done
+echo "done"
+if [ "$update_cached_image" -eq 1 ]; then
+    echo not all required packages installed, doing so now
     # to keep the image small, we deleted the ports tree from the image...
     sudo port selfupdate
     # XXX likely we'll need some other way to force an upgrade at some