fa68c3585a
This adds the ability to have different profiles for individual distros and versions of the distro because they all ship with and depend on different versions of policy packages. The `selinux` dir contains the unmodified policy that is being used today. The `selinux-fedora` dir contains the new policy for fedora 24 with the changes for it to compile and work on the system. The fedora policy is from commit https://github.com/projectatomic/docker-selinux/commit/4a6ce94da5e34868642ebcc7a67da937d4c73283 Signed-off-by: Michael Crosby <crosbymichael@gmail.com> Upstream-commit: 32b1f26c5111b22fe4277879c4f5e4687a6a72fc Component: engine
160 lines
6.5 KiB
Bash
160 lines
6.5 KiB
Bash
#!/bin/bash
|
|
set -e
|
|
|
|
# subshell so that we can export PATH and TZ without breaking other things
|
|
(
|
|
export TZ=UTC # make sure our "date" variables are UTC-based
|
|
|
|
source "$(dirname "$BASH_SOURCE")/.integration-daemon-start"
|
|
source "$(dirname "$BASH_SOURCE")/.detect-daemon-osarch"
|
|
|
|
# TODO consider using frozen images for the dockercore/builder-rpm tags
|
|
|
|
rpmName=docker-engine
|
|
rpmVersion="$VERSION"
|
|
rpmRelease=1
|
|
|
|
# rpmRelease versioning is as follows
|
|
# Docker 1.7.0: version=1.7.0, release=1
|
|
# Docker 1.7.0-rc1: version=1.7.0, release=0.1.rc1
|
|
# Docker 1.7.0-cs1: version=1.7.0.cs1, release=1
|
|
# Docker 1.7.0-cs1-rc1: version=1.7.0.cs1, release=0.1.rc1
|
|
# Docker 1.7.0-dev nightly: version=1.7.0, release=0.0.YYYYMMDD.HHMMSS.gitHASH
|
|
|
|
# if we have a "-rc*" suffix, set appropriate release
|
|
if [[ "$rpmVersion" =~ .*-rc[0-9]+$ ]] ; then
|
|
rcVersion=${rpmVersion#*-rc}
|
|
rpmVersion=${rpmVersion%-rc*}
|
|
rpmRelease="0.${rcVersion}.rc${rcVersion}"
|
|
fi
|
|
|
|
DOCKER_GITCOMMIT=$(git rev-parse --short HEAD)
|
|
if [ -n "$(git status --porcelain --untracked-files=no)" ]; then
|
|
DOCKER_GITCOMMIT="$DOCKER_GITCOMMIT-unsupported"
|
|
fi
|
|
|
|
# if we have a "-dev" suffix or have change in Git, let's make this package version more complex so it works better
|
|
if [[ "$rpmVersion" == *-dev ]] || [ -n "$(git status --porcelain)" ]; then
|
|
gitUnix="$(git log -1 --pretty='%at')"
|
|
gitDate="$(date --date "@$gitUnix" +'%Y%m%d.%H%M%S')"
|
|
gitCommit="$(git log -1 --pretty='%h')"
|
|
gitVersion="${gitDate}.git${gitCommit}"
|
|
# gitVersion is now something like '20150128.112847.17e840a'
|
|
rpmVersion="${rpmVersion%-dev}"
|
|
rpmRelease="0.0.$gitVersion"
|
|
fi
|
|
|
|
# Replace any other dashes with periods
|
|
rpmVersion="${rpmVersion/-/.}"
|
|
|
|
rpmPackager="$(awk -F ': ' '$1 == "Packager" { print $2; exit }' hack/make/.build-rpm/${rpmName}.spec)"
|
|
rpmDate="$(date +'%a %b %d %Y')"
|
|
|
|
# if go-md2man is available, pre-generate the man pages
|
|
make manpages
|
|
|
|
# Convert the CHANGELOG.md file into RPM changelog format
|
|
VERSION_REGEX="^\W\W (.*) \((.*)\)$"
|
|
ENTRY_REGEX="^[-+*] (.*)$"
|
|
while read -r line || [[ -n "$line" ]]; do
|
|
if [ -z "$line" ]; then continue; fi
|
|
if [[ "$line" =~ $VERSION_REGEX ]]; then
|
|
echo >> contrib/builder/rpm/${PACKAGE_ARCH}/changelog
|
|
echo "* `date -d ${BASH_REMATCH[2]} '+%a %b %d %Y'` ${rpmPackager} - ${BASH_REMATCH[1]}" >> contrib/builder/rpm/${PACKAGE_ARCH}/changelog
|
|
fi
|
|
if [[ "$line" =~ $ENTRY_REGEX ]]; then
|
|
echo "- ${BASH_REMATCH[1]//\`}" >> contrib/builder/rpm/${PACKAGE_ARCH}/changelog
|
|
fi
|
|
done < CHANGELOG.md
|
|
|
|
builderDir="contrib/builder/rpm/${PACKAGE_ARCH}"
|
|
pkgs=( $(find "${builderDir}/"*/ -type d) )
|
|
if [ ! -z "$DOCKER_BUILD_PKGS" ]; then
|
|
pkgs=()
|
|
for p in $DOCKER_BUILD_PKGS; do
|
|
pkgs+=( "$builderDir/$p" )
|
|
done
|
|
fi
|
|
for dir in "${pkgs[@]}"; do
|
|
[ -d "$dir" ] || { echo >&2 "skipping nonexistent $dir"; continue; }
|
|
version="$(basename "$dir")"
|
|
suite="${version##*-}"
|
|
|
|
image="dockercore/builder-rpm:$version"
|
|
if ! docker inspect "$image" &> /dev/null; then
|
|
( set -x && docker build ${DOCKER_BUILD_ARGS} -t "$image" "$dir" )
|
|
fi
|
|
|
|
mkdir -p "$DEST/$version"
|
|
cat > "$DEST/$version/Dockerfile.build" <<-EOF
|
|
FROM $image
|
|
COPY . /usr/src/${rpmName}
|
|
RUN mkdir -p /go/src/github.com/docker && mkdir -p /go/src/github.com/opencontainers
|
|
EOF
|
|
|
|
# get the RUNC and CONTAINERD commit from the root Dockerfile, this keeps the commits in sync
|
|
awk '$1 == "ENV" && $2 == "RUNC_COMMIT" { print; exit }' Dockerfile >> "$DEST/$version/Dockerfile.build"
|
|
awk '$1 == "ENV" && $2 == "CONTAINERD_COMMIT" { print; exit }' Dockerfile >> "$DEST/$version/Dockerfile.build"
|
|
|
|
# add runc and containerd compile and install
|
|
cat >> "$DEST/$version/Dockerfile.build" <<-EOF
|
|
# Install runc
|
|
RUN git clone https://github.com/opencontainers/runc.git "/go/src/github.com/opencontainers/runc" \
|
|
&& cd "/go/src/github.com/opencontainers/runc" \
|
|
&& git checkout -q "\$RUNC_COMMIT"
|
|
RUN set -x && export GOPATH="/go" && cd "/go/src/github.com/opencontainers/runc" \
|
|
&& make BUILDTAGS="\$RUNC_BUILDTAGS" && make install
|
|
# Install containerd
|
|
RUN git clone https://github.com/docker/containerd.git "/go/src/github.com/docker/containerd" \
|
|
&& cd "/go/src/github.com/docker/containerd" \
|
|
&& git checkout -q "\$CONTAINERD_COMMIT"
|
|
RUN set -x && export GOPATH="/go" && cd "/go/src/github.com/docker/containerd" && make && make install
|
|
EOF
|
|
if [ "$DOCKER_EXPERIMENTAL" ]; then
|
|
echo 'ENV DOCKER_EXPERIMENTAL 1' >> "$DEST/$version/Dockerfile.build"
|
|
fi
|
|
cat >> "$DEST/$version/Dockerfile.build" <<-EOF
|
|
RUN mkdir -p /root/rpmbuild/SOURCES \
|
|
&& echo '%_topdir /root/rpmbuild' > /root/.rpmmacros
|
|
WORKDIR /root/rpmbuild
|
|
RUN ln -sfv /usr/src/${rpmName}/hack/make/.build-rpm SPECS
|
|
WORKDIR /root/rpmbuild/SPECS
|
|
RUN tar --exclude .git -r -C /usr/src -f /root/rpmbuild/SOURCES/${rpmName}.tar ${rpmName}
|
|
RUN tar --exclude .git -r -C /go/src/github.com/docker -f /root/rpmbuild/SOURCES/${rpmName}.tar containerd
|
|
RUN tar --exclude .git -r -C /go/src/github.com/opencontainers -f /root/rpmbuild/SOURCES/${rpmName}.tar runc
|
|
RUN gzip /root/rpmbuild/SOURCES/${rpmName}.tar
|
|
RUN { cat /usr/src/${rpmName}/contrib/builder/rpm/${PACKAGE_ARCH}/changelog; } >> ${rpmName}.spec && tail >&2 ${rpmName}.spec
|
|
RUN rpmbuild -ba \
|
|
--define '_gitcommit $DOCKER_GITCOMMIT' \
|
|
--define '_release $rpmRelease' \
|
|
--define '_version $rpmVersion' \
|
|
--define '_origversion $VERSION' \
|
|
--define '_experimental ${DOCKER_EXPERIMENTAL:-0}' \
|
|
${rpmName}.spec
|
|
EOF
|
|
# selinux policy referencing systemd things won't work on non-systemd versions
|
|
# of centos or rhel, which we don't support anyways
|
|
if [ "${suite%.*}" -gt 6 ] && [[ "$version" != opensuse* ]]; then
|
|
selinuxDir="selinux"
|
|
if [ -d "./contrib/selinux-$version" ]; then
|
|
selinuxDir="selinux-${version}"
|
|
fi
|
|
cat >> "$DEST/$version/Dockerfile.build" <<-EOF
|
|
RUN tar -cz -C /usr/src/${rpmName}/contrib/${selinuxDir} -f /root/rpmbuild/SOURCES/${rpmName}-selinux.tar.gz ${rpmName}-selinux
|
|
RUN rpmbuild -ba \
|
|
--define '_gitcommit $DOCKER_GITCOMMIT' \
|
|
--define '_release $rpmRelease' \
|
|
--define '_version $rpmVersion' \
|
|
--define '_origversion $VERSION' \
|
|
${rpmName}-selinux.spec
|
|
EOF
|
|
fi
|
|
tempImage="docker-temp/build-rpm:$version"
|
|
( set -x && docker build -t "$tempImage" -f $DEST/$version/Dockerfile.build . )
|
|
docker run --rm "$tempImage" bash -c 'cd /root/rpmbuild && tar -c *RPMS' | tar -xvC "$DEST/$version"
|
|
docker rmi "$tempImage"
|
|
done
|
|
|
|
source "$(dirname "$BASH_SOURCE")/.integration-daemon-stop"
|
|
) 2>&1 | tee -a $DEST/test.log
|