Compare commits

...

430 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
Ana Rosas
05f926b0ec Merge pull request #264 from travis-ci/ar-enqueue-restarting-jobs
Enqueue restarting Jobs and Builds for Hub
2016-06-07 14:23:40 +02:00
Ana Rosas
6656b5d0aa Merge branch 'master' into ar-enqueue-restarting-jobs 2016-06-07 11:23:04 +02:00
Buck Doyle
b649bb5a0f Remove duplicated sorting configuration (#274)
As noted by @rkh in the API introduction.
2016-06-06 15:08:00 -04:00
Ana Rosas
24865ee322 Merge branch 'master' into ar-enqueue-restarting-jobs 2016-06-06 18:22:06 +02:00
Piotr Sarnacki
686e3c9baf Merge pull request #273 from travis-ci/fix-sorting-by-current-build
Rename current_build sort to current_build_id
2016-06-06 16:48:05 +02:00
Piotr Sarnacki
7317d6b265 Rename current_build sort to current_build_id
This a quick workaround for sorting by current_build. When the field
that we use to sort is the same as one of the associations name API V3
will try to join the association. So in this case it will try to join
:current_build, which fails. This needs a better solution, but I want to
get this working for now.
2016-06-06 16:40:41 +02:00
Ana Rosas
3a58979e43 Merge branch 'master' into ar-enqueue-restarting-jobs 2016-06-06 15:21:53 +02:00
Piotr Sarnacki
b1de9d569c Merge pull request #272 from travis-ci/fix-sorting-by-current-build
Specify a table when sorting by current_build_id
2016-06-06 14:23:31 +02:00
Piotr Sarnacki
dbe0a75a22 Specify a table when sorting by current_build_id
Otherwise in some circumstances postgres may complain about
disambiguity.
2016-06-06 14:13:46 +02:00
Ana Rosas
8b9df97e3f Merge branch 'master' into ar-enqueue-restarting-jobs 2016-06-06 11:04:44 +02:00
carlad
9df4dc02cf Merge pull request #266 from HPI-BP2015H/cron-time
return created_at of cron
2016-06-03 15:37:10 +02:00
Christopher Weyand
7200744879 Merge branch 'master' into cron-time 2016-06-03 15:32:52 +02:00
Igor
92dd9a5ce0 Merge pull request #269 from travis-ci/igor-ruby-version
Use .ruby-version file instead of ruby statement in Gemfile
2016-06-03 12:10:49 +02:00
Igor Wiedler
bec9f35e69 Use .ruby-version file instead of ruby statement in Gemfile 2016-06-02 19:22:16 +02:00
carlad
2303db9f4f add info about developer.travis-ci.org 2016-06-02 16:46:39 +02:00
Ana Rosas
1c9212ef08 Refacto on restart endpoint for Jobs 2016-06-01 14:57:55 +02:00
Renée Hendricksen
794e2d70af Merge pull request #268 from travis-ci/fix-api-sentry-connection
Fix api sentry connection
2016-05-31 11:36:57 +02:00
Ana Rosas
0038197aab Assign variable before if statement 2016-05-30 18:10:11 +02:00
Renée Hendricksen
574dfab772 fix the error - it's reporting to Sentry - Yay 2016-05-30 18:07:54 +02:00
Renée Hendricksen
8c6477c247 try another spot to throw and error 2016-05-30 18:05:25 +02:00
Renée Hendricksen
ace3e588ea forgot this and it's not tested 2016-05-30 17:57:48 +02:00
Renée Hendricksen
a8b70f51f3 code error we want to see on staging 2016-05-30 17:51:04 +02:00
Renée Hendricksen
21c714ae97 fix the test 2016-05-30 17:31:37 +02:00
Renée Hendricksen
d7d8e3bbe3 use the method directly 2016-05-30 17:26:44 +02:00
Renée Hendricksen
2ded8ac2be some changes to get errors to report to Sentry 2016-05-30 17:16:27 +02:00
Ana Rosas
8655fd19ce Refacto endpoint 2016-05-30 17:07:17 +02:00
Ana Rosas
6de524d84c Enqueue restarting jobs for the Hub 2016-05-30 17:07:17 +02:00
Renée Hendricksen
0e43360f1d ignore my gemset 2016-05-30 15:31:19 +02:00
Christopher Weyand
799d757625 cron representation change tests 2016-05-30 11:26:06 +02:00
Christopher Weyand
504be84f27 cron return created_at 2016-05-30 10:02:21 +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
fa50bd13de Abstract enqueue restart service, to use it with Jobs and Builds 2016-05-26 17:45:31 +02:00
Ana Rosas
1863f5bd0c Enqueue restarting jobs for the Hub 2016-05-26 17:45:31 +02:00
Josh Kalderimis
efb9d899b2 Signal Sciences support (#254)
* test out setting up signal sciences

* tweak the signalsciences config a little

* try out the updated signal sciences heroku integration

* use the old ngnix start script, as signalsciences is now nginx based

* make sure sigsci conf is included in our custom nginx config

* remove the custom port stuff, no longer needed
2016-05-26 17:44:12 +02:00
carlad
6e51368525 Merge pull request #263 from travis-ci/cd-cron-error
add error rescue for cron start method
2016-05-24 15:55:20 +02:00
carlad
e62ba7722e Merge branch 'master' into cd-cron-error 2016-05-24 15:46:35 +02:00
Ana Rosas
276a61759d Merge pull request #261 from travis-ci/ar-migrate-restart-builds
Enqueue restarting builds/jobs for Hub
2016-05-24 08:36:46 -05:00
carlad
1d3a2ebb67 add error rescue for cron start method 2016-05-24 15:20:40 +02:00
Ana Rosas
3c253bb88c Move stub to before block on restart test 2016-05-23 15:07:33 -05:00
Ana Rosas
2b37d90ffb Add permission methods to enqueue_build 2016-05-23 15:07:33 -05:00
Ana Rosas
9bd145856b Add feature flag to enqueue restart build to Hub 2016-05-23 15:07:33 -05:00
Ana Rosas
9bbfb7ec97 Add an equeue service 2016-05-23 15:07:33 -05:00
Ana Rosas
28884f9931 Enqueue build_restart event in Hub 2016-05-18 15:11:04 -05:00
Igor
e876a83d86 Merge pull request #260 from travis-ci/igor-cors-preflight-cache
Set Access-Control-Max-Age header for CORS preflight requests to cache them
2016-05-18 13:56:09 +02:00
Igor Wiedler
2a66505aca Set Access-Control-Max-Age header for CORS preflight requests to cache them (refs travis-pro/post-its#169) 2016-05-18 12:26:06 +02:00
Piotr Sarnacki
1615928c68 Bump travis-core 2016-05-17 16:15:27 +02:00
Piotr Sarnacki
5cade805e0 Merge pull request #259 from travis-ci/ps-current-build2
Add current_build to repositories payload
2016-05-17 14:20:22 +02:00
Piotr Sarnacki
659dc4d992 Add current_build to repositories payload
This commit adds current_build (which is based on
repositories.current_build_id) to repositories payload. It also adds
ability to sort by current_build.
2016-05-17 14:11:09 +02:00
Konstantin Haase
754101e9af Merge pull request #258 from lucascherifi/patch-1
Update README.md
2016-05-17 11:58:17 +02:00
Lucas CHERIFI
654185538f Update README.md 2016-05-16 03:56:10 +02:00
Piotr Sarnacki
13d9c97501 Revert "Merge pull request #257 from travis-ci/ps-current-build"
This reverts commit 52bebad05c, reversing
changes made to 9d386efa4c.
2016-05-11 17:13:40 +02:00
Piotr Sarnacki
52bebad05c Merge pull request #257 from travis-ci/ps-current-build
Add current_build to repositories payload
2016-05-11 17:00:35 +02:00
Piotr Sarnacki
c9b93982c9 Add current_build to repositories payload
current_build is the most recent build that is either completed or
running
2016-05-11 16:55:47 +02:00
Ana Rosas
9d386efa4c Bump travis-core 2016-05-09 11:19:22 -05:00
Konstantin Haase
168bc39d2a add command to procfile 2016-04-28 15:15:57 +02:00
Konstantin Haase
7f437f9d27 Merge pull request #255 from HPI-BP2015H/start-cron
script to start all due cron jobs
2016-04-28 15:13:06 +02:00
Steffen Kötte
ea838dd246 script to start all due cron jobs 2016-04-27 14:31:09 +02:00
Konstantin Haase
0458482fdf Merge pull request #225 from HPI-BP2015H/cronjobs
Cronjobs
2016-04-22 15:05:52 +02:00
carlad
d21fc58955 Merge pull request #253 from travis-ci/cd-after-number
bump travis-core to deal with `/builds?after_number` problem
2016-04-22 14:54:05 +02:00
carlad
4ec8e1acdc bump travis-core use master 2016-04-22 14:45:53 +02:00
carlad
c6ddffc85a bump travis core 2016-04-22 14:01:46 +02:00
carlad
732e8a956d bump travis-core for builds after number fix 2016-04-22 13:46:18 +02:00
Steffen
f186c16669 Merge branch 'master' into cronjobs 2016-04-22 10:33:40 +02:00
Konstantin Haase
0593c55ef6 Merge pull request #252 from travis-ci/cd-v3
v3 - add validation check to build and job cancel and restart
2016-04-20 14:56:45 +02:00
carlad
7b5c11fca6 add specs, update error names 2016-04-20 14:31:08 +02:00
carlad
63bef443e8 update build_cancel spec 2016-04-20 11:55:03 +02:00
carlad
30d73782c8 add error check to build restart and cancel 2016-04-20 11:33:20 +02:00
carlad
379a63bf00 fix spelling of canceled, remove debug output 2016-04-20 11:08:29 +02:00
carlad
ec217a58f1 correct typo 2016-04-19 18:29:46 +02:00
carlad
506e0f0f7a add check for state on job restart and cancel 2016-04-19 15:26:28 +02:00
carlad
ec62a5b918 merge 2016-04-19 12:39:00 +02:00
Steffen
13aa741e57 Merge branch 'master' into cronjobs 2016-04-18 09:42:36 +02:00
Konstantin Haase
78f36320a7 Merge pull request #251 from travis-ci/cd-requests-branch-name
V3 add branch_name for request
2016-04-15 17:31:04 +02:00
carlad
00aaf32b1e add branch_name for request 2016-04-15 17:22:41 +02:00
Hiro Asari
93bc69dc9d Update travis-core and thor
In particular, include https://github.com/travis-ci/travis-core/pull/538
to fetch GCS caches
2016-04-14 08:11:57 -10:00
Steffen Kötte
7e7f1b212b refactor cron start 2016-04-14 12:53:23 +02:00
carlad
27f18d77ac rename branch, add method to model 2016-04-14 11:26:51 +02:00
carlad
a67f6bb2ea Merge branch 'cd-v3' of github.com:travis-ci/travis-api into cd-v3 2016-04-14 11:15:36 +02:00
carlad
55f8378940 add branch_name method 2016-04-14 11:15:17 +02:00
carlad
866fd2a617 Auto-merged master into cd-v3 on deployment. 2016-04-14 10:43:36 +02:00
carlad
d522072705 Merge branch 'cd-v3' of github.com:travis-ci/travis-api into cd-v3 2016-04-14 10:40:49 +02:00
carlad
c22998fdcf add branch_name to request renderer 2016-04-14 10:39:59 +02:00
carlad
6b7526dd7e remove request endpoint 2016-04-14 10:19:28 +02:00
carlad
845f02d8d9 add request endpoint 2016-04-14 10:14:20 +02:00
Steffen Kötte
0b2585de45 remove cronjobs and disallow creating if branch does no longer exist on GitHub 2016-04-12 11:33:30 +02:00
Konstantin Haase
72c204883f Merge pull request #247 from HPI-BP2015H/readme_update
Readme update
2016-04-11 15:51:05 +02:00
Steffen
1b9b422753 remove text from code block 2016-04-08 09:55:32 +02:00
Christopher Weyand
c6d9e5ad7d Merge remote-tracking branch 'travis/master' into readme_update
Conflicts:
	README.md
2016-04-07 16:00:33 +02:00
Piotr Sarnacki
efe26b03a1 Bump travis-core 2016-04-07 11:43:46 +02:00
Piotr Sarnacki
dc4d6f0208 Bump travis-core 2016-04-07 11:40:44 +02:00
carlad
482f037438 Update README.md 2016-04-06 15:03:12 +02:00
Josh Kalderimis
357257b654 Merge pull request #246 from travis-ci/ha-chore-bundle-update
Update travis-core
2016-04-05 20:32:34 +02:00
Hiro Asari
1f0d26a01c Update travis-core
In particular, to include https://github.com/travis-ci/travis-core/pull/530
2016-04-05 08:27:34 -10:00
carlad
ce1ba54f77 Merge pull request #245 from travis-ci/ar-cd-rate-setting
Use Travis.config to retrieve default values for api_builds_rate_limit
2016-04-05 17:33:22 +02:00
Ana Rosas
03e992885e Bump travis-core 2016-04-05 17:28:00 +02:00
Ana Rosas
228b594237 Return LIMIT if everything else fails 2016-04-05 17:09:48 +02:00
Ana Rosas
11ceaed333 Test default limit 2016-04-05 16:47:33 +02:00
Ana Rosas
679bbd7901 Use LIMIT constant as a backup limit number 2016-04-05 16:27:45 +02:00
Ana Rosas
4556130acb Merge branch 'master' into ar-cd-rate-setting 2016-04-05 15:30:16 +02:00
Ana Rosas
407d2abea1 Use Travis.config to retrieve default values for api_builds_rate_limit 2016-04-05 15:29:49 +02:00
Steffen
7922ca8e84 Merge branch 'master' into cronjobs 2016-04-05 15:23:03 +02:00
carlad
e4b1562039 Merge pull request #244 from travis-ci/ar-cd-rate-setting
Update api builds rate limit condition to get higher rate for .com
2016-04-05 12:35:10 +02:00
Ana Rosas
a37acda0a0 Merge branch 'master' into ar-cd-rate-setting 2016-04-05 12:30:41 +02:00
Ana Rosas
5fc096f68b Update rate limit condition 2016-04-05 12:29:35 +02:00
carlad
9f9c5bf789 Update README.md 2016-04-05 11:43:40 +02:00
carlad
855997aba8 Merge pull request #243 from travis-ci/ar-cd-rate-setting
Add api builds rate limit to API
2016-04-05 10:29:35 +02:00
Ana Rosas
cab8534b4a Fix merge conflicts 2016-04-04 16:38:20 +02:00
carlad
7f4d67ea8d remove core pointing to branch 2016-04-04 16:21:16 +02:00
Ana Rosas
0e8fe08f7c Update limit method and finish test 2016-04-04 16:13:14 +02:00
Steffen
a522607673 Merge branch 'master' into cronjobs 2016-04-04 10:39:55 +02:00
Steffen Kötte
31f6b5793a refactor cron model and create service 2016-04-04 10:27:06 +02:00
Steffen
c49819ca52 add missing sudo 2016-04-01 16:22:29 +02:00
Lennard Wolf
bc42810a53 updated README to a functioning state. 2016-04-01 16:03:09 +02:00
Tyranja
6e3577401e Merge pull request #242 from travis-ci/ar-bump-core
Bump travis-core
2016-04-01 12:05:52 +02:00
carlad
24b2abdfd0 add .rspec for formatting, add new test (still broken) 2016-03-31 17:15:43 +02:00
carlad
f51cf1a1d1 update rakefile to allow heroku deployment, update create.rb with api builds rate limit 2016-03-31 16:54:12 +02:00
carlad
d6c0621d71 remove fail from rake tasks to allow heroku deployment 2016-03-31 15:55:17 +02:00
carlad
49a6bb5d26 add debug to see what request contains 2016-03-31 15:51:44 +02:00
Tyranja
2f870e6826 Bump travis-core 2016-03-30 16:35:34 +02:00
Tyranja
7ca67875b4 Merge pull request #241 from travis-ci/cd-fix-rake-problem
add better condition check for rake
2016-03-30 12:31:22 +02:00
carlad
d1848ba6f9 make settings visible in repository 2016-03-30 12:30:26 +02:00
carlad
1dd47df6bf add better condition check for rake 2016-03-30 12:18:05 +02:00
Steffen Kötte
9734e7133f fix feature flag for_branch endpoint 2016-03-29 16:51:00 +02:00
carlad
a466f0c819 Merge pull request #240 from travis-ci/sf-unsmart-helpers
Unsmart helpers, middlewares, and endpoints
2016-03-24 17:41:10 +01:00
carlad
f2d3758e09 Merge branch 'master' into sf-unsmart-helpers 2016-03-24 17:20:37 +01:00
Sven Fuchs
e183401888 Merge pull request #238 from travis-ci/cd-rakefile
Clean up the Rakefile
2016-03-24 16:33:23 +01:00
carlad
f1b3101ac7 Merge branch 'cd-rakefile' of github.com:travis-ci/travis-api into cd-rakefile 2016-03-24 16:19:14 +01:00
carlad
bcdd15f4cf fix typo 2016-03-24 13:41:27 +01:00
carlad
aa211be12a update readme 2016-03-24 13:39:41 +01:00
carlad
55287b23df Merge branch 'master' into cd-rakefile 2016-03-23 17:00:23 +01:00
carlad
7a95dabe95 Merge branch 'master' into cd-rakefile 2016-03-23 14:55:00 +01:00
carlad
1d6ed1e364 fix incorrect db name 2016-03-23 14:16:48 +01:00
carlad
dd82c14f5b refactor db create, move migrations into dev/test group 2016-03-23 14:09:29 +01:00
carlad
f8bee8f801 clean up rakefile, update gemspec 2016-03-23 13:13:22 +01:00
Steffen Kötte
69df412aa1 Merge branch 'master' into cronjobs
# Conflicts:
#	Gemfile
#	Gemfile.lock
2016-03-22 14:02:42 +01:00
Jonas Chromik
ca82725e5e move cron jobs feature flag to permissions 2016-03-22 13:48:51 +01:00
Steffen Kötte
c037ec7aa3 refactor planned time calculation into separate methods 2016-03-22 10:17:23 +01:00
Jonas Chromik
462a3618e1 update Gemfile.lock to use new migrations 2016-03-21 17:21:57 +01:00
Jonas Chromik
fe76d38230 Merge branch 'master' into cronjobs 2016-03-21 17:08:33 +01:00
Steffen Kötte
7215151403 adjust new test to include cron permission 2016-03-21 10:37:06 +01:00
Steffen Kötte
ac0012b0a2 Merge commit '8a050a468c77f2ad8c5faa99864c0bd7d61b08a0' into cronjobs
# Conflicts:
#	Gemfile
2016-03-21 10:32:46 +01:00
Jonas Chromik
5663410c45 minor changes 2016-03-14 12:50:39 +01:00
Christopher Weyand
dd7e74950d revert gemspec 2016-03-14 11:11:18 +01:00
Christopher Weyand
6c839aebec feature flag test 2016-03-14 11:03:41 +01:00
Steffen Kötte
ca5820e2e3 send user id with cron build payload 2016-02-25 13:49:12 +01:00
Steffen Kötte
77ec852be6 send empty credentials hash 2016-02-11 14:43:33 +01:00
Steffen Kötte
8a6f4066ae refactor methods to calculate next build time 2016-02-01 17:08:11 +01:00
Steffen Kötte
3fa9c09c0c move cron creation to query 2016-02-01 16:50:10 +01:00
Steffen Kötte
0d1dbaadd7 move start all to query 2016-02-01 16:29:23 +01:00
Steffen Kötte
be01b36f05 move find cron for repository to query 2016-02-01 16:20:50 +01:00
Steffen Kötte
6fb0f7b6ce change error type 2016-02-01 16:08:33 +01:00
Steffen Kötte
98a75e5931 move find cron for branch to correct query 2016-02-01 15:23:15 +01:00
Steffen Kötte
d75daab82f move cron start to query 2016-02-01 15:13:34 +01:00
Steffen Kötte
64478d50d1 rename next_build_time to next_enqueuing 2016-01-28 13:46:35 +01:00
Steffen Kötte
24b0af35e9 move start cronjob to services 2016-01-28 13:16:53 +01:00
Steffen Kötte
05d2e4767e adjust cron API path 2016-01-28 13:01:28 +01:00
Steffen
598ca6c2ca Merge branch 'master' into cronjobs 2016-01-21 13:39:43 +01:00
Steffen Kötte
2d2e7aa528 fix job enqueueing 2016-01-21 13:11:18 +01:00
Steffen Kötte
4704992a18 remove token from perform_async call 2016-01-21 10:40:43 +01:00
Steffen Kötte
da33cff0eb add more tests
add first version to start crons
adjust code to return now if cron is overdue
2016-01-18 16:59:10 +01:00
Steffen Kötte
9b24312445 Merge commit '43a2806b3ba410fc5bf3b3956e01879c96690c5b' into cronjobs 2016-01-18 13:51:48 +01:00
Steffen Kötte
2566a7761c add tests for next build time 2016-01-18 13:50:53 +01:00
Jonas Chromik
43a2806b3b Remove 'BUNDLED WITH [...]' in Gemfile.lock. 2016-01-18 12:35:10 +01:00
Jonas Chromik
3f11b08a25 Add timecop gem to Gemfile. 2016-01-18 12:27:29 +01:00
Steffen Kötte
e9356970f8 fix tests with output of next build date for cron jobs 2016-01-14 16:16:15 +01:00
Steffen Kötte
00e15de083 show next build time for cron 2016-01-14 16:12:27 +01:00
Steffen Kötte
ffcf8985c0 add tests for only one cron job per branch and interval value 2016-01-11 15:54:50 +01:00
Steffen Kötte
587ed37395 fix specs for new structure 2016-01-11 15:11:48 +01:00
Steffen Kötte
68ba4b9fce check for correct interval
allow only one cronjob per branch
2016-01-11 14:54:02 +01:00
Steffen Kötte
0920041375 further changes for new structure with only one cron per branch 2016-01-11 14:14:00 +01:00
Steffen Kötte
b45b3fadf7 changes for new db structure 2016-01-07 15:00:08 +01:00
Steffen Kötte
e4aec173ee Merge commit 'bddd9952a74d1eddad5d5a255419e07c836b286d' into addCron
Conflicts:
	spec/v3/services/owner/find_spec.rb
	spec/v3/services/repositories/for_current_user_spec.rb
	spec/v3/services/repositories/for_owner_spec.rb
	spec/v3/services/repository/find_spec.rb
2015-12-17 10:11:20 +01:00
Steffen
18ea7853bf Merge branch 'master' into addCron 2015-11-19 13:39:50 +01:00
Steffen Kötte
f356beaccf add time and disable_by_push options for cron 2015-11-19 13:39:13 +01:00
Steffen Kötte
75449baacd fix and add tests for crons 2015-11-16 15:52:05 +01:00
Steffen Kötte
aca632ed15 use branch for storing cron 2015-11-16 14:24:11 +01:00
Steffen Kötte
0a91a69d0d remove debug code 2015-11-09 16:59:10 +01:00
Lennard Wolf
e8ab7c0be6 add test for /repo/{repo.id}/crons/create endpoint 2015-11-09 16:55:53 +01:00
Lennard Wolf
b1408583dd fix test for /repo/{repo.id}/crons endpoint 2015-11-09 16:25:03 +01:00
Lennard Wolf
0e1b266e9b add test for /repo/{repo.id}/crons endpoint 2015-11-09 16:23:01 +01:00
Lennard Wolf
b3eb2f3398 add test for /cron/{cron.id}/delete endpoint 2015-11-09 16:04:41 +01:00
Lennard Wolf
f5f4b3b0b1 add test for /cron/{cron.id} endpoint 2015-11-09 14:50:44 +01:00
Lennard Wolf
a2a4737099 Fixed tests broken by cron 2015-11-09 14:03:30 +01:00
Steffen Kötte
c6556977fa Change create and delete to POST 2015-11-09 13:42:01 +01:00
Steffen Kötte
d1dd965b32 fix permissions 2015-11-09 12:51:07 +01:00
Lennard Wolf
c08f8243fb fix .../crons/create endpoint 2015-11-05 16:08:08 +01:00
Lennard Wolf
208dfb9a93 add /repo/repository.id/crons/create endpoint, all working with our access_control 2015-11-05 16:04:08 +01:00
Lennard Wolf
ec37deb17c add /repo/repo.id/crons GET endpoint 2015-11-05 15:22:10 +01:00
Lennard Wolf
5295d0c3ee add nonworking implementation of /cron/cron.id/delete 2015-11-05 15:11:31 +01:00
Lennard Wolf
772e797aae add /cron/cron.id/ GET endpoint 2015-11-05 13:31:36 +01:00
Lennard Wolf
046a63b60a add find for cron 2015-11-05 11:43:58 +01:00
517 changed files with 20769 additions and 2828 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://github.com/ryandotsmith/nginx-buildpack.git

4
.gitignore vendored
View File

@ -4,11 +4,9 @@ config/nginx.conf
config/skylight.yml
tmp/
log/
logs/
vendor
.yardoc
.coverage
*.env
.ruby-gemset

3
.rspec Normal file
View File

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

View File

@ -1 +1 @@
2.1.5
2.2.3

View File

@ -2,7 +2,7 @@ language: ruby
sudo: false
rvm: 2.1.5
rvm: 2.2.3
env:
global:
@ -19,6 +19,3 @@ services:
before_script:
- 'RAILS_ENV=test bundle exec rake db:create --trace'
script:
- bundle exec rspec spec

18
Gemfile
View File

@ -1,17 +1,15 @@
source 'https://rubygems.org'
gemspec
ruby '2.1.7' if ENV.key?('DYNO')
gem 's3', github: 'travis-ci/s3'
gem 'travis-core', github: 'travis-ci/travis-core'
gem 'travis-support', github: 'travis-ci/travis-support'
gem 'travis-amqp', github: 'travis-ci/travis-amqp'
gem 'travis-config', '~> 0.1.0'
gem 'travis-sidekiqs', github: 'travis-ci/travis-sidekiqs', require: nil
gem 'travis-settings', github: 'travis-ci/travis-settings'
gem 'travis-sidekiqs', github: 'travis-ci/travis-sidekiqs'
gem 'travis-yaml', github: 'travis-ci/travis-yaml'
gem 'travis-migrations', github: 'travis-ci/travis-migrations'
gem 'mustermann', github: 'rkh/mustermann'
gem 'sinatra'
gem 'sinatra-contrib', require: nil #github: 'sinatra/sinatra-contrib', require: nil
@ -20,9 +18,9 @@ gem 'active_model_serializers'
gem 'unicorn'
gem 'sentry-raven'
gem 'yard-sinatra', github: 'rkh/yard-sinatra'
gem 'rack-contrib', github: 'rack/rack-contrib'
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,16 +31,22 @@ gem 'micro_migrations'
gem 'simplecov'
gem 'skylight', '~> 0.6.0.beta.1'
gem 'stackprof'
gem 'netaddr'
gem 'jemalloc'
gem 'customerio'
group :development, :test do
gem 'travis-migrations', github: 'travis-ci/travis-migrations'
end
group :test do
gem 'rspec', '~> 2.13'
gem 'rspec-its'
gem 'factory_girl', '~> 2.4.0'
gem 'mocha', '~> 0.12'
gem 'database_cleaner', '~> 0.8.0'
gem 'timecop', '~> 0.8.0'
end
group :development do

View File

@ -1,20 +1,13 @@
GIT
remote: git://github.com/eric/metriks-librato_metrics.git
revision: ccbeb751ec5fc4edfe446d8a67a423b96ebe86c7
revision: 2c124f024fd2e34378260cd24b0e8687ff9bd196
specs:
metriks-librato_metrics (1.0.2)
metriks-librato_metrics (1.0.5)
metriks (>= 0.9.9.6)
GIT
remote: git://github.com/rack/rack-contrib.git
revision: 1b11346d729efd88b274cd7f704e0bca9eb3de7a
specs:
rack-contrib (1.2.0)
rack (>= 0.9.1)
GIT
remote: git://github.com/rkh/mustermann.git
revision: fa22e2cf4cfdb57f452c366eac66f241827b7e9c
revision: 9611951c5c789ad8227a740ae142c157a8bf7401
specs:
mustermann (0.4.0)
tool (~> 0.2)
@ -42,45 +35,30 @@ GIT
GIT
remote: git://github.com/travis-ci/travis-amqp.git
revision: c388299757b7eda2cc0e33cdc7d90113cf283e6a
revision: 3966b3651adfd1c544f53d49d5986ac16cd9c4bc
specs:
travis-amqp (0.0.1)
GIT
remote: git://github.com/travis-ci/travis-core.git
revision: f7b3a76b3f39c28bb5cf7b9dc24acec13908a11a
remote: git://github.com/travis-ci/travis-migrations.git
revision: dc432e45354287c617c3ae07a72e9e3c4be012cd
specs:
travis-core (0.0.1)
actionmailer (~> 3.2.19)
activerecord (~> 3.2.19)
coder (~> 0.4.0)
data_migrations (~> 0.0.1)
gh
hashr (~> 0.0.19)
metriks (~> 0.9.7)
multi_json
pusher (~> 0.14.0)
railties (~> 3.2.19)
rake
redis (~> 3.0)
rollout (~> 1.1.0)
s3 (~> 0.3)
simple_states (~> 1.0.0)
thor (~> 0.14.6)
travis-config (~> 0.1.0)
virtus (~> 1.0.0)
travis-migrations (0.0.2)
GIT
remote: git://github.com/travis-ci/travis-migrations.git
revision: fcf6eea3e3122a7cbb857826db835de69974c54d
remote: git://github.com/travis-ci/travis-settings.git
revision: d510e63b6c6f059cccae141c265e7a0c7236d1fd
specs:
travis-migrations (0.0.1)
travis-settings (0.0.1)
activemodel
virtus
GIT
remote: git://github.com/travis-ci/travis-sidekiqs.git
revision: 21a2fee158e25252dd78f5fa31e81b4f6583be23
revision: c5d4a4abc6c3737f9c43d3333efb94daa18b9fbb
specs:
travis-sidekiqs (0.0.1)
redis-namespace
sidekiq
GIT
@ -99,25 +77,33 @@ PATH
remote: .
specs:
travis-api (0.0.1)
activerecord (~> 3.2.19)
coder (~> 0.4.0)
composite_primary_keys (~> 5.0)
google-api-client (~> 0.9.4)
hashr
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)
redcarpet (~> 2.1)
redis (~> 3.0)
rollout (~> 1.1.0)
simple_states (~> 1.0.0)
sinatra (~> 1.3)
sinatra-contrib (~> 1.3)
travis-core
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)
@ -128,7 +114,7 @@ GEM
rack-cache (~> 1.2)
rack-test (~> 0.6.1)
sprockets (~> 2.2.1)
active_model_serializers (0.9.0)
active_model_serializers (0.9.5)
activemodel (>= 3.2)
activemodel (3.2.22.2)
activesupport (= 3.2.22.2)
@ -152,38 +138,31 @@ GEM
backports (3.6.8)
builder (3.0.4)
bunny (0.8.0)
celluloid (0.16.0)
timers (~> 4.0.0)
coder (0.4.0)
coderay (1.1.0)
coderay (1.1.1)
coercible (1.0.0)
descendants_tracker (~> 0.0.1)
composite_primary_keys (5.0.14)
activerecord (~> 3.2.0, >= 3.2.9)
connection_pool (2.1.1)
customerio (0.6.1)
httparty (>= 0.5, < 0.12)
concurrent-ruby (1.0.2)
connection_pool (2.2.0)
customerio (1.0.0)
multi_json (~> 1.0)
dalli (2.7.2)
data_migrations (0.0.1)
activerecord
rake
dalli (2.7.6)
database_cleaner (0.8.0)
descendants_tracker (0.0.4)
thread_safe (~> 0.3, >= 0.3.1)
diff-lcs (1.2.5)
docile (1.1.5)
dotenv (0.7.0)
equalizer (0.0.11)
erubis (2.7.0)
factory_girl (2.4.2)
activesupport
faraday (0.9.2)
multipart-post (>= 1.2, < 3)
ffi (1.9.6)
foreman (0.64.0)
dotenv (~> 0.7.0)
thor (>= 0.13.6)
ffi (1.9.10)
foreman (0.82.0)
thor (~> 0.19.1)
gh (0.14.0)
addressable
backports
@ -191,27 +170,47 @@ GEM
multi_json (~> 1.0)
net-http-persistent (>= 2.7)
net-http-pipeline
git-version-bump (0.15.1)
google-api-client (0.9.8)
addressable (~> 2.3)
googleauth (~> 0.5)
httpclient (~> 2.7)
hurley (~> 0.1)
memoist (~> 0.11)
mime-types (>= 1.6)
representable (~> 2.3.0)
retriable (~> 2.0)
thor (~> 0.19)
googleauth (0.5.1)
faraday (~> 0.9)
jwt (~> 1.4)
logging (~> 2.0)
memoist (~> 0.12)
multi_json (~> 1.11)
os (~> 0.9)
signet (~> 0.7)
hashr (0.0.22)
hike (1.2.3)
hitimes (1.2.3)
httparty (0.11.0)
multi_json (~> 1.0)
multi_xml (>= 0.5.2)
httpclient (2.7.1)
hitimes (1.2.4)
httpclient (2.8.0)
hurley (0.2)
i18n (0.7.0)
ice_nine (0.11.2)
jemalloc (1.0.1)
journey (1.0.4)
json (1.8.3)
kgio (2.9.2)
listen (1.0.3)
rb-fsevent (>= 0.9.3)
rb-inotify (>= 0.9)
rb-kqueue (>= 0.2)
mail (2.5.4)
mime-types (~> 1.16)
treetop (~> 1.4.8)
jwt (1.5.4)
kgio (2.10.0)
listen (3.1.5)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
ruby_dep (~> 1.2)
little-plugger (1.1.4)
logging (2.1.0)
little-plugger (~> 1.1)
multi_json (~> 1.10)
memcachier (0.0.2)
memoist (0.14.0)
metaclass (0.0.4)
method_source (0.8.2)
metriks (0.9.9.6)
@ -224,15 +223,15 @@ GEM
mime-types (1.25.1)
mocha (0.14.0)
metaclass (~> 0.0.1)
multi_json (1.11.2)
multi_xml (0.5.5)
multi_json (1.12.1)
multipart-post (2.0.0)
net-http-persistent (2.9.4)
net-http-pipeline (1.0.1)
pg (0.18.2)
polyglot (0.3.5)
netaddr (1.5.1)
os (0.9.6)
pg (0.18.4)
proxies (0.2.1)
pry (0.10.1)
pry (0.10.3)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
@ -242,8 +241,11 @@ GEM
pusher-signature (~> 0.1.8)
pusher-signature (0.1.8)
rack (1.4.7)
rack-attack (4.2.0)
rack-attack (5.0.0.beta1)
rack
rack-contrib (1.4.0)
git-version-bump (~> 0.15)
rack (~> 1.4)
rack-protection (1.5.3)
rack
rack-ssl (1.3.4)
@ -257,21 +259,22 @@ GEM
rake (>= 0.8.7)
rdoc (~> 3.4)
thor (>= 0.14.6, < 2.0)
raindrops (0.13.0)
raindrops (0.16.0)
rake (0.9.6)
rb-fsevent (0.9.4)
rb-inotify (0.9.5)
ffi (>= 0.5.0)
rb-kqueue (0.2.3)
rb-fsevent (0.9.7)
rb-inotify (0.9.7)
ffi (>= 0.5.0)
rdoc (3.12.2)
json (~> 1.4)
redcarpet (2.3.0)
redis (3.2.2)
redis-namespace (1.5.1)
redis (3.3.0)
redis-namespace (1.5.2)
redis (~> 3.0, >= 3.0.4)
rerun (0.8.2)
listen (~> 1.0.3)
representable (2.3.0)
uber (~> 0.0.7)
rerun (0.11.0)
listen (~> 3.0)
retriable (2.1.0)
rollout (1.1.0)
rspec (2.99.0)
rspec-core (~> 2.99.0)
@ -283,35 +286,39 @@ GEM
rspec-its (1.0.1)
rspec-core (>= 2.99.0.beta1)
rspec-expectations (>= 2.99.0.beta1)
rspec-mocks (2.99.2)
sentry-raven (0.15.3)
rspec-mocks (2.99.4)
ruby_dep (1.3.1)
sentry-raven (1.0.0)
faraday (>= 0.7.6)
sidekiq (3.3.0)
celluloid (>= 0.16.0)
connection_pool (>= 2.0.0)
json
redis (>= 3.0.6)
redis-namespace (>= 1.3.1)
sidekiq (4.1.2)
concurrent-ruby (~> 1.0)
connection_pool (~> 2.2, >= 2.2.0)
redis (~> 3.2, >= 3.2.1)
signet (0.7.2)
addressable (~> 2.3)
faraday (~> 0.9)
jwt (~> 1.5)
multi_json (~> 1.10)
simple_states (1.0.1)
activesupport
hashr (~> 0.0.10)
simplecov (0.9.1)
simplecov (0.11.2)
docile (~> 1.1.0)
multi_json (~> 1.0)
simplecov-html (~> 0.8.0)
simplecov-html (0.8.0)
json (~> 1.8)
simplecov-html (~> 0.10.0)
simplecov-html (0.10.0)
sinatra (1.4.6)
rack (~> 1.4)
rack-protection (~> 1.4)
tilt (>= 1.3, < 3)
sinatra-contrib (1.4.2)
sinatra-contrib (1.4.7)
backports (>= 2.0)
multi_json
rack-protection
rack-test
sinatra (~> 1.4.0)
tilt (~> 1.3)
skylight (0.6.0.beta.1)
tilt (>= 1.3, < 3)
skylight (0.6.2.beta.2)
activesupport (>= 3.0.0)
slop (3.6.0)
sprockets (2.2.3)
@ -319,24 +326,20 @@ GEM
multi_json (~> 1.0)
rack (~> 1.0)
tilt (~> 1.1, != 1.3.0)
stackprof (0.2.7)
thor (0.14.6)
stackprof (0.2.9)
thor (0.19.1)
thread_safe (0.3.5)
tilt (1.4.1)
timers (4.0.1)
hitimes
timecop (0.8.1)
tool (0.2.3)
travis-config (0.1.4)
hashr (~> 0.0)
treetop (1.4.15)
polyglot
polyglot (>= 0.3.1)
tzinfo (0.3.47)
unicorn (4.8.3)
tzinfo (0.3.49)
uber (0.0.15)
unicorn (5.1.0)
kgio (~> 2.6)
rack
raindrops (~> 0.7)
useragent (0.13.3)
useragent (0.16.7)
virtus (1.0.5)
axiom-types (~> 0.1)
coercible (~> 1.0)
@ -362,10 +365,11 @@ DEPENDENCIES
micro_migrations
mocha (~> 0.12)
mustermann!
netaddr
pry
rack-attack
rack-attack (= 5.0.0.beta1)
rack-cache!
rack-contrib!
rack-contrib
rake (~> 0.9.2)
rb-fsevent (~> 0.9.1)
rerun
@ -378,13 +382,17 @@ DEPENDENCIES
sinatra-contrib
skylight (~> 0.6.0.beta.1)
stackprof
timecop (~> 0.8.0)
travis-amqp!
travis-api!
travis-config (~> 0.1.0)
travis-core!
travis-migrations!
travis-settings!
travis-sidekiqs!
travis-support!
travis-yaml!
unicorn
yard-sinatra!
BUNDLED WITH
1.12.5

View File

@ -1,3 +1,4 @@
web: ./script/server
console: bundle exec je ./script/console
sidekiq: bundle exec je sidekiq -c 4 -r ./lib/travis/sidekiq.rb -q build_cancellations, -q build_restarts, -q job_cancellations, -q job_restarts
start_crons: ./script/start_crons

View File

@ -4,51 +4,68 @@ This is the app running on https://api.travis-ci.org/
## Requirements
You will need the following packages to get travis-api to work:
1. PostgreSQL 9.3 or higher
1. Redis
1. RabbitMQ
1. Nginx *NB: If working on Ubuntu please install Nginx manually from source. [This guide](http://www.rackspace.com/knowledge_center/article/ubuntu-and-debian-installing-nginx-from-source) is helpful but make sure you install the [latest stable version](https://www.nginx.com/resources/wiki/start/topics/tutorials/install/#stable), include the user name on your ubuntu machine when compiling (add `--user=[yourusername]` as an option when running `./configure`), and don't follow any subsequent server configuration steps. Travis-api will start and configure its own nginx server when run locally.
2. Bundler
3. Redis Server
4. *Optional:* RabbitMQ Server
5. Nginx -
*If working in Ubuntu please install nginx manually from source: Download and extract latest nginx version, open a terminal in extracted folder and then run the following:*
```sh-session
$ sudo apt-get install libpcre3 libpcre3-dev
$ auto/configure --user=$USER
$ make
$ sudo make install
$ sudo ln -s /usr/local/nginx/sbin/nginx /bin/nginx
```
## Installation
### Setup
$ bundle install
```sh-session
$ bundle install
```
### Database setup
NB detail for how `rake` sets up the database can be found in the `Rakefile`. In the `namespace :db` block you will see the database name for development is hardcoded to `travis-development`. If you are using a different configuration you will have to make your own adjustments.
1. `bundle exec rake db:create`
2. for testing 'RAILS_ENV=test bundle exec rake db:create --trace'
1. Clone `travis-logs` and copy the `logs` database (assume the PostgreSQL user is `postgres`):
*You might need to create a role first. For this you should run the following:*
```sh-session
cd ..
git clone https://github.com/travis-ci/travis-logs.git
cd travis-logs
rvm jruby do bundle exec rake db:migrate # `travis-logs` requires JRuby
psql -c "DROP TABLE IF EXISTS logs CASCADE" -U postgres travis_development
pg_dump -t logs travis_logs_development | psql -U postgres travis_development
$ sudo -u postgres psql -c "CREATE USER yourusername WITH SUPERUSER PASSWORD 'yourpassword'"
```
Repeat the database steps for `RAILS_ENV=test`.
NB detail for how `rake` sets up the database can be found in the `Rakefile`. In the `namespace :db` block you will see the database name is configured using the environment variable RAILS_ENV. If you are using a different configuration you will have to make your own adjustments.
```sh-session
RAILS_ENV=test bundle exec rake db:create
pushd ../travis-logs
RAILS_ENV=test rvm jruby do bundle exec rake db:migrate
psql -c "DROP TABLE IF EXISTS logs CASCADE" -U postgres travis_test
pg_dump -t logs travis_logs_test | psql -U postgres travis_test
popd
$ RAILS_ENV=development bundle exec rake db:create
$ RAILS_ENV=test bundle exec rake db:create
```
#### Optional
Clone `travis-logs` and copy the `logs` database (assume the PostgreSQL user is `postgres`):
```sh-session
$ cd ..
$ git clone https://github.com/travis-ci/travis-logs.git
$ cd travis-logs
$ rvm jruby do bundle exec rake db:migrate # `travis-logs` requires JRuby
$ psql -c "DROP TABLE IF EXISTS logs CASCADE" -U postgres travis_development
$ pg_dump -t logs travis_logs_development | psql -U postgres travis_development
$ RAILS_ENV=test bundle exec rake db:create
$ pushd ../travis-logs
$ RAILS_ENV=test rvm jruby do bundle exec rake db:migrate
$ psql -c "DROP TABLE IF EXISTS logs CASCADE" -U postgres travis_test
$ pg_dump -t logs travis_logs_test | psql -U postgres travis_test
$ popd
```
### Run tests
$ rake spec
```sh-session
$ bundle exec rake
```
### Run the server
$ bundle exec script/server
```sh-session
$ bundle exec script/server
```
If you have problems with Nginx because the websocket is already in use, try restarting your computer.
## Contributing
@ -60,5 +77,4 @@ popd
### API documentation
We use source code comments to add documentation. If the server is running, you
can browse an HTML documenation 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

@ -1,45 +1,34 @@
require 'rake'
require 'travis/migrations'
task default: :spec
namespace :db do
if ENV["RAILS_ENV"] == 'test'
desc 'Create and migrate the test database'
env = ENV["RAILS_ENV"]
if env != 'production'
desc "Create and migrate the #{env} database"
task :create do
sh 'createdb travis_test' rescue nil
sh "psql -q travis_test < #{Gem.loaded_specs['travis-migrations'].full_gem_path}/db/structure.sql"
end
else
desc 'Create and migrate the development database'
task :create do
sh 'createdb travis_development' rescue nil
sh "psql -q travis_development < #{Gem.loaded_specs['travis-migrations'].full_gem_path}/db/structure.sql"
sh "createdb travis_#{env}" rescue nil
sh "psql -q travis_#{env} < #{Gem.loaded_specs['travis-migrations'].full_gem_path}/db/structure.sql"
end
end
end
desc "generate gemspec"
task 'travis-api.gemspec' do
content = File.read 'travis-api.gemspec'
# 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
fields = {
authors: `git shortlog -sn`.scan(/[^\d\s].*/),
email: `git shortlog -sne`.scan(/[^<]+@[^>]+/),
files: `git ls-files`.split("\n").reject { |f| f =~ /^(\.|Gemfile)/ }
}
# 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
end
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'
tasks_path = File.expand_path('../lib/tasks/*.rake', __FILE__)
Dir.glob(tasks_path).each { |r| import r }
task :default => :'spec:all'

View File

@ -9,9 +9,9 @@ events {
}
http {
gzip on;
gzip_comp_level 2;
gzip_min_length 512;
gzip on;
gzip_comp_level 2;
gzip_min_length 512;
server_tokens off;

BIN
heroku-buildpack-sigsci.tgz Normal file

Binary file not shown.

67
lib/travis.rb Normal file
View File

@ -0,0 +1,67 @@
require 'pusher'
require 'travis/support'
require 'travis/support/database'
require 'travis/redis_pool'
require 'travis/errors'
module Travis
class << self
def services=(services)
@services = services
end
def services
@services ||= Travis::Services
end
end
require 'travis/model'
require 'travis/task'
require 'travis/event'
require 'travis/api/serialize'
require 'travis/config/defaults'
require 'travis/features'
require 'travis/github'
require 'travis/notification'
require 'travis/services'
class UnknownRepository < StandardError; end
class GithubApiError < StandardError; end
class AdminMissing < StandardError; end
class RepositoryMissing < StandardError; end
class LogAlreadyRemoved < StandardError; end
class AuthorizationDenied < StandardError; end
class JobUnfinished < StandardError; end
class << self
def setup(options = {})
@config = Config.load(*options[:configs])
@redis = Travis::RedisPool.new(config.redis.to_h)
Travis.logger.info('Setting up Travis::Core')
Github.setup
Services.register
Github::Services.register
end
attr_accessor :redis, :config
def pusher
@pusher ||= ::Pusher.tap do |pusher|
pusher.app_id = config.pusher.app_id
pusher.key = config.pusher.key
pusher.secret = config.pusher.secret
pusher.scheme = config.pusher.scheme if config.pusher.scheme
pusher.host = config.pusher.host if config.pusher.host
pusher.port = config.pusher.port if config.pusher.port
end
end
def states_cache
@states_cache ||= Travis::StatesCache.new
end
end
setup
end

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,32 +82,27 @@ 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
use(Rack::Config) { |env| env['metriks.request.start'] ||= Time.now.utc }
use Travis::Api::App::Cors # if Travis.env == 'development' ???
use Raven::Rack if Travis.env == 'production' || Travis.env == 'staging'
use Raven::Rack if Travis::Api::App.use_monitoring?
use Rack::SSL if Endpoint.production?
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
@ -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
@ -192,7 +192,7 @@ module Travis::Api
end
end
if use_monitoring? and not console?
if use_monitoring? && !console?
setup_monitoring
end
end

View File

@ -15,6 +15,11 @@ class Travis::Api::App
options // do
headers['Access-Control-Allow-Methods'] = "HEAD, GET, POST, PATCH, PUT, DELETE"
headers['Access-Control-Allow-Headers'] = "Content-Type, Authorization, Accept, If-None-Match, If-Modified-Since, X-User-Agent, Travis-API-Version"
# cache OPTIONS for 24 hours to avoid excessive preflight requests and speed up access
# browsers might still limit this value to 10 minutes, see caveats
# http://stackoverflow.com/a/12021982
headers['Access-Control-Max-Age'] = "86400"
end
end
end

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,6 +1,8 @@
require 'travis/api/app'
require 'travis/api/workers/build_cancellation'
require 'travis/api/workers/build_restart'
require 'travis/api/enqueue/services/restart_model'
require 'travis/api/enqueue/services/cancel_model'
class Travis::Api::App
class Endpoint
@ -20,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]})"
@ -39,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
@ -48,16 +53,18 @@ class Travis::Api::App
post '/:id/restart' do
Metriks.meter("api.request.restart_build").mark
service = Travis::Enqueue::Services::RestartModel.new(current_user, build_id: params[:id])
service = self.service(:reset_model, build_id: params[:id])
if !service.accept?
result = if !service.accept?
status 400
result = false
false
else
Travis::Sidekiq::BuildRestart.perform_async(id: params[:id], user_id: current_user.id)
payload = { id: params[:id], user_id: current_user.id }
service.push("build:restart", payload)
status 202
result = true
true
end
respond_with(result: result, flash: service.messages)
end
end

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

@ -9,7 +9,7 @@ class Travis::Api::App
Thread.new do
loop do
begin
Raven.send queue.pop
Raven.send_event queue.pop
rescue Exception => e
puts e.message, e.backtrace
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,44 +26,57 @@ 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|
Rack::Attack::Allow2Ban.filter(request.identifier, maxretry: 2, findtime: 5.minutes, bantime: bantime(5.hours)) do
request.post? and request.path == '/auth/github'
end
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
end
####
# 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|
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
end
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_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

@ -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

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