github.com/containers/podman/v5@v5.1.0-rc1/test/buildah-bud/run-buildah-bud-tests (about)

     1  #!/bin/bash
     2  
     3  ME=$(basename $0)
     4  
     5  ###############################################################################
     6  # BEGIN user-customizable section
     7  
     8  # Buildah main repository; unlikely to change often
     9  BUILDAH_REPO=github.com/containers/buildah
    10  
    11  # Tag name used to identify the base checkout
    12  BASE_TAG=buildah-bud-in-podman
    13  
    14  # END   user-customizable section
    15  ###############################################################################
    16  
    17  usage="Usage: $ME [--help] [--no-checkout] [--no-test] [--filter=TESTNAME]
    18  
    19  Flags, useful for manual debugging:
    20  
    21    --no-checkout   Skip checkout step, go directly to running tests.
    22                    Useful when rerunning tests.
    23  
    24    --no-test       Do checkout only, but do not run tests. Useful when
    25                    testing the apply-podman-deltas script.
    26  
    27    --filter=NAME   Passed on to bats; runs only tests that match NAME
    28  
    29    --remote        Test with podman-remote. Will start its own server.
    30  "
    31  
    32  # Parse command-line options (used in development only, not in CI)
    33  do_checkout=y
    34  do_test=y
    35  declare -a bats_filter=()
    36  for i; do
    37      value=$(expr "$i" : '[^=]*=\(.*\)')
    38      case "$i" in
    39          --no-checkout)  do_checkout= ; shift;;
    40          --no-test)      do_test=     ; shift;;
    41          --filter=*)     bats_filter=("--filter" "$value"); shift;;
    42          --remote)       PODBIN_NAME=remote;;
    43         -h|--help)       echo "$usage"; exit 0;;
    44          *)              echo "$ME: Unrecognized option '$i'" >&2; exit 1;;
    45      esac
    46  done
    47  
    48  # Patches helpers.bash and potentially other files (bud.bats? Dockerfiles?)
    49  #
    50  # The patch file is horrible to generate:
    51  #    1) cd to the checked-out buildah/tests directory
    52  #    2) make your edits
    53  #    3) git commit -asm 'blah blah blah'
    54  #       3a) if checked-out directory already includes earlier patches,
    55  #           you may need to 'git commit --amend' instead
    56  #    4) git format-patch HEAD^
    57  #    5) sed -e 's/ \+$//' 0001* >../PATCH-FILE-PATH
    58  #    6) vim that file, remove trailing empty newlines
    59  #    7) cd back out of buildah directory, and git-commit this new patch file
    60  #
    61  # FIXME: this makes me nervous. The diff will probably need tweaking
    62  #        over time. I don't think we need to version it, because we
    63  #        *have* to be in lockstep with a specific buildah version,
    64  #        so problems should only arise when we re-vendor.
    65  #        But I'm still nervous and can't put my finger on the reason.
    66  #
    67  # Complicated invocation needed because we 'cd' down below.
    68  BUD_TEST_DIR=$(realpath $(dirname ${BASH_SOURCE[0]}))
    69  PATCHES=${BUD_TEST_DIR}/buildah-tests.diff
    70  
    71  # Friendlier relative path to our buildah-tests dir
    72  BUD_TEST_DIR_REL=$(dirname $(git ls-files --full-name ${BASH_SOURCE[0]}))
    73  # Path to podman binary; again, do it before we cd
    74  PODMAN_BINARY=$(pwd)/bin/podman
    75  REMOTE=
    76  # If remote, start server & change path
    77  if [[ "${PODBIN_NAME:-}" = "remote" ]]; then
    78      REMOTE=1
    79      PODMAN_BINARY+="-remote"
    80  fi
    81  
    82  function die() {
    83      failhint=
    84      echo "$ME: $*" >&2
    85      exit 1
    86  }
    87  
    88  # From here on out, any unexpected abort will try to offer helpful hints
    89  failhint=
    90  trap 'if [[ $? != 0 ]]; then if [[ -n $failhint ]]; then echo;echo "***************************************";echo "$failhint";echo;echo "Please see $BUD_TEST_DIR_REL/README.md for advice";fi;fi' 0
    91  
    92  # Find the version of buildah we've vendored in, so we can run the right tests
    93  buildah_version=$(awk "\$1 == \"$BUILDAH_REPO\" { print \$2 }" <go.mod)
    94  
    95  if [[ -z "$buildah_version" ]]; then
    96      # This should not happen
    97      die "Did not find '$BUILDAH_REPO' in go.mod"
    98  fi
    99  
   100  # From here on out, any error is fatal
   101  set -e
   102  
   103  # Run sudo early, to refresh the credentials cache. This is a NOP under CI,
   104  # but might be appreciated by developers who run this script, step away
   105  # during the git-checkout-buildah step, then come back twenty minutes later
   106  # to an expired sudo prompt and no tests have run. (No need to do this
   107  # for checkout; only when running tests)
   108  export SUDO=
   109  if [[ -n $do_test ]] && ! [[ "$PRIV_NAME" == "rootless" ]]; then
   110      SUDO=sudo
   111      $SUDO --validate
   112  fi
   113  
   114  # Before pulling buildah (while still cd'ed to podman repo), try to determine
   115  # if this is a PR, and if so if it's a revendoring of buildah. We use this to
   116  # try to offer a helpful hint on failure.
   117  is_revendor=
   118  if [[ -n $CIRRUS_CHANGE_IN_REPO ]]; then
   119      if [[ -n $DEST_BRANCH ]]; then
   120          head=${CIRRUS_CHANGE_IN_REPO}
   121          # Base of this PR.
   122          base=$(set -x;git merge-base ${DEST_BRANCH} $head)
   123          changes=$(set -x;git diff --name-status $base $head)
   124          if [[ -n $changes ]]; then
   125              if [[ $changes =~ vendor/$BUILDAH_REPO ]]; then
   126                  is_revendor=y
   127              fi
   128          fi
   129      fi
   130  fi
   131  
   132  # Pull buildah, including tests
   133  buildah_dir=test-buildah-$buildah_version
   134  if [[ -n $do_checkout ]]; then
   135      if [[ -d $buildah_dir ]]; then
   136          die "Directory already exists: $buildah_dir"
   137      fi
   138  
   139      # buildah_version should usually be vX.Y, but sometimes a PR under test
   140      # will need a special unreleased version (go calls then "pseudoversions").
   141      # In the usual case, we can do a shallow git clone:
   142      shallow_checkout="--branch $buildah_version"
   143      if [[ $buildah_version =~ .*-.*\.[0-9]{14}-.* ]]; then
   144          # ...but with a pseudoversion, we must git-clone the entire repo,
   145          # then do a git checkout within it
   146          shallow_checkout=
   147      fi
   148  
   149      failhint="'git clone' failed - this should never happen!"
   150      (set -x;git clone -q $shallow_checkout https://$BUILDAH_REPO $buildah_dir)
   151  
   152      # Recent versions of git (like `2.39`) disallow some operations (like `am`)
   153      # without an identity being set.  In this case, git will throw an error
   154      # with a helpful error message for humans to ponder.  However, when running
   155      # under automation, nobody cares about this condition or message, because
   156      # the environment is disposable.
   157      if [[ "$CI" == "true" ]]; then
   158          (
   159          _gc='git config --global'
   160          set -x
   161          $_gc user.email "TMcTestFace@example.com"
   162          $_gc user.name "Testy McTestface"
   163          $_gc --add safe.directory $buildah_dir
   164          )
   165      fi
   166  
   167      cd $buildah_dir
   168      if [[ -z $shallow_checkout ]]; then
   169          # extract the SHA (rightmost field) from, e.g., v1.2-YYYMMDD-<sha>
   170          sha=${buildah_version##*-}
   171  
   172          failhint="'git checkout $sha' failed - this should never happen!"
   173          (set -x;git checkout -q $sha)
   174      fi
   175  
   176      # Give it a recognizable tag; this will be useful if we need to update
   177      # the set of patches
   178      (set -x;git tag $BASE_TAG)
   179  
   180      # Build buildah and the copy helper
   181      failhint="error building buildah. This should never happen."
   182      (set -x;make bin/buildah)
   183      failhint="error building buildah's copy helper. This should never happen."
   184      (set -x;make bin/copy)
   185  
   186      # The upcoming patch may fail. Before we try it, create a helper script
   187      # for a developer to push a new set of diffs to podman-land.
   188      failhint=
   189      sed -e "s,\[BASETAG\],${BASE_TAG},g" \
   190          -e "s,\[BUILDAHREPO\],${BUILDAH_REPO},g" \
   191          < ${BUD_TEST_DIR}/make-new-buildah-diffs \
   192          > make-new-buildah-diffs
   193      chmod 755 make-new-buildah-diffs
   194  
   195      # Apply custom patches. We do this _after_ building, although it shouldn't
   196      # matter because these patches should only apply to test scripts and not
   197      # to any buildah sources.
   198      failhint="
   199  Error applying patch file. This can happen when you vendor in a new buildah.
   200  You will want to:
   201  
   202    - look for 'test/*.rej'
   203    - resolve conflicts manually
   204    - git add test/helpers.bash
   205    - git am --continue
   206    - ./make-new-buildah-diffs
   207  "
   208      (set -x;git am --reject <$PATCHES)
   209  
   210     # Now apply our custom skips and error-message changes. This is maintained
   211      # in a custom script, not a .diff file, because diffs are WAY too hard for
   212      # humans to read and update.
   213      APPLY=apply-podman-deltas
   214      failhint="
   215  Error applying podman-specific deltas. This sometimes happens when you
   216  vendor in a new buildah. You will want to:
   217  
   218    - inspect the errors shown above
   219    - find the corresponding lines in $BUD_TEST_DIR_REL/$APPLY
   220    - edit/delete them as necessary
   221  "
   222      (set -x;$BUD_TEST_DIR/$APPLY)
   223  else
   224      # Called with --no-checkout
   225      test -d $buildah_dir || die "Called with --no-checkout, but $buildah_dir does not exist"
   226  
   227      cd $buildah_dir
   228  fi
   229  
   230  if [[ -n $do_test ]]; then
   231      failhint="Error running buildah bud tests under podman."
   232      if [[ -n $is_revendor ]]; then
   233          failhint+="
   234  
   235  It looks like you're vendoring in a new buildah. The likely failure
   236  here is that there's a new test in bud.bats that uses functionality
   237  not (yet) in podman build. You will likely need to 'skip' that test.
   238  "
   239      else
   240          failhint+="
   241  
   242  Is it possible that your PR breaks podman build in some way? Please
   243  review the test failure and double-check your changes.
   244  "
   245      fi
   246  
   247      (set -x;$SUDO env TMPDIR=/var/tmp \
   248                   PODMAN_BINARY=$PODMAN_BINARY \
   249                   PODMAN_SERVER_LOG=$PODMAN_SERVER_LOG \
   250                   REMOTE=$REMOTE \
   251                   BUILDAH_BINARY=$(pwd)/bin/buildah \
   252                   COPY_BINARY=$(pwd)/bin/copy \
   253                   bats "${bats_filter[@]}" tests/bud.bats)
   254  fi