Files
ortools-clone/tools/release/build_delivery_manylinux_amd64.sh
2025-06-12 10:02:27 +02:00

269 lines
8.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# Copyright 2010-2025 Google LLC
# 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.
set -eo pipefail
function help() {
local -r NAME=$(basename "$0")
local -r BOLD="\e[1m"
local -r RESET="\e[0m"
local -r help=$(cat << EOF
${BOLD}NAME${RESET}
\t$NAME - Build delivery using an ${BOLD}manylinux2014 docker image${RESET}.
${BOLD}SYNOPSIS${RESET}
\t$NAME [-h|--help|help] [examples|dotnet|java|python|all|reset]
${BOLD}DESCRIPTION${RESET}
\tBuild Google OR-Tools deliveries.
\tYou ${BOLD}MUST${RESET} define the following variables before running this script:
\t* ORTOOLS_TOKEN: secret use to decrypt keys to sign .Net and Java packages.
${BOLD}OPTIONS${RESET}
\t-h --help: display this help text
\tarchive: build all (C++, .Net, Java) archives
\tdotnet: build all .Net packages
\tjava: build all Java packages
\tpython: build all Pyhon packages
\texamples: build examples archives
\tall: build everything (default)
${BOLD}EXAMPLES${RESET}
Using export to define the ${BOLD}ORTOOLS_TOKEN${RESET} env and only building the Java packages:
export ORTOOLS_TOKEN=SECRET
$0 java
note: the 'export ...' should be placed in your bashrc to avoid any leak
of the secret in your bash history
EOF
)
echo -e "$help"
}
function assert_defined(){
if [[ -z "${!1}" ]]; then
>&2 echo "Variable '${1}' must be defined"
exit 1
fi
}
function build_delivery() {
assert_defined ORTOOLS_BRANCH
assert_defined ORTOOLS_SHA1
assert_defined ORTOOLS_TOKEN
assert_defined ORTOOLS_DELIVERY
assert_defined DOCKERFILE
assert_defined ORTOOLS_IMG
# Clean
echo -n "Remove previous docker images..." | tee -a "${ROOT_DIR}/build.log"
docker image rm -f "${ORTOOLS_IMG}":"${ORTOOLS_DELIVERY}" 2>/dev/null
docker image rm -f "${ORTOOLS_IMG}":devel 2>/dev/null
docker image rm -f "${ORTOOLS_IMG}":env 2>/dev/null
echo "DONE" | tee -a "${ROOT_DIR}/build.log"
cd "${RELEASE_DIR}" || exit 2
# Build env
# https://github.com/containerd/containerd/blob/v1.4.3/platforms/platforms.go#L63
echo -n "Build ${ORTOOLS_IMG}:env..." | tee -a "${ROOT_DIR}/build.log"
docker buildx build --platform linux/amd64 \
--tag "${ORTOOLS_IMG}":env \
--build-arg ORTOOLS_GIT_BRANCH="${ORTOOLS_BRANCH}" \
--build-arg ORTOOLS_GIT_SHA1="${ORTOOLS_SHA1}" \
--target=env \
-f "${DOCKERFILE}" .
echo "DONE" | tee -a "${ROOT_DIR}/build.log"
# Build devel
echo -n "Build ${ORTOOLS_IMG}:devel..." | tee -a "${ROOT_DIR}/build.log"
docker buildx build --platform linux/amd64 \
--tag "${ORTOOLS_IMG}":devel \
--build-arg ORTOOLS_GIT_BRANCH="${ORTOOLS_BRANCH}" \
--build-arg ORTOOLS_GIT_SHA1="${ORTOOLS_SHA1}" \
--target=devel \
-f "${DOCKERFILE}" .
echo "DONE" | tee -a "${ROOT_DIR}/build.log"
# Build delivery
echo -n "Build ${ORTOOLS_IMG}:${ORTOOLS_DELIVERY}..." | tee -a "${ROOT_DIR}/build.log"
docker buildx build --platform linux/amd64 \
--tag "${ORTOOLS_IMG}":"${ORTOOLS_DELIVERY}" \
--build-arg ORTOOLS_GIT_BRANCH="${ORTOOLS_BRANCH}" \
--build-arg ORTOOLS_GIT_SHA1="${ORTOOLS_SHA1}" \
--build-arg ORTOOLS_TOKEN="${ORTOOLS_TOKEN}" \
--build-arg ORTOOLS_DELIVERY="${ORTOOLS_DELIVERY}" \
--target=delivery \
-f "${DOCKERFILE}" .
echo "DONE" | tee -a "${ROOT_DIR}/build.log"
}
# .Net build
function build_dotnet() {
if echo "${ORTOOLS_BRANCH} ${ORTOOLS_SHA1}" | cmp --silent "${ROOT_DIR}/export/amd64_dotnet_build" -; then
echo "build .Net up to date!" | tee -a build.log
return 0
fi
assert_defined ORTOOLS_IMG
local -r ORTOOLS_DELIVERY=dotnet
build_delivery
# copy nupkg to export
docker run --rm --init \
-w /root/or-tools \
-v "${ROOT_DIR}/export":/export \
-u "$(id -u "${USER}")":"$(id -g "${USER}")" \
-t "${ORTOOLS_IMG}":"${ORTOOLS_DELIVERY}" "cp export/*nupkg /export/"
echo "${ORTOOLS_BRANCH} ${ORTOOLS_SHA1}" > "${ROOT_DIR}/export/amd64_dotnet_build"
}
# Java build
function build_java() {
if echo "${ORTOOLS_BRANCH} ${ORTOOLS_SHA1}" | cmp --silent "${ROOT_DIR}/export/amd64_java_build" -; then
echo "build Java up to date!" | tee -a build.log
return 0
fi
assert_defined ORTOOLS_IMG
local -r ORTOOLS_DELIVERY=java
build_delivery
# copy .jar to export
docker run --rm --init \
-w /root/or-tools \
-v "${ROOT_DIR}/export":/export \
-u "$(id -u "${USER}")":"$(id -g "${USER}")" \
-t "${ORTOOLS_IMG}":"${ORTOOLS_DELIVERY}" "cp export/*.jar* /export/"
echo "${ORTOOLS_BRANCH} ${ORTOOLS_SHA1}" > "${ROOT_DIR}/export/amd64_java_build"
}
# Python build
function build_python() {
if echo "${ORTOOLS_BRANCH} ${ORTOOLS_SHA1}" | cmp --silent "${ROOT_DIR}/export/amd64_python_build" -; then
echo "build python up to date!" | tee -a build.log
return 0
fi
local -r ORTOOLS_DELIVERY=python
build_delivery
# copy .whl to export
docker run --rm --init \
-w /root/or-tools \
-v "${ROOT_DIR}/export":/export \
-u "$(id -u "${USER}")":"$(id -g "${USER}")" \
-t "${ORTOOLS_IMG}":"${ORTOOLS_DELIVERY}" "cp export/*.whl /export/"
echo "${ORTOOLS_BRANCH} ${ORTOOLS_SHA1}" > "${ROOT_DIR}/export/amd64_python_build"
}
# Create Archive
function build_archive() {
if echo "${ORTOOLS_BRANCH} ${ORTOOLS_SHA1}" | cmp --silent "${ROOT_DIR}/export/amd64_archive_build" -; then
echo "build archive up to date!" | tee -a build.log
return 0
fi
local -r ORTOOLS_DELIVERY=archive
build_delivery
# copy archive to export
docker run --rm --init \
-w /root/or-tools \
-v "${ROOT_DIR}/export":/export \
-u "$(id -u "${USER}")":"$(id -g "${USER}")" \
-t "${ORTOOLS_IMG}":"${ORTOOLS_DELIVERY}" "cp export/*.tar.gz /export/"
echo "${ORTOOLS_BRANCH} ${ORTOOLS_SHA1}" > "${ROOT_DIR}/export/amd64_archive_build"
}
# Build Examples
function build_examples() {
if echo "${ORTOOLS_BRANCH} ${ORTOOLS_SHA1}" | cmp --silent "${ROOT_DIR}/export/amd64_examples_build" -; then
echo "build examples up to date!" | tee -a build.log
return 0
fi
local -r ORTOOLS_DELIVERY=examples
build_delivery
echo "${ORTOOLS_BRANCH} ${ORTOOLS_SHA1}" > "${ROOT_DIR}/export/amd64_examples_build"
}
# Cleaning everything
function reset() {
assert_defined ORTOOLS_IMG
echo "Cleaning everything..."
rm -rf export/
docker image rm -f "${ORTOOLS_IMG}":archive 2>/dev/null
docker image rm -f "${ORTOOLS_IMG}":examples 2>/dev/null
docker image rm -f "${ORTOOLS_IMG}":dotnet 2>/dev/null
docker image rm -f "${ORTOOLS_IMG}":java 2>/dev/null
docker image rm -f "${ORTOOLS_IMG}":python 2>/dev/null
docker image rm -f "${ORTOOLS_IMG}":devel 2>/dev/null
docker image rm -f "${ORTOOLS_IMG}":env 2>/dev/null
rm -f "${ROOT_DIR}"/*.log
echo "DONE"
}
# Main
function main() {
case ${1} in
-h | --help | help)
help; exit ;;
esac
assert_defined ORTOOLS_TOKEN
echo "ORTOOLS_TOKEN: FOUND" | tee -a build.log
local -r ROOT_DIR="$(cd -P -- "$(dirname -- "$0")/../.." && pwd -P)"
echo "ROOT_DIR: '${ROOT_DIR}'" | tee -a build.log
local -r RELEASE_DIR="$(cd -P -- "$(dirname -- "$0")" && pwd -P)"
echo "RELEASE_DIR: '${RELEASE_DIR}'" | tee -a build.log
(cd "${ROOT_DIR}" && make print-OR_TOOLS_VERSION | tee -a build.log)
local -r ORTOOLS_BRANCH=$(git rev-parse --abbrev-ref HEAD)
local -r ORTOOLS_SHA1=$(git rev-parse --verify HEAD)
local -r DOCKERFILE="amd64.Dockerfile"
local -r ORTOOLS_IMG="ortools/manylinux_delivery_amd64"
local -r PLATFORM=$(uname -m)
mkdir -p "${ROOT_DIR}/export"
case ${1} in
dotnet|java|python|archive|examples)
"build_$1"
exit ;;
reset)
reset
exit ;;
all)
build_dotnet
build_java
#build_python
build_archive
#build_examples
exit ;;
*)
>&2 echo "Target '${1}' unknown"
exit 1
esac
exit 0
}
main "${1:-all}"