diff --git a/circle.yml b/circle.yml index 34ce1b34c..3ab50cccf 100644 --- a/circle.yml +++ b/circle.yml @@ -5,19 +5,9 @@ dependencies: cache_directories: - "~/docker" override: - # need to add the dokku user to the docker group - - sudo -E CI=true make -e sshcommand - - sudo usermod -G docker dokku - - sudo -E CI=true DOCKER_VERSION=1.5.0 make -e install: { timeout: 300 } - - make -e ci-dependencies - #### circle does some weird *expletive* with regards to root and gh auth (needed for gitsubmodules test) - - sudo rsync -a ~ubuntu/.ssh/ ~root/.ssh/ - - sudo chown -R root:root ~root/.ssh/ - - sudo sed -e 's:/home/ubuntu:/root:g' ~root/.ssh/config - #### - - sudo -E make -e setup-deploy-tests + - ./tests/ci/parallel_runner.sh setup: { timeout: 300 } post: - sudo -E make -e lint test: override: - - ./tests/ci/parallel_runner.sh: { parallel: true, timeout: 1800 } + - ./tests/ci/parallel_runner.sh testing: { parallel: true, timeout: 1800 } diff --git a/dokku b/dokku index c48397b98..1462d1619 100755 --- a/dokku +++ b/dokku @@ -37,7 +37,7 @@ fi if [[ -n "$SSH_ORIGINAL_COMMAND" ]]; then export -n SSH_ORIGINAL_COMMAND - if [[ $1 =~ config-* ]];then + if [[ $1 =~ config-* ]] || [[ $1 =~ docker-options* ]];then xargs $0 <<<$SSH_ORIGINAL_COMMAND exit $? else diff --git a/tests.mk b/tests.mk index 5c1931e54..68f3e32fc 100644 --- a/tests.mk +++ b/tests.mk @@ -28,8 +28,15 @@ 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 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 127.0.0.1 \\r\\n Port 22333 \\r\\n RequestTTY yes \\r\\n IdentityFile /root/.ssh/dokku_test_rsa" >> /root/.ssh/config +endif + +ifeq ($(shell grep 22333 /etc/ssh/sshd_config),) + sed --in-place "s:^Port 22:Port 22 \\nPort 22333:g" /etc/ssh/sshd_config + restart ssh endif @echo "-----> Installing SSH public key..." @@ -38,6 +45,7 @@ endif @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..." @@ -61,7 +69,11 @@ lint: unit-tests: @echo running unit tests... +ifndef UNIT_TEST_BATCH @$(QUIET) bats tests/unit +else + @$(QUIET) ./tests/ci/unit_test_runner.sh $$UNIT_TEST_BATCH +endif deploy-test-clojure: @echo deploying config app... @@ -125,7 +137,6 @@ deploy-test-static: deploy-tests: @echo running deploy tests... - # @$(QUIET) bats tests/deploy @$(QUIET) $(MAKE) deploy-test-config @$(QUIET) $(MAKE) deploy-test-clojure @$(QUIET) $(MAKE) deploy-test-dockerfile diff --git a/tests/ci/parallel_runner.sh b/tests/ci/parallel_runner.sh index 68e1038ff..8a664b8b8 100755 --- a/tests/ci/parallel_runner.sh +++ b/tests/ci/parallel_runner.sh @@ -1,20 +1,46 @@ #!/usr/bin/env bash +MODE="$1"; MODE=${MODE:="testing"} + +setup_circle() { + MAKE_ENV="CI=true DOCKER_VERSION=1.5.0" + [[ "$1" == "buildstack" ]] && MAKE_ENV+=" BUILD_STACK=true " + echo "setting up with MAKE_ENV: $MAKE_ENV" + sudo -E CI=true make -e sshcommand + # need to add the dokku user to the docker group + sudo usermod -G docker dokku + #### circle does some weird *expletive* with regards to root and gh auth (needed for gitsubmodules test) + sudo rsync -a ~ubuntu/.ssh/ ~root/.ssh/ + sudo chown -R root:root ~root/.ssh/ + sudo sed --in-place 's:/home/ubuntu:/root:g' ~root/.ssh/config + #### + sudo -E $MAKE_ENV make -e install + sudo -E make -e setup-deploy-tests + make -e ci-dependencies +} + case "$CIRCLE_NODE_INDEX" in 0) - echo "=====> make unit-tests" - sudo -E make -e unit-tests + echo "=====> make unit-tests (1/2) on CIRCLE_NODE_INDEX: $CIRCLE_NODE_INDEX" + [[ "$MODE" == "setup" ]] && setup_circle && exit 0 + sudo -E UNIT_TEST_BATCH=1 make -e unit-tests ;; 1) - echo "=====> make deploy-tests (buildstep release)" - sudo -E make -e deploy-tests + echo "=====> make unit-tests (2/2) on CIRCLE_NODE_INDEX: $CIRCLE_NODE_INDEX" + [[ "$MODE" == "setup" ]] && setup_circle && exit 0 + sudo -E UNIT_TEST_BATCH=2 make -e unit-tests ;; 2) - echo "=====> make deploy-tests (buildstep master)" - docker rmi -f progrium/buildstep && \ - sudo -E BUILD_STACK=true make -e stack && \ + echo "=====> make deploy-tests (buildstep release) on CIRCLE_NODE_INDEX: $CIRCLE_NODE_INDEX" + [[ "$MODE" == "setup" ]] && setup_circle && exit 0 + sudo -E make -e deploy-tests + ;; + + 3) + echo "=====> make deploy-tests (buildstep master) on CIRCLE_NODE_INDEX: $CIRCLE_NODE_INDEX" + [[ "$MODE" == "setup" ]] && setup_circle buildstack && exit 0 sudo -E make -e deploy-tests ;; esac diff --git a/tests/ci/unit_test_runner.sh b/tests/ci/unit_test_runner.sh new file mode 100755 index 000000000..9f5e2ce39 --- /dev/null +++ b/tests/ci/unit_test_runner.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash + +is_number() { + local NUMBER=$1; local NUM_RE='^[0-9]+$' + if [[ $NUMBER =~ $NUM_RE ]];then + return 0 + else + return 1 + fi +} + +usage() { + echo "usage: $0 1|2" + exit 0 +} + +BATCH_NUM="$1" +is_number $BATCH_NUM || usage + +TESTS=($(find "$(dirname $0)"/../unit -maxdepth 1 -name "*.bats")) +HALF_TESTS=$(( ${#TESTS[@]} / 2 )) +FIRST_HALF=("${TESTS[@]:0:${HALF_TESTS}}") +LAST_HALF=("${TESTS[@]:${HALF_TESTS}:${#TESTS[@]}}") + +case "$BATCH_NUM" in + 1) + bats "${FIRST_HALF[@]}" + ;; + + 2) + bats "${LAST_HALF[@]}" + ;; + + *) + usage + ;; +esac diff --git a/tests/deploy/config.bats b/tests/deploy/config.bats deleted file mode 100644 index f8177e53e..000000000 --- a/tests/deploy/config.bats +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bats - -load ../unit/test_helper - -@test "deploy config app" { - run bash -c "cd tests && ./test_deploy ./apps/config dokku.me" - echo "output: "$output - echo "status: "$status - assert_success -} diff --git a/tests/deploy/gitsubmodules.bats b/tests/deploy/gitsubmodules.bats deleted file mode 100644 index b5b66fdcf..000000000 --- a/tests/deploy/gitsubmodules.bats +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bats - -load ../unit/test_helper - -@test "deploy gitsubmodules app" { - run bash -c "cd tests && ./test_deploy ./apps/gitsubmodules dokku.me" - echo "output: "$output - echo "status: "$status - assert_success -} diff --git a/tests/deploy/go.bats b/tests/deploy/go.bats deleted file mode 100644 index cdd75c2c2..000000000 --- a/tests/deploy/go.bats +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bats - -load ../unit/test_helper - -@test "deploy go app" { - run bash -c "cd tests && ./test_deploy ./apps/go dokku.me" - echo "output: "$output - echo "status: "$status - assert_success -} diff --git a/tests/deploy/java.bats b/tests/deploy/java.bats deleted file mode 100644 index 560ad28e3..000000000 --- a/tests/deploy/java.bats +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bats - -load ../unit/test_helper - -@test "deploy java app" { - run bash -c "cd tests && ./test_deploy ./apps/java dokku.me" - echo "output: "$output - echo "status: "$status - assert_success -} diff --git a/tests/deploy/multi.bats b/tests/deploy/multi.bats deleted file mode 100644 index e938e21fc..000000000 --- a/tests/deploy/multi.bats +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bats - -load ../unit/test_helper - -@test "deploy multi app" { - run bash -c "cd tests && ./test_deploy ./apps/multi dokku.me" - echo "output: "$output - echo "status: "$status - assert_success -} diff --git a/tests/deploy/nodejs-express.bats b/tests/deploy/nodejs-express.bats deleted file mode 100644 index 2fcc82dc8..000000000 --- a/tests/deploy/nodejs-express.bats +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bats - -load ../unit/test_helper - -@test "deploy nodejs-express app" { - run bash -c "cd tests && ./test_deploy ./apps/nodejs-express dokku.me" - echo "output: "$output - echo "status: "$status - assert_success -} diff --git a/tests/deploy/php.bats b/tests/deploy/php.bats deleted file mode 100644 index 06bfa081b..000000000 --- a/tests/deploy/php.bats +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bats - -load ../unit/test_helper - -@test "deploy php app" { - skip "fails. ref: https://github.com/progrium/buildstep/issues/126" - run bash -c "cd tests && ./test_deploy ./apps/php dokku.me" - echo "output: "$output - echo "status: "$status - assert_success -} diff --git a/tests/deploy/python-flask.bats b/tests/deploy/python-flask.bats deleted file mode 100644 index 1834e8fc8..000000000 --- a/tests/deploy/python-flask.bats +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bats - -load ../unit/test_helper - -@test "deploy python-flask app" { - run bash -c "cd tests && ./test_deploy ./apps/python-flask dokku.me" - echo "output: "$output - echo "status: "$status - assert_success -} diff --git a/tests/deploy/static.bats b/tests/deploy/static.bats deleted file mode 100644 index bef621f29..000000000 --- a/tests/deploy/static.bats +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bats - -load ../unit/test_helper - -@test "deploy static app" { - skip "fails on apt-get update..." - run bash -c "cd tests && ./test_deploy ./apps/static dokku.me" - echo "output: "$output - echo "status: "$status - assert_success -} diff --git a/tests/unit/core.bats b/tests/unit/core.bats index 76d5702e2..99c545a99 100644 --- a/tests/unit/core.bats +++ b/tests/unit/core.bats @@ -115,3 +115,9 @@ build_nginx_config() { assert_urls "https://${TEST_APP}.dokku.me" "https://test.dokku.me" "http://dokku.example.com" } +@test "(core) git-remote (off-port)" { + run deploy_app nodejs-express ssh://dokku@127.0.0.1:22333/$TEST_APP + echo "output: "$output + echo "status: "$status + assert_success +} diff --git a/tests/unit/docker-options.bats b/tests/unit/docker-options.bats index c2b097eb2..d10f346e7 100644 --- a/tests/unit/docker-options.bats +++ b/tests/unit/docker-options.bats @@ -149,3 +149,14 @@ teardown() { assert_success deploy_app } + +@test "docker-options:add (all phases over SSH)" { + run ssh dokku@dokku.me docker-options:add $TEST_APP build,deploy,run \"-v /tmp\" + echo "output: "$output + echo "status: "$status + assert_success + run /bin/bash -c "dokku docker-options $TEST_APP | egrep '\-v /tmp' | wc -l | grep -q 3" + echo "output: "$output + echo "status: "$status + assert_success +} diff --git a/tests/unit/test_helper.bash b/tests/unit/test_helper.bash index 08d16f8ae..ec7f359ff 100644 --- a/tests/unit/test_helper.bash +++ b/tests/unit/test_helper.bash @@ -89,7 +89,9 @@ create_app() { } destroy_app() { + RC="$1"; RC=${RC:=0} echo $TEST_APP | dokku apps:destroy $TEST_APP + return $RC } add_domain() { @@ -98,18 +100,20 @@ add_domain() { deploy_app() { APP_TYPE="$1"; APP_TYPE=${APP_TYPE:="nodejs-express"} + GIT_REMOTE="$2"; GIT_REMOTE=${GIT_REMOTE:="dokku@dokku.me:$TEST_APP"} TMP=$(mktemp -d -t "$TARGET.XXXXX") rmdir $TMP && cp -r ./tests/apps/$APP_TYPE $TMP cd $TMP git init git config user.email "robot@example.com" git config user.name "Test Robot" - git remote add target dokku@dokku.me:$TEST_APP + echo "setting up remote: $GIT_REMOTE" + git remote add target $GIT_REMOTE [[ -f gitignore ]] && mv gitignore .gitignore git add . git commit -m 'initial commit' - git push target master || destroy_app + git push target master || destroy_app $? } setup_client_repo() {