public inbox for isar-users@googlegroups.com
 help / color / mirror / Atom feed
From: "Schaffner, Tobias" <tobias.schaffner@siemens.com>
To: Uladzimir Bely <ubely@ilbers.de>,
	"isar-users@googlegroups.com" <isar-users@googlegroups.com>
Subject: Re: [PATCH 1/3] testsuite: Dockerfile for isar-docker image
Date: Thu, 9 Mar 2023 07:57:29 +0000	[thread overview]
Message-ID: <978dd08a-bff6-eefa-1b54-8388ecbcf56c@siemens.com> (raw)
In-Reply-To: <20230307043649.12796-2-ubely@ilbers.de>

On 07.03.23 05:36, Uladzimir Bely wrote:
> Add dockerfile and related files for generating isar-docker image
> supposed to be used in docker-based CI systems.
> 
> Signed-off-by: Uladzimir Bely <ubely@ilbers.de>
> ---
>   testsuite/dockerdata/.dockerignore        |   2 +
>   testsuite/dockerdata/Dockerfile           |  48 ++++++
>   testsuite/dockerdata/container-entrypoint |   9 ++
>   testsuite/dockerdata/contrib/oe-git-proxy | 187 ++++++++++++++++++++++
>   4 files changed, 246 insertions(+)
>   create mode 100644 testsuite/dockerdata/.dockerignore
>   create mode 100644 testsuite/dockerdata/Dockerfile
>   create mode 100755 testsuite/dockerdata/container-entrypoint
>   create mode 100755 testsuite/dockerdata/contrib/oe-git-proxy
> 
> diff --git a/testsuite/dockerdata/.dockerignore b/testsuite/dockerdata/.dockerignore
> new file mode 100644
> index 00000000..6e19512a
> --- /dev/null
> +++ b/testsuite/dockerdata/.dockerignore
> @@ -0,0 +1,2 @@
> +.dockerignore
> +Dockerfile
> diff --git a/testsuite/dockerdata/Dockerfile b/testsuite/dockerdata/Dockerfile
> new file mode 100644
> index 00000000..7372c752
> --- /dev/null
> +++ b/testsuite/dockerdata/Dockerfile
> @@ -0,0 +1,48 @@
> +FROM debian:bullseye-slim as isar-docker

Why not choose kas-isar as parent image and just add the CI specific 
needs? Is there a reason why you want to maintain this a second time?

Best,
Tobias

> +
> +ARG TARGETPLATFORM
> +ARG DEBIAN_FRONTEND=noninteractive
> +
> +RUN apt-get update && \
> +    apt-get install -y locales && \
> +    localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
> +
> +ENV LANG=en_US.utf8
> +ENV LC_ALL=en_US.UTF-8
> +
> +# Isar main dependencies
> +RUN apt-get install -y -f --no-install-recommends \
> +        binfmt-support bzip2 debootstrap dosfstools dpkg-dev gettext-base \
> +        git mtools parted python3 quilt qemu-user-static reprepro sudo \
> +        unzip xz-utils git-buildpackage pristine-tar sbuild schroot zstd \
> +        python3-distutils \
> +        umoci skopeo
> +
> +# Isar testsuite dependencies
> +RUN apt-get install --no-install-recommends -y \
> +        python3-pip && \
> +    pip3 --proxy=$https_proxy install avocado-framework==100.1 && \
> +    rm -rf $(pip3 cache dir) && \
> +    apt-get install -y -f --no-install-recommends \
> +        qemu-system ovmf
> +
> +RUN apt-get clean && \
> +    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
> +
> +COPY contrib/oe-git-proxy /usr/bin/
> +ENV GIT_PROXY_COMMAND="oe-git-proxy" \
> +    NO_PROXY="*"
> +
> +RUN echo "builder ALL=NOPASSWD: ALL" > /etc/sudoers.d/builder-nopasswd && \
> +    chmod 660 /etc/sudoers.d/builder-nopasswd && \
> +    echo "Defaults env_keep += \"ftp_proxy http_proxy https_proxy no_proxy\"" \
> +    > /etc/sudoers.d/env_keep && chmod 660 /etc/sudoers.d/env_keep
> +
> +RUN useradd builder --user-group --create-home --home-dir /builder && \
> +    sbuild-adduser builder >/dev/null 2>/dev/null
> +
> +COPY container-entrypoint /
> +
> +USER builder
> +
> +ENTRYPOINT ["/container-entrypoint"]
> diff --git a/testsuite/dockerdata/container-entrypoint b/testsuite/dockerdata/container-entrypoint
> new file mode 100755
> index 00000000..6af07932
> --- /dev/null
> +++ b/testsuite/dockerdata/container-entrypoint
> @@ -0,0 +1,9 @@
> +#!/bin/bash
> +
> +sudo update-binfmts --enable && [ -f /proc/sys/fs/binfmt_misc/status ]
> +
> +if [ -n "$1" ]; then
> +    exec "$@"
> +else
> +    exec bash
> +fi
> diff --git a/testsuite/dockerdata/contrib/oe-git-proxy b/testsuite/dockerdata/contrib/oe-git-proxy
> new file mode 100755
> index 00000000..aa9b9dc9
> --- /dev/null
> +++ b/testsuite/dockerdata/contrib/oe-git-proxy
> @@ -0,0 +1,187 @@
> +#!/bin/bash
> +
> +# oe-git-proxy is a simple tool to be via GIT_PROXY_COMMAND. It uses socat
> +# to make SOCKS5 or HTTPS proxy connections.
> +# It uses ALL_PROXY or all_proxy or http_proxy to determine the proxy server,
> +# protocol, and port.
> +# It uses NO_PROXY to skip using the proxy for a comma delimited list of
> +# hosts, host globs (*.example.com), IPs, or CIDR masks (192.168.1.0/24). It
> +# is known to work with both bash and dash shells.
> +#
> +# Example ALL_PROXY values:
> +# ALL_PROXY=socks://socks.example.com:1080
> +# ALL_PROXY=https://proxy.example.com:8080
> +#
> +# Copyright (c) 2013, Intel Corporation.
> +#
> +# SPDX-License-Identifier: GPL-2.0-only
> +#
> +# AUTHORS
> +# Darren Hart <dvhart@linux.intel.com>
> +
> +# disable pathname expansion, NO_PROXY fields could start with "*" or be it
> +set -f
> +
> +if [ $# -lt 2 -o "$1" = '--help' -o "$1" = '-h' ] ; then
> +    echo 'oe-git-proxy: error: the following arguments are required: host port'
> +    echo 'Usage: oe-git-proxy host port'
> +    echo ''
> +    echo 'OpenEmbedded git-proxy - a simple tool to be used via GIT_PROXY_COMMAND.'
> +    echo 'It uses socat to make SOCKS or HTTPS proxy connections.'
> +    echo 'It uses ALL_PROXY to determine the proxy server, protocol, and port.'
> +    echo 'It uses NO_PROXY to skip using the proxy for a comma delimited list'
> +    echo 'of hosts, host globs (*.example.com), IPs, or CIDR masks (192.168.1.0/24).'
> +    echo 'It is known to work with both bash and dash shells.runs native tools'
> +    echo ''
> +    echo 'arguments:'
> +    echo '  host                proxy host to use'
> +    echo '  port                proxy port to use'
> +    echo ''
> +    echo 'options:'
> +    echo '  -h, --help          show this help message and exit'
> +    echo ''
> +    exit 2
> +fi
> +
> +# Locate the netcat binary
> +if [ -z "$SOCAT" ]; then
> +	SOCAT=$(which socat 2>/dev/null)
> +	if [ $? -ne 0 ]; then
> +		echo "ERROR: socat binary not in PATH" 1>&2
> +		exit 1
> +	fi
> +fi
> +METHOD=""
> +
> +# Test for a valid IPV4 quad with optional bitmask
> +valid_ipv4() {
> +	echo $1 | egrep -q "^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}(/(3[0-2]|[1-2]?[0-9]))?$"
> +	return $?
> +}
> +
> +# Convert an IPV4 address into a 32bit integer
> +ipv4_val() {
> +	IP="$1"
> +	SHIFT=24
> +	VAL=0
> +	for B in $( echo "$IP" | tr '.' ' ' ); do
> +		VAL=$(($VAL+$(($B<<$SHIFT))))
> +		SHIFT=$(($SHIFT-8))
> +	done
> +	echo "$VAL"
> +}
> +
> +# Determine if two IPs are equivalent, or if the CIDR contains the IP
> +match_ipv4() {
> +	CIDR=$1
> +	IP=$2
> +
> +	if [ -z "${IP%%$CIDR}" ]; then
> +		return 0
> +	fi
> +
> +	# Determine the mask bitlength
> +	BITS=${CIDR##*/}
> +	[ "$BITS" != "$CIDR" ] || BITS=32
> +	if [ -z "$BITS" ]; then
> +		return 1
> +	fi
> +
> +	IPVAL=$(ipv4_val $IP)
> +	IP2VAL=$(ipv4_val ${CIDR%%/*})
> +
> +	# OR in the unmasked bits
> +	for i in $(seq 0 $((32-$BITS))); do
> +		IP2VAL=$(($IP2VAL|$((1<<$i))))
> +		IPVAL=$(($IPVAL|$((1<<$i))))
> +	done
> +
> +	if [ $IPVAL -eq $IP2VAL ]; then
> +		return 0
> +	fi
> +	return 1
> +}
> +
> +# Test to see if GLOB matches HOST
> +match_host() {
> +	HOST=$1
> +	GLOB=$2
> +
> +	if [ -z "${HOST%%*$GLOB}" ]; then
> +		return 0
> +	fi
> +
> +	# Match by netmask
> +	if valid_ipv4 $GLOB; then
> +		for HOST_IP in $(getent ahostsv4 $HOST | grep ' STREAM ' | cut -d ' ' -f 1) ; do
> +			if valid_ipv4 $HOST_IP; then
> +				match_ipv4 $GLOB $HOST_IP
> +				if [ $? -eq 0 ]; then
> +					return 0
> +				fi
> +			fi
> +		done
> +	fi
> +
> +	return 1
> +}
> +
> +# If no proxy is set or needed, just connect directly
> +METHOD="TCP:$1:$2"
> +
> +[ -z "${ALL_PROXY}" ] && ALL_PROXY=$all_proxy
> +[ -z "${ALL_PROXY}" ] && ALL_PROXY=$http_proxy
> +
> +if [ -z "$ALL_PROXY" ]; then
> +	exec $SOCAT STDIO $METHOD
> +fi
> +
> +# Connect directly to hosts in NO_PROXY
> +for H in $( echo "$NO_PROXY" | tr ',' ' ' ); do
> +	if match_host $1 $H; then
> +		exec $SOCAT STDIO $METHOD
> +	fi
> +done
> +
> +# Proxy is necessary, determine protocol, server, and port
> +# extract protocol
> +PROTO=${ALL_PROXY%://*}
> +# strip protocol:// from string
> +ALL_PROXY=${ALL_PROXY#*://}
> +# extract host & port parts:
> +#   1) drop username/password
> +PROXY=${ALL_PROXY##*@}
> +#   2) remove optional trailing /?
> +PROXY=${PROXY%%/*}
> +#   3) extract optional port
> +PORT=${PROXY##*:}
> +if [ "$PORT" = "$PROXY" ]; then
> +	PORT=""
> +fi
> +#   4) remove port
> +PROXY=${PROXY%%:*}
> +
> +# extract username & password
> +PROXYAUTH="${ALL_PROXY%@*}"
> +[ "$PROXYAUTH" = "$ALL_PROXY" ] && PROXYAUTH=
> +[ -n "${PROXYAUTH}" ] && PROXYAUTH=",proxyauth=${PROXYAUTH}"
> +
> +if [ "$PROTO" = "socks" ] || [ "$PROTO" = "socks4a" ]; then
> +	if [ -z "$PORT" ]; then
> +		PORT="1080"
> +	fi
> +	METHOD="SOCKS4A:$PROXY:$1:$2,socksport=$PORT"
> +elif [ "$PROTO" = "socks4" ]; then
> +	if [ -z "$PORT" ]; then
> +		PORT="1080"
> +	fi
> +	METHOD="SOCKS4:$PROXY:$1:$2,socksport=$PORT"
> +else
> +	# Assume PROXY (http, https, etc)
> +	if [ -z "$PORT" ]; then
> +		PORT="8080"
> +	fi
> +	METHOD="PROXY:$PROXY:$1:$2,proxyport=${PORT}${PROXYAUTH}"
> +fi
> +
> +exec $SOCAT STDIO "$METHOD"

  reply	other threads:[~2023-03-09  7:57 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-07  4:36 [PATCH 0/3] Switch to own " Uladzimir Bely
2023-03-07  4:36 ` [PATCH 1/3] testsuite: Dockerfile for " Uladzimir Bely
2023-03-09  7:57   ` Schaffner, Tobias [this message]
2023-03-09  9:05     ` Baurzhan Ismagulov
2023-03-09  9:14       ` Uladzimir Bely
2023-03-09 11:10         ` Jan Kiszka
2023-03-09 11:07       ` Jan Kiszka
2023-03-07  4:36 ` [PATCH 2/3] testsuite: Add README for isar-docker Uladzimir Bely
2023-03-07  4:36 ` [PATCH 3/3] gitlab-ci: Switch to own isar-docker image Uladzimir Bely
2023-03-14 13:49 ` [PATCH 0/3] " Henning Schild
2023-03-14 14:00   ` Jan Kiszka
2023-03-14 14:25     ` Henning Schild
2023-03-14 14:28       ` Jan Kiszka

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=978dd08a-bff6-eefa-1b54-8388ecbcf56c@siemens.com \
    --to=tobias.schaffner@siemens.com \
    --cc=isar-users@googlegroups.com \
    --cc=ubely@ilbers.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox