mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
32b1f26c51
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
4a6ce94da5
Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
159 lines
6.5 KiB
Bash
159 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
|