blob: 7af6b7a6d53a6c26d74edfca29034cf2babd6257 [file] [log] [blame]
#!/bin/bash
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
#
# Start a Celix dev container with all needed dependencies
# pre-installed already.
SCRIPT_LOCATION=$(realpath "$(dirname "${BASH_SOURCE[0]}")")
CELIX_REPO_ROOT=$(realpath "${SCRIPT_LOCATION}/..")
CELIX_CONTAINER_ROOT="/home/celixdev/workspace"
CONTAINER_SSH_PORT=2233
CONTAINER_COMMAND_DEFAULT="sudo chown -R celixdev:celixdev ${CELIX_CONTAINER_ROOT} && sudo /usr/sbin/sshd -D -e -p ${CONTAINER_SSH_PORT}"
CONTAINER_COMMAND=${1:-${CONTAINER_COMMAND_DEFAULT}}
CONTAINER_NAME="celixdev"
# Check which container engine is available.
# Check for podman first, because the 'podman-docker' package might be installed providing a dummy 'docker' command.
if command -v podman > /dev/null 2>&1; then
CONTAINER_ENGINE="podman"
else
CONTAINER_ENGINE="docker"
fi
ask_and_execute() {
local QUESTION="$1"
local FUNC_NAME="$2"
# Prompt the user with the question
while true; do
read -p "${QUESTION} (yes/no): " yn
case $yn in
[Yy]* )
# Call the provided function if the answer is yes
${FUNC_NAME}
echo ""
break;;
[Nn]* )
# Exit if the answer is no
break;;
* )
echo "Please answer yes or no.";;
esac
done
}
remove_celixdev_container() {
echo "Removing container '${CONTAINER_NAME}'"
${CONTAINER_ENGINE} rm -f ${CONTAINER_NAME}
}
# Check if container celixdev already exists
if [ "$(${CONTAINER_ENGINE} ps -a --format '{{.Names}}' | grep ${CONTAINER_NAME})" ]; then
ask_and_execute "Container '${CONTAINER_NAME}' already exists. Do you want to remove it?" remove_celixdev_container
fi
# Check again if container celixdev already exists and exit if it does
if [ "$(${CONTAINER_ENGINE} ps -a --format '{{.Names}}' | grep ${CONTAINER_NAME})" ]; then
echo "Container '${CONTAINER_NAME}' already exists. Exiting."
exit 1
fi
ADDITIONAL_ARGS=""
GNUPG_DIR_MOUNTED=false
add_gnupg_mount() {
echo "Adding .gnupg directory mount arguments"
ADDITIONAL_ARGS="${ADDITIONAL_ARGS} --volume ${HOME}/.gnupg:/home/celixdev/.gnupg:O"
GNUPG_DIR_MOUNTED=true
}
if [ -e "${HOME}/.gnupg" ]; then
ask_and_execute "Do you want to mount the .gnupg directory to the container (as an overlayfs)?" add_gnupg_mount
fi
add_gitconfig_mount() {
echo "Adding .gitconfig file mount arguments"
ADDITIONAL_ARGS="${ADDITIONAL_ARGS} --volume ${HOME}/.gitconfig:/home/celixdev/.gitconfig:ro"
}
if [ -e "${HOME}/.gitconfig" ]; then
ask_and_execute "Do you want to mount the .gitconfig file to the container (as read-only)?" add_gitconfig_mount
fi
add_sshagent_forward()
{
echo "Adding SSH agent forwarding"
ADDITIONAL_ARGS="${ADDITIONAL_ARGS} --volume ${SSH_AUTH_SOCK}:/ssh-agent --env SSH_AUTH_SOCK=/ssh-agent"
}
if [ -n "${SSH_AUTH_SOCK}" ]; then
ask_and_execute "Do you want to forward the SSH agent to the container?" add_sshagent_forward
fi
# Start a container with all the Celix dependencies pre-installed
# --userns=keep-id is used to keep the user id the same in the container as on the host
# --privileged to allow the unit tests to change thread priorities
# -d runs the container in detached mode
# -it starts the container in interactive mode
# --rm removes the container when it is stopped
# --net=host is used to allow e.g. communication with etcd
# --volume & --workdir are set to the Celix repo root (to allow building and editing of the Celix repo)
# --security-opt disables SELinux for the container
echo "Starting container '${CONTAINER_NAME}' with command: ${CONTAINER_COMMAND}"
${CONTAINER_ENGINE} run -it --rm --privileged -d \
--name ${CONTAINER_NAME} \
--userns=keep-id \
--net=host \
${ADDITIONAL_ARGS} \
--volume "${CELIX_REPO_ROOT}":${CELIX_CONTAINER_ROOT} \
--workdir "${CELIX_CONTAINER_ROOT}" \
--security-opt label=disable \
apache/celix-conan-dev:latest bash -c "${CONTAINER_COMMAND}"
echo ""
build_conan_deps() {
echo "Building Celix dependencies with Conan"
${CONTAINER_ENGINE} exec -it ${CONTAINER_NAME} bash -c "cd ${CELIX_CONTAINER_ROOT} && .devcontainer/setup-project-with-conan.sh"
}
ask_and_execute "Do you want to build Celix dependencies with Conan?" build_conan_deps
echo "Done. You can connect with ssh using 'ssh -p 2233 celixdev@localhost' and password 'celixdev'"