| #!/bin/bash |
| |
| # Copyright 2020-present Open Networking Foundation |
| # |
| # 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. |
| |
| # Build the apps |
| |
| # General purposes vars |
| CURRENT_UID=$(id -u) |
| CURRENT_GID=$(id -g) |
| CURRENT_DIR=$(pwd) |
| MVN=1 |
| PROJECT_VERSION=0 |
| |
| # Docker related vars |
| DOCKER_MVN_TAG=3.6.3-openjdk-11-slim |
| DOCKER_MVN_IMAGE=maven:${DOCKER_MVN_TAG} |
| |
| # Do not attach stdin if running in an environment without it (e.g., Jenkins) |
| IT=$(test -t 0 && echo "-it" || echo "-t") |
| |
| # Trellis-control related vars |
| TRELLIS_CONTROL_GROUPID=org.onosproject |
| TRELLIS_CONTROL_ARTIFACTID=segmentrouting-app |
| TRELLIS_CONTROL_ARTIFACT=${TRELLIS_CONTROL_GROUPID}:${TRELLIS_CONTROL_ARTIFACTID} |
| TRELLIS_CONTROL_OAR=${TRELLIS_CONTROL_ROOT}/app/target/${TRELLIS_CONTROL_ARTIFACTID}-${TRELLIS_CONTROL_VERSION}.oar |
| |
| # Trellis-t3 related vars |
| TRELLIS_T3_GROUPID=org.onosproject |
| TRELLIS_T3_ARTIFACTID=t3-app |
| TRELLIS_T3_ARTIFACT=${TRELLIS_T3_GROUPID}:${TRELLIS_T3_ARTIFACTID} |
| TRELLIS_T3_OAR=${TRELLIS_T3_ROOT}/app/target/${TRELLIS_T3_ARTIFACTID}-${TRELLIS_T3_VERSION}.oar |
| |
| # UP4 related vars |
| UP4_GROUPID=org.omecproject |
| UP4_ARTIFACTID=up4-app |
| UP4_ARTIFACT=${UP4_GROUPID}:${UP4_ARTIFACTID} |
| UP4_TARGETS=_prepare_app_build |
| UP4_OAR=${UP4_ROOT}/app/app/target/${UP4_ARTIFACTID}-${UP4_VERSION}.oar |
| |
| # Fabric-tna related vars |
| FABRIC_TNA_GROUPID=org.stratumproject |
| FABRIC_TNA_ARTIFACTID=fabric-tna |
| FABRIC_TNA_ARTIFACT=${FABRIC_TNA_GROUPID}:${FABRIC_TNA_ARTIFACTID} |
| FABRIC_TNA_TARGETS=all |
| FABRIC_TNA_OAR=${FABRIC_TNA_ROOT}/target/${FABRIC_TNA_ARTIFACTID}-${FABRIC_TNA_VERSION}.oar |
| |
| set -eu -o pipefail |
| |
| function extract_version { |
| # Enter in the project folder |
| cd "$1" || exit 1 |
| # Verify if the VERSION file exists |
| if [ -f "VERSION" ]; then |
| NEW_VERSION=$(head -n1 "VERSION") |
| # If this is a golang project, use funky v-prefixed versions |
| if [ -f "Gopkg.toml" ] || [ -f "go.mod" ]; then |
| PROJECT_VERSION=v${NEW_VERSION} |
| else |
| PROJECT_VERSION=${NEW_VERSION} |
| fi |
| # If this is a node.js project |
| elif [ -f "package.json" ]; then |
| NEW_VERSION=$(python -c 'import json,sys;obj=json.load(sys.stdin); print obj["version"]' < package.json) |
| PROJECT_VERSION=${NEW_VERSION} |
| # If this is a mvn project |
| elif [ -f "pom.xml" ]; then |
| NEW_VERSION=$(xmllint --xpath '/*[local-name()="project"]/*[local-name()="version"]/text()' pom.xml) |
| PROJECT_VERSION=${NEW_VERSION} |
| else |
| echo "ERROR: No versioning file found!" |
| exit 1 |
| fi |
| cd ../ |
| } |
| |
| # Generic function to build an app |
| function build_app { |
| # First step is to remove the oar dir |
| rm -rf "$1" |
| # Settings are needed by both build processes - contains proxy settings and extra |
| cp mvn_settings.xml "$2" |
| # Dependencies are needed only by the mvn copy - contains repo settings |
| cp dependencies.xml "$2" |
| # Mounting the current dir allows to cache the .m2 folder that is persisted and leveraged by subsequent builds |
| docker run "${IT}" --rm -v "${CURRENT_DIR}":/root -w /root/"$3" "${DOCKER_MVN_IMAGE}" \ |
| bash -c "mvn dependency:copy -Dartifact=$4:$5:oar \ |
| -DoutputDirectory=$6 -Dmdep.useBaseVersion=true \ |
| -Dmdep.overWriteReleases=true -Dmdep.overWriteSnapshots=true -f dependencies.xml \ |
| -s mvn_settings.xml; \ |
| chown -R ${CURRENT_UID}:${CURRENT_GID} /root" |
| # If the oar is not found - try to build using the source code |
| if [ ! -f "$7" ]; then |
| cd "$2" || exit 1 |
| # Verify for the last time if the VERSION is a checkout object or a review |
| if ! (git checkout "origin/$5" || git checkout "$5"); then |
| if ! (git fetch "$8" "$5" && git checkout FETCH_HEAD); then |
| exit 1 |
| fi |
| fi |
| cd ../ |
| # Having the same mount file allows to reduce build time |
| docker run "${IT}" --rm -v "${CURRENT_DIR}":/root -w /root/"$3" "${DOCKER_MVN_IMAGE}" \ |
| bash -c "mvn clean install -s mvn_settings.xml; \ |
| chown -R ${CURRENT_UID}:${CURRENT_GID} /root" |
| # We need to override the version variable because it is not valid at this point |
| MVN=0 |
| fi |
| } |
| |
| function trellis-control-build { |
| # Build function |
| build_app "${TRELLIS_CONTROL_ROOT}"/app/target \ |
| "${TRELLIS_CONTROL_ROOT}"/ "trellis-control" \ |
| "${TRELLIS_CONTROL_ARTIFACT}" "${TRELLIS_CONTROL_VERSION}" \ |
| "app/target" "${TRELLIS_CONTROL_OAR}" "${TRELLIS_CONTROL_REPO}" |
| # If MVN was not successful - built from sources |
| if [ "$MVN" -eq "0" ]; then |
| # When building from source api and app jars are automatically put into the local .m2 folder. |
| # Update VERSION |
| extract_version "${TRELLIS_CONTROL_ROOT}" |
| # Update OAR |
| TRELLIS_CONTROL_OAR="${TRELLIS_CONTROL_ROOT}"/app/target/"${TRELLIS_CONTROL_ARTIFACTID}"-"${PROJECT_VERSION}".oar |
| else |
| # Fetch trellis-control api and app JARs that may be needed to build other apps when using local maven cache (i.e., T3 and fabric-tna). |
| # Fetched jars will be places in the local .m2 folder. |
| docker run "${IT}" --rm -v "${CURRENT_DIR}":/root -w /root/"trellis-control" "${DOCKER_MVN_IMAGE}" \ |
| bash -c "mvn dependency:copy -Dartifact=${TRELLIS_CONTROL_GROUPID}:segmentrouting-api:${TRELLIS_CONTROL_VERSION} \ |
| -Dmdep.useBaseVersion=true -Dmdep.overWriteReleases=true -Dmdep.overWriteSnapshots=true -f dependencies.xml \ |
| -s mvn_settings.xml; \ |
| mvn dependency:copy -Dartifact=${TRELLIS_CONTROL_GROUPID}:segmentrouting-app:${TRELLIS_CONTROL_VERSION} \ |
| -Dmdep.useBaseVersion=true -Dmdep.overWriteReleases=true -Dmdep.overWriteSnapshots=true -f dependencies.xml \ |
| -s mvn_settings.xml" |
| fi |
| # Final step requires to move the oar to the folder used by Dockerfile. Moreover, it will help catch up errors |
| cp "${TRELLIS_CONTROL_OAR}" "${LOCAL_APPS}"/ |
| } |
| |
| function trellis-t3-build { |
| build_app "${TRELLIS_T3_ROOT}"/app/target \ |
| "${TRELLIS_T3_ROOT}"/ "trellis-t3" \ |
| "${TRELLIS_T3_ARTIFACT}" "${TRELLIS_T3_VERSION}" \ |
| "app/target" "${TRELLIS_T3_OAR}" "${TRELLIS_T3_REPO}" |
| if [ "$MVN" -eq "0" ]; then |
| extract_version "${TRELLIS_T3_ROOT}" |
| TRELLIS_T3_OAR="${TRELLIS_T3_ROOT}"/app/target/"${TRELLIS_T3_ARTIFACTID}"-"${PROJECT_VERSION}".oar |
| fi |
| cp "${TRELLIS_T3_OAR}" "${LOCAL_APPS}"/ |
| } |
| |
| function up4-build { |
| # Prepares app folder |
| cd "${UP4_ROOT}" || exit 1 && make "${UP4_TARGETS}" |
| cd ../ |
| build_app "${UP4_ROOT}"/app/app/target \ |
| "${UP4_ROOT}"/app "up4/app" \ |
| "${UP4_ARTIFACT}" "${UP4_VERSION}" \ |
| "app/app/target" "${UP4_OAR}" "${UP4_REPO}" |
| if [ "$MVN" -eq "0" ]; then |
| extract_version "${UP4_ROOT}"/app |
| cd ../ |
| UP4_OAR="${UP4_ROOT}"/app/app/target/"${UP4_ARTIFACTID}"-"${PROJECT_VERSION}".oar |
| fi |
| cp "${UP4_OAR}" "${LOCAL_APPS}"/ |
| } |
| |
| function fabric-tna-build { |
| # This workaround is temporary - typically we need to build only the pipeconf |
| cd "${FABRIC_TNA_ROOT}" || exit 1 && make "${FABRIC_TNA_TARGETS[@]}" |
| cd ../ |
| build_app "${FABRIC_TNA_ROOT}"/target \ |
| "${FABRIC_TNA_ROOT}"/ "fabric-tna" \ |
| "${FABRIC_TNA_ARTIFACT}" "${FABRIC_TNA_VERSION}" \ |
| "target" "${FABRIC_TNA_OAR}" "${FABRIC_TNA_REPO}" |
| if [ "$MVN" -eq "0" ]; then |
| extract_version "${FABRIC_TNA_ROOT}" |
| FABRIC_TNA_OAR="${FABRIC_TNA_ROOT}"/target/"${FABRIC_TNA_ARTIFACTID}"-"${PROJECT_VERSION}".oar |
| fi |
| cp "${FABRIC_TNA_OAR}" "${LOCAL_APPS}"/ |
| } |
| |
| "$1" |