__defaults_go: &DEFAULTS_GO language: go go: "1.14.6" cache: directories: - ui/node_modules # https://restic.net/blog/2018-09-02/travis-build-cache - $HOME/.cache/go-build - $HOME/gopath/pkg/mod before_cache: # this log file is updated on every get/set operation # so it forces new cache archive on every build # remove it before creating cache archive - rm -vf $HOME/.cache/go-build/log.txt env: - GO111MODULE=on __defaults_js: &DEFAULTS_JS language: node_js # we run make to install everything install: [] cache: directories: - ui/node_modules env: - NODE_ENV=test git: depth: 100 os: linux language: shell jobs: allow_failures: - name: Percy UI snapshots - name: Webpack bundle size compare - name: Benchmark Go code compare include: - stage: Stats name: Webpack bundle size compare if: (repo = prymitive/karma AND type = pull_request) <<: *DEFAULTS_JS env: # GITHUB_TOKEN for CI Bundle size diff comments and gist uploads - secure: "Or5fiXZfgIsXvzoOdEprRwJ0uwUjMvxGHE3LG+h3OsIBO6WA8vgOqVOjqVHV2dgC9cSjm5A7MX52S7cDqfkQDkgnVHpVxRwDC9n9O4vnaFdCZ4nC+d18z8dikbiwgdeWQ+Wi6RhZENye1Lu5sBaAJ09wYgx9lNdEVpRaTUvUw6grSlESJZSXoxfxWWpmTyx+yPH4sxuWjZ7gCspDX9s9k4fjpY4LkhQQwLlk8wPc2hfDg48e+K1OR6sYB8uRS33Xc4fQtzElzazmaZ0fn77h5ysDgC1g/ko+E2j8HHMbZvFpzYpm1bCpIv1G/0A2ItH7gT3HsuwkDvfH/it56JTCbBWJJ+hTDeswCQNu0h797QM6jv0o5wgKpHR1t+AeM9vDe4Ds0pAXouJz0LJewNOdNvi5O1BZA9OooKc34hwTJs/zj5NwiZuOyPSMhDBGa++Vhsr9K3rPD9+97M2hac6NO6TBVWZjvqJilmkjJs+bKrl//ClBvdhDGkJNDbB+2emdD1/wzpPVJPp3IRhzeEF89IVE58qE+OQnIwtbEZ2W1ct6Ep7ZJdrXWc/VBdJB1ELfUtNmkvWFZD5IJfnb/Z5MS6iespXlV5alPQ7eZ2jNl3tn7uDaCStuQN1tO2wthNnsSU/OkfFRch/Ks3gYC5+v7n8aJMkTYFmHr4Y/xlXBsrA=" script: - ./scripts/have-ui-changes.sh || ./scripts/ci-diff-webpack.sh - stage: Stats name: Benchmark Go code compare if: (repo = prymitive/karma AND type = pull_request) <<: *DEFAULTS_GO env: # GITHUB_TOKEN for CI Bundle size diff comments and gist uploads - secure: "Or5fiXZfgIsXvzoOdEprRwJ0uwUjMvxGHE3LG+h3OsIBO6WA8vgOqVOjqVHV2dgC9cSjm5A7MX52S7cDqfkQDkgnVHpVxRwDC9n9O4vnaFdCZ4nC+d18z8dikbiwgdeWQ+Wi6RhZENye1Lu5sBaAJ09wYgx9lNdEVpRaTUvUw6grSlESJZSXoxfxWWpmTyx+yPH4sxuWjZ7gCspDX9s9k4fjpY4LkhQQwLlk8wPc2hfDg48e+K1OR6sYB8uRS33Xc4fQtzElzazmaZ0fn77h5ysDgC1g/ko+E2j8HHMbZvFpzYpm1bCpIv1G/0A2ItH7gT3HsuwkDvfH/it56JTCbBWJJ+hTDeswCQNu0h797QM6jv0o5wgKpHR1t+AeM9vDe4Ds0pAXouJz0LJewNOdNvi5O1BZA9OooKc34hwTJs/zj5NwiZuOyPSMhDBGa++Vhsr9K3rPD9+97M2hac6NO6TBVWZjvqJilmkjJs+bKrl//ClBvdhDGkJNDbB+2emdD1/wzpPVJPp3IRhzeEF89IVE58qE+OQnIwtbEZ2W1ct6Ep7ZJdrXWc/VBdJB1ELfUtNmkvWFZD5IJfnb/Z5MS6iespXlV5alPQ7eZ2jNl3tn7uDaCStuQN1tO2wthNnsSU/OkfFRch/Ks3gYC5+v7n8aJMkTYFmHr4Y/xlXBsrA=" before_script: - travis_retry make mock-assets script: - ./scripts/have-backend-changes.sh || ./scripts/ci-diff-benchmark-go.sh - stage: Test name: Test Go code if: (repo = prymitive/karma AND type != pull_request) OR (fork = true AND type = pull_request) <<: *DEFAULTS_GO before_script: - travis_retry make mock-assets script: make test-go after_success: - travis_retry curl -s --connect-timeout 30 --fail https://codecov.io/bash | bash -s -- -F backend - stage: Test name: Test JavaScript code if: (repo = prymitive/karma AND type != pull_request) OR (fork = true AND type = pull_request) <<: *DEFAULTS_JS script: make -C ui test-js after_success: - travis_retry curl -s --connect-timeout 30 --fail https://codecov.io/bash | bash -s -- -F ui # duplicate js test but with a different time zone, to ensure that tests/code work with non-UTC time zone - stage: Test name: Test JavaScript code with Pacific/Easter time zone if: (repo = prymitive/karma AND type != pull_request) OR (fork = true AND type = pull_request) <<: *DEFAULTS_JS script: env TZ=Pacific/Easter make -C ui test-js after_success: - travis_retry curl -s --connect-timeout 30 --fail https://codecov.io/bash | bash -s -- -F ui - stage: Lint name: Lint git commit if: (repo = prymitive/karma AND type != pull_request) OR (fork = true AND type = pull_request) <<: *DEFAULTS_JS script: make -C ui lint-git-ci - stage: Lint name: Lint Go code if: (repo = prymitive/karma AND type != pull_request) OR (fork = true AND type = pull_request) <<: *DEFAULTS_GO before_script: - travis_retry make mock-assets script: travis_retry make lint-go - stage: Lint name: Check Go code formatting if: (repo = prymitive/karma AND type != pull_request) OR (fork = true AND type = pull_request) <<: *DEFAULTS_GO before_script: - travis_retry make mock-assets script: - make format-go - git diff --exit-code - stage: Lint name: Verify go.sum if: (repo = prymitive/karma AND type != pull_request) OR (fork = true AND type = pull_request) <<: *DEFAULTS_GO script: - travis_retry make mock-assets - travis_retry go get -d -v ./cmd/karma - travis_retry go mod tidy - make tools-go-mod-tidy - git diff --exit-code - stage: Lint name: Lint JavaScript code if: (repo = prymitive/karma AND type != pull_request) OR (fork = true AND type = pull_request) <<: *DEFAULTS_JS script: make -C ui lint-js - stage: Lint name: Check JavaScript code formatting if: (repo = prymitive/karma AND type != pull_request) OR (fork = true AND type = pull_request) <<: *DEFAULTS_JS script: - make -C ui format - git diff --exit-code - stage: Lint name: Check JavaScript dependencies if: (repo = prymitive/karma AND type != pull_request) OR (fork = true AND type = pull_request) <<: *DEFAULTS_JS script: - make -C ui lint-deps - stage: Lint name: Lint documentation if: (repo = prymitive/karma AND type != pull_request) OR (fork = true AND type = pull_request) <<: *DEFAULTS_JS script: make -C ui lint-docs - stage: Lint name: Verify OpenAPI client code if: (repo = prymitive/karma AND type != pull_request) OR (fork = true AND type = pull_request) language: shell addons: apt: packages: - docker-ce script: - travis_retry make openapi-client - git diff --exit-code - stage: Lint name: Lint Golang Version if: (repo = prymitive/karma AND type != pull_request) OR (fork = true AND type = pull_request) language: shell script: make lint-golang-version - stage: Lint name: Lint Node Version if: (repo = prymitive/karma AND type != pull_request) OR (fork = true AND type = pull_request) language: shell script: make lint-nodejs-version - stage: Lint name: Lint Bootstrap Version if: (repo = prymitive/karma AND type != pull_request) OR (fork = true AND type = pull_request) language: shell script: make lint-bootstrap-version - stage: Lint name: Generate Changelog if: (repo = prymitive/karma AND type != pull_request) OR (fork = true AND type = pull_request) <<: *DEFAULTS_GO env: - GO111MODULE=on # GITHUB_TOKEN - secure: "QsPAMhX52+jx8OZXmeZ0eDekHGdRmDbrWp48L4CbaTjgyZX+TSYIqsg6gTVDaHXW6b/AOFFdr8xvInelO2I0M1LV6mmbnzLslxfOxGo87qf9gVZk3VJry+qp2yJAd6s8CiO2GOUYzjOxk8Vd5R76ZpL1or10++tFojvCgYBzmIBFWpeVLyz6iJEgcqPowI/7cicITkEh67vx2DrVjiYptq42+f4fI2oeOf1U7nxd3YQFDtl00VyzacQJ7rVqONPWlagZPdn0w/qWTRkw4ynglVF4FufzCE5L6Bbe7xqbp9wxWhssmNCgC2xwIOu23ODLxSpYFqrYkdu6nLzBsPMxEBcc4O4oqx6IzUc1NMDhXwRmoFY4PQjmC8Rf0Q7oK0HIq+ZsYL0GxztOy0dWSXwoGwQvDLJyuoBtaN2lOKSGhAEeJqqpQaVIPbn3/cORAWXVJjuaFrIsU1Z2lSb60ENIcEHxTpBkbjAfPkk5u5jN4fck8tJMga4argi00fV14gHp4VGpq6o5UvoB+YdEJnPlypUW/8VY+EQhSoW98+b9QXBksL8g8/iezHAjIpwDfMTimSzTy7wd8wV/HR7pqpd9pNlKAhbCWNRa0YGrIoPff1YETRAZsI39lDMvrWjoMJWEDxoR/JAeYXX8V1JyCeX0uiLNisehfCfybc0kDM6Yv6Y=" script: - travis_retry make changelog - stage: Snapshots name: Percy UI snapshots if: (repo = prymitive/karma AND type != pull_request AND type != cron) OR (fork = true AND type = pull_request) <<: *DEFAULTS_JS env: - NODE_ENV=test - secure: "Fx290FkiIG0iVV+gXG22g5kEQs+bM7RkPZvM7q3nUp+8CNW0H627YVX/9WmthFRMmR2gWOltjZLYBGFL1lUaF/Qbvs+xjWibyNGuBJN3ODDTs56ywYg5Ege4ewQFH1XToV1WEwJ6ET0mREo5LSW4o1TBmZtGNzNldeM+aRScOMW6T8sUh2cYY+nHF5sQXN2UM3BtXZVY2kRQbRy5CxLql7l4keGO6anmD+AI3jn8Wj9bbY/CJxSLnXvWbw66Uj37lv7wlEzO4GKqtBYMMbmGBwjgrwSfVH42tq6PxabzFzZLUmnIr62EyBwfTQG2JoPXLC6AIouH2erM2fd2Qg4WF8yIOqPAJki0vw6VQS0VRHGvwrq/OXmiTWgpqTCXrIvrs45b2FsXGec10G/rFrS3ayoutXMNOwjBGYIkyxPP8ngfa2jinOWG05OMuOHPRDqCsAYL5jTIqUwp0VkoDNvp8aibQeKTKl7y5xkJtOstWaa1uMirRVFpi4SUCWvylt1sTR2VF2bzmuRFkQQ1xX2LvMtPKk86CriLSch2jeke90f4Ygl4fJV5+H3CsMION5WiTWFvPf0ncxzZKPCQ/SFnNQUjoo87YHg0aI9UgvOfd3Ca1k9Fxw5qC919eHFPF4Qz8z85WN58VXJVCEb1w2opPWoeiqMtabq9fCusxR8Y43Q=" script: ./scripts/percy-skip-deps.sh || make -C ui test-percy - stage: Build and Deploy name: Cross compile binaries if: (repo = prymitive/karma AND type != pull_request) OR (fork = true AND type = pull_request) <<: *DEFAULTS_GO env: # add an extra env so we don't push cross compilation cache into the main archive # as it slows down other jobs - JOB=cc - GO111MODULE=on - NODE_ENV=production before_script: # this stage needs to build everything including assets file and that # requires running webpack, so we need nodejs here - travis_retry nvm install $(< .nvmrc) script: # prune GOCACHE if it gets too big - ./scripts/prune-go-cache.sh - export SOURCE_DATE_EPOCH=$(git show -s --format=%ci ${TRAVIS_TAG:-${TRAVIS_COMMIT}}^{commit}) - travis_retry make crosscompile -j 2 - for i in karma-*; do tar --mtime="${SOURCE_DATE_EPOCH}" --owner=0 --group=0 --numeric-owner -c $i | gzip -n - > $i.tar.gz; done - shasum -a 512 karma-*.tar.gz | tee sha512sum.txt # verify that there are no uncommited changes - git diff --exit-code # print GOCACHE size - ./scripts/prune-go-cache.sh --dry-run deploy: provider: releases api_key: secure: "J0TR1UEjE/6dK/qRGhti/IYqrAI9cMYDt+UKhU7zcZgmurIRzOL1KXzMMQ30ZZJe++zY9m2zwyX/1hanHKXI97QNR94QaPmvVRHnBp8fZMKooKMh2vPSbU5LrkTxa4XDETsj+iH9o7UrVY2paaQFjNdJXfYoMSAP1TNpWNvZvS2Mq4jEopnr/5hZicXfkxkZq6K5/MoqkfjPj5bt8ULj2okk+9H+x0a3AMGsyp9YQ/QLL3v9wNSTOU33cQPmDGS84E5R+NX6/5ty4HJoFDwYudYYIyx9wun7rulxjxD6OB1htplqvpvP0SgCd1ah6ikTHI05Mil3QbkVjTnaQ48F2Y4R0H1qQ9jhIGRciqTuebS1WWm6t6XKAthwXm5/MO6YMNAWeLQ/eK6wIdPYfamWkkxOKsHJ8nI8YszMruW6b53DmNc7yh25fjJR7BL4p1zOXLUWJTOZVRoMjf4v9rW2A5hhPPPcDmVK59BQTPlqgP5Kh8lCLA5Hgm577oMfVt4gKPAlyni3iCkxW+pSn3bOVDafFk+3sTMmqGgcwcVBSWG5hMjGx0y2lTO5ElSwmloGoWUmJgco5+eoVp6yFYBdoY4ogrT8mhadovGBORavUQDxAhN9QJT6NqAJUzBOGf3iVyyCsKvERavOn2zo8yC1pTEwzjSekDB1NLRJ+pHF50k=" skip_cleanup: true file_glob: true file: - karma-*.tar.gz - sha512sum.txt on: repo: prymitive/karma tags: true - stage: Build and Deploy name: Build docker image # we build and push docker image on merge and tag, so this should only # run for new branches, to test that they don't break docker builds if: (repo = prymitive/karma AND type != pull_request AND branch != master AND tag IS NOT present) OR (fork = true AND type = pull_request) language: shell addons: apt: packages: - docker-ce script: travis_retry make docker-image - stage: Build and Deploy name: Build and push docker image if: repo = prymitive/karma AND ((type = push AND branch = master) OR tag IS present) language: shell addons: apt: packages: - docker-ce env: # DOCKER_PASSWORD - secure: "iCMjE3Andg+pDnEUXqrlN+6pQ6RNxXARnovrwYb26Fz57tz/sJQGGmcRv4Ac3As/by+f7HEFsMb81CzGq2SCcDJ99jqROo4WzCCcjiI7q5E/0ltsBT1ElL4z3GLG5iaofPnJK7tW8Cq7HO30ZoSB57hS1BwaXfbIicw4XyZSG5TYHZgH6iO+LM2HAuxqthyZlK5O+CmTslamSDw/wiuBzilKNaX+mzdPuVfNd8m91MX/Fq+L3Oj9e7yH42In/PYUdN6S9bFgJQewG/CRRP+MBDK45ET63aQxqvgJchs45rTIdvcXjPMzb5xF8oHdjB3z7GdALbKDxa05sBu+SD8ElyerVFF3G+uFicDsdXoIR+NeTVzwwqrk2YmqOVz6jHaTw5WApttPayMbq3zzyH5zezbMROF0/rogaAHsW38xHktwMmEJ+eR1kdWSEYVDrRrTYPNPZJAcBsF4di+PIfjZ/6Ih5k4n4bFEQsvdXp0hRbx3DLHHusKihKvONW6ckp8tvyT+72aWvCehB5XuasgOzMXxHtBG4XPcPt8EoHOs/0bszTWpP5Nt98OvOSZaX7oZuvhVS0s9JfgVUFhqj1I/uO8KQxOpKsQBTCV0pBW8T6CGeJFXQHgMfFe8auIzzmFQzgHpIrcr6tjrgsadAl0wG4EmheNI2PJMs09+rZxDgX4=" # GITHUB_PACKAGES_TOKEN / personal token for uploading to github docker repo - secure: "XuyWpaszA/Mi2ik5tUwxNXSdDjzvyQVtGldBzqYZ5NC9+vb1BtTZqYXBT+ATYLUpGRTUGP1QJKabz/yn9/33/gTGthBO+2TzvcQoJSpw1VcnAfG8jjPwbDiB2FfwEeFQFzMxkWNeZ4zwOmW8oA/3/ojY8slU/BCeP7gM/vfz5pgQys8bd9x72tvr2zsh5lEKP0R2IJtCEz8B+/LobLiODvRiFThK/7hFENoiU/iTMsjjhvvnJPvx4IPgZVsCookFRoyPZVawxiRfkp0Ic/nllKaibqfJvz2O2w4woLAehsiyRcHFQYHo2Xh+cCLPqlNy/0lbjOMybCjTyCqVLgJWMPfw71m9F2fG641BMFshRbK2GPcjrdwnm7vTZ5XbxdkcrHk6we88yMEZFc/1yAK8qGeIKX4r7MqZDYa8qX0fG5NzENzJbXDM1ZRu0Bwj99Avb8ulB/vgKvIXvCAqHK+tSMRhJZ8ZBswxvFG14cQnKY2sqErd10EP1w6J0ifdCYdm6AXVLbOgTg5lCAiUJ7BU2QLBcOC8byB3GpUzac/0sQAeIC1zyxI6w5tziJs1pB2HpyRj8+edMVpu1WiVFfcwHUKdSmMsw0qlLwZaJwWzbLmuuXQ8xXYjESWIKMcwn0nZaSU5CqCb7E0ruq2G/fiw5FMu8M/RajTQUXNH9ro1EgE=" script: - export VERSION=$(make show-version) - export LOCAL_IMAGE="karma:${VERSION}" - export DOCKER_USERNAME=lmierzwa - export DOCKER_IMAGE=karma - export IMAGE_NAME="${DOCKER_USERNAME}/${DOCKER_IMAGE}" - travis_retry make docker-image ### Docker Hub - travis_retry docker login -u "${DOCKER_USERNAME}" -p "${DOCKER_PASSWORD}" - docker tag "${LOCAL_IMAGE}" "${IMAGE_NAME}:latest" # tag with the version only if we have a git tag (new release was pushed) - if [ -n "$TRAVIS_TAG" ]; then docker tag "${LOCAL_IMAGE}" "${IMAGE_NAME}:${VERSION}" ; fi - travis_retry docker push "${IMAGE_NAME}" ### GitHub # tag with the version only if we have a git tag (new release was pushed) - if [ -n "$TRAVIS_TAG" ]; then travis_retry docker login docker.pkg.github.com -u prymitive -p "${GITHUB_PACKAGES_TOKEN}" && docker tag "${LOCAL_IMAGE}" "docker.pkg.github.com/prymitive/karma/karma:${VERSION}" && travis_retry docker push "docker.pkg.github.com/prymitive/karma/karma:${VERSION}" ; fi - stage: Build and Deploy name: Deploy demo app to Heroku # deploy on every job that isn't a PR, this way we: # * don't deploy on PRs send from forks, only internal # * deploy only once per PR - since we will deploy on branch job if: repo = prymitive/karma AND type != pull_request env: # HEROKU_TOKEN, valid forever, needed to push docker image and release # it on heroku app - secure: "EJnXjoZ0K9JxZWk16kpmxYk/fez7OP9VlUUZfXctSK5TIov9VE/tMLsM/azZETZXE+bANgwsFtBAm+Jd45XffSYNy5shli5G7r/BR0ZhTQAPKVwUMpkroFvN4NbGvw/XGE51CPaQjqTKxrsf8JCrXgqVg6bPRt/wt0K0yP16ffPidQnpyBsZJtRX7ccUS/bEs7PxpMo8zCzFuhvC4SqQud7TDPBC+3S09jt1M92AsDTV1hUnuVSgW9/BLBTXL1GlHuVWIrE6A6Wbw5k89KZXTt+GUNNomZ4IfB70wHuuWF67vMCuBM8kC2ZzAlyDmCLevSPzsk8KTOu1lZL7UOqf2W0Oqk/lSaehT2rVX7ffJFOKKb8t62+pAI9V8excLlfYCJElb+ADKfH3L4CSODohVEnQex6Sz6cFwsSGrvGTt0Hq+U2CX3Tu0u3SauWHqdu1zqysfJLHBGiDyrqQ39JoAJQQTJ2adUiFj54GA9Ob8MDJglv7qPJcaZpkikiNLb80Wm2nbN/TBe0x4tsV1ntSouHpuYA7KZeKat11ZslO7vu1Z5fPy3FpMwYFkAlN2PCnsynCdxiJQwVf/fKguu6MZ2FUEWpSOspLWwooBrIH1N43n6eKs/dyk4yNmpQlGXe/cOY0mVfXwzZNi40k7CDkEj5plxyft25lBaKzEwibC30=" language: shell addons: apt: packages: - docker-ce before_script: # a safe and boring version of cat > .netrc < EOF - echo "machine api.heroku.com" >> $HOME/.netrc - echo " login l.mierzwa@gmail.com" >> $HOME/.netrc - echo " password $HEROKU_TOKEN" >> $HOME/.netrc script: - travis_retry docker build --build-arg VERSION=$(make show-version) -t registry.heroku.com/karma-demo/web -f demo/Dockerfile . - travis_retry docker login -u _ -p "$HEROKU_TOKEN" registry.heroku.com - travis_retry docker push registry.heroku.com/karma-demo/web # bundled heroku cli doesn't know anything about containers, update it - travis_retry curl -s --connect-timeout 30 --fail https://cli-assets.heroku.com/install.sh | sh - travis_retry /usr/local/bin/heroku container:release web --app karma-demo - stage: E2E name: Test demo site if: (repo = prymitive/karma AND type != pull_request) OR (fork = true AND type = pull_request) <<: *DEFAULTS_JS script: - travis_retry make -C ui test-demo