diff options
Diffstat (limited to '.circleci/config.yml')
-rw-r--r-- | .circleci/config.yml | 293 |
1 files changed, 293 insertions, 0 deletions
diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 000000000..f64524c80 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,293 @@ +# References: +# 1. https://circleci.com/blog/how-to-build-a-docker-image-on-circleci-2-0/ +# 2. https://circleci.com/docs/2.0/building-docker-images/ +# + +version: 2 + +defaults: + bmo_slim_image: &bmo_slim_image + image: mozillabteam/bmo-slim:20180809.1 + user: app + + mysql_image: &mysql_image + image: mozillabteam/bmo-mysql:5.6 + + store_log: &store_log + store_artifacts: + path: /app/bugzilla.log + destination: bugzilla.log + + main_filters: &main_filters + branches: + ignore: + - /^(?:release|test)-20\d\d\d\d\d\d\.\d+/ + - /\// + - production + + bmo_env: &bmo_env + PORT: 8000 + LOGGING_PORT: 5880 + LOCALCONFIG_ENV: 1 + LOG4PERL_CONFIG_FILE: log4perl-test.conf + BMO_db_user: bugs + BMO_db_host: 127.0.0.1 + BMO_db_pass: bugs + BMO_db_name: bugs + BMO_memcached_servers: localhost:11211 + BMO_memcached_namespace: "bugzilla:" + BMO_urlbase: AUTOMATIC + + mysql_env: &mysql_env + MYSQL_DATABASE: bugs + MYSQL_USER: bugs + MYSQL_PASSWORD: bugs + MYSQL_ALLOW_EMPTY_PASSWORD: 1 + + docker_oldtests: &docker_oldtests + - <<: *bmo_slim_image + environment: + <<: *bmo_env + BZ_QA_CONF_FILE: /app/.circleci/selenium_test.conf + BZ_QA_ANSWERS_FILE: /app/.circleci/checksetup_answers.legacy.txt + BZ_QA_LEGACY_MODE: 1 + - <<: *mysql_image + environment: *mysql_env + - image: selenium/standalone-firefox:2.53.1 + - image: memcached:latest + + default_qa_setup: &default_qa_setup + run: + name: default qa setup + command: | + [[ -f build_info/only_version_changed.txt ]] && exit 0 + mv /opt/bmo/local /app/local + perl -MSys::Hostname -i -pE 's/bmo.test/hostname() . ":$ENV{PORT}"/ges' $BZ_QA_CONF_FILE + perl checksetup.pl --no-database --default-localconfig + mkdir artifacts + +jobs: + build_info: + parallelism: 1 + working_directory: /app + docker: + - <<: *bmo_slim_image + environment: + <<: *bmo_env + steps: + - checkout + - run: + name: build push data + command: | + mv /opt/bmo/local /app/local + perl Makefile.PL + perl -I/app -I/app/local/lib/perl5 -MBugzilla -e 1 + perl checksetup.pl --no-database --no-templates --no-permissions + perl scripts/build-bmo-push-data.pl + - run: + name: only publish if tag exists + command: | + tag="$(cat build_info/tag.txt)" + git fetch --tags + if git tag | fgrep -q "$tag"; then + echo "tag $tag exists!" + else + echo "tag $tag does not exist" + echo yes > build_info/publish.txt + fi + - run: + name: check if only version changed + command: | + if git diff 'HEAD~..HEAD' --name-only | grep -qv '^Bugzilla.pm'; then + echo "more files than just Bugzilla.pm changed." + exit 0 + fi + if git diff 'HEAD~..HEAD' |grep '^[+-][^+-]' | grep -qv '^[+-]our $VERSION'; then + echo "Something other than the version number changed." + exit 0 + fi + if [[ "$CIRCLE_BRANCH" == "master" ]]; then + echo "Can't cut corners on the master branch" + exit 0 + fi + echo yes > build_info/only_version_changed.txt + - persist_to_workspace: + root: /app/build_info + paths: ["*.txt"] + - store_artifacts: + path: /app/build_info + - *store_log + + build: + working_directory: /app + docker: + - image: docker:17.06.1-ce + steps: + - setup_remote_docker + - run: + name: install git and ssh + command: apk update && apk add git openssh-client + - checkout + - run: | + docker build \ + --build-arg CI="$CI" \ + --build-arg CIRCLE_SHA1="$CIRCLE_SHA1" \ + --build-arg CIRCLE_BUILD_URL="$CIRCLE_BUILD_URL" \ + -t bmo . + - attach_workspace: + at: /app/build_info + - run: "docker run --name bmo --entrypoint true bmo" + - run: "docker cp bmo:/app/version.json build_info/version.json" + - store_artifacts: + path: /app/build_info + - *store_log + - deploy: + command: | + [[ -n "$DOCKERHUB_REPO" && -n "$DOCKER_USER" && -n "$DOCKER_PASS" ]] || exit 0 + docker login -u "$DOCKER_USER" -p "$DOCKER_PASS" + if [[ "$CIRCLE_BRANCH" == "master" ]]; then + TAG="$(cat /app/build_info/tag.txt)" + if [[ -n "$TAG" && -f build_info/publish.txt ]]; then + [[ -n "$GITHUB_PERSONAL_TOKEN" ]] || exit 0 + git config credential.helper "cache --timeout 120" + git config user.email "$GITHUB_EMAIL" + git config user.name "$GITHUB_NAME" + git tag $TAG + git push https://${GITHUB_PERSONAL_TOKEN}:x-oauth-basic@github.com/$GITHUB_REPO.git $TAG + docker tag bmo "$DOCKERHUB_REPO:$TAG" + docker push "$DOCKERHUB_REPO:$TAG" + fi + docker tag bmo "$DOCKERHUB_REPO:latest" + docker push "$DOCKERHUB_REPO:latest" + else + docker tag bmo "$DOCKERHUB_REPO:$CIRCLE_BRANCH" + docker push "$DOCKERHUB_REPO:$CIRCLE_BRANCH" + fi + + test_sanity: + parallelism: 1 + working_directory: /app + docker: + - <<: *bmo_slim_image + environment: *bmo_env + steps: + - checkout + - attach_workspace: + at: /app/build_info + - run: | + [[ -f build_info/only_version_changed.txt ]] && exit 0 + mv /opt/bmo/local /app/local + mkdir artifacts + - run: | + [[ -f build_info/only_version_changed.txt ]] && exit 0 + perl -I/app -I/app/local/lib/perl5 -c -E 'use Bugzilla; BEGIN { Bugzilla->extensions }' + - run: | + [[ -f build_info/only_version_changed.txt ]] && exit 0 + perl Makefile.PL + - run: + name: run sanity tests + command: | + [[ -f build_info/only_version_changed.txt ]] && exit 0 + /app/scripts/entrypoint.pl prove -qf $(circleci tests glob 't/*.t' 'extensions/*/t/*.t' | circleci tests split) | tee artifacts/$CIRCLE_JOB.txt + - store_artifacts: + path: /app/artifacts + - *store_log + + test_webservices: + parallelism: 1 + working_directory: /app + docker: *docker_oldtests + steps: + - checkout + - attach_workspace: + at: /app/build_info + - *default_qa_setup + - run: | + [[ -f build_info/only_version_changed.txt ]] && exit 0 + /app/scripts/entrypoint.pl load_test_data + - run: | + [[ -f build_info/only_version_changed.txt ]] && exit 0 + /app/scripts/entrypoint.pl test_webservices | tee artifacts/$CIRCLE_JOB.txt + - store_artifacts: + path: /app/artifacts + - *store_log + + test_selenium: + parallelism: 1 + working_directory: /app + docker: *docker_oldtests + steps: + - checkout + - attach_workspace: + at: /app/build_info + - *default_qa_setup + - run: | + [[ -f build_info/only_version_changed.txt ]] && exit 0 + /app/scripts/entrypoint.pl load_test_data --legacy + - run: | + [[ -f build_info/only_version_changed.txt ]] && exit 0 + /app/scripts/entrypoint.pl test_selenium | tee artifacts/$CIRCLE_JOB.txt + - store_artifacts: + path: /app/artifacts + - *store_log + + test_bmo: + parallelism: 1 + working_directory: /app + docker: + - <<: *bmo_slim_image + environment: + <<: *bmo_env + BZ_QA_ANSWERS_FILE: /app/.circleci/checksetup_answers.txt + TWD_HOST: localhost + TWD_PORT: 4444 + TWD_BROWSER: firefox + - <<: *mysql_image + environment: *mysql_env + - image: memcached:latest + - image: selenium/standalone-firefox:2.53.1 + steps: + - checkout + - attach_workspace: + at: /app/build_info + - run: | + [[ -f build_info/only_version_changed.txt ]] && exit 0 + mv /opt/bmo/local /app/local + perl checksetup.pl --no-database + /app/scripts/entrypoint.pl load_test_data + mkdir artifacts + - run: | + [[ -f build_info/only_version_changed.txt ]] && exit 0 + /app/scripts/entrypoint.pl test_bmo -q -f t/bmo/*.t + - *store_log + +workflows: + version: 2 + main: + jobs: + - build_info: + filters: *main_filters + - build: + filters: *main_filters + requires: + - build_info + - test_sanity + - test_bmo + - test_webservices + - test_selenium + - test_sanity: + filters: *main_filters + requires: + - build_info + - test_bmo: + filters: *main_filters + requires: + - build_info + - test_webservices: + filters: *main_filters + requires: + - build_info + - test_selenium: + filters: *main_filters + requires: + - build_info |