# anchor refs to be used elsewhere refs: wait_for_postgres: &wait_for_postgres run: name: waiting for postgres to be ready command: | for i in `seq 1 60`; do nc -z localhost 5432 && echo Success && exit 0 echo -n . sleep 1 done echo Failed waiting for Postgres && exit 1 filter_only_vtags: &filter_only_vtags filters: tags: only: /^v.*/ filter_only_release_branches: &filter_only_release_branches filters: branches: only: /^release-v.*/ filter_only_dev_branches: &filter_only_dev_branches filters: branches: only: /^dev.*/ filter_only_vtags_dev_release_branches: &filter_only_vtags_dev_release_branches filters: tags: only: /^v.*/ branches: only: /^(dev|release).*/ filter_ignore_branches: &filter_ignore_branches filters: branches: ignore: /.*/ filter_ignore_dev_release_branches: &filter_ignore_dev_release_branches filters: branches: ignore: /^(dev|release).*/ setup_remote_docker: &setup_remote_docker setup_remote_docker: version: 17.09.0-ce docker_layer_caching: true # ref pg environment for testing test_pg_env: &test_pg_env environment: POSTGRES_USER: gql_test POSTGRES_DB: gql_test # ref test server job test_server: &test_server working_directory: ~/graphql-engine steps: - checkout - attach_workspace: at: /build - *wait_for_postgres - run: name: test the server working_directory: ./server command: | DATABASE_URL="postgres://gql_test:@localhost:5432/gql_test" make ci-test # ref pytest server job pytest_server: &pytest_server working_directory: ~/graphql-engine steps: - checkout - restore_cache: keys: - server-deps-cache-{{ checksum "server/graphql-engine.cabal" }}-{{ checksum "server/stack.yaml" }} - attach_workspace: at: /build - *wait_for_postgres - run: command: /build/_server_output/graphql-engine serve background: true environment: HASURA_GRAPHQL_DATABASE_URL: postgres://gql_test:@localhost:5432/gql_test EVENT_WEBHOOK_HEADER: MyEnvValue - run: name: create test output dir command: | mkdir -p /build/_server_test_output/$PG_VERSION - run: name: pytest the server working_directory: ./server/tests-py environment: DATABASE_URL: postgres://gql_test:@localhost:5432/gql_test HGE_URL: http://localhost:8080 command: | pip3 install -r requirements.txt pytest -vv --hge-url="$HGE_URL" --pg-url="$DATABASE_URL" ## commented for the timesake # stack --system-ghc hpc report /build/_server_output/graphql-engine.tix --destdir /build/_server_test_output/$PG_VERSION - store_artifacts: path: /build/_server_test_output destination: server_test version: 2 jobs: # check if this should be built or not, fails if # changes only contains files in .ciignore check_build_worthiness: docker: - image: hasura/graphql-engine-cli-builder:v0.3 working_directory: ~/graphql-engine steps: - checkout - run: name: check build worthiness command: .circleci/ciignore.sh # build the server binary, and package into docker image build_server: docker: - image: hasura/graphql-engine-server-builder:v0.3 working_directory: ~/graphql-engine steps: - checkout - *setup_remote_docker - restore_cache: keys: - server-deps-cache-{{ checksum "server/graphql-engine.cabal" }}-{{ checksum "server/stack.yaml" }} - restore_cache: keys: - server-app-cache-{{ .Branch }}-{{ .Revision }} - run: name: Build the server working_directory: ./server command: | # for PRs non-optimized build, else optimized build if [[ "$CIRCLE_BRANCH" =~ ^(dev|release) || "$CIRCLE_TAG" =~ ^v ]]; then echo "Branch starts with dev or release, or tagged commit starts with v. Optimized build" make ci-binary else echo "Non-release branch, non-optimized build" BUILD_FLAGS="--fast" make ci-binary fi make ci-image make ci-save-image - save_cache: key: server-app-cache-{{ .Branch }}-{{ .Revision }} paths: - ./server/.stack-work - save_cache: key: server-deps-cache-{{ checksum "server/graphql-engine.cabal" }}-{{ checksum "server/stack.yaml" }} paths: - ~/.stack - store_artifacts: path: /build/_server_output destination: server - persist_to_workspace: root: /build paths: - _server_output # binary is called graphql-engine # job to execute when all server tests pass. later we can collect test # reports and publish them etc. all_server_tests_pass: docker: - image: alpine:edge steps: - run: name: All server tests passed command: echo 'all tests passed!' # test the server with postgres versions >= 9.5 test_server_pg_10.4: <<: *test_server docker: - image: hasura/graphql-engine-cli-builder:v0.3 - image: circleci/postgres:10.4-alpine <<: *test_pg_env test_server_pg_9.6: <<: *test_server docker: - image: hasura/graphql-engine-cli-builder:v0.3 - image: circleci/postgres:9.6-alpine <<: *test_pg_env test_server_pg_9.5: <<: *test_server docker: - image: hasura/graphql-engine-cli-builder:v0.3 - image: circleci/postgres:9.5-alpine <<: *test_pg_env # pytest the server with postgres versions >= 9.5 pytest_server_pg_10.4: <<: *pytest_server environment: PG_VERSION: "10_4" docker: - image: hasura/graphql-engine-server-builder:v0.3.2 - image: circleci/postgres:10.4-alpine <<: *test_pg_env pytest_server_pg_9.6: <<: *pytest_server environment: PG_VERSION: "9_6" docker: - image: hasura/graphql-engine-server-builder:v0.3.2 - image: circleci/postgres:9.6-alpine <<: *test_pg_env pytest_server_pg_9.5: <<: *pytest_server environment: PG_VERSION: "9_5" docker: - image: hasura/graphql-engine-server-builder:v0.3.2 - image: circleci/postgres:9.5-alpine <<: *test_pg_env # test and build cli test_and_build_cli: docker: - image: hasura/graphql-engine-cli-builder:v0.3 - image: circleci/postgres:10-alpine environment: POSTGRES_USER: gql_test POSTGRES_DB: gql_test working_directory: /go/src/github.com/hasura/graphql-engine steps: - checkout - attach_workspace: at: /build - restore_cache: keys: - cli-vendor-{{ checksum "cli/Gopkg.toml" }}-{{ checksum "cli/Gopkg.lock" }} - run: name: get cli dependencies working_directory: cli command: make deps - save_cache: key: cli-vendor-{{ checksum "cli/Gopkg.toml" }}-{{ checksum "cli/Gopkg.lock" }} paths: - cli/vendor - *wait_for_postgres - run: name: test cli command: .circleci/test-cli.sh - run: name: build cli working_directory: cli command: | make build make compress make ci-copy-binary - store_artifacts: path: /build/_cli_output destination: cli - persist_to_workspace: root: /build paths: - _cli_output # test and build console test_and_build_console: docker: - image: hasura/graphql-engine-console-builder:v0.3 environment: CYPRESS_KEY: 983be0db-0f19-40cc-bfc4-194fcacd85e1 - image: circleci/postgres:10-alpine environment: POSTGRES_USER: gql_test POSTGRES_DB: gql_test working_directory: ~/graphql-engine parallelism: 4 steps: - checkout - attach_workspace: at: /build - restore_cache: key: console-npm-cache-{{ checksum "console/package.json" }}-{{ checksum "console/package-lock.json" }} - run: name: install dependencies working_directory: console command: make ci-deps - save_cache: key: console-npm-cache-{{ checksum "console/package.json" }}-{{ checksum "console/package-lock.json" }} paths: - console/node_modules - ~/.npm - ~/.cache - *wait_for_postgres - run: name: test console command: .circleci/test-console.sh - run: name: build console working_directory: console command: | make build make ci-copy-assets - store_artifacts: path: /build/_console_output destination: console - persist_to_workspace: root: /build paths: - _console_output deploy: docker: - image: hasura/graphql-engine-deployer:v0.3 working_directory: ~/graphql-engine steps: - *setup_remote_docker - checkout - attach_workspace: at: /build - run: name: deploy command: .circleci/deploy.sh workflows: version: 2 build_and_test: jobs: - check_build_worthiness: *filter_only_vtags - build_server: <<: *filter_only_vtags requires: - check_build_worthiness - test_server_pg_10.4: <<: *filter_only_vtags requires: - build_server - test_server_pg_9.6: <<: *filter_only_vtags requires: - build_server - test_server_pg_9.5: <<: *filter_only_vtags requires: - build_server - pytest_server_pg_10.4: <<: *filter_only_vtags requires: - build_server - pytest_server_pg_9.6: <<: *filter_only_vtags requires: - build_server - pytest_server_pg_9.5: <<: *filter_only_vtags requires: - build_server - all_server_tests_pass: <<: *filter_only_vtags requires: - test_server_pg_10.4 - test_server_pg_9.6 - test_server_pg_9.5 - pytest_server_pg_10.4 - pytest_server_pg_9.6 - pytest_server_pg_9.5 - test_and_build_cli: <<: *filter_only_vtags requires: - build_server - test_and_build_console: <<: *filter_only_vtags requires: - test_and_build_cli - deploy: <<: *filter_only_vtags_dev_release_branches requires: - test_and_build_console - all_server_tests_pass