xd009642 / coveralls-api

Rust implementation of the coveralls api. Allows you to send coveralls reports to coveralls.io
Apache License 2.0
2 stars 2 forks source link

Support other CI environment variables #1

Closed breezewish closed 5 years ago

breezewish commented 5 years ago

Looks like it would be better to support these env variables (filling them in the upload json) according to https://docs.coveralls.io/supported-ci-services and https://github.com/lemurheavy/coveralls-ruby/blob/ecece72d423352432bcac2833952f352c2377350/lib/coveralls/configuration.rb#L114:

CI_NAME
CI_BUILD_NUMBER
CI_BUILD_URL
CI_BRANCH
CI_PULL_REQUEST

Also, it would be even nicer if env var detection can be more smart, like: https://github.com/lemurheavy/coveralls-ruby/blob/ecece72d423352432bcac2833952f352c2377350/lib/coveralls/configuration.rb#L199

(For me, our project is using a self-hosted Jenkins CI)

xd009642 commented 5 years ago

I'll look into doing this now, just going to have to refresh myself on how the API works. Out of curiosity are you using this crate for a project or considering it?

breezewish commented 5 years ago

@xd009642 We are running cargo tarpaulin in our own CI (Jenkins CI) and figured out that git related information is not sent to Coveralls, which leads to displaying "Unknown" status 🤣 Currently we write a proxy that manipulates the JSON on-the-fly, thanks to the endpoint url configuration in tarpaulin. But would be more elegant if this crate can support it natively!

xd009642 commented 5 years ago

Okay, could you just send me what the json looks like and what it should look like? I find the coveralls api documentation lacking in some areas and I think some of these might be optional fields I don't use.

breezewish commented 5 years ago

@xd009642 Our json after manipulation looks like (js output):

{ repo_token: 'xxxxxxx',
  source_files: 
   [ { name: '../../benches/hierarchy/engine_factory.rs',
       source_digest: 'c1ddbc3f0b00ccc13057af94d1a540fc',
       coverage: [Object] },
     { name: '../../benches/hierarchy/mod.rs',
       source_digest: '7d1ea12b8e1300fe8c3ec75bca077903',
       coverage: [Object] },
     { name: '../../benches/misc/channel/bench_channel.rs',
       source_digest: '5fd32d810109a373e820f57cba8a0545',
       coverage: [Object] },
     { name: '../../benches/misc/coprocessor/codec/chunk/arrow.rs',
       source_digest: 'f8804674a4a66e16cbd419d683915e48',
       coverage: [Object] },
     { name: '../../benches/misc/raftkv/mod.rs',
       source_digest: 'd667e6303a54dffc8b0c8801bb415a78',
       coverage: [Object] },
     { name: '../../benches/misc/serialization/bench_serialization.rs',
       source_digest: '1a99275deda6a26ba4f7d6950892b30c',
       coverage: [Object] },
     { name: '../../benches/raftstore/mod.rs',
       source_digest: '6bc549d9207febd26a51e4dad1cab50d',
       coverage: [Object] },
     { name: 'src/buffer.rs',
       source_digest: '673a135676743f8789a30e91b64619f7',
       coverage: [Object] },
     { name: 'src/error.rs',
       source_digest: '2401e570615773dbafd9190f2e827e32',
       coverage: [Object] },
     { name: '../cop_datatype/src/def/eval_type.rs',
       source_digest: '0076d6644d6675bd834e8035eac7e9a9',
       coverage: [Object] },
     { name: '../cop_datatype/src/def/field_type.rs',
       source_digest: 'd89ac53f642d39b494ca2dfdb8a9feea',
       coverage: [Object] },
     { name: '../test_coprocessor/src/column.rs',
       source_digest: 'edb597dbe1332abcf2396b429b57a8e8',
       coverage: [Object] },
     { name: '../test_coprocessor/src/dag.rs',
       source_digest: '7fd2980d4db8f04fab04a74a37f72e2f',
       coverage: [Object] },
     { name: '../test_coprocessor/src/fixture.rs',
       source_digest: '6837ef3113a3e861c43f1c8b43b6eb8e',
       coverage: [Object] },
     { name: '../test_coprocessor/src/store.rs',
       source_digest: '9b8be5179eb12519a4863a7a9d9e5e71',
       coverage: [Object] },
     { name: '../test_coprocessor/src/table.rs',
       source_digest: '085e409b2968e2b280f77ed8bd3d9800',
       coverage: [Object] },
     { name: '../test_raftstore/src/cluster.rs',
       source_digest: '356ffa0a1578b4eb0e1f0fdee1c404f5',
       coverage: [Object] },
     { name: '../test_raftstore/src/node.rs',
       source_digest: '07e408b959c64967580e1eb310c0e5f4',
       coverage: [Object] },
     { name: '../test_raftstore/src/pd.rs',
       source_digest: '714875da0ca30e64bd44372fa8fb5796',
       coverage: [Object] },
     { name: '../test_raftstore/src/server.rs',
       source_digest: '528c4d24484b26a95e78dec59657cd2e',
       coverage: [Object] },
     { name: '../test_raftstore/src/transport_simulate.rs',
       source_digest: '015d6229e5c88f1a6e513bc7f7b201c2',
       coverage: [Object] },
     { name: '../test_storage/src/assert_storage.rs',
       source_digest: '8d06a00cb846a7eb886ee281afe9572c',
       coverage: [Object] },
     { name: '../test_storage/src/sync_storage.rs',
       source_digest: '6f0c6451d2d0b756f2a0b3d7f0f37ed0',
       coverage: [Object] },
     { name: '../test_util/src/kv_generator.rs',
       source_digest: '84e0c4b028f68f2130f57ec8fd8aa0a7',
       coverage: [Object] },
     { name: '../test_util/src/logging.rs',
       source_digest: 'a979c3464169f7a35c5f5889477bf5cc',
       coverage: [Object] },
     { name: '../../fuzz/cli.rs',
       source_digest: 'c82d238d6593928dc70d76aae2e5c8dc',
       coverage: [Object] },
     { name: '../../fuzz/targets/mod.rs',
       source_digest: '321ffe98b172f9405a090363a1a56ae9',
       coverage: [Object] },
     { name: '../../fuzz/targets/util.rs',
       source_digest: '4649ad7735dceef6b8f7b9712d57a70f',
       coverage: [Object] },
     { name: '../../src/bin/tikv-ctl.rs',
       source_digest: '1e649cd1417dbe6a4bc5609453f13897',
       coverage: [Object] },
     { name: '../../src/bin/util/profiling.rs',
       source_digest: '1501b23bfed7cbe980a830dfcd2a4c62',
       coverage: [Object] },
     { name: '../../src/config.rs',
       source_digest: 'ca15aa8fd1fe8239930a76c3c2e6ce2d',
       coverage: [Object] },
     { name: '../../src/coprocessor/checksum.rs',
       source_digest: '41c8c74ea16fb1d919b8d86427177b68',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/batch/column.rs',
       source_digest: 'dc754bcecebbd6b4d75e1a38ebba8e90',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/batch/rows.rs',
       source_digest: 'fa4dca7f6b9b4fc499c70a2ad71a9f11',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/chunk/chunk.rs',
       source_digest: '11a964ae351266f2e167f9e9322d9dd6',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/chunk/column.rs',
       source_digest: 'd1f4b04a03f7fa8856544c8273afbe36',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/convert.rs',
       source_digest: '74bfdbe7cb56c23fc9b1cfdf6ef233a9',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/datum.rs',
       source_digest: '793d8ca77c933f90b706c72be1f4173f',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/error.rs',
       source_digest: '2d14ba18e41cd3cb56b0efa2905696a2',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/mysql/decimal.rs',
       source_digest: 'b9148963191e53ef28f5f2803063f405',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/mysql/duration.rs',
       source_digest: '09f8f3d0747da11091e5c90aa8579397',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/mysql/json/binary.rs',
       source_digest: '9ca11bdd562d5f9f3b48dcca387a8f21',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/mysql/json/comparison.rs',
       source_digest: 'f7f2d3f799b605f6a68041fb20e2f8f6',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/mysql/json/json_cast.rs',
       source_digest: '0809a5369127e94b1b47eafe83187d07',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/mysql/json/json_extract.rs',
       source_digest: '35d8bfb5b71a676789802a8ddbe8332d',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/mysql/json/json_merge.rs',
       source_digest: 'e48132aa45fea9b755f8ce756d03db6b',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/mysql/json/json_modify.rs',
       source_digest: 'a2c9610b15c3192e68086d86c70fd5f1',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/mysql/json/json_remove.rs',
       source_digest: '089886d6049dacfb92fdd482dcdbb28a',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/mysql/json/json_type.rs',
       source_digest: '87ff63dd9d845b8ee07d4344a2a4f4ee',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/mysql/json/json_unquote.rs',
       source_digest: 'bfc60345b1a77f7170e9473290955b5c',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/mysql/json/path_expr.rs',
       source_digest: '1f0120094151db35875b10590fcf10c8',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/mysql/json/serde.rs',
       source_digest: '6d99cc31720a1439d92a86e727a0428b',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/mysql/time/extension.rs',
       source_digest: '182cb739d11814c587150178a24bf72a',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/mysql/time/mod.rs',
       source_digest: '39a749ce3271390ad098d620dc327878',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/mysql/time/tz.rs',
       source_digest: '1922249143efa18aa498960f6acaa64f',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/mysql/time/weekmode.rs',
       source_digest: '520fe6470b656f846ced9a826280c6b7',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/overflow.rs',
       source_digest: '9b1e0936cfcc7c1999d7ffdd5a3b733f',
       coverage: [Object] },
     { name: '../../src/coprocessor/codec/table.rs',
       source_digest: 'c0009e6e50802c0f34eddb175881d613',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/dag.rs',
       source_digest: '295d411aa548979aacea85084cecdc45',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/executor/aggregate.rs',
       source_digest: '236d153f411788ab0fc9b4b03244438f',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/executor/aggregation.rs',
       source_digest: 'c1f663b60f58d2fd5fff798eb621c2b0',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/executor/index_scan.rs',
       source_digest: '2e9e42df23f09f92ce8d9c322df80d64',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/executor/limit.rs',
       source_digest: '95491efcfe073aa6d5c8232e76b0bdf9',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/executor/metrics.rs',
       source_digest: 'deee481e0177d53744b8baf72a47acbd',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/executor/mod.rs',
       source_digest: 'fdd88d5ac441a154928144324c14f653',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/executor/scanner.rs',
       source_digest: '0c6bbd281f26c500d7c773bc3ba05123',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/executor/selection.rs',
       source_digest: 'd1927c413e37e7d5e4b3c9b8c2c7e5da',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/executor/table_scan.rs',
       source_digest: '0f1b818d1de4f512d5094c48d45a4ea7',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/executor/topn.rs',
       source_digest: 'f1c337282b1acb1271de04827ddf1ca3',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/executor/topn_heap.rs',
       source_digest: 'b285a18dfcc406119cc6ae47e7ec97bd',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/expr/builtin_arithmetic.rs',
       source_digest: 'bcfc49767458de650ebeb6c09fc3788b',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/expr/builtin_cast.rs',
       source_digest: 'b6f814f1fbbb63c8ae9c8ee55b830bb6',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/expr/builtin_compare.rs',
       source_digest: 'e36c3b537313af7557c284cb4ea40d38',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/expr/builtin_control.rs',
       source_digest: '628eabaea03861bc096481f4b5ec4d4e',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/expr/builtin_encryption.rs',
       source_digest: 'f27f3f031a9ba5dc275446e308206c60',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/expr/builtin_json.rs',
       source_digest: 'd75330351ba92e6af796edb4f8488a5f',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/expr/builtin_like.rs',
       source_digest: '765ca7997c16dc411db5e8bb0e58dc91',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/expr/builtin_math.rs',
       source_digest: '0943c3c9175b70009decd5bc8ee1f0c6',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/expr/builtin_miscellaneous.rs',
       source_digest: '1f937730c607f0302b4945d8cf9e6a84',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/expr/builtin_op.rs',
       source_digest: 'afac11cf39114fc966cef877445870bc',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/expr/builtin_other.rs',
       source_digest: 'd5a2ee7e1c17998ac8f7ae967d6a51ee',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/expr/builtin_string.rs',
       source_digest: '9f71b7f0ae26ad9f0f1a07c012027ca0',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/expr/builtin_time.rs',
       source_digest: '5cc08f7d11136a6d32447a9bbf4a5210',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/expr/column.rs',
       source_digest: '6f702bd6c459701842d7df8c62f98e93',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/expr/constant.rs',
       source_digest: 'b4d8e5a0aa20d386012e7ff924246b7d',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/expr/ctx.rs',
       source_digest: '1ae94bdcfd394aeb2add65d1bc03d903',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/expr/mod.rs',
       source_digest: '23ff01d7a8e42c6683a9b929fb8083a3',
       coverage: [Object] },
     { name: '../../src/coprocessor/dag/expr/scalar_function.rs',
       source_digest: '947bf3076ab971f3454b01ec9adc323f',
       coverage: [Object] },
     { name: '../../src/coprocessor/endpoint.rs',
       source_digest: 'da2f4e7701d26432d3ed0a4125c1afa6',
       coverage: [Object] },
     { name: '../../src/coprocessor/error.rs',
       source_digest: '0e1afbebf32fb23965345c8096c5ae93',
       coverage: [Object] },
     { name: '../../src/coprocessor/local_metrics.rs',
       source_digest: '7f0e02ee13d3d57de43fc1083ab7cc83',
       coverage: [Object] },
     { name: '../../src/coprocessor/mod.rs',
       source_digest: 'a972824da46784cf4519691cda149434',
       coverage: [Object] },
     { name: '../../src/coprocessor/readpool_context.rs',
       source_digest: '1f63b7c96b29990099d8db3566a9d560',
       coverage: [Object] },
     { name: '../../src/coprocessor/statistics/analyze.rs',
       source_digest: '5907df86d6ee9bac62ed929424e8f27d',
       coverage: [Object] },
     { name: '../../src/coprocessor/statistics/cmsketch.rs',
       source_digest: '380ccd78baf3b3ce69a9ae7f73d83057',
       coverage: [Object] },
     { name: '../../src/coprocessor/statistics/fmsketch.rs',
       source_digest: 'a224643ba818a6fa7a8214e99cfea258',
       coverage: [Object] },
     { name: '../../src/coprocessor/statistics/histogram.rs',
       source_digest: 'f5817746eea5289aed46e3bc0af4cbf2',
       coverage: [Object] },
     { name: '../../src/coprocessor/tracker.rs',
       source_digest: 'd54c2c0252d539179944e459e0ddf44c',
       coverage: [Object] },
     { name: '../../src/coprocessor/util.rs',
       source_digest: '65d21c92cca0e3a579274a9a352219a9',
       coverage: [Object] },
     { name: '../../src/import/client.rs',
       source_digest: '7067e69dce08c0ff48eb9ccd454c663c',
       coverage: [Object] },
     ... 130 more items ],
  commit_sha: 'xxxxxxx',
  service_branch: 'master' }

And it works well for Coveralls. Notice that "service_branch" is not a field in this repo.

You may refer other available fields here, though I have not tried them all: https://github.com/lemurheavy/coveralls-ruby/blob/ecece72d423352432bcac2833952f352c2377350/lib/coveralls/configuration.rb#L54

xd009642 commented 5 years ago

So I haven't forgotten about this issue, it's just a case of finding the time for it! There is a new PR on the tarpaulin develop branch which adds the git info to the uploaded json. Don't know if that's helps with the issue at all?

xd009642 commented 5 years ago

I've implemented an initial version based on the links. If no CI is provided it tries to work out from the environment variables first otherwise falls back to the old approach. If a ci is specified it does the old approach still (but I'll get to that). Just want to see if my auto-detection stuff works first :+1:

I'm testing it on travis, I'd appreciate a Jenkins test if you have time. To install the test version just use the following cargo command:

RUSTFLAGS="--cfg procmacro2_semver_exempt" cargo install cargo-tarpaulin --git https://github.com/xd009642/tarpaulin --branch coveralls-test
breezewish commented 5 years ago

Thanks a lot! I will take a look at it soon and see if it works!

xd009642 commented 5 years ago

Have you had a chance to test it yet?

breezewish commented 5 years ago

Sorry for the late reply, I was on vacation recently 😄

I tried your latest version and seems that it doesn't work for me because repo_token field was not included when a service (in my case, Jenkins) is recognized. According to doc section "CIRCLE, JENKINS, SEMAPHORE AND CODESHIP" looks like the supplement of COVERALLS_REPO_TOKEN should be respected even if there is a known service.

My testing command was:

cargo tarpaulin --coveralls my_token -v

Which pushes a report to Coveralls (but branch info was not included) for current Tarpaulin master but does not successfully push a report at all for the new branch, caused by repo_token missing.

xd009642 commented 5 years ago

Okay I might have to rejiggle things some more for handling travis but I've pushed an update to both this repo and tarpaulin. So if you do a clean install and let me know if it works :+1:

breezewish commented 5 years ago

@xd009642 Tried with your latest version, works like a charm! 👍

xd009642 commented 5 years ago

Sweet, I'll double check the code this end, publish a new version then do the same tarpaulin side!

breezewish commented 5 years ago

@xd009642 That's awesome! Thanks for your great job!

xd009642 commented 5 years ago

Okay we're nearly there, I've published the new coveralls version. Updated tarpaulin and filled in some edge cases for if the tool is specified. If you could make sure I haven't unwittingly broken anything and I'll double check it still works with travis for one of my projects :+1: then if so I'll merge my tarpaulin changes and release a new tarpaulin version sometime this week!

xd009642 commented 5 years ago

For some reason I'm not getting anything for Travis... I'll have to look into this before I release

xd009642 commented 5 years ago

So I have a feeling having the repo token might be messing up the travis runs because of their special behaviour for free travis instances... I might have to update coveralls-api to handle this. I'll message again when I've figured it out travis side just so we can double check I haven't broken anything for Jenkins.

xd009642 commented 5 years ago

@breeswish if you try it again just to make sure. Nothing I changed to get tarpaulin working with travis should affect jenkins. However, it's always nice to double check these things!

breezewish commented 5 years ago

@xd009642 Tried again in our environment and there is no problem! 👍

xd009642 commented 5 years ago

Awesome! I've merged it into tarpaulin's develop branch. There will either be a new release this weekend or next week but until then you can use the develop builds via docker (although there might be a docker issue) or using cargo to install it :+1: