Skip to content

Commit ad59d20

Browse files
authored
Merge pull request #57 from igchor/auto_docker_build
Auto docker build
2 parents 2561f45 + 880f7dc commit ad59d20

File tree

10 files changed

+510
-37
lines changed

10 files changed

+510
-37
lines changed

.github/workflows/build-cachelib-centos.yml

Lines changed: 0 additions & 37 deletions
This file was deleted.
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
name: build-cachelib-docker
2+
on:
3+
push:
4+
pull_request:
5+
6+
jobs:
7+
build-cachelib-docker:
8+
name: "CentOS/latest - Build CacheLib with all dependencies"
9+
runs-on: ubuntu-latest
10+
env:
11+
REPO: cachelib
12+
GITHUB_REPO: pmem/CacheLib
13+
CONTAINER_REG: ghcr.io/pmem/cachelib
14+
CONTAINER_REG_USER: ${{ secrets.GH_CR_USER }}
15+
CONTAINER_REG_PASS: ${{ secrets.GH_CR_PAT }}
16+
FORCE_IMAGE_ACTION: ${{ secrets.FORCE_IMAGE_ACTION }}
17+
HOST_WORKDIR: ${{ github.workspace }}
18+
WORKDIR: docker
19+
IMG_VER: devel
20+
strategy:
21+
matrix:
22+
CONFIG: ["OS=centos OS_VER=8streams PUSH_IMAGE=1"]
23+
steps:
24+
- name: "System Information"
25+
run: |
26+
echo === uname ===
27+
uname -a
28+
echo === /etc/os-release ===
29+
cat /etc/os-release
30+
echo === df -hl ===
31+
df -hl
32+
echo === free -h ===
33+
free -h
34+
echo === top ===
35+
top -b -n1 -1 -Eg || timeout 1 top -b -n1
36+
echo === env ===
37+
env
38+
echo === gcc -v ===
39+
gcc -v
40+
- name: "checkout sources"
41+
uses: actions/checkout@v2
42+
43+
- name: Pull the image or rebuild and push it
44+
run: cd $WORKDIR && ${{ matrix.CONFIG }} ./pull-or-rebuild-image.sh $FORCE_IMAGE_ACTION
45+
46+
- name: Run the build
47+
run: cd $WORKDIR && ${{ matrix.CONFIG }} ./build.sh

docker/build.sh

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
#!/usr/bin/env bash
2+
# SPDX-License-Identifier: BSD-3-Clause
3+
# Copyright 2022, Intel Corporation
4+
5+
#
6+
# build.sh - runs a Docker container from a Docker image with environment
7+
# prepared for running CacheLib builds and tests. It uses Docker image
8+
# tagged as described in ./images/build-image.sh.
9+
#
10+
# Notes:
11+
# - set env var 'HOST_WORKDIR' to where the root of this project is on the host machine,
12+
# - set env var 'OS' and 'OS_VER' properly to a system/Docker you want to build this
13+
# repo on (for proper values take a look at the list of Dockerfiles at the
14+
# utils/docker/images directory in this repo), e.g. OS=ubuntu, OS_VER=20.04,
15+
# - set env var 'CONTAINER_REG' to container registry address
16+
# [and possibly user/org name, and package name], e.g. "<CR_addr>/pmem/CacheLib",
17+
# - set env var 'DNS_SERVER' if you use one,
18+
# - set env var 'COMMAND' to execute specific command within Docker container or
19+
# env var 'TYPE' to pick command based on one of the predefined types of build (see below).
20+
#
21+
22+
set -e
23+
24+
source $(dirname ${0})/set-ci-vars.sh
25+
IMG_VER=${IMG_VER:-devel}
26+
TAG="${OS}-${OS_VER}-${IMG_VER}"
27+
IMAGE_NAME=${CONTAINER_REG}:${TAG}
28+
CONTAINER_NAME=CacheLib-${OS}-${OS_VER}
29+
WORKDIR=/CacheLib # working dir within Docker container
30+
SCRIPTSDIR=${WORKDIR}/docker
31+
32+
if [[ -z "${OS}" || -z "${OS_VER}" ]]; then
33+
echo "ERROR: The variables OS and OS_VER have to be set " \
34+
"(e.g. OS=fedora, OS_VER=32)."
35+
exit 1
36+
fi
37+
38+
if [[ -z "${HOST_WORKDIR}" ]]; then
39+
echo "ERROR: The variable HOST_WORKDIR has to contain a path to " \
40+
"the root of this project on the host machine."
41+
exit 1
42+
fi
43+
44+
if [[ -z "${CONTAINER_REG}" ]]; then
45+
echo "ERROR: CONTAINER_REG environment variable is not set " \
46+
"(e.g. \"<registry_addr>/<org_name>/<package_name>\")."
47+
exit 1
48+
fi
49+
50+
# Set command to execute in the Docker container
51+
COMMAND="./run-build.sh";
52+
echo "COMMAND to execute within Docker container: ${COMMAND}"
53+
54+
if [ -n "${DNS_SERVER}" ]; then DOCKER_OPTS="${DOCKER_OPTS} --dns=${DNS_SERVER}"; fi
55+
56+
# Check if we are running on a CI (Travis or GitHub Actions)
57+
[ -n "${GITHUB_ACTIONS}" -o -n "${TRAVIS}" ] && CI_RUN="YES" || CI_RUN="NO"
58+
59+
# Do not allocate a pseudo-TTY if we are running on GitHub Actions
60+
[ ! "${GITHUB_ACTIONS}" ] && DOCKER_OPTS="${DOCKER_OPTS} --tty=true"
61+
62+
63+
echo "Running build using Docker image: ${IMAGE_NAME}"
64+
65+
# Run a container with
66+
# - environment variables set (--env)
67+
# - host directory containing source mounted (-v)
68+
# - working directory set (-w)
69+
docker run --privileged=true --name=${CONTAINER_NAME} -i \
70+
${DOCKER_OPTS} \
71+
--env http_proxy=${http_proxy} \
72+
--env https_proxy=${https_proxy} \
73+
--env TERM=xterm-256color \
74+
--env WORKDIR=${WORKDIR} \
75+
--env SCRIPTSDIR=${SCRIPTSDIR} \
76+
--env GITHUB_REPO=${GITHUB_REPO} \
77+
--env CI_RUN=${CI_RUN} \
78+
--env TRAVIS=${TRAVIS} \
79+
--env GITHUB_ACTIONS=${GITHUB_ACTIONS} \
80+
--env CI_COMMIT=${CI_COMMIT} \
81+
--env CI_COMMIT_RANGE=${CI_COMMIT_RANGE} \
82+
--env CI_BRANCH=${CI_BRANCH} \
83+
--env CI_EVENT_TYPE=${CI_EVENT_TYPE} \
84+
--env CI_REPO_SLUG=${CI_REPO_SLUG} \
85+
--env DOC_UPDATE_GITHUB_TOKEN=${DOC_UPDATE_GITHUB_TOKEN} \
86+
--env DOC_UPDATE_BOT_NAME=${DOC_UPDATE_BOT_NAME} \
87+
--env DOC_REPO_OWNER=${DOC_REPO_OWNER} \
88+
--env COVERITY_SCAN_TOKEN=${COVERITY_SCAN_TOKEN} \
89+
--env COVERITY_SCAN_NOTIFICATION_EMAIL=${COVERITY_SCAN_NOTIFICATION_EMAIL} \
90+
--env TEST_TIMEOUT=${TEST_TIMEOUT} \
91+
--env TZ='Europe/Warsaw' \
92+
--shm-size=4G \
93+
-v ${HOST_WORKDIR}:${WORKDIR} \
94+
-v /etc/localtime:/etc/localtime \
95+
-w ${SCRIPTSDIR} \
96+
${IMAGE_NAME} ${COMMAND}
97+

docker/images/build-image.sh

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#!/usr/bin/env bash
2+
# SPDX-License-Identifier: BSD-3-Clause
3+
# Copyright 2016-2021, Intel Corporation
4+
#
5+
# build-image.sh - prepares a Docker image with <OS>-based environment for
6+
# testing (or dev) purpose, tagged with ${CONTAINER_REG}:${OS}-${OS_VER}-${IMG_VER},
7+
# according to the ${OS}-${OS_VER}.Dockerfile file located in the same directory.
8+
# IMG_VER is a version of Docker image (it usually relates to project's release tag)
9+
# and it defaults to "devel".
10+
#
11+
12+
set -e
13+
IMG_VER=${IMG_VER:-devel}
14+
TAG="${OS}-${OS_VER}-${IMG_VER}"
15+
16+
if [[ -z "${OS}" || -z "${OS_VER}" ]]; then
17+
echo "ERROR: The variables OS and OS_VER have to be set " \
18+
"(e.g. OS=fedora, OS_VER=34)."
19+
exit 1
20+
fi
21+
22+
if [[ -z "${CONTAINER_REG}" ]]; then
23+
echo "ERROR: CONTAINER_REG environment variable is not set " \
24+
"(e.g. \"<registry_addr>/<org_name>/<package_name>\")."
25+
exit 1
26+
fi
27+
28+
echo "Check if the file ${OS}-${OS_VER}.Dockerfile exists"
29+
if [[ ! -f "${OS}-${OS_VER}.Dockerfile" ]]; then
30+
echo "Error: ${OS}-${OS_VER}.Dockerfile does not exist."
31+
exit 1
32+
fi
33+
34+
echo "Build a Docker image tagged with: ${CONTAINER_REG}:${TAG}"
35+
docker build -t ${CONTAINER_REG}:${TAG} \
36+
--build-arg http_proxy=$http_proxy \
37+
--build-arg https_proxy=$https_proxy \
38+
-f ${OS}-${OS_VER}.Dockerfile .
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
FROM quay.io/centos/centos:stream8
2+
3+
RUN dnf install -y \
4+
cmake \
5+
sudo \
6+
git \
7+
tzdata \
8+
vim \
9+
gdb \
10+
clang
11+
12+
COPY ./install-cachelib-deps.sh ./install-cachelib-deps.sh
13+
RUN ./install-cachelib-deps.sh
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#!/usr/bin/env bash
2+
# SPDX-License-Identifier: BSD-3-Clause
3+
# Copyright 2022, Intel Corporation
4+
5+
git clone https://github.com/pmem/CacheLib CacheLib
6+
7+
./CacheLib/contrib/prerequisites-centos8.sh
8+
9+
for pkg in zstd googleflags googlelog googletest sparsemap fmt folly fizz wangle fbthrift ;
10+
do
11+
sudo ./CacheLib/contrib/build-package.sh -j -I /opt/ "$pkg"
12+
done
13+
14+
rm -rf CacheLib

docker/images/push-image.sh

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#!/usr/bin/env bash
2+
# SPDX-License-Identifier: BSD-3-Clause
3+
# Copyright 2016-2021, Intel Corporation
4+
5+
#
6+
# push-image.sh - pushes the Docker image tagged as described in
7+
# ./build-image.sh, to the ${CONTAINER_REG}.
8+
#
9+
# The script utilizes ${CONTAINER_REG_USER} and ${CONTAINER_REG_PASS} variables to
10+
# log in to the ${CONTAINER_REG}. The variables can be set in the CI's configuration
11+
# for automated builds.
12+
#
13+
14+
set -e
15+
IMG_VER=${IMG_VER:-devel}
16+
TAG="${OS}-${OS_VER}-${IMG_VER}"
17+
18+
if [[ -z "${OS}" || -z "${OS_VER}" ]]; then
19+
echo "ERROR: The variables OS and OS_VER have to be set " \
20+
"(e.g. OS=fedora, OS_VER=34)."
21+
exit 1
22+
fi
23+
24+
if [[ -z "${CONTAINER_REG}" ]]; then
25+
echo "ERROR: CONTAINER_REG environment variable is not set " \
26+
"(e.g. \"<registry_addr>/<org_name>/<package_name>\")."
27+
exit 1
28+
fi
29+
30+
if [[ -z "${CONTAINER_REG_USER}" || -z "${CONTAINER_REG_PASS}" ]]; then
31+
echo "ERROR: variables CONTAINER_REG_USER=\"${CONTAINER_REG_USER}\" and " \
32+
"CONTAINER_REG_PASS=\"${CONTAINER_REG_PASS}\"" \
33+
"have to be set properly to allow login to the Container Registry."
34+
exit 1
35+
fi
36+
37+
# Check if the image tagged with ${CONTAINER_REG}:${TAG} exists locally
38+
if [[ ! $(docker images -a | awk -v pattern="^${CONTAINER_REG}:${TAG}\$" \
39+
'$1":"$2 ~ pattern') ]]
40+
then
41+
echo "ERROR: Docker image tagged ${CONTAINER_REG}:${TAG} does not exist locally."
42+
exit 1
43+
fi
44+
45+
echo "Log in to the Container Registry: ${CONTAINER_REG}"
46+
echo "${CONTAINER_REG_PASS}" | docker login ghcr.io -u="${CONTAINER_REG_USER}" --password-stdin
47+
48+
echo "Push the image to the Container Registry"
49+
docker push ${CONTAINER_REG}:${TAG}

0 commit comments

Comments
 (0)