config.yml 11.6 KB
Newer Older
Steven Allen's avatar
Steven Allen committed
1
version: 2.1
Łukasz Magiera's avatar
Łukasz Magiera committed
2

Jakub Sztandera's avatar
Jakub Sztandera committed
3 4
aliases:
  make_out_dirs: &make_out_dirs
Steven Allen's avatar
Steven Allen committed
5
    run: mkdir -p /tmp/circleci-artifacts /tmp/circleci-workspace /tmp/circleci-test-results/{unit,sharness}
Jakub Sztandera's avatar
Jakub Sztandera committed
6 7 8
  restore_gomod: &restore_gomod
    restore_cache:
      keys:
Steven Allen's avatar
Steven Allen committed
9 10 11 12
        - v5-dep-{{ .Branch }}-{{ checksum "~/ipfs/go-ipfs/go.sum" }}-{{ .Environment.CIRCLE_JOB }}
        - v5-dep-{{ .Branch }}-{{ checksum "~/ipfs/go-ipfs/go.sum" }}-
        - v5-dep-{{ .Branch }}-
        - v5-dep-master-
Jakub Sztandera's avatar
Jakub Sztandera committed
13 14
  store_gomod: &store_gomod
      save_cache:
Steven Allen's avatar
Steven Allen committed
15
        key: v5-dep-{{ .Branch }}-{{ checksum "~/ipfs/go-ipfs/go.sum" }}-{{ .Environment.CIRCLE_JOB }}
Jakub Sztandera's avatar
Jakub Sztandera committed
16 17 18 19
        paths:
          - ~/go/pkg/mod
          - ~/.cache/go-build/

Steven Allen's avatar
Steven Allen committed
20 21 22 23 24 25 26
default_environment: &default_environment
  SERVICE: circle-ci
  TRAVIS: 1
  CIRCLE: 1
  CIRCLE_TEST_REPORTS: /tmp/circleci-test-results
  CIRCLE_ARTIFACTS: /tmp/circleci-artifacts
  GIT_PAGER: cat
Jakub Sztandera's avatar
Jakub Sztandera committed
27

Steven Allen's avatar
Steven Allen committed
28 29 30
executors:
  golang:
    docker:
Oli Evans's avatar
Oli Evans committed
31
      - image: circleci/golang:1.14
Steven Allen's avatar
Steven Allen committed
32 33 34 35 36 37 38 39 40 41 42 43 44 45
    working_directory: ~/ipfs/go-ipfs
    environment:
      <<: *default_environment
      GO111MODULE: "on"
      TEST_NO_DOCKER: 1
      TEST_NO_FUSE: 1
      GOPATH: /home/circleci/go
      TEST_VERBOSE: 1
  node:
    docker:
      - image: circleci/node:10
    working_directory: ~/ipfs/go-ipfs
    environment:
      <<: *default_environment
46 47
  node-browsers:
    docker:
48
      - image: circleci/node:12-browsers
49 50 51 52 53 54 55
    working_directory: ~/ipfs/go-ipfs
    environment:
      <<: *default_environment
      NO_SANDBOX: true
      IPFS_REUSEPORT: false
      LIBP2P_ALLOW_WEAK_RSA_KEYS: 1
      E2E_IPFSD_TYPE: go
Oli Evans's avatar
Oli Evans committed
56 57 58 59 60 61
  dockerizer: 
    docker: 
      - image: circleci/golang:1.14
    environment:
      IMAGE_NAME: olizilla/test-go-ipfs
      WIP_IMAGE_TAG: wip
Łukasz Magiera's avatar
Łukasz Magiera committed
62 63

jobs:
Steven Allen's avatar
Steven Allen committed
64
  gobuild:
Steven Allen's avatar
Steven Allen committed
65
    executor: golang
Steven Allen's avatar
Steven Allen committed
66 67 68 69 70 71 72 73 74 75 76 77 78
    steps:
    - checkout
    - *make_out_dirs
    - *restore_gomod
    - run:
        command: make cmd/ipfs-try-build
        environment:
          TEST_NO_FUSE: 0
    - run:
        command: make cmd/ipfs-try-build
        environment:
          TEST_NO_FUSE: 1
    - *store_gomod
Steven Allen's avatar
Steven Allen committed
79
  golint:
Steven Allen's avatar
Steven Allen committed
80
    executor: golang
Steven Allen's avatar
Steven Allen committed
81 82 83 84 85 86 87
    steps:
    - checkout
    - *make_out_dirs
    - *restore_gomod
    - run: |
        make -O test_go_lint
    - *store_gomod
Łukasz Magiera's avatar
Łukasz Magiera committed
88
  gotest:
Steven Allen's avatar
Steven Allen committed
89
    executor: golang
Łukasz Magiera's avatar
Łukasz Magiera committed
90 91
    steps:
    - checkout
Jakub Sztandera's avatar
Jakub Sztandera committed
92 93
    - *make_out_dirs
    - *restore_gomod
Łukasz Magiera's avatar
Łukasz Magiera committed
94

95
    - run: |
Jakub Sztandera's avatar
Jakub Sztandera committed
96
        make -j 1 test/unit/gotest.junit.xml \
97
        && [[ ! $(jq -s -c 'map(select(.Action == "fail")) | .[]' test/unit/gotest.json) ]]
Jakub Sztandera's avatar
Jakub Sztandera committed
98 99 100 101
    - run: 
        when: always
        command: bash <(curl -s https://codecov.io/bash) -cF unittests -X search -f coverage/unit_tests.coverprofile

102 103
    - run:
        when: always
Jakub Sztandera's avatar
Jakub Sztandera committed
104 105 106 107
        command: mv "test/unit/gotest.junit.xml" /tmp/circleci-test-results/unit

    - *store_gomod

Łukasz Magiera's avatar
Łukasz Magiera committed
108 109 110 111 112 113 114 115
    - store_test_results:
        path: /tmp/circleci-test-results
    # Save artifacts
    - store_artifacts:
        path: /tmp/circleci-artifacts
    - store_artifacts:
        path: /tmp/circleci-test-results
  sharness:
Steven Allen's avatar
Steven Allen committed
116
    executor: golang
Łukasz Magiera's avatar
Łukasz Magiera committed
117
    steps:
Jakub Sztandera's avatar
Jakub Sztandera committed
118
    - run: sudo apt install socat
Łukasz Magiera's avatar
Łukasz Magiera committed
119
    - checkout
Jakub Sztandera's avatar
Jakub Sztandera committed
120 121
    - *make_out_dirs
    - *restore_gomod
Łukasz Magiera's avatar
Łukasz Magiera committed
122

123
    - run: make -O -j 10 coverage/sharness_tests.coverprofile test/sharness/test-results/sharness.xml TEST_GENERATE_JUNIT=1 CONTINUE_ON_S_FAILURE=1
Łukasz Magiera's avatar
Łukasz Magiera committed
124

Jakub Sztandera's avatar
Jakub Sztandera committed
125 126 127
    - run:
        when: always
        command: bash <(curl -s https://codecov.io/bash) -cF sharness -X search -f coverage/sharness_tests.coverprofile
128

Jakub Sztandera's avatar
Jakub Sztandera committed
129
    - run: mv "test/sharness/test-results/sharness.xml" /tmp/circleci-test-results/sharness
130
    # make sure we fail if there are test failures
Jakub Sztandera's avatar
Jakub Sztandera committed
131 132 133 134
    - run: find test/sharness/test-results -name 't*-*.sh.*.counts' | test/sharness/lib/sharness/aggregate-results.sh | grep 'failed\s*0'

    - *store_gomod

Łukasz Magiera's avatar
Łukasz Magiera committed
135 136 137 138 139 140 141
    - store_test_results:
        path: /tmp/circleci-test-results
    # Save artifacts
    - store_artifacts:
        path: /tmp/circleci-artifacts
    - store_artifacts:
        path: /tmp/circleci-test-results
Steven Allen's avatar
Steven Allen committed
142
  build:
Steven Allen's avatar
Steven Allen committed
143
    executor: golang
Łukasz Magiera's avatar
Łukasz Magiera committed
144 145 146 147
    steps:
      - checkout
      - *make_out_dirs
      - *restore_gomod
Steven Allen's avatar
Steven Allen committed
148 149 150 151 152 153 154 155
      - run:
          name: Building
          command: make build
      - run:
          name: Storing
          command: |
            mkdir -p /tmp/circleci-workspace/bin
            cp cmd/ipfs/ipfs /tmp/circleci-workspace/bin
Łukasz Magiera's avatar
Łukasz Magiera committed
156 157 158
      - persist_to_workspace:
          root: /tmp/circleci-workspace
          paths:
Steven Allen's avatar
Steven Allen committed
159
            - bin/ipfs
Łukasz Magiera's avatar
Łukasz Magiera committed
160 161
      - *store_gomod
  interop:
Steven Allen's avatar
Steven Allen committed
162
    executor: node
Steven Allen's avatar
Steven Allen committed
163
    parallelism: 4
Łukasz Magiera's avatar
Łukasz Magiera committed
164 165 166 167
    steps:
      - *make_out_dirs
      - attach_workspace:
          at: /tmp/circleci-workspace
Steven Allen's avatar
Steven Allen committed
168 169 170 171 172
      - run:
          name: Cloning
          command: |
            git clone https://github.com/ipfs/interop.git
            git -C interop log -1
Steven Allen's avatar
Steven Allen committed
173 174
      - restore_cache:
          keys:
Steven Allen's avatar
Steven Allen committed
175 176
            - v2-interop-{{ checksum "~/ipfs/go-ipfs/interop/package-lock.json" }}
            - v2-interop-
Łukasz Magiera's avatar
Łukasz Magiera committed
177
      - run:
178 179 180
          name: Installing dependencies
          command: |
            npm install
Łukasz Magiera's avatar
Łukasz Magiera committed
181
          working_directory: ~/ipfs/go-ipfs/interop
Steven Allen's avatar
Steven Allen committed
182
      - save_cache:
Steven Allen's avatar
Steven Allen committed
183
          key: v2-interop-{{ checksum "~/ipfs/go-ipfs/interop/package-lock.json" }}
Steven Allen's avatar
Steven Allen committed
184 185
          paths:
            - ~/ipfs/go-ipfs/interop/node_modules
186 187 188
      - run:
          name: Installing reporting tools
          command: |
Steven Allen's avatar
Steven Allen committed
189
            npm install --save-dev mocha-junit-reporter@1.23.1 mocha-multi-reporters@1.1.0
190
          working_directory: ~/ipfs/go-ipfs/interop
Łukasz Magiera's avatar
Łukasz Magiera committed
191
      - run:
192 193 194 195
          name: Running tests
          command: |
            mkdir -p /tmp/test-results/interop/
            export MOCHA_FILE="$(mktemp /tmp/test-results/interop/unit.XXXXXX.xml)"
196
            echo '{"reporterEnabled": "mocha-junit-reporter, spec"}' > mocha-conf.json
Steven Allen's avatar
Steven Allen committed
197 198
            node_modules/.bin/mocha -R mocha-multi-reporters --reporter-options "configFile=mocha-conf.json" \
              $(sed -n -e "s|^require('\(.*\)')$|test/\1|p" test/node.js | circleci tests split)
Łukasz Magiera's avatar
Łukasz Magiera committed
199
          working_directory: ~/ipfs/go-ipfs/interop
200 201
          environment:
            IPFS_REUSEPORT: false
202
            LIBP2P_ALLOW_WEAK_RSA_KEYS: 1
Steven Allen's avatar
Steven Allen committed
203
            IPFS_GO_EXEC: /tmp/circleci-workspace/bin/ipfs
204 205
      - store_test_results:
          path: /tmp/test-results
Steven Allen's avatar
Steven Allen committed
206
  go-ipfs-api:
Steven Allen's avatar
Steven Allen committed
207
    executor: golang
Steven Allen's avatar
Steven Allen committed
208 209 210 211 212
    steps:
      - *make_out_dirs
      - attach_workspace:
          at: /tmp/circleci-workspace
      - run:
Steven Allen's avatar
Steven Allen committed
213
          name: Cloning
Steven Allen's avatar
Steven Allen committed
214 215 216
          command: |
            git clone https://github.com/ipfs/go-ipfs-api.git
            git -C go-ipfs-api log -1
Steven Allen's avatar
Steven Allen committed
217 218
      - run:
          name: Starting the daemon
Steven Allen's avatar
Steven Allen committed
219 220 221 222
          command: /tmp/circleci-workspace/bin/ipfs daemon --init --enable-namesys-pubsub
          background: true
      - run:
          name: Waiting for the daemon
223
          no_output_timeout: 30s
Steven Allen's avatar
Steven Allen committed
224 225 226 227
          command: |
            while ! /tmp/circleci-workspace/bin/ipfs id --api=/ip4/127.0.0.1/tcp/5001 2>/dev/null; do
              sleep 1
            done
Steven Allen's avatar
Steven Allen committed
228 229 230 231
      - restore_cache:
          keys:
            - v1-go-api-{{ checksum "~/ipfs/go-ipfs/go-ipfs-api/go.sum" }}
            - v1-go-api-
Steven Allen's avatar
Steven Allen committed
232 233 234
      - run:
          command: go test -v ./...
          working_directory: ~/ipfs/go-ipfs/go-ipfs-api
Steven Allen's avatar
Steven Allen committed
235 236 237 238 239 240 241 242
      - save_cache:
          key: v1-go-api-{{ checksum "~/ipfs/go-ipfs/go-ipfs-api/go.sum" }}
          paths:
            - ~/go/pkg/mod
            - ~/.cache/go-build/
      - run:
          name: Stopping the daemon
          command: /tmp/circleci-workspace/bin/ipfs shutdown
Steven Allen's avatar
Steven Allen committed
243
  go-ipfs-http-client:
Steven Allen's avatar
Steven Allen committed
244
    executor: golang
Steven Allen's avatar
Steven Allen committed
245 246 247 248 249
    steps:
      - *make_out_dirs
      - attach_workspace:
          at: /tmp/circleci-workspace
      - run:
Steven Allen's avatar
Steven Allen committed
250
          name: Cloning
Steven Allen's avatar
Steven Allen committed
251 252 253
          command: |
            git clone https://github.com/ipfs/go-ipfs-http-client.git
            git -C go-ipfs-http-client log -1
Steven Allen's avatar
Steven Allen committed
254 255 256 257 258 259
      - restore_cache:
          keys:
            - v1-http-client-{{ checksum "~/ipfs/go-ipfs/go-ipfs-http-client/go.sum" }}
            - v1-http-client-
      - run:
          name: go test -v ./...
Steven Allen's avatar
Steven Allen committed
260 261 262 263
          command: |
            export PATH=/tmp/circleci-workspace/bin:$PATH
            go test -v ./...
          working_directory: ~/ipfs/go-ipfs/go-ipfs-http-client
Steven Allen's avatar
Steven Allen committed
264 265 266 267 268
      - save_cache:
          key: v1-http-client-{{ checksum "~/ipfs/go-ipfs/go-ipfs-http-client/go.sum" }}
          paths:
            - ~/go/pkg/mod
            - ~/.cache/go-build/
269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303
  ipfs-webui:
    executor: node-browsers
    steps:
      - *make_out_dirs
      - attach_workspace:
          at: /tmp/circleci-workspace
      - run:
          name: Cloning
          command: |
            git clone https://github.com/ipfs-shipyard/ipfs-webui.git
            git -C ipfs-webui log -1
      - restore_cache:
          keys:
            - v1-ipfs-webui-{{ checksum "~/ipfs/go-ipfs/ipfs-webui/package-lock.json" }}
            - v1-ipfs-webui-
      - run:
          name: Installing dependencies
          command: |
            npm install
          working_directory: ~/ipfs/go-ipfs/ipfs-webui
      - run:
          name: Running upstream tests (finish early if they fail)
          command: |
            npm test || circleci-agent step halt
          working_directory: ~/ipfs/go-ipfs/ipfs-webui
      - run:
          name: Running tests with go-ipfs built from current commit
          command: npm test
          working_directory: ~/ipfs/go-ipfs/ipfs-webui
          environment:
            IPFS_GO_EXEC: /tmp/circleci-workspace/bin/ipfs
      - save_cache:
          key: v1-ipfs-webui-{{ checksum "~/ipfs/go-ipfs/ipfs-webui/package-lock.json" }}
          paths:
            - ~/ipfs/go-ipfs/ipfs-webui/node_modules
Oli Evans's avatar
Oli Evans committed
304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334
  docker-build:
    executor: dockerizer
    steps:
      - checkout
      - setup_remote_docker
      - run:
          name: Build Docker image
          command: |
            docker build -t $IMAGE_NAME:$WIP_IMAGE_TAG .
      - run:
          name: Archive Docker image
          command: docker save -o go-ipfs-image.tar $IMAGE_NAME
      - persist_to_workspace:
          root: .
          paths:
            - ./go-ipfs-image.tar
  docker-push:
    executor: dockerizer
    steps:
      - checkout
      - setup_remote_docker
      - attach_workspace:
          at: /tmp/workspace
      - run:
          name: Load archived Docker image
          command: docker load -i /tmp/workspace/go-ipfs-image.tar
      - run:
          name: Publish Docker Image to Docker Hub
          command: |
            echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin
            ./bin/push-docker-tags.sh "$CIRCLE_BUILD_NUM" "$CIRCLE_SHA1" "$CIRCLE_BRANCH" "$CIRCLE_TAG" dryrun
Oli Evans's avatar
Oli Evans committed
335

Łukasz Magiera's avatar
Łukasz Magiera committed
336 337
workflows:
  version: 2
Oli Evans's avatar
Oli Evans committed
338 339 340

  # Runs for all branches, but not on tags
  # see: https://circleci.com/docs/2.0/workflows/#executing-workflows-for-a-git-tag
Łukasz Magiera's avatar
Łukasz Magiera committed
341 342
  test:
    jobs:
Steven Allen's avatar
Steven Allen committed
343
    - gobuild
Steven Allen's avatar
Steven Allen committed
344
    - golint
Łukasz Magiera's avatar
Łukasz Magiera committed
345 346
    - gotest
    - sharness
Steven Allen's avatar
Steven Allen committed
347
    - build
Łukasz Magiera's avatar
Łukasz Magiera committed
348 349
    - interop:
        requires:
Steven Allen's avatar
Steven Allen committed
350 351 352 353 354 355 356
          - build
    - go-ipfs-api:
        requires:
          - build
    - go-ipfs-http-client:
        requires:
          - build
357 358 359
    - ipfs-webui:
        requires:
          - build
Oli Evans's avatar
Oli Evans committed
360 361 362 363 364 365 366 367 368 369 370 371
    - docker-build
    - docker-push:
        requires:
        - docker-build
        - golint
        - gotest
        - sharness
        - interop
        - go-ipfs-api
        - go-ipfs-http-client
        - ipfs-webui

372 373 374
  # NOTE: CircleCI only builds tags if you explicitly filter for them. That
  # also means tag-based jobs can only depend on other tag-based jobs, so we
  # use a separate workflow because every job needs to be tagged together.
Oli Evans's avatar
Oli Evans committed
375 376 377 378 379 380 381
  # see: https://circleci.com/docs/2.0/workflows/#executing-workflows-for-a-git-tag
  docker-on-tag: 
    jobs:
      - docker-build:
          filters:
            tags:
              only: /^v[0-9].*|^cluster.+/
Oli Evans's avatar
Oli Evans committed
382
            branches:
Oli Evans's avatar
Oli Evans committed
383
              ignore: /.*/
Oli Evans's avatar
Oli Evans committed
384 385 386 387 388 389
      - docker-push:
          requires:
            - docker-build
          filters:
            tags:
              only: /^v[0-9].*|^cluster.+/
Oli Evans's avatar
Oli Evans committed
390
            branches:
Oli Evans's avatar
Oli Evans committed
391
              ignore: /.*/