diff --git a/.circleci/config.yml b/.circleci/config.yml index 41fe25837..130247282 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,9 +3,16 @@ jobs: build: machine: image: ubuntu-1604:201903-01 + environment: + DOKKU_HOST: dokku.me + DOKKU_PORT: 3022 parallelism: 4 steps: - checkout + - run: | + make ci-dependencies + - run: | + ./tests/ci/setup.sh - run: | if [[ "$(lsb_release -rs)" == "14.04" ]]; then # dokku.me now resolves to 10.0.0.2. add 10.0.0.2/24 to eth0 @@ -14,12 +21,6 @@ jobs: # dokku.me now resolves to 10.0.0.2. add 10.0.0.2/24 to ens4 sudo ip a a 10.0.0.2/24 broadcast 10.0.0.255 dev ens4 fi - - run: | - make ci-dependencies - - run: | - ./tests/ci/setup.sh - - run: | - echo 'export DOKKU_SKIP_CLEANUP=true' | sudo tee /home/dokku/.dokkurc/dokku_skip_cleanup - run: | case $CIRCLE_NODE_INDEX in 0) sudo -E make -e lint go-tests ci-go-coverage ;; diff --git a/.dockerignore b/.dockerignore index a89678a7f..29e2c3436 100644 --- a/.dockerignore +++ b/.dockerignore @@ -6,6 +6,7 @@ contrib build docs tests +!build/dokku.deb !contrib/dokku-installer.py !contrib/dokku-update !contrib/bash-completion diff --git a/Dockerfile b/Dockerfile index 0032a9c75..3dc52667a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,43 +10,43 @@ ARG DOKKU_SKIP_KEY_FILE=true ARG DOKKU_VHOST_ENABLE=false ARG DOKKU_WEB_CONFIG=false -RUN addgroup --gid $DOKKU_GID dokku && \ - adduser --uid $DOKKU_UID --gid $DOKKU_GID --disabled-password --gecos "" "dokku" +COPY ./build/dokku.deb /tmp/dokku.deb -RUN echo "dokku dokku/hostname string $DOKKU_HOSTNAME" | debconf-set-selections && \ - echo "dokku dokku/skip_key_file boolean $DOKKU_SKIP_KEY_FILE" | debconf-set-selections && \ - echo "dokku dokku/vhost_enable boolean $DOKKU_VHOST_ENABLE" | debconf-set-selections && \ - echo "dokku dokku/web_config boolean $DOKKU_WEB_CONFIG" | debconf-set-selections && \ - curl -sSL https://packagecloud.io/dokku/dokku/gpgkey | apt-key add - && \ - echo "deb https://packagecloud.io/dokku/dokku/ubuntu/ bionic main" | tee /etc/apt/sources.list.d/dokku.list && \ - apt-get update && apt-get -y upgrade && apt-get --no-install-recommends -qq -y install \ - dokku \ - rsync && \ - apt-get purge -y syslog-ng-core && \ - apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* +RUN addgroup --gid $DOKKU_GID dokku \ + && adduser --uid $DOKKU_UID --gid $DOKKU_GID --disabled-password --gecos "" "dokku" + +RUN echo "dokku dokku/hostname string $DOKKU_HOSTNAME" | debconf-set-selections \ + && echo "dokku dokku/skip_key_file boolean $DOKKU_SKIP_KEY_FILE" | debconf-set-selections \ + && echo "dokku dokku/vhost_enable boolean $DOKKU_VHOST_ENABLE" | debconf-set-selections \ + && echo "dokku dokku/web_config boolean $DOKKU_WEB_CONFIG" | debconf-set-selections \ + && curl -sSL https://packagecloud.io/dokku/dokku/gpgkey | apt-key add - \ + && echo "deb https://packagecloud.io/dokku/dokku/ubuntu/ bionic main" | tee /etc/apt/sources.list.d/dokku.list \ + && apt-get update -qq \ + && apt-get install --no-install-recommends --only-upgrade -y -qq openssl openssh-server \ + && apt --no-install-recommends -qq -y install rsync /tmp/dokku.deb \ + && apt-get purge -y -q syslog-ng-core \ + && apt-get autoremove -y -q \ + && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* WORKDIR /tmp COPY ./docker . RUN \ - rsync -a /tmp/ / && \ - rm -rf /tmp/* && \ - rm /etc/runit/runsvdir/default/sshd/down && \ - chown -R dokku:dokku /home/dokku/ && \ - mkdir -p /skel/etc /skel/home /skel/var/lib/dokku /var/log/services && \ - mv /etc/ssh /skel/etc/ssh && \ - mv /home/dokku /skel/home/dokku && \ - mv /var/lib/dokku/config /skel/var/lib/dokku/config && \ - mv /var/lib/dokku/data /skel/var/lib/dokku/data && \ - ln -sf /mnt/dokku/etc/ssh /etc/ssh && \ - ln -sf /mnt/dokku/home/dokku /home/dokku && \ - ln -sf /mnt/dokku/var/lib/dokku/config /var/lib/dokku/config && \ - ln -sf /mnt/dokku/var/lib/dokku/data /var/lib/dokku/data && \ - mv /etc/my_init.d/00_regen_ssh_host_keys.sh \ - /etc/my_init.d/15_regen_ssh_host_keys && \ - rm /etc/nginx/sites-enabled/default && \ - rm /usr/share/nginx/html/index.html && \ - rm /etc/my_init.d/10_syslog-ng.init && \ - sed -i '/imklog/d' /etc/rsyslog.conf && \ - rm /var/log/btmp /var/log/wtmp /var/log/*log /var/log/apt/* /var/log/dokku/* /var/log/nginx/* + rsync -a /tmp/ / \ + && rm -rf /tmp/* \ + && rm /etc/runit/runsvdir/default/sshd/down \ + && chown -R dokku:dokku /home/dokku/ \ + && mkdir -p /skel/etc /skel/home /skel/var/lib/dokku /var/log/services \ + && mv /etc/ssh /skel/etc/ssh \ + && mv /home/dokku /skel/home/dokku \ + && mv /var/lib/dokku/config /skel/var/lib/dokku/config \ + && mv /var/lib/dokku/data /skel/var/lib/dokku/data \ + && ln -sf /mnt/dokku/etc/ssh /etc/ssh \ + && ln -sf /mnt/dokku/home/dokku /home/dokku \ + && ln -sf /mnt/dokku/var/lib/dokku/config /var/lib/dokku/config \ + && ln -sf /mnt/dokku/var/lib/dokku/data /var/lib/dokku/data \ + && mv /etc/my_init.d/00_regen_ssh_host_keys.sh /etc/my_init.d/15_regen_ssh_host_keys \ + && rm /etc/nginx/sites-enabled/default /usr/share/nginx/html/index.html /etc/my_init.d/10_syslog-ng.init \ + && sed -i '/imklog/d' /etc/rsyslog.conf \ + && rm /var/log/btmp /var/log/wtmp /var/log/*log /var/log/apt/* /var/log/dokku/* /var/log/nginx/* diff --git a/contrib/dokku-docker-bin.sh b/contrib/dokku-docker-bin.sh new file mode 100755 index 000000000..f20ae5928 --- /dev/null +++ b/contrib/dokku-docker-bin.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +set -eo pipefail +[[ $DOKKU_TRACE ]] && set -x && DOKKU_DOCKER_ENV="--env DOKKU_TRACE=on" +DOKKU_DOCKER_CONTAINER_NAME=${DOKKU_DOCKER_CONTAINER_NAME:=dokku} + +# TODO: handle cases where we need a tty +DOCKER_CMD="docker exec $DOKKU_DOCKER_ENV -i $DOKKU_DOCKER_CONTAINER_NAME dokku $*" + +exec "$DOCKER_CMD" diff --git a/contrib/release-dokku b/contrib/release-dokku index 3fa7b3890..f56d4e564 100755 --- a/contrib/release-dokku +++ b/contrib/release-dokku @@ -319,6 +319,13 @@ fn-require-bin() { fi } +fn-build-docker-image() { + declare desc="Builds the dokku docker image and tags it with the given version" + declare VERSION="$1" + docker build -t "dokku/dokku:$VERSION" . + docker push "dokku/dokku:$VERSION" +} + main() { declare RELEASE="$1" local CURRENT_VERSION NEXT_VERSION IS_RELEASE @@ -360,14 +367,14 @@ main() { if [[ "$RELEASE" != "build" ]]; then fn-publish-package "$IS_RELEASE" "deb" "build/dokku_${NEXT_VERSION}_amd64.deb" || log-fail "Error publishing deb package" fn-publish-package "$IS_RELEASE" "rpm" "build/dokku-${NEXT_VERSION}-1.x86_64.rpm" || log-fail "Error publishing rpm package" - docker build -t "dokku/dokku:$NEXT_VERSION" . - docker push "dokku/dokku:$NEXT_VERSION" + fn-build-docker-image "$NEXT_VERSION" || log-fail "Error building docker image" fn-repo-push-tags "$IS_RELEASE" fi if [[ "$IS_RELEASE" != "true" ]]; then git reset -q HEAD plugins/*/plugin.toml git checkout -- plugins/*/plugin.toml + cp "build/dokku_${NEXT_VERSION}_amd64.deb" build/dokku.deb fi echo "build/dokku_${NEXT_VERSION}_amd64.deb" >build/deb-filename diff --git a/debian/postinst b/debian/postinst index 014926a76..0cc555dda 100755 --- a/debian/postinst +++ b/debian/postinst @@ -40,6 +40,7 @@ case "$1" in egrep -i "^docker" /etc/group || groupadd docker usermod -aG docker dokku + mkdir -p ${DOKKU_ROOT}/.dokkurc echo "Setting up storage directories" mkdir -p ${DOKKU_LIB_ROOT}/data ${DOKKU_LIB_ROOT}/data/storage diff --git a/rpm/dokku.postinst b/rpm/dokku.postinst index 4658c75b1..182e645c0 100644 --- a/rpm/dokku.postinst +++ b/rpm/dokku.postinst @@ -9,6 +9,7 @@ setup-user() { touch "$DOKKU_ROOT/.ssh/authorized_keys" chown -R dokku:dokku "$DOKKU_ROOT/.ssh" usermod -aG docker dokku + mkdir -p "$DOKKU_ROOT/.dokkurc" } setup-storage() { diff --git a/tests.mk b/tests.mk index c42dc22b3..f93f97ae5 100644 --- a/tests.mk +++ b/tests.mk @@ -45,10 +45,9 @@ endif ci-dependencies: bats shellcheck shfmt xmlstarlet setup-deploy-tests: - mkdir -p /home/dokku ifdef ENABLE_DOKKU_TRACE echo "-----> Enabling tracing" - echo "export DOKKU_TRACE=1" >> /home/dokku/dokkurc + docker exec -ti dokku bash -c 'echo "export DOKKU_TRACE=1" >> /home/dokku/dokkurc' endif @echo "Setting dokku.me in /etc/hosts" sudo /bin/bash -c "[[ `ping -c1 dokku.me >/dev/null 2>&1; echo $$?` -eq 0 ]] || echo \"127.0.0.1 dokku.me *.dokku.me www.test.app.dokku.me\" >> /etc/hosts" @@ -61,33 +60,20 @@ endif @echo "-----> Setting up ssh config..." ifneq ($(shell ls /root/.ssh/config >/dev/null 2>&1 ; echo $$?),0) - echo "Host dokku.me \\r\\n RequestTTY yes \\r\\n IdentityFile /root/.ssh/dokku_test_rsa" >> /root/.ssh/config + echo "Host dokku.me \\r\\n Port 3022 \\r\\n RequestTTY yes \\r\\n IdentityFile /root/.ssh/dokku_test_rsa" >> /root/.ssh/config echo "Host 127.0.0.1 \\r\\n Port 22333 \\r\\n RequestTTY yes \\r\\n IdentityFile /root/.ssh/dokku_test_rsa" >> /root/.ssh/config else ifeq ($(shell grep dokku.me /root/.ssh/config),) - echo "Host dokku.me \\r\\n RequestTTY yes \\r\\n IdentityFile /root/.ssh/dokku_test_rsa" >> /root/.ssh/config + echo "Host dokku.me \\r\\n Port 3022 \\r\\n RequestTTY yes \\r\\n IdentityFile /root/.ssh/dokku_test_rsa" >> /root/.ssh/config echo "Host 127.0.0.1 \\r\\n Port 22333 \\r\\n RequestTTY yes \\r\\n IdentityFile /root/.ssh/dokku_test_rsa" >> /root/.ssh/config endif -ifneq ($(wildcard /etc/ssh/sshd_config),) - sed --in-place "s/^#Port 22$\/Port 22/g" /etc/ssh/sshd_config -ifeq ($(shell grep 22333 /etc/ssh/sshd_config),) - sed --in-place "s:^Port 22:Port 22 \\nPort 22333:g" /etc/ssh/sshd_config -endif - service ssh restart -endif - @echo "-----> Installing SSH public key..." - sudo sshcommand acl-remove dokku test - cat /root/.ssh/dokku_test_rsa.pub | sudo sshcommand acl-add dokku test + docker exec -ti dokku bash -c "sshcommand acl-remove dokku test" + docker exec -ti dokku bash -c "echo `cat /root/.ssh/dokku_test_rsa.pub` | sshcommand acl-add dokku test" @echo "-----> Intitial SSH connection to populate known_hosts..." - ssh -o StrictHostKeyChecking=no dokku@dokku.me help >/dev/null - ssh -o StrictHostKeyChecking=no dokku@127.0.0.1 help >/dev/null - -ifeq ($(shell grep dokku.me /home/dokku/VHOST 2>/dev/null),) - @echo "-----> Setting default VHOST to dokku.me..." - echo "dokku.me" > /home/dokku/VHOST -endif + sudo ssh -o StrictHostKeyChecking=no dokku@dokku.me help >/dev/null + sudo ssh -o StrictHostKeyChecking=no dokku@127.0.0.1 help >/dev/null lint-setup: @mkdir -p test-results/shellcheck tmp/shellcheck diff --git a/tests/ci/setup.sh b/tests/ci/setup.sh index 190f2812e..0eeeee7be 100755 --- a/tests/ci/setup.sh +++ b/tests/ci/setup.sh @@ -4,6 +4,8 @@ set -eo pipefail readonly ROOT_DIR="$(cd "$(dirname "$(dirname "$(dirname "${BASH_SOURCE[0]}")")")" && pwd)" install_dependencies() { + echo "=====> install_dependencies on CIRCLE_NODE_INDEX: $CIRCLE_NODE_INDEX" + mkdir -p "$ROOT_DIR/build/" HEROKUISH_VERSION=$(grep HEROKUISH_VERSION "${ROOT_DIR}/deb.mk" | head -n1 | cut -d' ' -f3) HEROKUISH_PACKAGE_NAME="herokuish_${HEROKUISH_VERSION}_amd64.deb" @@ -25,54 +27,59 @@ install_dependencies() { PROCFILE_UTIL_PACKAGE_NAME="procfile-util_${PROCFILE_VERSION}_amd64.deb" curl -L "https://packagecloud.io/dokku/dokku/packages/ubuntu/trusty/procfile-util_${PROCFILE_VERSION}_amd64.deb/download.deb" -o "$ROOT_DIR/build/${PROCFILE_UTIL_PACKAGE_NAME}" - sudo add-apt-repository -y ppa:nginx/stable - sudo apt-get update - sudo apt-get -qq -y install cgroupfs-mount nginx - sudo cp "${ROOT_DIR}/tests/dhparam.pem" /etc/nginx/dhparam.pem + sudo dpkg -i "${ROOT_DIR}/build/$HEROKUISH_PACKAGE_NAME" \ + "${ROOT_DIR}/build/$PLUGN_PACKAGE_NAME" \ + "${ROOT_DIR}/build/$SSHCOMMAND_PACKAGE_NAME" \ + "${ROOT_DIR}/build/$SIGIL_PACKAGE_NAME" \ + "${ROOT_DIR}/build/$PROCFILE_UTIL_PACKAGE_NAME" +} - sudo dpkg -i "${ROOT_DIR}/build/$HEROKUISH_PACKAGE_NAME" - sudo dpkg -i "${ROOT_DIR}/build/$PLUGN_PACKAGE_NAME" - sudo dpkg -i "${ROOT_DIR}/build/$SSHCOMMAND_PACKAGE_NAME" - sudo dpkg -i "${ROOT_DIR}/build/$SIGIL_PACKAGE_NAME" - sudo dpkg -i "${ROOT_DIR}/build/$PROCFILE_UTIL_PACKAGE_NAME" +build_dokku() { + echo "=====> build_dokku on CIRCLE_NODE_INDEX: $CIRCLE_NODE_INDEX" + "${ROOT_DIR}/contrib/release-dokku" build + docker build -t dokku/dokku:test . +} + +run_dokku_container() { + echo "=====> run_dokku_container on CIRCLE_NODE_INDEX: $CIRCLE_NODE_INDEX" + docker run -d \ + --env DOKKU_HOSTNAME=dokku.me \ + --name dokku \ + --publish 3022:22 \ + --publish 22333:22 \ + --publish 80:80 \ + --publish 443:443 \ + --volume /var/lib/dokku:/mnt/dokku \ + --volume /var/run/docker.sock:/var/run/docker.sock \ + dokku/dokku:test + + sleep 1 && docker logs dokku } install_dokku() { + echo "=====> install_dokku on CIRCLE_NODE_INDEX: $CIRCLE_NODE_INDEX" + if [[ "$FROM_SOURCE" == "true" ]]; then sudo -E CI=true make -e install return fi - "${ROOT_DIR}/contrib/release-dokku" build + build_dokku + run_dokku_container - echo "dokku dokku/hostname string dokku.me" | sudo debconf-set-selections - echo "dokku dokku/key_file string /root/.ssh/id_rsa.pub" | sudo debconf-set-selections - echo "dokku dokku/nginx_enable boolean true" | sudo debconf-set-selections - echo "dokku dokku/skip_key_file boolean true" | sudo debconf-set-selections - echo "dokku dokku/vhost_enable boolean true" | sudo debconf-set-selections - echo "dokku dokku/web_config boolean false" | sudo debconf-set-selections - sudo dpkg -i "$(cat "${ROOT_DIR}/build/deb-filename")" + sudo mkdir -p /usr/local/bin + sudo cp -v contrib/dokku-docker-bin.sh /usr/local/bin/dokku } # shellcheck disable=SC2120 setup_circle() { echo "=====> setup_circle on CIRCLE_NODE_INDEX: $CIRCLE_NODE_INDEX" - sudo -E CI=true make -e sshcommand - # need to add the dokku user to the docker group - sudo usermod -G docker dokku - [[ "$1" == "buildstack" ]] && BUILD_STACK=true make -e stack install_dependencies install_dokku sudo -E make -e setup-deploy-tests - bash --version - docker version lsb_release -a - # setup .dokkurc - sudo -E mkdir -p /home/dokku/.dokkurc - sudo -E chown dokku:ubuntu /home/dokku/.dokkurc - sudo -E chmod 775 /home/dokku/.dokkurc # pull node:4 image for testing sudo docker pull node:4 }