blob: 389f6801f7a6649ebc35579740a48235100f6514 [file] [edit]
#!/bin/bash
# Copyright 2019 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# This script is expected to be run on an Enterprise Linux system (RHEL, CentOS)
# on GCE with various flags set in the instance metadata including the git
# repository to clone. The script produces an RPM defined by an RPM spec in the
# packaging/ directory from the cloned repo.
URL="http://metadata/computeMetadata/v1/instance/attributes"
function get_md() {
curl -f -H Metadata-Flavor:Google "${URL}/${1}"
}
GCS_PATH=$(get_md daisy-outs-path)
SRC_PATH=$(get_md daisy-sources-path)
REPO_OWNER=$(get_md repo-owner)
REPO_NAME=$(get_md repo-name)
GIT_REF=$(get_md git-ref)
BUILD_DIR=$(get_md build-dir)
VERSION=$(get_md version)
VERSION=${VERSION:-"dummy"}
echo "Started build..."
# common.sh contains functions common to all builds.
gcloud storage cp "${SRC_PATH}/common.sh" ./
. common.sh
# Install git2 as this is not available in centos 6/7
VERSION_ID=6
if [[ -f /etc/os-release ]]; then
eval $(grep VERSION_ID /etc/os-release)
VERSION_ID=${VERSION_ID:0:1}
fi
GIT="git"
if [[ ${VERSION_ID} =~ 6|7 ]]; then
try_command yum install -y "https://repo.ius.io/ius-release-el${VERSION_ID}.rpm"
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-IUS-${VERSION_ID}
GIT="git236"
fi
# Install DevToolSet with gcc 10 for EL7.
# Centos 7 has only gcc 4.8.5 available.
if (( ${VERSION_ID} == 7 )); then
try_command yum install -y centos-release-scl
try_command yum install -y devtoolset-10-gcc-c++.x86_64
fi
# Enable CRB repo on EL9.
if [[ ${VERSION_ID} = 9 ]]; then
eval $(grep ID /etc/os-release)
# RHEL has a different CRB repo than Rocky/CentOS.
if [[ ${ID} == "rhel" ]]; then
dnf config-manager --set-enabled rhui-codeready-builder-for-rhel-9-$(uname -m)-rhui-rpms
else
dnf config-manager --set-enabled crb
fi
fi
if [[ ${VERSION_ID} = 10 ]]; then
echo "Enabling CRB repo for el10"
dnf config-manager --set-enabled crb
fi
try_command yum install -y $GIT rpmdevtools yum-utils python3-devel
git_checkout "$REPO_OWNER" "$REPO_NAME" "$GIT_REF"
if [[ -n "$BUILD_DIR" ]]; then
cd "$BUILD_DIR"
fi
if grep -q '%{_go}' ./packaging/*.spec; then
echo "Installing go"
install_go
echo "Installing go dependencies"
$GO mod download
fi
# Make build dirs as needed.
RPMDIR=/usr/src/redhat
for dir in ${RPMDIR}/{SOURCES,SPECS}; do
[[ -d "$dir" ]] || mkdir -p "$dir"
done
# Find the RPM specs to build for this version.
TOBUILD=""
SPECS=$(ls ./packaging/*.spec | sed -re 's/(\.el.)?.spec//' | sort -ru)
echo "all specs $SPECS"
for spec in $SPECS; do
spec=$(basename "$spec")
distspec="${spec}.el${VERSION_ID}.spec"
echo checking $spec and $distspec
if [[ -f "./packaging/$distspec" ]]; then
TOBUILD="${TOBUILD} ${distspec}"
else
TOBUILD="${TOBUILD} ${spec}.spec"
fi
done
[[ -z "$TOBUILD" ]] && build_fail "No RPM specs found"
COMMITURL="https://github.com/$REPO_OWNER/$REPO_NAME/tree/$(git rev-parse HEAD)"
echo "Building package(s)"
# Enable gcc 10 for EL7 only and before rpmbuild
if (( ${VERSION_ID} == 7 )); then
source /opt/rh/devtoolset-10/enable
fi
for spec in $TOBUILD; do
PKGNAME="$(grep Name: "./packaging/${spec}"|cut -d' ' -f2-|tr -d ' ')"
yum-builddep -y "./packaging/${spec}"
cp "./packaging/${spec}" "${RPMDIR}/SPECS/"
cp ./packaging/*.tar.gz "${RPMDIR}/SOURCES/" || :
cp ./packaging/*.patch "${RPMDIR}/SOURCES/" || :
sed -i"" "/^Version/aVcs: ${COMMITURL}" "${RPMDIR}/SPECS/${spec}"
tar czvf "${RPMDIR}/SOURCES/${PKGNAME}_${VERSION}.orig.tar.gz" \
--exclude .git --exclude packaging \
--transform "s/^\./${PKGNAME}-${VERSION}/" .
rpmbuild --define "_topdir ${RPMDIR}/" --define "_version ${VERSION}" \
--define "_go ${GO:-"UNSET"}" --define "_gopath ${GOPATH:-"UNSET"}" \
-ba "${RPMDIR}/SPECS/${spec}"
SRPM_FILE=$(find ${RPMDIR}/SRPMS -iname "${PKGNAME}*.src.rpm")
done
rpms=$(find ${RPMDIR}/{S,}RPMS -iname "${PKGNAME}*.rpm")
for rpm in $rpms; do
rpm -qpilR $rpm
done
echo "copying ${rpms} to $GCS_PATH/"
gcloud storage cp --no-clobber ${rpms} "$GCS_PATH/"
build_success "Built $(echo ${rpms}|xargs)"