Compare commits

..

242 Commits

Author SHA1 Message Date
Renée Hendricksen
542592ae41 Merge pull request #313 from travis-ci/fix_sentry_errors
fix another sentry error
2016-08-14 21:22:26 -04:00
Renée Hendricksen
c2c1952d40 Merge branch 'master' into fix_sentry_errors 2016-08-14 21:06:18 -04:00
Renée Hendricksen
ca80c7f0a2 fix another sentry error 2016-08-14 21:05:56 -04:00
Renée Hendricksen
a9f84c27b0 Merge pull request #311 from travis-ci/fix_sentry_errors
Fix sentry errors
2016-08-14 20:51:11 -04:00
Renée Hendricksen
65aece922c fix another sentry error 2016-08-14 20:35:11 -04:00
Renée Hendricksen
17ccc22fbe fix the atom bug 2016-08-14 19:23:22 -04:00
Renée Hendricksen
51575bdb89 this fixes the error 2016-08-14 18:16:05 -04:00
Renée Hendricksen
b3e8b9d43b more debug output 2016-08-14 17:26:03 -04:00
Renée Hendricksen
ba6b5b7cba add some debug for testing staging 2016-08-14 16:54:34 -04:00
Joe Corcoran
8afaeb10c0 Merge pull request #310 from travis-ci/joshk-customerio-domain-data
also send the travis domain to customer.io
2016-08-12 14:41:59 +02:00
Josh Kalderimis
c7161cec81 also send the travis domain to customer.io 2016-08-12 14:37:05 +02:00
Aakriti Gupta
8a14ef827f Merge pull request #302 from travis-ci/ps-stop-using-last-deploy-sha-buildpack
Use `HEROKU_SLUG_COMMIT` instead of last-commit-sha-buildpack
2016-08-11 15:20:26 +02:00
Piotr Sarnacki
32503b0731 Use HEROKU_SLUG_COMMIT instead of last-commit-sha-buildpack
We used last-commit-sha-buildpack in order to fetch the sha of the last
deployed commit during building the app and save it to use it later.
This was done using undocumented Heroku properties, for example it
assumed a certain path to git files. It turns out that there's another
way to do it now. We can enable dyno-metadata[1] feature on heroku and
use HEROKU_SLUG_COMMIT

[1] https://devcenter.heroku.com/articles/dyno-metadata
2016-08-08 13:31:52 +02:00
Renée Hendricksen
178122e247 Merge pull request #309 from travis-ci/fix_crons
fix the reported error on crons
2016-08-04 15:13:03 -04:00
Renée Hendricksen
7655d0edd2 Merge branch 'master' into fix_crons 2016-08-04 15:06:55 -04:00
Renée Hendricksen
885ae009f4 fix the reported error on crons 2016-08-04 15:05:20 -04:00
Renée Hendricksen
614b1f5338 Merge pull request #308 from travis-ci/fix_crons
Fix crons
2016-08-03 00:41:39 -04:00
Renée Hendricksen
8655579a94 clean up the debug output 2016-08-03 00:17:11 -04:00
Renée Hendricksen
77e47bc41a don't report console errors to Sentry 2016-08-03 00:13:43 -04:00
Renée Hendricksen
779b6a569e don't allow one error to stop all crons from running 2016-08-02 23:49:47 -04:00
Renée Hendricksen
abe7b13605 better output 2016-08-02 23:16:00 -04:00
Renée Hendricksen
0dc7e2743c take intentional error out to see real errors 2016-08-02 22:56:13 -04:00
Renée Hendricksen
d42362eacc looks like Raven isn't getting the reports because the dyno doesn't exist long enough for the http request to get out :( 2016-08-02 22:49:02 -04:00
Renée Hendricksen
1788e0c0fb more output for the strange behavior on staging 2016-08-02 22:42:32 -04:00
Renée Hendricksen
20d4df8af3 test output for staging 2016-08-02 22:34:49 -04:00
Renée Hendricksen
d41ddd7171 testing console on staging 2016-08-02 22:03:31 -04:00
Renée Hendricksen
6ca063cf3d adding an error to see if I get it from Sentry 2016-08-02 21:26:04 -04:00
Renée Hendricksen
f787a96b96 Auto-merged master into fix_crons on deployment. 2016-08-02 21:03:43 -04:00
Renée Hendricksen
d0a143d76a ensure that the Time.now builds get started and tag the Sentry errors from cron 2016-08-02 19:44:33 -04:00
Ana Rosas
cdce95a508 Merge pull request #307 from travis-ci/ar-fix-request-endpoint
Restoring /requests new version
2016-08-02 10:13:00 -05:00
Ana Rosas
0f2b1edae1 Remove unnecessary sign 2016-08-02 10:02:44 -05:00
Ana Rosas
f09e9931b2 Restoring requests code 2016-08-02 09:39:00 -05:00
Brandon Ferguson
75bd65e56c Merge pull request #305 from travis-ci/backport-amqps-fix
Backport travis-core/travis-config AMQPS fix
2016-08-01 12:27:09 +02:00
bnferguson
f4cb24c4b4 fix deprecation warnings 2016-08-01 12:01:34 +02:00
bnferguson
4888c2c905 Add specs for patched in travis-config updates 2016-08-01 11:53:11 +02:00
bnferguson
edf889b55f fix typo 2016-08-01 11:33:52 +02:00
bnferguson
0dc1009ab4 Patch in AMQPS support from travis-core since its vendored here 2016-08-01 11:32:16 +02:00
Ana Rosas
255640fd4f Merge pull request #283 from travis-ci/ar-remove-unused-core-code
Remove legacy travis-core code
2016-07-28 12:17:58 -05:00
Ana Rosas
bcf08e0e7e Remove SS reference on nginx config 2016-07-28 10:29:58 -05:00
Ana Rosas
89eea1682f Merge branch 'ar-remove-unused-core-code' of github.com:travis-ci/travis-api into ar-remove-unused-core-code 2016-07-28 09:26:52 -05:00
Ana Rosas
9e1c6933f5 Use nginx buildpack 2016-07-28 15:09:09 +02:00
Ana Rosas
3f97b40914 Restore sigsci-buildpack-nginx 2016-07-28 15:09:09 +02:00
Ana Rosas
90e5d968ea Try herouku buildpack from sigsci 2016-07-28 15:09:08 +02:00
Ana Rosas
7d70f161a1 Use only nginx package 2016-07-28 15:09:08 +02:00
Ana Rosas
7f3fb70ec7 Add nginx buildpack 2016-07-28 15:09:08 +02:00
Ana Rosas
175e266a6d Rever removing signalsciences buildpack 2016-07-28 15:09:08 +02:00
Ana Rosas
e037127a9c Remove sigsci buildpack temporarily 2016-07-28 15:09:08 +02:00
Ana Rosas
5293919f3a Remove repeated gem 2016-07-28 15:09:08 +02:00
Aakriti Gupta
c6a1eda572 Move travis-core files from /vendor to /lib.
- Re-factor
- Remove code for notifications
- Remove addons
- Remove travis-core gem.
- Ignore logs directory only
- Move core tests to spec/lib
2016-07-28 15:09:08 +02:00
Ana Rosas
cb89cae39f Remove event#notify 2016-07-28 15:09:07 +02:00
Aakriti Gupta
bcbf0abf60 Remove feature flip from requests endpoint 2016-07-28 15:09:07 +02:00
Ana Rosas
9e2fff6e0a Remove specs from vendored travis-core 2016-07-28 15:09:07 +02:00
Ana Rosas
5dd513f79b Remove unused travis-core services 2016-07-28 15:09:07 +02:00
Ana Rosas
9b5893b07c Remove old code references from v3 endpoints 2016-07-28 15:09:07 +02:00
Ana Rosas
8bd4d7db5e Remove old code references from v2 endpoints 2016-07-28 15:09:07 +02:00
carlad
4254b181d4 Merge pull request #304 from travis-ci/v3-documentation
add info about developer.travis-ci.org to readme
2016-07-28 15:04:59 +02:00
carlad
8eb9811b30 add tool as dependency 2016-07-27 16:54:29 +02:00
carlad
93cfcadeef Merge pull request #303 from travis-ci/cd-sentry
Send error logging to Sentry
2016-07-27 12:50:27 +02:00
carlad
9e61d5e636 revert typo 2016-07-27 12:10:39 +02:00
carlad
c112c56664 add typo to test sending of error to sentry on staging 2016-07-27 11:59:36 +02:00
carlad
3a1b1a591f remove comment 2016-07-26 17:53:35 +02:00
carlad
72be42b88f move capture_exception to correct method, update spec 2016-07-26 17:36:02 +02:00
carlad
291fea3e07 add a cron to the test 2016-07-26 17:03:32 +02:00
carlad
1733ea69d5 remove expectation 2016-07-26 16:49:22 +02:00
carlad
543998feea update spec 2016-07-26 16:05:58 +02:00
carlad
e31976974c try to get spec to pass 2016-07-26 15:35:41 +02:00
carlad
c90991e10a update cron spec 2016-07-26 13:38:53 +02:00
carlad
c00cdbaff7 crons only 2016-07-25 19:30:45 +02:00
carlad
5e798aca6f try to fix spec 2016-07-25 15:54:26 +02:00
carlad
7107f4378c resolve conflicts 2016-07-25 14:43:19 +02:00
carlad
1e04b52f5f change raven syntax 2016-07-25 12:42:16 +02:00
carlad
20be47698a try raven.new 2016-07-22 15:19:14 +02:00
carlad
185067265c remove unnecessary requires, inital work on spec 2016-07-21 17:56:41 +02:00
carlad
27dbe9a75a require sentry, move raven capture 2016-07-21 17:24:36 +02:00
carlad
cafe40a4c3 add sentry capture to v3 router 2016-07-21 17:07:25 +02:00
Ana Rosas
e5492f77ce Use nginx buildpack 2016-07-20 13:44:26 -05:00
Ana Rosas
2df85a5068 Restore sigsci-buildpack-nginx 2016-07-20 13:28:33 -05:00
Ana Rosas
22a26580d9 Try herouku buildpack from sigsci 2016-07-20 13:23:21 -05:00
Ana Rosas
b471b92b60 Use only nginx package 2016-07-20 12:42:26 -05:00
Ana Rosas
89c96ecb95 Add nginx buildpack 2016-07-20 11:48:37 -05:00
Ana Rosas
0647dcdcb2 Rever removing signalsciences buildpack 2016-07-20 11:23:56 -05:00
Ana Rosas
11594487fb Remove sigsci buildpack temporarily 2016-07-20 10:25:42 -05:00
Ana Rosas
476e944c55 Remove repeated gem 2016-07-20 08:40:53 -05:00
Aakriti Gupta
65f1a29d86 Move travis-core files from /vendor to /lib.
- Re-factor
- Remove code for notifications
- Remove addons
- Remove travis-core gem.
- Ignore logs directory only
- Move core tests to spec/lib
2016-07-20 11:22:25 +02:00
Ana Rosas
e9b3ed308a Remove event#notify 2016-07-20 11:22:25 +02:00
Ana Rosas
bfd44e1d77 Remove specs from vendored travis-core 2016-07-20 11:22:21 +02:00
Ana Rosas
155767ea37 Remove unused travis-core services 2016-07-20 11:22:06 +02:00
Ana Rosas
70adc93a8f Remove old code references from v3 endpoints 2016-07-20 11:21:45 +02:00
Aakriti Gupta
9ab4111f33 Remove feature flip from requests endpoint 2016-07-20 11:20:19 +02:00
Ana Rosas
0ee949a846 Remove specs from vendored travis-core 2016-07-20 11:17:51 +02:00
Ana Rosas
8c512677f1 Remove unused travis-core services 2016-07-20 11:17:51 +02:00
Ana Rosas
510fb8b146 Remove old code references from v3 endpoints 2016-07-20 11:17:51 +02:00
Ana Rosas
75ef3a6367 Remove old code references from v2 endpoints 2016-07-20 11:17:50 +02:00
Renée Hendricksen
a45d53f73c Merge pull request #279 from travis-ci/jc-v3-env-vars
[WIP] Add environment variable endpoints
2016-07-14 20:02:24 -04:00
Renée Hendricksen
652439226a Merge branch 'master' into jc-v3-env-vars 2016-07-14 19:57:40 -04:00
Renée Hendricksen
b31301ac1f Merge pull request #292 from travis-ci/rlh_cleanup3
use the new method
2016-07-14 19:54:25 -04:00
Renée Hendricksen
48e4a2c589 use travis settings for encrypted columns 2016-07-14 17:47:17 -04:00
Renée Hendricksen
58cd17158c decrypt the public values for return and fix the tests 2016-07-14 17:24:49 -04:00
Renée Hendricksen
01893ba62b Merge pull request #300 from travis-ci/fix_time_dependent_test
Fix Time Dependent Tests
2016-07-13 10:10:45 -04:00
Renée Hendricksen
42b1661107 already required in the spec helper now 2016-07-12 19:27:04 -04:00
Renée Hendricksen
16968f445f freeze time for the whole suite so all the Time.now calls sprinkled through the old tests won't error if there is a delay on Travis CI 2016-07-12 19:23:24 -04:00
Renée Hendricksen
c10145cc93 builds occasionally fail when the timestamps are a second off, this should fix that 2016-07-12 17:38:55 -04:00
Renée Hendricksen
35ae19c3a0 Merge branch 'jc-v3-env-vars' into rlh_cleanup3 2016-07-12 17:08:10 -04:00
Renée Hendricksen
8cdbca925b Merge branch 'master' into jc-v3-env-vars 2016-07-12 17:07:51 -04:00
Renée Hendricksen
2783a69f89 encrpted value and working tests 2016-07-12 14:12:46 -04:00
Ana Rosas
40bff028f3 Merge pull request #299 from travis-ci/ar-fix-requests-endpoint-params
Handle build and job restarts on /requests
2016-07-12 09:17:37 -05:00
Ana Rosas
8b7a589018 Merge branch 'master' into ar-fix-requests-endpoint-params 2016-07-12 08:51:04 -05:00
Piotr Sarnacki
87a069863a Merge pull request #297 from travis-ci/ps-fix-v3-enable-repo
Upload SSL Key to GitHub when activating private repository
2016-07-12 11:37:13 +02:00
Piotr Sarnacki
14ea592cd7 Upload SSL Key to GitHub when activating private repository 2016-07-12 11:28:35 +02:00
Ana Rosas
54e9d2fd06 Get type of model in order to call correct restart event 2016-07-11 15:20:34 -05:00
Ana Rosas
f544f3b15a Requests endpoint receives build_id and job_id 2016-07-11 15:14:30 -05:00
Ana Rosas
a5480fb097 Merge pull request #298 from travis-ci/ar-fix-requests-endpoint
Fixes /requests endpoint
2016-07-11 14:44:36 -05:00
Ana Rosas
b234ad73be Use repo owner instead of current user 2016-07-11 14:29:05 -05:00
Ana Rosas
2ab8af6659 Use build:restart event 2016-07-11 14:29:05 -05:00
Ana Rosas
564e95be6b Use params instead of payload and return error message 2016-07-11 14:29:04 -05:00
Renée Hendricksen
1a36fc6195 Merge branch 'jc-v3-env-vars' into rlh_cleanup3 2016-07-11 15:14:15 -04:00
Renée Hendricksen
f8b8ef54a9 Merge branch 'master' into rlh_cleanup3 2016-07-11 15:13:24 -04:00
Renée Hendricksen
3fb7c35286 copy pasta fix 2016-07-07 01:30:35 -04:00
Renée Hendricksen
f63bb1c6a2 if this logic isn't needed we should take it out later 2016-07-07 01:16:39 -04:00
Renée Hendricksen
f1d7305e9d Merge branch 'master' into jc-v3-env-vars 2016-07-07 00:41:00 -04:00
Renée Hendricksen
b94d9c8637 use the new method 2016-07-07 00:31:35 -04:00
Konstantin Haase
f7f6478fa4 indentation 2016-07-06 10:56:14 +02:00
Renée Hendricksen
21f445ad64 Merge branch 'master' into jc-v3-env-vars 2016-07-05 18:02:29 -04:00
Renée Hendricksen
1ec8dba7e4 fix the tests 2016-07-05 13:36:31 -04:00
Ana Rosas
1d7bc10ed9 Merge pull request #291 from travis-ci/ag-ar-restart-in-request-endpoint
Use new restart service on request endpoint
2016-07-05 10:50:58 -05:00
Renée Hendricksen
ac7e610510 Merge branch 'master' into jc-v3-env-vars 2016-07-05 11:44:28 -04:00
Ana Rosas
db193cb541 Use new restart service on request endpoint 2016-07-05 10:25:54 -05:00
Igor
ff7d1dbfdd Merge pull request #290 from travis-ci/igor-update-rack-attack
Update rack-attack to 5.0.0.beta1
2016-07-05 13:11:59 +02:00
Igor
237f270708 Merge pull request #289 from travis-ci/igor-safelist-github-ips
safelist github IP range in Rack::Attack
2016-07-05 13:11:19 +02:00
Igor Wiedler
50b78a1458 Merge branch 'igor-safelist-github-ips' into igor-update-rack-attack 2016-07-05 13:03:05 +02:00
Igor Wiedler
79c14d697e only create/allocate GitHub CIDR object once 2016-07-05 13:02:00 +02:00
Igor Wiedler
d84d3983b8 update rack-attack to 5.0.0.beta1, use safelist/blocklist terminology 2016-07-05 12:58:58 +02:00
Igor Wiedler
a210cf8661 support nil ip 2016-07-05 12:46:32 +02:00
Igor Wiedler
0d90c21dbd require netaddr instead of cidr 2016-07-05 12:39:44 +02:00
Igor Wiedler
7e8b65a311 correct test case for GitHub IP check 2016-07-05 12:39:32 +02:00
Igor Wiedler
e6d7607916 safelist github IP range in Rack::Attack 2016-07-05 12:30:10 +02:00
Konstantin Haase
c1de919852 Don't run Rack::Attack for Enterprise. (#287)
On enterprise, the reverse proxy is not correctly set up, and therefore the client IP address not passed through properly. For that reason, all requests look like they originate from the same client, and if one gets blocked, everyone gets blocked.
2016-07-05 11:46:33 +02:00
Renée Hendricksen
7d52b06533 Merge branch 'jc-v3-env-vars' of github.com:travis-ci/travis-api into jc-v3-env-vars 2016-07-01 23:56:09 -04:00
Joe Corcoran
829366a554 Fix duplicate lines from rebase 2016-07-01 23:55:49 -04:00
Joe Corcoran
4b14f17cc5 Fix service specs 2016-07-01 23:55:49 -04:00
Joe Corcoran
f5bc526f25 Refactor repeated pattern into extracted method
Seems like we'll be checking login status before finding a resource
a lot, so here's a standard way to do it.
2016-07-01 23:55:49 -04:00
Joe Corcoran
1a07e199b5 Better style in error handling 2016-07-01 23:55:49 -04:00
Joe Corcoran
91e9fcebf7 Remove some duplication 2016-07-01 23:55:49 -04:00
Joe Corcoran
871b915515 Add env vars endpoints
This adds API V3 endpoints for querying, creating, modifying and
deleting environment variables.

It has no concept of encryption yet and should be considered a work in
progress.

We should also talk about the slightly off-track approach in the
EnvVars::Create service – maybe there's a way to standardise the
querying and rendering for post requests?

2016-07-01 23:55:49 -04:00
Joe Corcoran
77dcdaa482 Use travis-settings to manage JSON settings field
Since we use repository.settings as a kind of dump for all
sorts of settings, some user-facing and some not, this lets us
leave the db as it is, but pretend to have separate models for each
"kind" of setting.
2016-07-01 23:55:49 -04:00
Sven Fuchs
09806a5f93 Merge pull request #285 from travis-ci/igor-deprecate-event-notify
Add deprecation notice to Event.notify() that writes to log
2016-07-01 17:55:46 +02:00
Igor Wiedler
b5fe8f1884 Add deprecation notice to Event.notify() that writes to log 2016-07-01 17:48:34 +02:00
Igor
b9d65ff30f Merge pull request #284 from travis-ci/igor-fix-rate-limit
no longer test against user agent for github rate-limit, since it is not consistently github-camo
2016-07-01 16:39:02 +02:00
Igor Wiedler
34fbfc2ccf no longer test against user agent for github rate-limit, since it is not consistently github-camo 2016-07-01 16:27:41 +02:00
Joe Corcoran
bed317b109 Merge pull request #281 from travis-ci/igor-github-rate-limit
safelist build status image requests coming from github
2016-06-30 15:31:57 +02:00
Igor Wiedler
0156671fc8 safelist build status image requests coming from github
Currently almost all calls against API are being rate limited, including
build status images. This leads to common requesters such as GitHub's
camo proxy to get rate limited and receive a 429 response code.

This patch attempts to allow those requests.
2016-06-29 10:53:27 +02:00
Igor Wiedler
1f56dcc645 replace WHITELIST terminology with SAFELIST 2016-06-29 10:53:27 +02:00
Ana Rosas
14625ff7cb Merge pull request #282 from travis-ci/ar-add-enabled-for-all-flag
Add enable_for_all? condition on restart and cancel endpoints
2016-06-28 12:27:02 -07:00
Ana Rosas
69f0a9d33e Add enable_for_all? condition 2016-06-28 11:35:47 -07:00
Ana Rosas
0e5aa2fb7a Merge pull request #280 from travis-ci/ar-improve-feature-flag
[feature flag] Check for repository owner instead of current user
2016-06-24 13:32:26 -05:00
Ana Rosas
bfb68bf931 Merge branch 'master' into ar-improve-feature-flag 2016-06-23 17:07:36 -05:00
Ana Rosas
69cc2eef7d Check for repository owner instead of current user to validate feature flag 2016-06-23 15:15:31 -05:00
Piotr Sarnacki
16a7da54c2 Merge pull request #278 from travis-ci/ps-more-current-build-work
More `current_build` work
2016-06-23 10:05:55 +02:00
Joe Corcoran
0aeec35935 Fix duplicate lines from rebase 2016-06-22 16:59:49 +02:00
Joe Corcoran
769ae71076 Fix service specs 2016-06-22 16:50:11 +02:00
Piotr Sarnacki
32dd8d9f93 Mark current_build as experimental 2016-06-22 14:19:31 +02:00
Piotr Sarnacki
fcb0e7cde4 Rename current_build_id sort option to current_build 2016-06-22 14:19:31 +02:00
Joe Corcoran
88d9000042 Refactor repeated pattern into extracted method
Seems like we'll be checking login status before finding a resource
a lot, so here's a standard way to do it.
2016-06-21 15:34:11 +02:00
Joe Corcoran
81e93ca710 Better style in error handling 2016-06-21 15:34:11 +02:00
Joe Corcoran
00fb01bd7a Remove some duplication 2016-06-21 15:34:11 +02:00
Joe Corcoran
cae6da540f Add env vars endpoints
This adds API V3 endpoints for querying, creating, modifying and
deleting environment variables.

It has no concept of encryption yet and should be considered a work in
progress.

We should also talk about the slightly off-track approach in the
EnvVars::Create service – maybe there's a way to standardise the
querying and rendering for post requests?

2016-06-21 15:34:11 +02:00
Joe Corcoran
026dc4cb98 Use travis-settings to manage JSON settings field
Since we use repository.settings as a kind of dump for all
sorts of settings, some user-facing and some not, this lets us
leave the db as it is, but pretend to have separate models for each
"kind" of setting.
2016-06-21 15:33:05 +02:00
Sven Fuchs
cf5ea374d4 Merge pull request #277 from travis-ci/sf-cleanup-core
cleanup core
2016-06-21 15:28:39 +02:00
Sven Fuchs
dc176e0c0e remove commented callback code 2016-06-21 15:20:24 +02:00
Sven Fuchs
25f74defe5 try fixing updating github oauth scopes 2016-06-21 14:00:04 +02:00
Sven Fuchs
7250656de0 fix event notification 2016-06-21 12:16:43 +02:00
Sven Fuchs
6603990fe4 trigger sync in the auth endpoint, not the user model 2016-06-20 16:59:55 +02:00
Sven Fuchs
da4c7f26e6 fix auth endpoint 2016-06-20 15:04:38 +02:00
Sven Fuchs
060dd8aced delete github/find_or_create[org|repo|user] services 2016-06-20 11:26:47 +02:00
Sven Fuchs
84ebb6b24e move tracking github oauth scopes out of the user model, and into Travis::Github::Oauth 2016-06-19 17:33:03 +02:00
Sven Fuchs
734a7b9566 use travis-settings, remove travis/settings 2016-06-19 16:07:06 +02:00
Sven Fuchs
eb78d9df30 remove overwritable_method_definitions 2016-06-19 15:51:41 +02:00
Sven Fuchs
fb0493a33c delete commitcommand, request approval, branches, and states 2016-06-19 15:46:30 +02:00
Sven Fuchs
04cd5bea24 move travis.rb and travis/config to lib 2016-06-19 15:20:11 +02:00
Sven Fuchs
c6f6dd5f5a we can now run all specs in one go 2016-06-19 15:15:52 +02:00
Sven Fuchs
0f1e697abd delete github/services/sync_user and user_mailer, remove action_mailer 2016-06-19 15:04:39 +02:00
Sven Fuchs
a6658fa4d3 get rid of spec_helper_core 2016-06-19 14:35:54 +02:00
Sven Fuchs
a26c188822 move travis/api/serialize/* from core to lib 2016-06-18 18:01:09 +02:00
Sven Fuchs
51c6c8f58f move api/serializer to api/serialize/serializer 2016-06-18 17:58:36 +02:00
Sven Fuchs
81d8c64e98 rename api/v[0-2] to api/serialize/v[0-2] 2016-06-18 17:52:48 +02:00
Ana Rosas
4e858e3949 Merge pull request #265 from travis-ci/ar-enqueue-cancelling-jobs-builds
Enqueue messages for Hub to cancel Jobs/Builds | Modify restart endpoints
2016-06-15 16:22:05 +02:00
Ana Rosas
bf20506e09 Merge branch 'master' into ar-enqueue-cancelling-jobs-builds 2016-06-15 16:15:05 +02:00
Ana Rosas
41c274b222 Remove 'type' from payload 2016-06-15 14:36:59 +02:00
Tyranja
3cfac6a5c1 Merge pull request #267 from travis-ci/rlh-are-remove-core
Move the travis-core dependancy into vendor
2016-06-15 13:59:42 +02:00
Sven Fuchs
3508df01a9 fix rake spec task 2016-06-14 19:12:54 +02:00
Sven Fuchs
c0e57cc890 add dependencies from travis-core 2016-06-14 19:10:34 +02:00
Sven Fuchs
4155c8ebcd remove travis-core dependency from gemspec 2016-06-14 17:45:10 +02:00
Ana Rosas
5949429f75 Enqueue restart message on job/restart v3 endpoint 2016-06-14 17:39:29 +02:00
Ana Rosas
a2d1322b60 Enqueue cancel message on job/cancel v3 endpoint 2016-06-14 17:24:05 +02:00
Ana Rosas
bb7260bc9e Enqueue restart message on build restart v3 endpoint 2016-06-14 16:46:29 +02:00
Tyranja
91ca0efe03 Fix gemspec AGAIN 2016-06-14 15:31:07 +02:00
Tyranja
b36a6f8358 Fix gemspec AGAIN 2016-06-14 15:28:05 +02:00
Tyranja
06de527c63 Sort and uniq gemspec authors and emails 2016-06-14 15:20:45 +02:00
Tyranja
8f9d5e41b7 remove debugging output 2016-06-14 15:18:15 +02:00
Tyranja
2624bd9e72 Revert "Removes the unused travis-core v0 code"
This reverts commit a68c0028d8e8dfb4a0e7f965e57fbc9e8686ba86.
2016-06-14 15:18:15 +02:00
Tyranja
56a59e4cc3 Adds debugging output for canceling jobs 2016-06-14 15:18:15 +02:00
Tyranja
c4e58c3e63 Add Commit_command back to vendor 2016-06-14 15:17:47 +02:00
Tyranja
341adbae21 Removes the unused travis-core v0 code 2016-06-14 15:17:47 +02:00
Sven Fuchs
feb4bcd90f delete unused stuffz 2016-06-14 15:17:47 +02:00
Renée Hendricksen
0077b6414a fix sidekiq on this branch 2016-06-14 15:17:47 +02:00
Renée Hendricksen
489c404bbb updated gemspec 2016-06-14 15:17:47 +02:00
Renée Hendricksen
e467fa3e6d renamed the core spec directory 2016-06-14 15:17:47 +02:00
Renée Hendricksen
ce071ad728 log pattern got excluded 2016-06-14 15:17:20 +02:00
Renée Hendricksen
5776e13385 wrong ruby in travis file 2016-06-14 15:17:20 +02:00
Renée Hendricksen
62f0bf7081 this is needed too 2016-06-14 15:17:20 +02:00
Renée Hendricksen
1ca54b361f github didn't have the correct version 2016-06-14 15:17:20 +02:00
Renée Hendricksen
4b6c177311 moved travis-core to vendor 2016-06-14 15:17:20 +02:00
Renée Hendricksen
7691d04de0 all the dep warnings 2016-06-14 15:16:51 +02:00
Renée Hendricksen
a02995e357 some more dep warnings 2016-06-14 15:16:15 +02:00
Renée Hendricksen
7c3c6bd1a9 passing specs 2016-06-14 15:16:15 +02:00
Ana Rosas
e097c8889e Enqueue cancel message on build cancel v3 endpoint 2016-06-14 15:15:59 +02:00
Tyranja
0f2c7e0307 Update rspec due to deprecation warnings 2016-06-14 15:14:11 +02:00
Renée Hendricksen
cecc501255 working service specs 2016-06-14 15:14:11 +02:00
Renée Hendricksen
5a8c1e63c4 update the gemspec 2016-06-14 15:14:11 +02:00
Renée Hendricksen
692308837d use the default rake task 2016-06-14 15:11:58 +02:00
Renée Hendricksen
3b490b58cb run both tests 2016-06-14 15:11:58 +02:00
Renée Hendricksen
e77be8210f working core specs 2016-06-14 15:11:58 +02:00
Renée Hendricksen
9ed43941fd updates for v3 approved by rkh and spruce up the model tests 2016-06-14 15:11:58 +02:00
Tyranja
e1f7921223 Change Database configuration to make the test pass 2016-06-14 15:11:58 +02:00
Renée Hendricksen
ae133e649a use the core spec helper 2016-06-14 15:10:40 +02:00
Tyranja
3b6ab6fb71 Copies spec from core 2016-06-14 15:10:40 +02:00
Ana Rosas
75460b2427 Use Travis::Enqueue::Services::CancelModel on v3 build cancel endpoint 2016-06-13 18:16:16 +02:00
Ana Rosas
777e42374c Auto-merged master into ar-enqueue-cancelling-jobs-builds on deployment. 2016-06-09 14:53:10 +02:00
carlad
b67c226515 Merge pull request #275 from travis-ci/jc-v3-settings
Add settings to API V3
2016-06-09 14:51:06 +02:00
Joe Corcoran
5fee54b91b Fewer object allocations :) 2016-06-09 11:29:17 +02:00
Ana Rosas
1c99216e23 Fix merge conflicts 2016-06-08 17:51:48 +02:00
Joe Corcoran
eb0eab5967 Move settings to top level of response
To better accommodate nested responses.
2016-06-08 17:18:24 +02:00
Joe Corcoran
daf534edb7 Don't overwrite settings with defaults
Also changes the way the JSON fields are set to force ActiveRecord
to recognise the changes. Is there a better way?
2016-06-08 17:13:05 +02:00
Joe Corcoran
fba9a87c39 Add settings to API V3
This adds /repo/{repository.id}/settings endpoints for reading
and updating repo settings.

Main points:

1. Sets up Settings as a first class resource instead of as an
   attribute of Repository
2. Adds new meta-programmed method to Query for accessing all
   prefixed params as a hash.
2016-06-08 15:59:52 +02:00
carlad
2303db9f4f add info about developer.travis-ci.org 2016-06-02 16:46:39 +02:00
Ana Rosas
68daabafa0 Use only params[:id] 2016-05-27 17:52:55 +02:00
Ana Rosas
00bae7a945 Remove push_matrix method, no need of it 2016-05-27 16:41:07 +02:00
Ana Rosas
29f80ab31b Use CancelModel on Jobs endpoint 2016-05-27 16:15:41 +02:00
Ana Rosas
ef7811ead9 Small refacto 2016-05-27 16:10:16 +02:00
Ana Rosas
c3e0d6d6bb Use CancelModel in Builds endpoint 2016-05-27 15:57:19 +02:00
Ana Rosas
428422d569 Add enqueue service for canceling jobs and builds 2016-05-27 12:44:48 +02:00
Ana Rosas
1863f5bd0c Enqueue restarting jobs for the Hub 2016-05-26 17:45:31 +02:00
647 changed files with 4911 additions and 10930 deletions

View File

@ -1,3 +1,2 @@
https://github.com/heroku/heroku-buildpack-ruby.git
https://github.com/drogus/last-commit-sha-buildpack.git
https://dl.signalsciences.net/heroku/sigsci-buildpack-nginx.tgz
https://github.com/ryandotsmith/nginx-buildpack.git

3
.gitignore vendored
View File

@ -4,10 +4,7 @@ config/nginx.conf
config/skylight.yml
tmp/
log/
logs/
!vendor/travis-core/lib/travis/logs/
!vendor/travis-core/lib/travis/model/log/
.yardoc
.coverage

1
.rspec
View File

@ -1,2 +1,3 @@
--require spec_helper
--colour
--tty

View File

@ -1,14 +1,12 @@
source 'https://rubygems.org'
gemspec
ruby '2.2.3' if ENV.key?('DYNO')
gem 's3', github: 'travis-ci/s3'
gem 'travis-core', path: 'vendor'
gem 'travis-support', github: 'travis-ci/travis-support'
gem 'travis-amqp', github: 'travis-ci/travis-amqp'
gem 'travis-config', '~> 0.1.0'
gem 'travis-settings', github: 'travis-ci/travis-settings'
gem 'travis-sidekiqs', github: 'travis-ci/travis-sidekiqs'
gem 'travis-yaml', github: 'travis-ci/travis-yaml'
@ -22,7 +20,7 @@ gem 'sentry-raven'
gem 'yard-sinatra', github: 'rkh/yard-sinatra'
gem 'rack-contrib'
gem 'rack-cache', github: 'rtomayko/rack-cache'
gem 'rack-attack'
gem 'rack-attack', '5.0.0.beta1'
gem 'gh'
gem 'bunny', '~> 0.8.0'
gem 'dalli'
@ -33,6 +31,7 @@ gem 'micro_migrations'
gem 'simplecov'
gem 'skylight', '~> 0.6.0.beta.1'
gem 'stackprof'
gem 'netaddr'
gem 'jemalloc'
gem 'customerio'

View File

@ -45,6 +45,14 @@ GIT
specs:
travis-migrations (0.0.2)
GIT
remote: git://github.com/travis-ci/travis-settings.git
revision: d510e63b6c6f059cccae141c265e7a0c7236d1fd
specs:
travis-settings (0.0.1)
activemodel
virtus
GIT
remote: git://github.com/travis-ci/travis-sidekiqs.git
revision: c5d4a4abc6c3737f9c43d3333efb94daa18b9fbb
@ -69,49 +77,33 @@ PATH
remote: .
specs:
travis-api (0.0.1)
composite_primary_keys (~> 5.0)
memcachier
mustermann (~> 0.4)
pg
rack-contrib (~> 1.1)
rack-ssl (~> 1.3, >= 1.3.3)
redcarpet (~> 2.1)
sinatra (~> 1.3)
sinatra-contrib (~> 1.3)
travis-core
travis-support
useragent
PATH
remote: vendor
specs:
travis-core (0.0.1)
actionmailer (~> 3.2.19)
activerecord (~> 3.2.19)
coder (~> 0.4.0)
data_migrations (~> 0.0.1)
gh
composite_primary_keys (~> 5.0)
google-api-client (~> 0.9.4)
hashr
metriks (~> 0.9.7)
memcachier
multi_json
mustermann (~> 0.4)
pg
pusher (~> 0.14.0)
rack-contrib (~> 1.1)
rack-ssl (~> 1.3, >= 1.3.3)
railties (~> 3.2.19)
rake
redcarpet (~> 2.1)
redis (~> 3.0)
rollout (~> 1.1.0)
s3 (~> 0.3)
simple_states (~> 1.0.0)
thor
travis-config (~> 0.1.0)
sinatra (~> 1.3)
sinatra-contrib (~> 1.3)
tool
travis-support
useragent
virtus (~> 1.0.0)
GEM
remote: https://rubygems.org/
specs:
actionmailer (3.2.22.2)
actionpack (= 3.2.22.2)
mail (~> 2.5.4)
actionpack (3.2.22.2)
activemodel (= 3.2.22.2)
activesupport (= 3.2.22.2)
@ -157,9 +149,6 @@ GEM
customerio (1.0.0)
multi_json (~> 1.0)
dalli (2.7.6)
data_migrations (0.0.1)
activerecord
rake
database_cleaner (0.8.0)
descendants_tracker (0.0.4)
thread_safe (~> 0.3, >= 0.3.1)
@ -220,9 +209,6 @@ GEM
logging (2.1.0)
little-plugger (~> 1.1)
multi_json (~> 1.10)
mail (2.5.4)
mime-types (~> 1.16)
treetop (~> 1.4.8)
memcachier (0.0.2)
memoist (0.14.0)
metaclass (0.0.4)
@ -241,9 +227,9 @@ GEM
multipart-post (2.0.0)
net-http-persistent (2.9.4)
net-http-pipeline (1.0.1)
netaddr (1.5.1)
os (0.9.6)
pg (0.18.4)
polyglot (0.3.5)
proxies (0.2.1)
pry (0.10.3)
coderay (~> 1.1.0)
@ -255,7 +241,7 @@ GEM
pusher-signature (~> 0.1.8)
pusher-signature (0.1.8)
rack (1.4.7)
rack-attack (4.4.1)
rack-attack (5.0.0.beta1)
rack
rack-contrib (1.4.0)
git-version-bump (~> 0.15)
@ -348,9 +334,6 @@ GEM
tool (0.2.3)
travis-config (0.1.4)
hashr (~> 0.0)
treetop (1.4.15)
polyglot
polyglot (>= 0.3.1)
tzinfo (0.3.49)
uber (0.0.15)
unicorn (5.1.0)
@ -382,8 +365,9 @@ DEPENDENCIES
micro_migrations
mocha (~> 0.12)
mustermann!
netaddr
pry
rack-attack
rack-attack (= 5.0.0.beta1)
rack-cache!
rack-contrib
rake (~> 0.9.2)
@ -402,8 +386,8 @@ DEPENDENCIES
travis-amqp!
travis-api!
travis-config (~> 0.1.0)
travis-core!
travis-migrations!
travis-settings!
travis-sidekiqs!
travis-support!
travis-yaml!

View File

@ -77,5 +77,4 @@ If you have problems with Nginx because the websocket is already in use, try res
### API documentation
We use source code comments to add documentation. If the server is running, you
can browse an HTML documentation at [`/docs`](http://localhost:5000/docs).
v3 documentation can be found at https://developer.travis-ci.org which is a repository that can be found at https://github.com/travis-pro/developer

View File

@ -9,44 +9,26 @@ namespace :db do
end
end
begin
require 'rspec'
require 'rspec/core/rake_task'
RSpec::Core::RakeTask.new(:spec)
# begin
# require 'rspec'
# require 'rspec/core/rake_task'
# RSpec::Core::RakeTask.new(:spec)
#
# RSpec::Core::RakeTask.new(:spec_core) do |t|
# t.pattern = 'spec_core/**{,/*/**}/*_spec.rb'
# end
#
# task :default => [:spec]
# rescue LoadError => e
# puts e.inspect
# end
task :core_specs do
RSpec::Core::RakeTask.new(:core_spec) do |t|
t.pattern = 'core_specs/**{,/*/**}/*_spec.rb'
end
Rake::Task["core_spec"].execute
# not sure how else to include the spec_helper
namespace :spec do
desc 'Run all specs'
task :all do
sh 'bundle exec rspec -r spec_helper spec'
end
task :default => [:spec, :core_specs]
rescue LoadError => e
puts e.inspect
end
desc "generate gemspec"
task 'travis-api.gemspec' do
content = File.read 'travis-api.gemspec'
fields = {
authors: `git shortlog -sn`.scan(/[^\d\s].*/),
email: `git shortlog -sne`.scan(/[^<]+@[^>]+/),
files: `git ls-files`.split("\n").reject { |f| f =~ /^(\.|Gemfile)/ }
}
fields.each do |field, values|
updated = " s.#{field} = ["
updated << values.map { |v| "\n %p" % v }.join(',')
updated << "\n ]"
content.sub!(/ s\.#{field} = \[\n( .*\n)* \]/, updated)
end
File.open('travis-api.gemspec', 'w') { |f| f << content }
end
task default: 'travis-api.gemspec'
## can this be removed? what other rakefiles need to be included?
# tasks_path = File.expand_path('../lib/tasks/*.rake', __FILE__)
# Dir.glob(tasks_path).each { |r| import r }
task :default => :'spec:all'

View File

@ -13,10 +13,6 @@ http {
gzip_comp_level 2;
gzip_min_length 512;
<% unless ENV['SIGSCI_ENABLED'].nil? || ENV['SIGSCI_ENABLED'].empty? %>
include "../sigsci-module-nginx/sigsci.conf";
<% end %>
server_tokens off;
log_format l2met 'measure#nginx.service=$request_time request_id=$http_x_request_id';

BIN
heroku-buildpack-sigsci.tgz Normal file

Binary file not shown.

View File

@ -1,34 +1,12 @@
require 'pusher'
require 'travis/support'
require 'travis/support/database'
require 'travis_core/version'
require 'travis/redis_pool'
require 'travis/errors'
# travis-core holds the central parts of the model layer used in both travis-ci
# (i.e. the web application) as well as travis-hub (a non-rails ui-less JRuby
# application that receives, processes and distributes messages from/to the
# workers and issues various events like email, pusher, irc notifications and
# so on).
#
# travis/model - contains ActiveRecord models that and model the main
# parts of the domain logic (e.g. repository, build, job
# etc.) and issue events on state changes (e.g.
# build:created, job:test:finished etc.)
# travis/event - contains event handlers that register for certain
# events and send out such things as email, pusher, irc
# notifications, archive builds or queue jobs for the
# workers.
# travis/mailer - contains ActionMailers for sending out email
# notifications
#
# travis-core also contains some helper classes and modules like Travis::Database
# (needed in travis-hub in order to connect to the database) and Travis::Renderer
# (our inferior layer on top of Rabl).
module Travis
class << self
def services=(services)
# Travis.logger.info("Using services: #{services}")
@services = services
end
@ -40,17 +18,11 @@ module Travis
require 'travis/model'
require 'travis/task'
require 'travis/event'
require 'travis/addons'
require 'travis/api'
require 'travis/api/serialize'
require 'travis/config/defaults'
require 'travis/commit_command'
require 'travis/enqueue'
require 'travis/features'
require 'travis/github'
require 'travis/logs'
require 'travis/mailer'
require 'travis/notification'
require 'travis/requests'
require 'travis/services'
class UnknownRepository < StandardError; end
@ -69,12 +41,8 @@ module Travis
Travis.logger.info('Setting up Travis::Core')
Github.setup
Addons.register
Services.register
Enqueue::Services.register
Github::Services.register
Logs::Services.register
Requests::Services.register
end
attr_accessor :redis, :config

View File

@ -26,10 +26,15 @@ require 'metriks/reporter/logger'
require 'metriks/librato_metrics_reporter'
require 'travis/support/log_subscriber/active_record_metrics'
require 'fileutils'
require 'securerandom'
module Travis::Api
end
require 'travis/api/app/endpoint'
require 'travis/api/app/middleware'
require 'travis/api/instruments'
require 'travis/api/v2/http'
require 'travis/api/serialize/v2'
require 'travis/api/v3'
require 'travis/api/app/stack_instrumentation'
require 'travis/api/app/error_handling'
@ -77,25 +82,20 @@ module Travis::Api
end
def self.deploy_sha
@deploy_sha ||= File.exist?(deploy_sha_path) ? File.read(deploy_sha_path)[0..7] : 'deploy-sha'
end
def self.deploy_sha_path
File.expand_path('../../../../.deploy-sha', __FILE__)
@deploy_sha ||= ENV['HEROKU_SLUG_COMMIT'] || SecureRandom.hex(5)
end
attr_accessor :app
def initialize
@app = Rack::Builder.app do
if stackprof = ENV['STACKPROF']
require 'stackprof'
modes = ['wall', 'cpu', 'object', 'custom']
mode = modes.include?(stackprof) ? stackprof.to_sym : :cpu
Travis.logger.info "Setting up profiler: #{mode}"
use StackProf::Middleware, enabled: true, save_every: 1, mode: mode
end
# if stackprof = ENV['STACKPROF']
# require 'stackprof'
# modes = ['wall', 'cpu', 'object', 'custom']
# mode = modes.include?(stackprof) ? stackprof.to_sym : :cpu
# Travis.logger.info "Setting up profiler: #{mode}"
# use StackProf::Middleware, enabled: true, save_every: 1, mode: mode
# end
extend StackInstrumentation
use Travis::Api::App::Middleware::Skylight
@ -129,7 +129,7 @@ module Travis::Api
use Travis::Api::App::Middleware::UserAgentTracker
# make sure this is below ScopeCheck so we have the token
use Rack::Attack if Endpoint.production?
use Rack::Attack if Endpoint.production? and not Travis.config.enterprise
# if this is a v3 API request, ignore everything after
use Travis::API::V3::OptIn

View File

@ -1,8 +1,10 @@
require 'travis/api/app'
require 'addressable/uri'
require 'faraday'
require 'securerandom'
require 'customerio'
require 'travis/api/app'
require 'travis/github/education'
require 'travis/github/oauth'
class Travis::Api::App
class Endpoint
@ -112,7 +114,7 @@ class Travis::Api::App
# access token and user payload to the parent window via postMessage.
#
# However, the endpoint to send the payload to has to be explicitely
# whitelisted in production, as this is endpoint is only meant to be used
# safelisted in production, as this is endpoint is only meant to be used
# with the official Travis CI client at the moment.
#
# Example usage:
@ -177,7 +179,8 @@ class Travis::Api::App
:created_at => user.created_at.to_i,
:github_id => user.github_id,
:education => user.education,
:first_logged_in_at => user.first_logged_in_at.to_i
:first_logged_in_at => user.first_logged_in_at.to_i,
:travis_domain => Travis.config.client_domain
}
customerio.identify(payload)
@ -186,7 +189,7 @@ class Travis::Api::App
end
def serialize_user(user)
rendered = Travis::Api.data(user, version: :v2)
rendered = Travis::Api::Serialize.data(user, version: :v2)
rendered['user'].merge('token' => user.tokens.first.try(:token).to_s)
end
@ -287,8 +290,11 @@ class Travis::Api::App
user.update_attributes info
else
self.user = ::User.create! info
Travis.run_service(:sync_user, user)
end
Travis::Github::Oauth.update_scopes(user) # unless Travis.env == 'test'
nullify_logins(user.github_id, user.login)
end
@ -340,7 +346,7 @@ class Travis::Api::App
end
def acceptable?(scopes, lossy = false)
User::Oauth.wanted_scopes.all? do |scope|
Travis::Github::Oauth.wanted_scopes.all? do |scope|
acceptable_scopes_for(scope, lossy).any? { |s| scopes.include? s }
end
end
@ -403,7 +409,7 @@ __END__
@@ invalid_target
<script>
console.log('refusing to send a token to <%= target_origin.inspect %>, not whitelisted!');
console.log('refusing to send a token to <%= target_origin.inspect %>, not safelisted!');
</script>
@@ common

View File

@ -1,7 +1,8 @@
require 'travis/api/app'
require 'travis/api/workers/build_cancellation'
require 'travis/api/workers/build_restart'
require 'travis/api/enqueue/services/enqueue_build'
require 'travis/api/enqueue/services/restart_model'
require 'travis/api/enqueue/services/cancel_model'
class Travis::Api::App
class Endpoint
@ -21,7 +22,8 @@ class Travis::Api::App
post '/:id/cancel' do
Metriks.meter("api.request.cancel_build").mark
service = self.service(:cancel_build, params.merge(source: 'api'))
service = Travis::Enqueue::Services::CancelModel.new(current_user, { build_id: params[:id] })
if !service.authorized?
json = { error: {
message: "You don't have access to cancel build(#{params[:id]})"
@ -40,7 +42,9 @@ class Travis::Api::App
status 422
respond_with json
else
Travis::Sidekiq::BuildCancellation.perform_async(id: params[:id], user_id: current_user.id, source: 'api')
payload = { id: params[:id], user_id: current_user.id, source: 'api' }
service.push("build:cancel", payload)
Metriks.meter("api.request.cancel_build.success").mark
status 204
@ -49,27 +53,16 @@ class Travis::Api::App
post '/:id/restart' do
Metriks.meter("api.request.restart_build").mark
if Travis::Features.owner_active?(:enqueue_to_hub, current_user)
service = Travis::Enqueue::Services::EnqueueBuild.new(current_user, params[:id])
if !service.accept?
status 400
result = false
else
payload = {id: params[:id], user_id: current_user.id}
service.push("build:restart", payload)
status 202
result = true
end
service = Travis::Enqueue::Services::RestartModel.new(current_user, build_id: params[:id])
result = if !service.accept?
status 400
false
else
service = self.service(:reset_model, build_id: params[:id])
if !service.accept?
status 400
result = false
else
Travis::Sidekiq::BuildRestart.perform_async(id: params[:id], user_id: current_user.id)
status 202
result = true
end
payload = { id: params[:id], user_id: current_user.id }
service.push("build:restart", payload)
status 202
true
end
respond_with(result: result, flash: service.messages)

View File

@ -1,6 +1,8 @@
require 'travis/api/app'
require 'travis/api/workers/job_cancellation'
require 'travis/api/workers/job_restart'
require 'travis/api/enqueue/services/restart_model'
require 'travis/api/enqueue/services/cancel_model'
class Travis::Api::App
class Endpoint
@ -27,7 +29,8 @@ class Travis::Api::App
post '/:id/cancel' do
Metriks.meter("api.request.cancel_job").mark
service = self.service(:cancel_job, params.merge(source: 'api'))
service = Travis::Enqueue::Services::CancelModel.new(current_user, { job_id: params[:id] })
if !service.authorized?
json = { error: {
message: "You don't have access to cancel job(#{params[:id]})"
@ -46,7 +49,8 @@ class Travis::Api::App
status 422
respond_with json
else
Travis::Sidekiq::JobCancellation.perform_async(id: params[:id], user_id: current_user.id, source: 'api')
payload = { id: params[:id], user_id: current_user.id, source: 'api' }
service.push("job:cancel", payload)
Metriks.meter("api.request.cancel_job.success").mark
status 204
@ -56,15 +60,18 @@ class Travis::Api::App
post '/:id/restart' do
Metriks.meter("api.request.restart_job").mark
service = self.service(:reset_model, job_id: params[:id])
if !service.accept?
service = Travis::Enqueue::Services::RestartModel.new(current_user, { job_id: params[:id] })
result = if !service.accept?
status 400
result = false
false
else
Travis::Sidekiq::JobRestart.perform_async(id: params[:id], user_id: current_user.id)
payload = {id: params[:id], user_id: current_user.id}
service.push("job:restart", payload)
status 202
result = true
true
end
respond_with(result: result, flash: service.messages)
end

View File

@ -1,5 +1,6 @@
require 'travis/api/app'
require 'travis/api/app/services/schedule_request'
require 'travis/api/enqueue/services/restart_model'
class Travis::Api::App
class Endpoint
@ -22,11 +23,22 @@ class Travis::Api::App
status 404
else
# DEPRECATED: this will be removed by 1st of December
#
# TODO It seems this endpoint is still in use, quite a bit:
# https://metrics.librato.com/s/metrics/api.request.restart?duration=2419200&q=api.request.restart
#
# I think we need to properly deprecate this by publishing a blog post.
Metriks.meter("api.request.restart").mark
respond_with service(:reset_model, params)
service = Travis::Enqueue::Services::RestartModel.new(current_user, params)
params[:user_id] = service.target.repository.owner.id
type = params[:build_id] ? 'build' : 'job'
params[:id] = params[:build_id] || params[:job_id]
service.push("#{type}:restart", params)
respond_with(result: true, flash: service.messages)
end
end
end
end
end

View File

@ -4,15 +4,15 @@ module Travis::Api::App::Responders
class Atom < Base
ATOM_FEED_ERB = ERB.new <<-EOF
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title><%= resource.first.repository.slug %> Builds</title>
<link href="<%= endpoint.url %>" type="application/atom+xml" rel = "self" />
<id>repo:<%= resource.first.repository.id %></id>
<rights>Copyright (c) <%= DateTime.now.strftime("%Y") %> Travis CI GmbH</rights>
<updated><%= DateTime.now.rfc3339 %></updated>
<% resource.each do |build| %>
<entry>
<title><%= build.repository.slug %> Build #<%= build.number %></title>
@ -21,7 +21,7 @@ module Travis::Api::App::Responders
<updated><%= ::DateTime.parse(build.updated_at.to_s).rfc3339 %></updated>
<summary type="html">
&lt;p&gt;
<%= build.commit.message.encode(:xml => :text) %> (<%= build.commit.committer_name %>)
<%= build.commit.message.encode(:xml => :text) if build.commit.message %> (<%= build.commit.committer_name %>)
&lt;br/&gt;&lt;br/&gt;
State: <%= build.state %>
&lt;br/&gt;
@ -36,7 +36,7 @@ module Travis::Api::App::Responders
</author>
</entry>
<% end %>
</feed>
EOF

View File

@ -1,3 +1,5 @@
require 'travis/api/serialize'
class Travis::Api::App
module Responders
class Json < Base
@ -46,7 +48,7 @@ class Travis::Api::App
if defined?(@builder)
@builder
else
@builder = Travis::Api.builder(resource, { :version => version }.merge(options))
@builder = Travis::Api::Serialize.builder(resource, { :version => version }.merge(options))
end
end

View File

@ -1,4 +1,5 @@
require 'rack/attack'
require 'netaddr'
class Rack::Attack
class Request
@ -25,31 +26,44 @@ class Rack::Attack
end
end
POST_WHITELISTED = [
POST_SAFELIST = [
"/auth/handshake",
"/auth/post_message",
"/auth/post_message/iframe"
]
GITHUB_CIDR = NetAddr::CIDR.create('192.30.252.0/22')
safelist('safelist build status images') do |request|
/\.(png|svg)$/.match(request.path)
end
# https://help.github.com/articles/what-ip-addresses-does-github-use-that-i-should-safelist/
safelist('safelist anything coming from github') do |request|
request.ip && GITHUB_CIDR.contains?(request.ip)
end
####
# Whitelisted IP addresses
whitelist('whitelist client requesting from redis') do |request|
Travis.redis.sismember(:api_whitelisted_ips, request.ip)
safelist('safelist client requesting from redis') do |request|
# TODO: deprecate :api_whitelisted_ips in favour of api_safelisted_ips
Travis.redis.sismember(:api_whitelisted_ips, request.ip) || Travis.redis.sismember(:api_safelisted_ips, request.ip)
end
####
# Ban based on: IP address
# Ban time: indefinite
# Ban after: manually banned
blacklist('block client requesting from redis') do |request|
Travis.redis.sismember(:api_blacklisted_ips, request.ip)
blocklist('block client requesting from redis') do |request|
# TODO: deprecate :api_blacklisted_ips in favour of api_blocklisted_ips
Travis.redis.sismember(:api_blacklisted_ips, request.ip) || Travis.redis.sismember(:api_blocklisted_ips, request.ip)
end
####
# Ban based on: IP address or access token
# Ban time: 5 hours
# Ban after: 10 POST requests within five minutes to /auth/github
blacklist('hammering /auth/github') do |request|
blocklist('hammering /auth/github') do |request|
Rack::Attack::Allow2Ban.filter(request.identifier, maxretry: 2, findtime: 5.minutes, bantime: bantime(5.hours)) do
request.post? and request.path == '/auth/github'
end
@ -59,9 +73,9 @@ class Rack::Attack
# Ban based on: IP address or access token
# Ban time: 1 hour
# Ban after: 10 POST requests within 30 seconds
blacklist('spamming with POST requests') do |request|
blocklist('spamming with POST requests') do |request|
Rack::Attack::Allow2Ban.filter(request.identifier, maxretry: 10, findtime: 30.seconds, bantime: bantime(1.hour)) do
request.post? and not POST_WHITELISTED.include? request.path
request.post? and not POST_SAFELIST.include? request.path
end
end

View File

@ -0,0 +1,59 @@
module Travis
module Enqueue
module Services
class CancelModel
attr_reader :current_user, :target
def initialize(current_user, params)
@current_user = current_user
@params = params
target
end
def messages
messages = []
messages << { :notice => "The #{type} was successfully cancelled." } if can_cancel?
messages << { :error => "You are not authorized to cancel this #{type}." } unless authorized?
messages << { :error => "The #{type} could not be cancelled." } unless build.cancelable?
messages
end
def push(event, payload)
# target may have been retrieved with a :join query, so we need to reset the readonly status
if can_cancel?
::Sidekiq::Client.push(
'queue' => 'hub',
'class' => 'Travis::Hub::Sidekiq::Worker',
#'args' => ["#{type}:cancel", @params]
'args' => [event, payload]
)
end
end
def type
@type ||= @params[:build_id] ? :build : :job
end
def target
if type == :build
@target = Build.find(@params[:build_id])
else
@target = Job.find(@params[:job_id])
end
end
def can_cancel?
authorized? && target.cancelable?
end
# check on web
def authorized?
current_user.permission?(:pull, :repository_id => target.repository_id)
end
end
end
end
end

View File

@ -1,49 +0,0 @@
module Travis
module Enqueue
module Services
class EnqueueBuild
attr_reader :current_user, :build
def initialize(current_user, build_id)
@current_user = current_user
@build = Build.find(build_id)
end
def push(event, payload)
::Sidekiq::Client.push(
'queue' => 'hub',
'class' => 'Travis::Hub::Sidekiq::Worker',
'args' => [event, payload]
)
end
def accept?
current_user && permission? && resetable?
end
def messages
messages = []
messages << { notice: "The build was successfully restarted." } if accept?
messages << { error: 'You do not seem to have sufficient permissions.' } unless permission?
messages << { error: "This build currently can not be restarted." } unless resetable?
messages
end
private
def permission?
current_user.permission?(required_role, repository_id: build.repository_id)
end
def resetable?
build.resetable?
end
def required_role
Travis.config.roles.reset_model
end
end
end
end
end

View File

@ -0,0 +1,64 @@
module Travis
module Enqueue
module Services
class RestartModel
attr_reader :current_user, :target
def initialize(current_user, params)
@current_user = current_user
@params = params
target
end
def push(event, payload)
if current_user && target && accept?
::Sidekiq::Client.push(
'queue' => 'hub',
'class' => 'Travis::Hub::Sidekiq::Worker',
'args' => [event, payload]
)
end
end
def accept?
current_user && permission? && resetable?
end
def messages
messages = []
messages << { notice: "The #{type} was successfully restarted." } if accept?
messages << { error: 'You do not seem to have sufficient permissions.' } unless permission?
messages << { error: "This #{type} currently can not be restarted." } unless resetable?
messages
end
def type
@type ||= @params[:build_id] ? :build : :job
end
def target
if type == :build
@target = Build.find(@params[:build_id])
else
@target = Job.find(@params[:job_id])
end
end
private
def permission?
current_user.permission?(required_role, repository_id: target.repository_id)
end
def resetable?
target.resetable?
end
def required_role
Travis.config.roles.reset_model
end
end
end
end
end

View File

@ -0,0 +1,68 @@
require 'travis/api/serialize/formats'
require 'travis/api/serialize/v0'
require 'travis/api/serialize/v1'
module Travis
module Api
module Serialize
DEFAULT_VERSION = 'v2'
class << self
def data(resource, options = {})
new(resource, options).data
end
def builder(resource, options = {})
target = (options[:for] || 'http').to_s.camelize
version = (options[:version] || default_version(options)).to_s.camelize
type = (options[:type] || type_for(resource)).to_s.camelize.split('::')
([version, target] + type).inject(self) do |const, name|
begin
if const && const.const_defined?(name.to_s.camelize, false)
const.const_get(name, false)
else
nil
end
rescue NameError
nil
end
end
end
def new(resource, options = {})
builder = builder(resource, options) || raise(ArgumentError, "cannot serialize #{resource.inspect}, options: #{options.inspect}")
builder.new(resource, options[:params] || {})
end
private
def type_for(resource)
if arel_relation?(resource)
type = resource.klass.name.pluralize
else
type = resource.class
type = type.base_class if active_record?(type)
type = type.name
end
type.split('::').last
end
def arel_relation?(object)
object.respond_to?(:klass)
end
def active_record?(object)
object.respond_to?(:base_class)
end
def default_version(options)
if options[:for].to_s.downcase == "pusher"
"v0"
else
DEFAULT_VERSION
end
end
end
end
end
end

View File

@ -0,0 +1,11 @@
module Travis
module Api
module Serialize
module Formats
def format_date(date)
date && date.strftime('%Y-%m-%dT%H:%M:%SZ')
end
end
end
end
end

View File

@ -0,0 +1,25 @@
require 'active_model_serializers'
module Travis
module Api
module Serialize
class ObjectSerializer < ActiveModel::Serializer
def data
as_json
end
end
class ArraySerializer < ActiveModel::ArraySerializer
def data
as_json
end
def initialize(resource, options)
options[:each_serializer] ||= V2::Http.const_get(options[:root].to_s.singularize.camelize)
super(resource, options)
end
end
end
end
end

View File

@ -0,0 +1,6 @@
# V0 is an internal api that we can change at any time
require 'travis/api/serialize/v0/event'
require 'travis/api/serialize/v0/notification'
require 'travis/api/serialize/v0/pusher'
require 'travis/api/serialize/v0/worker'

View File

@ -0,0 +1,2 @@
require 'travis/api/serialize/v0/event/build'
require 'travis/api/serialize/v0/event/job'

View File

@ -0,0 +1,96 @@
module Travis
module Api
module Serialize
module V0
module Event
class Build
include Formats
attr_reader :build, :repository, :request, :commit, :options
def initialize(build, options = {})
@build = build
@repository = build.repository
@request = build.request
@commit = build.commit
# @options = options
end
def data(extra = {})
{
'repository' => repository_data,
'request' => request_data,
'commit' => commit_data,
'build' => build_data,
'jobs' => build.matrix.map { |job| job_data(job) }
}
end
private
def build_data
{
'id' => build.id,
'repository_id' => build.repository_id,
'commit_id' => build.commit_id,
'number' => build.number,
'pull_request' => build.pull_request?,
'pull_request_number' => build.pull_request_number,
'config' => build.config.try(:except, :source_key),
'state' => build.state.to_s,
'previous_state' => build.previous_state.to_s,
'started_at' => format_date(build.started_at),
'finished_at' => format_date(build.finished_at),
'duration' => build.duration,
'job_ids' => build.matrix_ids
}
end
def repository_data
{
'id' => repository.id,
'key' => repository.key.try(:public_key),
'slug' => repository.slug,
'name' => repository.name,
'owner_email' => repository.owner_email,
'owner_avatar_url' => repository.owner.try(:avatar_url)
}
end
def request_data
{
'token' => request.token,
'head_commit' => (request.head_commit || '')
}
end
def commit_data
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
}
end
def job_data(job)
{
'id' => job.id,
'number' => job.number,
'state' => job.state.to_s,
'tags' => job.tags
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,37 @@
module Travis
module Api
module Serialize
module V0
module Event
class Job
include Formats
attr_reader :job
def initialize(job, options = {})
@job = job
# @options = options
end
def data(extra = {})
{
'job' => job_data,
}
end
private
def job_data
{
'queue' => job.queue,
'created_at' => job.created_at,
'started_at' => job.started_at,
'finished_at' => job.finished_at,
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,3 @@
require 'travis/api/serialize/v0/notification/build'
require 'travis/api/serialize/v0/notification/repository'
require 'travis/api/serialize/v0/notification/user'

View File

@ -0,0 +1,29 @@
module Travis
module Api
module Serialize
module V0
module Notification
class Build
attr_reader :build
def initialize(build, options = {})
@build = build
end
def data
{
'build' => build_data
}
end
def build_data
{
'id' => build.id
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,30 @@
module Travis
module Api
module Serialize
module V0
module Notification
class Repository
attr_reader :repository
def initialize(repository, options = {})
@repository = repository
end
def data
{
'repository' => repository_data
}
end
def repository_data
{
'id' => repository.id,
'slug' => repository.slug
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,30 @@
module Travis
module Api
module Serialize
module V0
module Notification
class User
attr_reader :user
def initialize(user, options = {})
@user = user
end
def data
{
'user' => user_data
}
end
def user_data
{
'id' => user.id,
'login' => user.login
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,3 @@
require 'travis/api/serialize/v0/pusher/annotation'
require 'travis/api/serialize/v0/pusher/build'
require 'travis/api/serialize/v0/pusher/job'

View File

@ -0,0 +1,35 @@
require 'travis/api/serialize/v0/pusher/annotation/created'
require 'travis/api/serialize/v0/pusher/annotation/updated'
module Travis
module Api
module Serialize
module V0
module Pusher
class Annotation
include Formats
attr_reader :annotation
def initialize(annotation, options = {})
@annotation = annotation
end
def data
{
"annotation" => {
"id" => annotation.id,
"job_id" => annotation.job_id,
"description" => annotation.description,
"url" => annotation.url,
"status" => annotation.status,
"provider_name" => annotation.annotation_provider.name,
}
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Annotation
class Created < Annotation
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Annotation
class Updated < Annotation
end
end
end
end
end
end
end

View File

@ -0,0 +1,112 @@
require 'travis/api/serialize/v0/pusher/build/canceled'
require 'travis/api/serialize/v0/pusher/build/created'
require 'travis/api/serialize/v0/pusher/build/received'
require 'travis/api/serialize/v0/pusher/build/started'
require 'travis/api/serialize/v0/pusher/build/finished'
module Travis
module Api
module Serialize
module V0
module Pusher
class Build
include Formats
attr_reader :build, :options
def initialize(build, options = {})
@build = build
@options = options
end
def data
{
'build' => build_data(build),
'commit' => commit_data(build.commit),
'repository' => repository_data(build.repository)
}
end
private
def build_data(build)
commit = build.commit
{
'id' => build.id,
'repository_id' => build.repository_id,
'commit_id' => build.commit_id,
'number' => build.number,
'pull_request' => build.pull_request?,
'pull_request_title' => build.pull_request_title,
'pull_request_number' => build.pull_request_number,
'state' => build.state.to_s,
'started_at' => format_date(build.started_at),
'finished_at' => format_date(build.finished_at),
'duration' => build.duration,
'job_ids' => build.matrix_ids,
'event_type' => build.event_type,
# this is a legacy thing, we should think about removing it
'commit' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'compare_url' => commit.compare_url,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email
}
end
def commit_data(commit)
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
}
end
def repository_data(repository)
{
'id' => repository.id,
'slug' => repository.slug,
'description' => repository.description,
'private' => repository.private,
'last_build_id' => repository.last_build_id,
'last_build_number' => repository.last_build_number,
'last_build_state' => repository.last_build_state.to_s,
'last_build_duration' => repository.last_build_duration,
'last_build_language' => nil,
'last_build_started_at' => format_date(repository.last_build_started_at),
'last_build_finished_at' => format_date(repository.last_build_finished_at),
'github_language' => repository.github_language,
'default_branch' => {
'name' => repository.default_branch,
'last_build_id' => last_build_on_default_branch_id(repository)
},
'active' => repository.active,
'current_build_id' => repository.current_build_id
}
end
def last_build_on_default_branch_id(repository)
default_branch = Branch.where(repository_id: repository.id, name: repository.default_branch).first
if default_branch
default_branch.last_build_id
end
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Build
class Canceled < Build
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Build
class Created < Build
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Build
class Finished < Build
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Build
class Received < Build
end
end
end
end
end
end
end

View File

@ -0,0 +1,49 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Build
class Received < Build
class Job
include Formats, V1::Helpers::Legacy
attr_reader :job, :commit
def initialize(job)
@job = job
@commit = job.commit
end
def data
{
'id' => job.id,
'repository_id' => job.repository_id,
'repository_private' => repository.private,
'parent_id' => job.source_id,
'number' => job.number,
'state' => job.state.to_s,
'result' => legacy_job_result(job),
'config' => job.obfuscated_config,
'commit' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'compare_url' => commit.compare_url,
'started_at' => format_date(job.started_at),
'finished_at' => format_date(job.finished_at),
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'allow_failure' => job.allow_failure
}
end
end
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Build
class Started < Build
end
end
end
end
end
end
end

View File

@ -0,0 +1,49 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Build
class Started < Build
class Job
include Formats, V1::Helpers::Legacy
attr_reader :job, :commit
def initialize(job)
@job = job
@commit = job.commit
end
def data
{
'id' => job.id,
'repository_id' => job.repository_id,
'repository_private' => repository.private,
'parent_id' => job.source_id,
'number' => job.number,
'state' => job.state.to_s,
'result' => legacy_job_result(job),
'config' => job.obfuscated_config,
'commit' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'compare_url' => commit.compare_url,
'started_at' => format_date(job.started_at),
'finished_at' => format_date(job.finished_at),
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'allow_failure' => job.allow_failure
}
end
end
end
end
end
end
end
end
end

View File

@ -0,0 +1,69 @@
require 'travis/api/serialize/v0/pusher/job/canceled'
require 'travis/api/serialize/v0/pusher/job/created'
require 'travis/api/serialize/v0/pusher/job/log'
require 'travis/api/serialize/v0/pusher/job/received'
require 'travis/api/serialize/v0/pusher/job/started'
require 'travis/api/serialize/v0/pusher/job/finished'
module Travis
module Api
module Serialize
module V0
module Pusher
class Job
include Formats
attr_reader :job, :options
def initialize(job, options = {})
@job = job
@options = options
end
def data
job_data(job).merge(
'commit' => commit_data(job.commit)
)
end
private
def job_data(job)
{
'id' => job.id,
'repository_id' => job.repository_id,
'repository_slug' => job.repository.slug,
'repository_private' => job.repository.private,
'build_id' => job.source_id,
'commit_id' => job.commit_id,
'log_id' => job.log_id,
'number' => job.number,
'state' => job.state.to_s,
'started_at' => format_date(job.started_at),
'finished_at' => format_date(job.finished_at),
'queue' => job.queue,
'allow_failure' => job.allow_failure,
'annotation_ids' => job.annotation_ids
}
end
def commit_data(commit)
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Job
class Canceled < Job
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Job
class Created < Job
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Job
class Finished < Job
end
end
end
end
end
end
end

View File

@ -0,0 +1,32 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Job
class Log
attr_reader :job, :options
def initialize(job, options = {})
@job = job
@options = options
end
def data
{
'id' => job.id,
'build_id' => job.source_id,
'repository_id' => job.repository_id,
'repository_private' => repository.private,
'_log' => options[:_log],
'number' => options[:number],
'final' => options[:final]
}
end
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Job
class Received < Job
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Job
class Started < Job
end
end
end
end
end
end
end

View File

@ -0,0 +1 @@
require 'travis/api/serialize/v0/worker/job'

View File

@ -0,0 +1,35 @@
require 'travis/api/serialize/v0/worker/job/test'
module Travis
module Api
module Serialize
module V0
module Worker
class Job
attr_reader :job
def initialize(job, options = {})
@job = job
end
def commit
job.commit
end
def repository
job.repository
end
def request
build.request
end
def build
job.source
end
end
end
end
end
end
end

View File

@ -0,0 +1,120 @@
module Travis
module Api
module Serialize
module V0
module Worker
class Job
class Test < Job
include Formats
def data
{
'type' => 'test',
# TODO legacy. remove this once workers respond to a 'job' key
'build' => job_data,
'job' => job_data,
'source' => build_data,
'repository' => repository_data,
'pull_request' => commit.pull_request? ? pull_request_data : false,
'config' => job.decrypted_config,
'queue' => job.queue,
'uuid' => Travis.uuid,
'ssh_key' => ssh_key,
'env_vars' => env_vars,
'timeouts' => timeouts
}
end
def build_data
{
'id' => build.id,
'number' => build.number
}
end
def job_data
data = {
'id' => job.id,
'number' => job.number,
'commit' => commit.commit,
'commit_range' => commit.range,
'commit_message' => commit.message,
'branch' => commit.branch,
'ref' => commit.pull_request? ? commit.ref : nil,
'state' => job.state.to_s,
'secure_env_enabled' => job.secure_env_enabled?
}
data['tag'] = request.tag_name if include_tag_name?
data['pull_request'] = commit.pull_request? ? commit.pull_request_number : false
data
end
def repository_data
{
'id' => repository.id,
'slug' => repository.slug,
'github_id' => repository.github_id,
'source_url' => repository.source_url,
'api_url' => repository.api_url,
'last_build_id' => repository.last_build_id,
'last_build_number' => repository.last_build_number,
'last_build_started_at' => format_date(repository.last_build_started_at),
'last_build_finished_at' => format_date(repository.last_build_finished_at),
'last_build_duration' => repository.last_build_duration,
'last_build_state' => repository.last_build_state.to_s,
'description' => repository.description,
'default_branch' => repository.default_branch
}
end
def pull_request_data
{
'number' => commit.pull_request_number,
'head_repo' => request.head_repo,
'base_repo' => request.base_repo,
'head_branch' => request.head_branch,
'base_branch' => request.base_branch
}
end
def ssh_key
nil
end
def env_vars
vars = settings.env_vars
vars = vars.public unless job.secure_env_enabled?
vars.map do |var|
{
'name' => var.name,
'value' => var.value.decrypt,
'public' => var.public
}
end
end
def timeouts
{ 'hard_limit' => timeout(:hard_limit), 'log_silence' => timeout(:log_silence) }
end
def timeout(type)
timeout = settings.send(:"timeout_#{type}")
timeout = timeout * 60 if timeout # worker handles timeouts in seconds
timeout
end
def include_tag_name?
Travis.config.include_tag_name_in_worker_payload && request.tag_name.present?
end
def settings
repository.settings
end
end
end
end
end
end
end
end

View File

@ -0,0 +1,4 @@
require 'travis/api/serialize/v1/archive'
require 'travis/api/serialize/v1/http'
require 'travis/api/serialize/v1/helpers'
require 'travis/api/serialize/v1/webhook'

View File

@ -0,0 +1 @@
require 'travis/api/serialize/v1/archive/build'

View File

@ -0,0 +1,52 @@
require 'travis/api/serialize/v1/archive/build/job'
module Travis
module Api
module Serialize
module V1
module Archive
class Build
include Formats
attr_reader :build, :commit, :repository
def initialize(build, options = {})
@build = build
@commit = build.commit
@repository = build.repository
end
def data
{
'id' => build.id,
'number' => build.number,
'config' => build.obfuscated_config.stringify_keys,
'result' => 0,
'started_at' => format_date(build.started_at),
'finished_at' => format_date(build.finished_at),
'duration' => build.duration,
'commit' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'matrix' => build.matrix.map { |job| Job.new(job).data },
'repository' => repository_data
}
end
def repository_data
{
'id' => repository.id,
'slug' => repository.slug
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,33 @@
module Travis
module Api
module Serialize
module V1
module Archive
class Build
class Job
include Formats
attr_reader :job, :commit
def initialize(job)
@job = job
@commit = job.commit
end
def data
{
'id' => job.id,
'number' => job.number,
'config' => job.obfuscated_config,
'started_at' => format_date(job.started_at),
'finished_at' => format_date(job.finished_at),
'log' => job.log_content
}
end
end
end
end
end
end
end
end

View File

@ -0,0 +1 @@
require 'travis/api/serialize/v1/helpers/legacy'

View File

@ -0,0 +1,36 @@
module Travis
module Api
module Serialize
module V1
module Helpers
module Legacy
RESULTS = {
passed: 0,
failed: 1
}
def legacy_repository_last_build_result(repository)
RESULTS[repository.last_build_state.try(:to_sym)]
end
def legacy_build_state(build)
build.finished? ? 'finished' : build.state.to_s
end
def legacy_build_result(build)
RESULTS[build.state.try(:to_sym)]
end
def legacy_job_state(job)
job.finished? ? 'finished' : job.state.to_s
end
def legacy_job_result(job)
RESULTS[job.state.try(:to_sym)]
end
end
end
end
end
end
end

View File

@ -0,0 +1,9 @@
require 'travis/api/serialize/v1/http/branches'
require 'travis/api/serialize/v1/http/build'
require 'travis/api/serialize/v1/http/builds'
require 'travis/api/serialize/v1/http/hooks'
require 'travis/api/serialize/v1/http/job'
require 'travis/api/serialize/v1/http/jobs'
require 'travis/api/serialize/v1/http/repositories'
require 'travis/api/serialize/v1/http/repository'
require 'travis/api/serialize/v1/http/user'

View File

@ -0,0 +1,45 @@
require 'travis/api/serialize/v1/helpers/legacy'
module Travis
module Api
module Serialize
module V1
module Http
class Branches
include Formats, Helpers::Legacy
attr_reader :builds, :options
def initialize(builds, options = {})
builds = builds.last_finished_builds_by_branches if builds.is_a?(Repository) # TODO remove, bc
@builds = builds
end
def cache_key
"branches-#{builds.map(&:id).join('-')}"
end
def updated_at
builds.compact.map(&:finished_at).compact.sort.first
end
def data
builds.compact.map do |build|
{
'repository_id' => build.repository_id,
'build_id' => build.id,
'commit' => build.commit.commit,
'branch' => build.commit.branch,
'message' => build.commit.message,
'result' => legacy_build_result(build),
'finished_at' => format_date(build.finished_at),
'started_at' => format_date(build.started_at)
}
end
end
end
end
end
end
end
end

View File

@ -0,0 +1,49 @@
require 'travis/api/serialize/v1/http/build/job'
module Travis
module Api
module Serialize
module V1
module Http
class Build
include Formats, Helpers::Legacy
attr_reader :build, :commit, :request
def initialize(build, options = {})
@build = build
@commit = build.commit
@request = build.request
end
def data
{
'id' => build.id,
'repository_id' => build.repository_id,
'number' => build.number,
'config' => build.obfuscated_config.stringify_keys,
'state' => legacy_build_state(build),
'result' => legacy_build_result(build),
'status' => legacy_build_result(build),
'started_at' => format_date(build.started_at),
'finished_at' => format_date(build.finished_at),
'duration' => build.duration,
'commit' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
'event_type' => build.event_type,
'matrix' => build.matrix.map { |job| Job.new(job).data },
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,34 @@
module Travis
module Api
module Serialize
module V1
module Http
class Build
class Job
include Formats, Helpers::Legacy
attr_reader :job
def initialize(job)
@job = job
end
def data
{
'id' => job.id,
'repository_id' => job.repository_id,
'number' => job.number,
'config' => job.obfuscated_config.stringify_keys,
'result' => legacy_job_result(job),
'started_at' => format_date(job.started_at),
'finished_at' => format_date(job.finished_at),
'allow_failure' => job.allow_failure
}
end
end
end
end
end
end
end
end

View File

@ -0,0 +1,40 @@
module Travis
module Api
module Serialize
module V1
module Http
class Builds
include Formats, Helpers::Legacy
attr_reader :builds
def initialize(builds, options = {})
@builds = builds
end
def data
builds.map { |build| build_data(build) }
end
def build_data(build)
{
'id' => build.id,
'repository_id' => build.repository_id,
'number' => build.number,
'state' => legacy_build_state(build),
'result' => legacy_build_result(build),
'started_at' => format_date(build.started_at),
'finished_at' => format_date(build.finished_at),
'duration' => build.duration,
'commit' => build.commit.commit,
'branch' => build.commit.branch,
'message' => build.commit.message,
'event_type' => build.event_type,
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,36 @@
module Travis
module Api
module Serialize
module V1
module Http
class Hooks
attr_reader :repos, :options
def initialize(repos, options = {})
@repos = repos
@options = options
end
def data
repos.map { |repo| repo_data(repo) }
end
private
def repo_data(repo)
{
'uid' => [repo.owner_name, repo.name].join(':'),
'url' => "https://github.com/#{repo.owner_name}/#{repo.name}",
'name' => repo.name,
'owner_name' => repo.owner_name,
'description' => repo.description,
'active' => repo.active,
'private' => repo.private
}
end
end
end
end
end
end
end

View File

@ -1,49 +1,32 @@
module Travis
module Api
module V2
module Http
class Jobs
include Formats
module Serialize
module V1
module Http
class Job
include Formats, Helpers::Legacy
attr_reader :jobs, :options
attr_reader :job, :commit
def initialize(jobs, options = {})
@jobs = jobs
@options = options
end
def data
{
'jobs' => jobs.map { |job| job_data(job) },
'commits' => jobs.map { |job| commit_data(job.commit) }
}
end
private
def job_data(job)
{
'id' => job.id,
'repository_id' => job.repository_id,
'repository_slug' => job.repository.slug,
'build_id' => job.source_id,
'commit_id' => job.commit_id,
'log_id' => job.log_id,
'number' => job.number,
'config' => job.obfuscated_config.stringify_keys,
'state' => job.state.to_s,
'started_at' => format_date(job.started_at),
'finished_at' => format_date(job.finished_at),
'queue' => job.queue,
'allow_failure' => job.allow_failure,
'tags' => job.tags
}
def initialize(job, options = {})
@job = job
@commit = job.commit
end
def commit_data(commit)
def data
{
'id' => commit.id,
'sha' => commit.commit,
'id' => job.id,
'number' => job.number,
'config' => job.obfuscated_config.stringify_keys,
'repository_id' => job.repository_id,
'build_id' => job.source_id,
'state' => job.finished? ? 'finished' : job.state.to_s,
'result' => legacy_job_result(job),
'status' => legacy_job_result(job),
'started_at' => format_date(job.started_at),
'finished_at' => format_date(job.finished_at),
'log' => job.log_content,
'commit' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
@ -52,8 +35,10 @@ module Travis
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
'worker' => job.worker
}
end
end
end
end
end

View File

@ -0,0 +1,36 @@
module Travis
module Api
module Serialize
module V1
module Http
class Jobs
include Formats, Helpers::Legacy
attr_reader :jobs
def initialize(jobs, options = {})
@jobs = jobs
end
def data
jobs.map { |job| job_data(job) }
end
def job_data(job)
commit = job.commit
{
'id' => job.id,
'repository_id' => job.repository_id,
'number' => job.number,
'state' => legacy_job_state(job),
'queue' => job.queue,
'allow_failure' => job.allow_failure
}
end
end
end
end
end
end
end

View File

@ -1,24 +1,20 @@
module Travis
module Api
module V2
module Http
class Repositories
include Formats
module Serialize
module V1
module Http
class Repositories
include Formats, Helpers::Legacy
attr_reader :repositories, :options
attr_reader :repositories
def initialize(repositories, options = {})
@repositories = repositories
@options = options
end
def initialize(repositories, options = {})
@repositories = repositories
end
def data
{
'repos' => repositories.map { |repository| repository_data(repository) }
}
end
private
def data
repositories.map { |repository| repository_data(repository) }
end
def repository_data(repository)
{
@ -27,15 +23,15 @@ module Travis
'description' => repository.description,
'last_build_id' => repository.last_build_id,
'last_build_number' => repository.last_build_number,
'last_build_state' => repository.last_build_state.to_s,
'last_build_status' => legacy_repository_last_build_result(repository),
'last_build_result' => legacy_repository_last_build_result(repository),
'last_build_duration' => repository.last_build_duration,
'last_build_language' => nil,
'last_build_started_at' => format_date(repository.last_build_started_at),
'last_build_finished_at' => format_date(repository.last_build_finished_at),
'active' => repository.active,
'github_language' => repository.github_language
}
end
end
end
end
end

View File

@ -1,44 +1,36 @@
module Travis
module Api
module V2
module Http
class Repository
include Formats
module Serialize
module V1
module Http
class Repository
include Formats, Helpers::Legacy
attr_reader :repository, :options
attr_reader :repository, :options
def initialize(repository, options = {})
@repository = repository
end
def initialize(repository, options = {})
@repository = repository
end
def data
{
'repo' => repository_data(repository)
}
end
private
# TODO why does this not include the last build? (i.e. 'builds' => { last build here })
def repository_data(repository)
def data
{
'id' => repository.id,
'slug' => repository.slug,
'active' => repository.active,
'description' => repository.description,
'public_key' => repository.key.public_key,
'last_build_id' => repository.last_build_id,
'last_build_number' => repository.last_build_number,
'last_build_state' => repository.last_build_state.to_s,
'last_build_status' => legacy_repository_last_build_result(repository),
'last_build_result' => legacy_repository_last_build_result(repository),
'last_build_duration' => repository.last_build_duration,
'last_build_language' => nil,
'last_build_started_at' => format_date(repository.last_build_started_at),
'last_build_finished_at' => format_date(repository.last_build_finished_at),
'github_language' => repository.github_language
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,33 @@
module Travis
module Api
module Serialize
module V1
module Http
class User
include Formats
attr_reader :user, :options
def initialize(user, options = {})
@user = user
@options = options
end
def data
{
'login' => user.login,
'name' => user.name,
'email' => user.email,
'gravatar_id' => user.gravatar_id,
'locale' => user.locale,
'is_syncing' => user.is_syncing,
'synced_at' => format_date(user.synced_at)
}
end
end
end
end
end
end
end

View File

@ -0,0 +1 @@
require 'travis/api/serialize/v1/webhook/build'

View File

@ -0,0 +1,29 @@
require 'travis/api/serialize/v1/webhook/build/finished'
module Travis
module Api
module Serialize
module V1
module Webhook
class Build
attr_reader :build, :commit, :request, :repository, :options
def initialize(build, options = {})
@build = build
@commit = build.commit
@request = build.request
@repository = build.repository
@options = options
end
private
def build_url
["https://#{Travis.config.host}", repository.slug, 'builds', build.id].join('/')
end
end
end
end
end
end
end

View File

@ -0,0 +1,72 @@
require 'travis/api/serialize/v1/webhook/build/finished/job'
module Travis
module Api
module Serialize
module V1
module Webhook
class Build
class Finished < Build
include Formats
def data
data = {
'id' => build.id,
'repository' => repository_data,
'number' => build.number,
'config' => build.obfuscated_config.stringify_keys,
'status' => build.result,
'result' => build.result,
'status_message' => result_message,
'result_message' => result_message,
'started_at' => format_date(build.started_at),
'finished_at' => format_date(build.finished_at),
'duration' => build.duration,
'build_url' => build_url,
'commit_id' => commit.id,
'commit' => commit.commit,
'base_commit' => request.base_commit,
'head_commit' => request.head_commit,
'branch' => commit.branch,
'message' => commit.message,
'compare_url' => commit.compare_url,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'matrix' => build.matrix.map { |job| Job.new(job, options).data },
'type' => build.event_type,
'state' => build.state.to_s,
'pull_request' => build.pull_request?,
'pull_request_number' => build.pull_request_number,
'pull_request_title' => build.pull_request_title,
'tag' => request.tag_name
}
if commit.pull_request?
data['pull_request_number'] = commit.pull_request_number
end
data
end
def repository_data
{
'id' => repository.id,
'name' => repository.name,
'owner_name' => repository.owner_name,
'url' => repository.url
}
end
def result_message
@result_message ||= ::Build::ResultMessage.new(build).short
end
end
end
end
end
end
end
end

View File

@ -0,0 +1,52 @@
module Travis
module Api
module Serialize
module V1
module Webhook
class Build
class Finished < Build
class Job
include Formats
attr_reader :job, :commit, :options
def initialize(job, options = {})
@job = job
@commit = job.commit
@options = options
end
def data
data = {
'id' => job.id,
'repository_id' => job.repository_id,
'parent_id' => job.source_id,
'number' => job.number,
'state' => job.finished? ? 'finished' : job.state.to_s,
'config' => job.obfuscated_config,
'status' => job.result,
'result' => job.result,
'commit' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'compare_url' => commit.compare_url,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'allow_failure' => job.allow_failure
}
data['log'] = job.log_content || '' if options[:include_logs]
data['started_at'] = format_date(job.started_at) if job.started?
data['finished_at'] = format_date(job.finished_at) if job.finished?
data
end
end
end
end
end
end
end
end
end

View File

@ -0,0 +1 @@
require 'travis/api/serialize/v2/http'

View File

@ -0,0 +1,24 @@
require 'travis/api/serialize/serializer'
require 'travis/api/serialize/v2/http/accounts'
require 'travis/api/serialize/v2/http/annotations'
require 'travis/api/serialize/v2/http/broadcasts'
require 'travis/api/serialize/v2/http/branch'
require 'travis/api/serialize/v2/http/branches'
require 'travis/api/serialize/v2/http/build'
require 'travis/api/serialize/v2/http/builds'
require 'travis/api/serialize/v2/http/caches'
require 'travis/api/serialize/v2/http/hooks'
require 'travis/api/serialize/v2/http/job'
require 'travis/api/serialize/v2/http/jobs'
require 'travis/api/serialize/v2/http/log'
require 'travis/api/serialize/v2/http/permissions'
require 'travis/api/serialize/v2/http/repositories'
require 'travis/api/serialize/v2/http/repository'
require 'travis/api/serialize/v2/http/requests'
require 'travis/api/serialize/v2/http/request'
require 'travis/api/serialize/v2/http/ssl_key'
require 'travis/api/serialize/v2/http/env_var'
require 'travis/api/serialize/v2/http/env_vars'
require 'travis/api/serialize/v2/http/user'
require 'travis/api/serialize/v2/http/validation_error'
require 'travis/api/serialize/v2/http/ssh_key'

View File

@ -0,0 +1,44 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Accounts
include Formats
attr_reader :accounts, :options
def initialize(accounts, options = {})
@accounts = accounts
@options = options
end
def data
{
:accounts => accounts.map { |account| account_data(account) }
}
end
private
def account_data(account)
data = {
'id' => account.id,
'name' => account.name,
'login' => account.login,
'type' => account.type.underscore,
'repos_count' => account.repos_count
}
data['avatar_url'] = account.avatar_url if account.respond_to?(:avatar_url)
data
end
end
end
end
end
end
end

View File

@ -0,0 +1,38 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Annotations
include Formats
def initialize(annotations, options = {})
@annotations = annotations
end
def data
{
"annotations" => @annotations.map { |annotation| build_annotation(annotation) },
}
end
private
def build_annotation(annotation)
{
"id" => annotation.id,
"job_id" => annotation.job_id,
"description" => annotation.description,
"url" => annotation.url,
"status" => annotation.status,
"provider_name" => annotation.annotation_provider.name,
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,31 @@
require 'travis/api/serialize/formats'
require 'travis/api/serialize/v2/http/branches'
module Travis
module Api
module Serialize
module V2
module Http
class Branch < Branches
include Formats
attr_reader :build, :commit, :options
def initialize(build, options = {})
@build = build
@commit = build.commit
@options = options
end
def data
{
'branch' => build_data(build),
'commit' => commit_data(commit)
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,64 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Branches
include Formats
attr_reader :builds, :commits, :options
def initialize(builds, options = {})
builds = builds.last_finished_builds_by_branches if builds.is_a?(Repository) # TODO remove, bc
@builds = builds
@commits = builds.map(&:commit)
@options = options
end
def data
{
'branches' => builds.map { |build| build_data(build) },
'commits' => commits.map { |commit| commit_data(commit) }
}
end
private
def build_data(build)
{
'id' => build.id,
'repository_id' => build.repository_id,
'commit_id' => build.commit_id,
'number' => build.number,
'config' => build.obfuscated_config.stringify_keys,
'state' => build.state.to_s,
'started_at' => format_date(build.started_at),
'finished_at' => format_date(build.finished_at),
'duration' => build.duration,
'job_ids' => build.matrix.map { |job| job.id },
'pull_request' => build.pull_request?
}
end
def commit_data(commit)
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,33 @@
module Travis
module Api
module Serialize
module V2
module Http
class Broadcasts
attr_reader :broadcasts, :options
def initialize(broadcasts, options = {})
@broadcasts = broadcasts
@options = options
end
def data
{
'broadcasts' => broadcasts.map { |broadcast| broadcast_data(broadcast) }
}
end
private
def broadcast_data(broadcast)
{
'id' => broadcast.id,
'message' => broadcast.message
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,97 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Build
include Formats
attr_reader :build, :options
def initialize(build, options = {})
options[:include_jobs] = true unless options.key?(:include_jobs)
@build = build
@options = options
end
def data
{
'build' => build_data(build),
'commit' => commit_data(build.commit, build.repository),
'jobs' => options[:include_jobs] ? build.matrix.map { |job| job_data(job) } : [],
'annotations' => options[:include_jobs] ? Annotations.new(annotations(build), @options).data["annotations"] : [],
}
end
private
def build_data(build)
{
'id' => build.id,
'repository_id' => build.repository_id,
'commit_id' => build.commit_id,
'number' => build.number,
'event_type' => build.event_type,
'pull_request' => build.pull_request?,
'pull_request_title' => build.pull_request_title,
'pull_request_number' => build.pull_request_number,
'config' => build.obfuscated_config.stringify_keys,
'state' => build.state.to_s,
'started_at' => format_date(build.started_at),
'finished_at' => format_date(build.finished_at),
'duration' => build.duration,
'job_ids' => build.matrix_ids
}
end
def commit_data(commit, repository)
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'branch_is_default' => branch_is_default(commit, repository),
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
}
end
def job_data(job)
{
'id' => job.id,
'repository_id' => job.repository_id,
'build_id' => job.source_id,
'commit_id' => job.commit_id,
'log_id' => job.log_id,
'state' => job.state.to_s,
'number' => job.number,
'config' => job.obfuscated_config.stringify_keys,
'started_at' => format_date(job.started_at),
'finished_at' => format_date(job.finished_at),
'queue' => job.queue,
'allow_failure' => job.allow_failure,
'tags' => job.tags,
'annotation_ids' => job.annotation_ids,
}
end
def branch_is_default(commit, repository)
repository.default_branch == commit.branch
end
def annotations(build)
build.matrix.map(&:annotations).flatten
end
end
end
end
end
end
end

View File

@ -0,0 +1,71 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Builds
include Formats
attr_reader :builds, :commits, :options
def initialize(builds, options = {})
@builds = builds
@commits = builds.map(&:commit)
@options = options
end
def data
{
'builds' => builds.map { |build| build_data(build) },
'commits' => commits.map { |commit| commit_data(commit) }
}
end
private
def build_data(build)
{
'id' => build.id,
'repository_id' => build.repository_id,
'commit_id' => build.commit_id,
'number' => build.number,
'event_type' => build.event_type,
'pull_request' => build.pull_request?,
'pull_request_title' => build.pull_request_title,
'pull_request_number' => build.pull_request_number,
'config' => build.obfuscated_config.stringify_keys,
'state' => build.state.to_s,
'started_at' => format_date(build.started_at),
'finished_at' => format_date(build.finished_at),
'duration' => build.duration,
'job_ids' => matrix_ids(build)
}
end
def matrix_ids(build)
build.cached_matrix_ids || build.matrix_ids
end
def commit_data(commit)
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
'pull_request_number' => commit.pull_request_number
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,37 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Caches
include Formats
attr_reader :caches, :options
def initialize(caches, options = {})
@caches = caches
@options = options
end
def data
{ 'caches' => caches.map { |cache| cache_data(cache) } }
end
private
def cache_data(cache)
{
'repository_id' => cache.repository.id,
'size' => cache.size,
'slug' => cache.slug,
'branch' => cache.branch,
'last_modified' => format_date(cache.last_modified)
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,25 @@
module Travis
module Api
module Serialize
module V2
module Http
class EnvVar < Travis::Api::Serialize::ObjectSerializer
attributes :id, :name, :value, :public, :repository_id
def value
if object.public?
object.value.decrypt
end
end
def serializable_hash
hash = super
hash.delete :value unless object.public?
hash
end
end
end
end
end
end
end

View File

@ -0,0 +1,2 @@
class Travis::Api::Serialize::V2::Http::EnvVars < Travis::Api::Serialize::ArraySerializer
end

View File

@ -0,0 +1,38 @@
module Travis
module Api
module Serialize
module V2
module Http
class Hooks
attr_reader :hooks, :options
def initialize(hooks, options = {})
@hooks = hooks
@options = options
end
def data
{
'hooks' => hooks.map { |hook| hook_data(hook) },
}
end
private
def hook_data(hook)
{
'id' => hook.id,
'name' => hook.name,
'owner_name' => hook.owner_name,
'description' => hook.description,
'active' => hook.active,
'private' => hook.private,
'admin' => hook.admin?
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,72 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Job
include Formats
attr_reader :job, :options
def initialize(job, options = {})
@job = job
@options = options
end
def data
{
'job' => job_data(job),
'commit' => commit_data(job.commit, job.repository),
'annotations' => Annotations.new(job.annotations, @options).data["annotations"],
}
end
private
def job_data(job)
{
'id' => job.id,
'repository_id' => job.repository_id,
'repository_slug' => job.repository.slug,
'build_id' => job.source_id,
'commit_id' => job.commit_id,
'log_id' => job.log_id,
'number' => job.number,
'config' => job.obfuscated_config.stringify_keys,
'state' => job.state.to_s,
'started_at' => format_date(job.started_at),
'finished_at' => format_date(job.finished_at),
'queue' => job.queue,
'allow_failure' => job.allow_failure,
'tags' => job.tags,
'annotation_ids' => job.annotation_ids,
}
end
def commit_data(commit, repository)
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'branch_is_default' => branch_is_default(commit, repository),
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
}
end
def branch_is_default(commit, repository)
repository.default_branch == commit.branch
end
end
end
end
end
end
end

View File

@ -0,0 +1,65 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Jobs
include Formats
attr_reader :jobs, :options
def initialize(jobs, options = {})
@jobs = jobs
@options = options
end
def data
{
'jobs' => jobs.map { |job| job_data(job) },
'commits' => jobs.map { |job| commit_data(job.commit) }
}
end
private
def job_data(job)
{
'id' => job.id,
'repository_id' => job.repository_id,
'repository_slug' => job.repository.slug,
'build_id' => job.source_id,
'commit_id' => job.commit_id,
'log_id' => job.log_id,
'number' => job.number,
'config' => job.obfuscated_config.stringify_keys,
'state' => job.state.to_s,
'started_at' => format_date(job.started_at),
'finished_at' => format_date(job.finished_at),
'queue' => job.queue,
'allow_failure' => job.allow_failure,
'tags' => job.tags
}
end
def commit_data(commit)
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,80 @@
module Travis
module Api
module Serialize
module V2
module Http
class Log
attr_reader :log, :options
def initialize(log, options = {})
@log = log
@options = options
end
def data
log_hash = options[:chunked] ? chunked_log_data : log_data
if log.removed_at
log_hash['removed_at'] = log.removed_at
log_hash['removed_by'] = log.removed_by.name || log.removed_by.login
end
{
'log' => log_hash,
}
end
private
def log_data
{
'id' => log.id,
'job_id' => log.job_id,
'type' => log.class.name.demodulize,
'body' => log.content
}
end
def chunked_log_data
{
'id' => log.id,
'job_id' => log.job_id,
'type' => log.class.name.demodulize,
'parts' => log_parts
}
end
def log_parts
if log.removed_at
# if log is removed we don't have actual parts
parts = [{ 'number' => 1, 'content' => log.content, 'final' => true }]
else
parts = log.parts
parts = parts.where(number: part_numbers) if part_numbers
parts = parts.where(["number > ?", after]) if after
parts.sort_by(&:number).map do |part|
{
'id' => part.id,
'number' => part.number,
'content' => part.content,
'final' => part.final
}
end
end
end
def after
after = options['after'].to_i
after == 0 ? nil : after
end
def part_numbers
if numbers = options['part_numbers']
numbers.is_a?(String) ? numbers.split(',').map(&:to_i) : numbers
end
end
end
end
end
end
end
end

View File

@ -0,0 +1,52 @@
module Travis
module Api
module Serialize
module V2
module Http
class Permissions
attr_reader :permissions, :options
def initialize(permissions, options = {})
@permissions = permissions
@options = options
end
def data
{
'permissions' => repo_ids,
'admin' => admin_ids,
'pull' => pull_ids,
'push' => push_ids
}
end
private
def filtered_ids(perm = nil)
if perm
permissions.find_all { |p| p.send("#{perm}?") }.map { |permission| permission.repository_id }
else
permissions.map { |permission| permission.repository_id }
end
end
def repo_ids
filtered_ids
end
def admin_ids
filtered_ids(:admin)
end
def pull_ids
filtered_ids(:pull)
end
def push_ids
filtered_ids(:push)
end
end
end
end
end
end
end

View File

@ -0,0 +1,47 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Repositories
include Formats
attr_reader :repositories, :options
def initialize(repositories, options = {})
@repositories = repositories
@options = options
end
def data
{
'repos' => repositories.map { |repository| repository_data(repository) }
}
end
private
def repository_data(repository)
{
'id' => repository.id,
'slug' => repository.slug,
'description' => repository.description,
'last_build_id' => repository.last_build_id,
'last_build_number' => repository.last_build_number,
'last_build_state' => repository.last_build_state.to_s,
'last_build_duration' => repository.last_build_duration,
'last_build_language' => nil,
'last_build_started_at' => format_date(repository.last_build_started_at),
'last_build_finished_at' => format_date(repository.last_build_finished_at),
'active' => repository.active,
'github_language' => repository.github_language
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,47 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Repository
include Formats
attr_reader :repository, :options
def initialize(repository, options = {})
@repository = repository
end
def data
{
'repo' => repository_data(repository)
}
end
private
# TODO why does this not include the last build? (i.e. 'builds' => { last build here })
def repository_data(repository)
{
'id' => repository.id,
'slug' => repository.slug,
'active' => repository.active,
'description' => repository.description,
'last_build_id' => repository.last_build_id,
'last_build_number' => repository.last_build_number,
'last_build_state' => repository.last_build_state.to_s,
'last_build_duration' => repository.last_build_duration,
'last_build_language' => nil,
'last_build_started_at' => format_date(repository.last_build_started_at),
'last_build_finished_at' => format_date(repository.last_build_finished_at),
'github_language' => repository.github_language
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,75 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Request
include Formats
attr_reader :request, :commit, :options
def initialize(request, options = {})
@request = request
@commit = request.commit
@options = options
end
def data
data = {
'request' => request_data
}
if commit
data['commit'] = commit_data
end
data
end
private
def request_data
data = {
'id' => request.id,
'repository_id' => request.repository_id,
'commit_id' => request.commit_id,
'created_at' => format_date(request.created_at),
'owner_id' => request.owner_id,
'owner_type' => request.owner_type,
'event_type' => request.event_type,
'base_commit' => request.base_commit,
'head_commit' => request.head_commit,
'result' => request.result,
'message' => request.message,
'pull_request' => request.pull_request?,
'pull_request_number' => request.pull_request_number,
'pull_request_title' => request.pull_request_title,
'branch' => request.branch_name,
'tag' => request.tag_name
}
data['build_id'] = request.builds.first.id if request.builds.present?
data
end
def commit_data
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
'pull_request_number' => commit.pull_request_number
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,72 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Requests
include Formats
attr_reader :requests, :commits, :options
def initialize(requests, options = {})
@requests = requests
@commits = requests.map(&:commit)
@options = options
end
def data
{
'requests' => requests.map { |request| request_data(request) },
'commits' => commits.compact.map { |commit| commit_data(commit) }
}
end
private
def request_data(request)
data = {
'id' => request.id,
'repository_id' => request.repository_id,
'commit_id' => request.commit_id,
'created_at' => format_date(request.created_at),
'owner_id' => request.owner_id,
'owner_type' => request.owner_type,
'event_type' => request.event_type,
'base_commit' => request.base_commit,
'head_commit' => request.head_commit,
'result' => request.result,
'message' => request.message,
'pull_request' => request.pull_request?,
'pull_request_number' => request.pull_request_number,
'pull_request_title' => request.pull_request_title,
'branch' => request.branch_name,
'tag' => request.tag_name
}
data['build_id'] = request.builds.first.id if request.builds.present?
data
end
def commit_data(commit)
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
'pull_request_number' => commit.pull_request_number
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,28 @@
require 'openssl'
require 'travis/private_key'
module Travis
module Api
module Serialize
module V2
module Http
class SshKey < Travis::Api::Serialize::ObjectSerializer
attributes :id, :description, :fingerprint
def id
object.repository_id
end
def fingerprint
value = object.value.decrypt
return unless value
PrivateKey.new(value).fingerprint
rescue OpenSSL::PKey::RSAError
nil
end
end
end
end
end
end
end

View File

@ -0,0 +1,28 @@
module Travis
module Api
module Serialize
module V2
module Http
class SslKey
attr_reader :key
def initialize(key, options = {})
@key = key
end
def fingerprint
PrivateKey.new(key.private_key).fingerprint
end
def data
{
'key' => key.public_key,
'fingerprint' => fingerprint
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,51 @@
require 'travis/api/serialize/formats'
require 'travis/github/oauth'
module Travis
module Api
module Serialize
module V2
module Http
class User
include Formats
attr_reader :user, :options
def initialize(user, options = {})
@user = user
@options = options
end
def data
{
'user' => user_data,
}
end
private
def user_data
{
'id' => user.id,
'name' => user.name,
'login' => user.login,
'email' => user.email,
'gravatar_id' => user.email ? Digest::MD5.hexdigest(user.email) : "",
'locale' => user.locale,
'is_syncing' => user.syncing?,
'synced_at' => format_date(user.synced_at),
'correct_scopes' => Github::Oauth.correct_scopes?(user),
'created_at' => format_date(user.created_at),
'channels' => channels
}
end
def channels
["user-#{user.id}"] + user.repository_ids.map { |id| "repo-#{id}" }
end
end
end
end
end
end
end

Some files were not shown because too many files have changed in this diff Show More