--- version: 2 references: images: go: &GOLANG_IMAGE circleci/golang:1.12.1 middleman: &MIDDLEMAN_IMAGE hashicorp/middleman-hashicorp:0.3.35 ember: &EMBER_IMAGE circleci/node:8-browsers paths: test-results: &TEST_RESULTS_DIR /tmp/test-results cache: yarn: &YARN_CACHE_KEY consul-ui-v1-{{ checksum "ui-v2/yarn.lock" }} rubygem: &RUBYGEM_CACHE_KEY static-site-gems-v1-{{ checksum "Gemfile.lock" }} environment: &ENVIRONMENT TEST_RESULTS_DIR: *TEST_RESULTS_DIR GOTESTSUM_RELEASE: 0.3.3 EMAIL: noreply@hashicorp.com GIT_AUTHOR_NAME: circleci-consul GIT_COMMITTER_NAME: circleci-consul S3_ARTIFACT_BUCKET: consul-dev-artifacts jobs: # build all distros build-distros: &build-distros docker: - image: *GOLANG_IMAGE environment: &build-env GOXPARALLEL: 2 # CircleCI containers are 2 CPU x 4GB RAM working_directory: /go/src/github.com/hashicorp/consul steps: - checkout - run: make tools - run: ./build-support/scripts/build-local.sh # save dev build to CircleCI - store_artifacts: path: ./pkg/bin # build all 386 architecture supported OS binaries build-386: <<: *build-distros environment: <<: *build-env XC_OS: "darwin freebsd linux windows" XC_ARCH: "386" # build all amd64 architecture supported OS binaries build-amd64: <<: *build-distros environment: <<: *build-env XC_OS: "darwin freebsd linux solaris windows" XC_ARCH: "amd64" # build all arm/arm64 architecture supported OS binaries build-arm-arm64: <<: *build-distros environment: <<: *build-env XC_OS: linux XC_ARCH: "arm arm64" # create a development build dev-build: docker: - image: *GOLANG_IMAGE working_directory: /go/src/github.com/hashicorp/consul steps: - checkout - run: make dev # save dev build to pass to downstream jobs - persist_to_workspace: root: /go/bin paths: - consul # upload development build to s3 dev-upload-s3: docker: - image: circleci/python:stretch environment: <<: *ENVIRONMENT steps: - run: name: Install awscli command: sudo pip install awscli # get consul binary - attach_workspace: at: bin/ - run: name: package binary command: tar -czf consul.tar.gz -C bin/ . - run: name: Upload to s3 command: | if [ -n "${S3_ARTIFACT_PATH}" ]; then aws s3 cp \ --metadata "CIRCLECI=${CIRCLECI},CIRCLE_BUILD_URL=${CIRCLE_BUILD_URL},CIRCLE_BRANCH=${CIRCLE_BRANCH}" \ "consul.tar.gz" "s3://${S3_ARTIFACT_BUCKET}/${S3_ARTIFACT_PATH}/${CIRCLE_SHA1}.tar.gz" else echo "CircleCI - S3_ARTIFACT_PATH was not set" exit 1 fi # Nomad 0.8 builds on go0.10 # Run integration tests on nomad/v0.8.7 nomad-integration-0_8: docker: - image: circleci/golang:1.10 environment: <<: *ENVIRONMENT NOMAD_WORKING_DIR: &NOMAD_WORKING_DIR /go/src/github.com/hashicorp/nomad NOMAD_VERSION: v0.8.7 steps: &NOMAD_INTEGRATION_TEST_STEPS - run: git clone https://github.com/hashicorp/nomad.git --branch ${NOMAD_VERSION} ${NOMAD_WORKING_DIR} # get consul binary - attach_workspace: at: /go/bin # make test result directory - run: mkdir -p $TEST_RESULTS_DIR # make dev build of nomad - run: command: make dev working_directory: *NOMAD_WORKING_DIR # update gotestsum - run: curl -sSL "https://github.com/gotestyourself/gotestsum/releases/download/v${GOTESTSUM_RELEASE}/gotestsum_${GOTESTSUM_RELEASE}_linux_amd64.tar.gz" | sudo tar --overwrite -xz -C /usr/local/bin gotestsum # run integration tests - run: command: gotestsum --format=short-verbose --junitfile $TEST_RESULTS_DIR/results.xml -- ./command/agent/consul -run TestConsul working_directory: *NOMAD_WORKING_DIR # store test results for CircleCI - store_test_results: path: *TEST_RESULTS_DIR - store_artifacts: path: *TEST_RESULTS_DIR # run integration tests on nomad/master nomad-integration-master: docker: - image: *GOLANG_IMAGE environment: <<: *ENVIRONMENT NOMAD_WORKING_DIR: /go/src/github.com/hashicorp/nomad NOMAD_VERSION: master steps: *NOMAD_INTEGRATION_TEST_STEPS build-website: # setting the working_directory along with the checkout path allows us to not have # to cd into the website/ directory for commands working_directory: ~/project/website docker: - image: *MIDDLEMAN_IMAGE steps: - checkout: path: ~/project # restores gem cache - restore_cache: key: *RUBYGEM_CACHE_KEY - run: name: install gems command: bundle check || bundle install --path vendor/bundle --retry=3 # saves gem cache if we have changed the Gemfile - save_cache: key: *RUBYGEM_CACHE_KEY paths: - ~/project/website/vendor/bundle - run: name: middleman build command: bundle exec middleman build - run: name: website deploy command: ./scripts/deploy.sh # build frontend yarn cache frontend-cache: docker: - image: *EMBER_IMAGE steps: - checkout # cache yarn deps - restore_cache: key: *YARN_CACHE_KEY - run: name: install yarn packages command: cd ui-v2 && yarn install - save_cache: key: *YARN_CACHE_KEY paths: - ui-v2/node_modules # build ember so frontend tests run faster ember-build: docker: - image: *EMBER_IMAGE steps: - checkout - restore_cache: key: *YARN_CACHE_KEY - run: cd ui-v2 && yarn build-ci --output-path=dist # saves the build to a workspace to be passed to a downstream job - persist_to_workspace: root: ui-v2 paths: - dist # run ember frontend tests ember-test: docker: - image: *EMBER_IMAGE environment: EMBER_TEST_PARALLEL: true #enables test parallelization with ember-exam EMBER_TEST_REPORT: test-results/report.xml #outputs test report for CircleCI test summary parallelism: 4 steps: - checkout - restore_cache: key: *YARN_CACHE_KEY - attach_workspace: at: ui-v2 - run: working_directory: ui-v2 command: node_modules/ember-cli/bin/ember exam --split=$CIRCLE_NODE_TOTAL --partition=`expr $CIRCLE_NODE_INDEX + 1` --path dist --silent -r xunit - store_test_results: path: ui-v2/test-results workflows: version: 2 build-distros: jobs: - build-386 - build-amd64 - build-arm-arm64 test-integrations: jobs: - dev-build - dev-upload-s3: requires: - dev-build filters: branches: ignore: - /^pull\/.*$/ # only push dev builds from non forks - nomad-integration-master: requires: - dev-build - nomad-integration-0_8: requires: - dev-build website: jobs: - build-website: context: static-sites filters: branches: only: stable-website frontend: jobs: - frontend-cache - ember-build: requires: - frontend-cache - ember-test: requires: - ember-build