Skip to content
Snippets Groups Projects
preinst.erb 4.76 KiB
Newer Older
#!/bin/sh
# GitLab pre-install script

DEST_DIR=<%= install_dir %>
NEW_MAJOR_VERSION=<%= build_version.split(".")[0] %>
NEW_MINOR_VERSION=<%= build_version.split(".")[0,2].join(".") %>
mkdir -p /var/log/gitlab/reconfigure

skip_backup_file=/etc/gitlab/skip-auto-backup
skip_reconfigure_file=/etc/gitlab/skip-auto-reconfigure
# environment may contain these - clear them out
OLD_VERSION_STRING=""
OLD_MAJOR_VERSION=""
OLD_MINOR_VERSION=""
if [ -e "${DEST_DIR}/version-manifest.json" ] ; then
  OLD_VERSION_STRING=$(grep -i "build_version" ${DEST_DIR}/version-manifest.json | awk -F ': ' '{print $2}' | tr -d '",')

  # Getting the Major and Major.Minor format of existing version string
  OLD_MAJOR_VERSION=$(echo $OLD_VERSION_STRING | awk -F "." '{print $1}')
  OLD_MINOR_VERSION=$(echo $OLD_VERSION_STRING | awk -F "." '{print $1"."$2}')
fi

greater_version()
{
  test "$(printf '%s\n' "$@" | sort -V | tail -n 1)" = "$1";
}

config_check() {
if [ -e "${DEST_DIR}/embedded/service/omnibus-ctl/check_config.rb" ] ; then
  ${DEST_DIR}/bin/gitlab-ctl check-config --version=${NEW_MINOR_VERSION}
  if [ $? -ne 0 ]; then
    exit 1
  fi
fi
}

  # Minimum version from which jumps are permitted to current version.
  # Follows https://docs.gitlab.com/ee/update/index.html#upgrade-paths
  MIN_VERSION=17.5
  if [ -n "${OLD_VERSION_STRING}" ] ; then
    # If existing version is less than required minimum version, do not permit the upgrade.
    if ! greater_version $OLD_MINOR_VERSION $MIN_VERSION; then
      notify "It seems you are upgrading from ${OLD_MINOR_VERSION} to ${NEW_MINOR_VERSION}."
      notify "It is required to upgrade to the latest ${MIN_VERSION}.x version first before proceeding."

      # If the upgrade is a major version jump, print a major upgrade notification.
      if test ${OLD_MAJOR_VERSION} -lt ${NEW_MAJOR_VERSION}; then
        notify "Please follow the upgrade documentation at https://docs.gitlab.com/ee/update/#upgrading-to-a-new-major-version"
      else
        notify "Please follow the upgrade documentation at https://docs.gitlab.com/ee/update/index.html#upgrade-paths"
      exit 1
pg_check() {
Clemens Beck's avatar
Clemens Beck committed
  PG_MIN_VERSION=14
  # Fetch the currently running version from the database
  # If this doesn't work, assume this isn't a database node
  if ! running_version=$(${DEST_DIR}/bin/gitlab-psql -d template1 -c 'SHOW server_version' -qt 2>/dev/null); then
    notify
    notify "This node does not appear to be running a database"
    notify "Skipping version check, if you think this is an error exit now"
    notify
    return
  fi

  # Check if PostgreSQL version is less than PG_MIN_VERSION and notify user.
  # In AWK, $NF will return the last column of the version output, which
  # is the version string. By doing $NF+0, we force awk to convert it to a
  # float, so that we can do numerical comparison.
  if ! $(echo ${running_version} | awk -v PG_MIN_VERSION="$PG_MIN_VERSION" '$NF+0 < PG_MIN_VERSION {exit 1}'); then
    notify
    notify "Your version of PostgreSQL is no longer supported. Please upgrade your PostgreSQL version to ${PG_MIN_VERSION}."
    notify "Check https://docs.gitlab.com/omnibus/settings/database.html#upgrade-packaged-postgresql-server for details."
    notify ""
    notify "Upgrade failed. Retry the upgrade after upgrading your PostgreSQL version."
    exit 1
  if [ -e "${skip_reconfigure_file}" ] ; then
    # The user wants us to do nothing
    return
  fi

  if [ -d ${DEST_DIR}/service/puma ] && [ ! -e "${skip_backup_file}" ] ; then
    notify "Automatically backing up only the GitLab SQL database (excluding everything else!)"
    if ! ${DEST_DIR}/bin/gitlab-rake gitlab:backup:create SKIP=repositories,uploads,builds,artifacts,lfs,terraform_state,ci_secure_files,registry,pages,packages ; then
      backup_failed "Database"

    BACKUP_ETC_ADDED_VERSION=12.3
    if greater_version $OLD_MINOR_VERSION $BACKUP_ETC_ADDED_VERSION; then
      notify "Automatically backing up /etc/gitlab"
      if ! ${DEST_DIR}/bin/gitlab-ctl backup-etc --no-delete-old-backups ; then
        notify "Configuration backup failed - check permissions for /etc/gitlab/config_backup/ [is it nfs root_squash?]"
      fi
    fi
backup_failed() {
  notify
  notify "$1 backup failed! If you want to skip this backup, run the following command and try again:"
  notify
  notify " sudo touch ${skip_backup_file}"
notify() {
  echo "gitlab preinstall: $1"
}

if [ -n "${GITLAB_DEBUG}" ] ; then
  notify "debug: arguments: $@"
fi

case "$1" in
  2)
    # Looks like an RPM upgrade
    pg_check
    main
    ;;
  upgrade)
    # Looks like a DEB upgrade
    pg_check
    main
    ;;
  *)
    # This is not an upgrade, nothing to do.
    ;;