Compare commits
60 Commits
master
...
blueocean-
Author | SHA1 | Date |
---|---|---|
R. Tyler Croy | c0953d956e | |
R. Tyler Croy | 1b9d2081a2 | |
R. Tyler Croy | f904000adb | |
R. Tyler Croy | a43fca69fd | |
R. Tyler Croy | 70c10152b8 | |
Liam Newman | d379c3840c | |
Liam Newman | a6b9377982 | |
Liam Newman | 94abc3386a | |
Liam Newman | 9f5de7ceec | |
Oleg Nenashev | 55711e18bb | |
Julien Pivotto | ff19dea1be | |
Daniel Beck | f0de89e172 | |
Daniel Beck | d8f7733559 | |
Daniel Beck | be7043cbd7 | |
Oliver Gondža | 12f2d88f53 | |
Oliver Gondža | 4411d6a3c4 | |
Oliver Gondža | 8bbd564f81 | |
Oliver Gondža | 6b9f0c3e38 | |
R. Tyler Croy | 02003bcd8d | |
R. Tyler Croy | adf628876b | |
R. Tyler Croy | 4a69711d52 | |
R. Tyler Croy | 5a1fe45bcc | |
James Dumay | c44c124f9b | |
James Dumay | 881f9577f2 | |
R. Tyler Croy | e8a0124887 | |
R. Tyler Croy | 2cf3e3d7d3 | |
R. Tyler Croy | 5410cbb170 | |
James Dumay | 5070587a3e | |
Liam Newman | 86fd572093 | |
R. Tyler Croy | ca6b8e416d | |
R. Tyler Croy | 5a16986a6e | |
R. Tyler Croy | 66884be9f9 | |
Liam Newman | 17144746bc | |
R. Tyler Croy | a69667e293 | |
R. Tyler Croy | 6067a0c227 | |
R. Tyler Croy | c223ecc52b | |
R. Tyler Croy | b79c103548 | |
R. Tyler Croy | b8a8c19025 | |
R. Tyler Croy | c3bf8c5e9a | |
R. Tyler Croy | 2c975d71a9 | |
R. Tyler Croy | 2a2523c6a7 | |
R. Tyler Croy | 9007af618b | |
R. Tyler Croy | ec81183688 | |
R. Tyler Croy | 525c2f464f | |
R. Tyler Croy | f09021fa0b | |
R. Tyler Croy | 80a4b326ff | |
R. Tyler Croy | c086ad7342 | |
R. Tyler Croy | 0d9da2885b | |
R. Tyler Croy | d3c8f4b8bf | |
R. Tyler Croy | 5cdeb21415 | |
R. Tyler Croy | 5506f46718 | |
R. Tyler Croy | 53cbabcef4 | |
R. Tyler Croy | c33bd391f5 | |
R. Tyler Croy | 4c497356c6 | |
R. Tyler Croy | e808bee73e | |
R. Tyler Croy | 9e673b82d1 | |
James Dumay | bf6bfb8799 | |
R. Tyler Croy | 321db5055a | |
Liam Newman | 2006413be1 | |
Liam Newman | 2c65ba8fef |
45
build.gradle
|
@ -100,22 +100,12 @@ dependencies {
|
|||
* versions of the site
|
||||
*/
|
||||
bower {
|
||||
/* weird syntax is weird */
|
||||
|
||||
/* jQuery and jQuery UI are both used by the "legacy" download picker and
|
||||
* can likely go away once the legacy site is sunsetted
|
||||
*/
|
||||
'jquery' ('1.11.3') {
|
||||
'jquery' ('3.1.1') {
|
||||
source 'dist/**'
|
||||
}
|
||||
'jquery-ui' ('1.11.4') {
|
||||
source '**/*.js'
|
||||
source 'themes/base/**' >> 'themes/base/'
|
||||
}
|
||||
|
||||
/* needed for jenkins.io */
|
||||
|
||||
'bootstrap' ('4.0.0-alpha.2') {
|
||||
'bootstrap' ('4.0.0-alpha.6') {
|
||||
source 'dist/**'
|
||||
}
|
||||
|
||||
|
@ -123,13 +113,18 @@ bower {
|
|||
source 'dist/**'
|
||||
}
|
||||
|
||||
'tether' ('1.1.1') {
|
||||
'tether' ('1.4.0') {
|
||||
source 'dist/**'
|
||||
}
|
||||
|
||||
'anchor-js' ('3.2.2') {
|
||||
source '**/*.js'
|
||||
}
|
||||
|
||||
/* Introduced by the Blue Ocean landing page */
|
||||
'ionicons' ('2.0.1') {
|
||||
source '*'
|
||||
}
|
||||
}
|
||||
|
||||
task fetchExamples(type: Exec) {
|
||||
|
@ -195,6 +190,29 @@ task prepareJavaScripts {
|
|||
}
|
||||
}
|
||||
}
|
||||
task prepareFonts {
|
||||
group 'Site'
|
||||
description 'Shuffle fonts around as necessary for CSS dependencies'
|
||||
dependsOn prepareJavaScripts
|
||||
|
||||
doLast {
|
||||
def fontsDir = file("${contentDir}/assets/bower/fonts")
|
||||
fontsDir.mkdirs()
|
||||
|
||||
copy {
|
||||
from "${projectDir}/src/assets"
|
||||
include '**/*.eot', '**/*.woff', '**/*.svg', '**/*.ttf'
|
||||
eachFile { FileCopyDetails copyDetails ->
|
||||
/* Prune the relative path off so the files are just dumped at
|
||||
* the top-level of fontsDir
|
||||
*/
|
||||
copyDetails.relativePath = new RelativePath(true, copyDetails.name)
|
||||
}
|
||||
|
||||
into fontsDir
|
||||
}
|
||||
}
|
||||
}
|
||||
task prepareUserHandbook(type: JRubyExec) {
|
||||
group 'Handbook'
|
||||
description 'Generate the raw .adoc file for PDF generation'
|
||||
|
@ -237,6 +255,7 @@ task assemble {
|
|||
fetchExamples,
|
||||
fetchReleaseHistory,
|
||||
prepareJavaScripts,
|
||||
prepareFonts,
|
||||
compileContent,
|
||||
printBooks
|
||||
}
|
||||
|
|
|
@ -140,6 +140,110 @@
|
|||
message: Do not fail to write a log file just because something deleted the parent directory.
|
||||
issue: 16634
|
||||
pull: 2738
|
||||
- version: "2.46.1"
|
||||
date: 2017-03-29
|
||||
lts_predecessor: "2.32.3"
|
||||
lts_baseline: "2.46"
|
||||
lts_changes:
|
||||
- type: rfe
|
||||
message: >
|
||||
Update the <a href="https://github.com/jenkinsci/sshd-module">SSHD module</a> from <code>1.7</code> to <code>1.8</code>.
|
||||
The change disables obsolete Ciphers: AES128CBC, TripleDESCBC, and BlowfishCBC.
|
||||
- type: rfe
|
||||
message: Enable the JNLP4 agent protocol by default.
|
||||
references:
|
||||
- issue: 40886
|
||||
- url: https://github.com/jenkinsci/remoting/blob/master/docs/protocols.md#jnlp4-connect
|
||||
title: upgrade notes
|
||||
- type: rfe
|
||||
message: >
|
||||
Allow defining agent ping interval and ping timeout in seconds. It can be done via the
|
||||
<code>hudson.slaves.ChannelPinger.pingIntervalSeconds</code> and
|
||||
<code>hudson.slaves.ChannelPinger.pingTimeoutSeconds</code>
|
||||
system properties.
|
||||
issue: 28245
|
||||
- type: rfe
|
||||
message: Print stack traces in logical order, with the most important part on top.
|
||||
pull: 1485
|
||||
- type: rfe
|
||||
message: Reduce size of Jenkins WAR file by not storing identical copies of <code>remoting.jar</code>/<code>slave.jar</code> there.
|
||||
pull: 2633
|
||||
- type: rfe
|
||||
message: Do not print warnings about undefined parameters when <code>hudson.model.ParametersAction.keepUndefinedParameters</code> property is set to <code>false</code>.
|
||||
pull: 2687
|
||||
- type: rfe
|
||||
message: Increase the <code>JENKINS_HOME</code> disk space threshold from <code>1Gb</code> to <code>10Gb</code> left. The warning will be shown only if more than <code>90%</code> of the disk is utilized.
|
||||
issue: 40749
|
||||
- type: bug
|
||||
message: Delete obsolete pinning UI.
|
||||
issue: 34065
|
||||
- type: bug
|
||||
message: Use project-specific validation URL for SCM Trigger, so <code>H</code> is handled correctly in preview.
|
||||
issue: 26977
|
||||
- type: bug
|
||||
message: Failure to serialize a single <code>Action</code> could cause an entire REST export response to fail. Upgraded to Stapler <code>1.250</code> with a fix.
|
||||
issue: 40088
|
||||
- type: bug
|
||||
message: Add Usage Statistics section to the global configuration to make it easier to find.
|
||||
issue: 32938
|
||||
- type: bug
|
||||
message: Allow <tt>groovy</tt> CLI command via SSH CLI.
|
||||
issue: 41765
|
||||
|
||||
changes:
|
||||
- type: bug
|
||||
message: >
|
||||
Prevent file descriptor leaks when Windows Service installer fails to read data from the service startup log.
|
||||
issue: 42670
|
||||
pull: 2793
|
||||
- type: bug
|
||||
message: >
|
||||
Update Remoting from <code>3.5</code> to <code>3.7</code>
|
||||
in order to prevent file descriptor leaks on agents in the case of multiple connection attempts.
|
||||
references:
|
||||
- url: https://github.com/jenkinsci/remoting/blob/master/CHANGELOG.md#37
|
||||
title: full changelog
|
||||
issue: 42371
|
||||
pull: 2773
|
||||
- type: bug
|
||||
message: Exceptions during Jenkins cleanup step should not block restart.
|
||||
issue: 42164
|
||||
- type: bug
|
||||
message: Cryptic error message when loading JnlpSlaveAgentProtocol4.
|
||||
issue: 41987
|
||||
- type: bug
|
||||
message: >
|
||||
Developer: Snapshot builds of plugins that had dependencies on other snapshot builds were not having their version numbers compared correctly.
|
||||
issue: 41899
|
||||
- type: bug
|
||||
message: Do not attempt to find the next occurrence of an impossible date such as June 31st in validation of trigger schedules.
|
||||
issue: 41864
|
||||
pull: 2759
|
||||
- type: bug
|
||||
message: >
|
||||
Remoting 3.5: Stability improvements.
|
||||
references:
|
||||
- issue: 41513
|
||||
- issue: 41852
|
||||
- type: bug
|
||||
message: Remove invalid translations in Slovene
|
||||
issue: 41756
|
||||
pull: 2767
|
||||
- type: rfe
|
||||
message: >
|
||||
Remoting 3.5: Add option to specify the remoting protocol to use on the client.
|
||||
issue: 41730
|
||||
- type: bug
|
||||
message: Use of the remote API to create items in views (<tt>/view/…/createItem</tt>) didn't actually add items to views since Jenkins 2.22.
|
||||
issue: 41128
|
||||
pull: 2760
|
||||
- type: bug
|
||||
message: >
|
||||
Remoting 3.5: Remoting clients now accept lowercase (HTTP 2) headers sent by reverse proxies.
|
||||
issue: 40710
|
||||
- type: bug
|
||||
message: Windows service restart did not retain build queue.
|
||||
issue: 32820
|
||||
|
||||
# DO NOT EDIT THIS FILE DIRECTLY
|
||||
# ALL CHANGES MUST GO THROUGH PULL REQUESTS
|
||||
|
|
|
@ -264,7 +264,33 @@
|
|||
message: >
|
||||
Removed localizations with very low coverage: Albanian, Basque, Belarusian, Bengali, Esperanto, Galician, Georgian, Gujarati, Hindi, Icelandic, Indonesian, Irish, Kannada, Macedonian, Marathi, Mongolian, Occitan, Punjabi, Sinhala, Tamil, Telugu, Thai.
|
||||
pull: 2813
|
||||
|
||||
- version: "2.53"
|
||||
date: 2017-04-02
|
||||
changes:
|
||||
- type: major bug
|
||||
issue: 42744
|
||||
pull: 2826
|
||||
message: >
|
||||
Update to Windows Service Wrapper <tt>2.0.3</tt> and Windows Agent Installer <tt>1.8</tt> to prevent conversion of environment variables to lowercase in the agent executable, regression in Jenkins <tt>2.50</tt>.
|
||||
references:
|
||||
- url: https://github.com/kohsuke/winsw/blob/master/CHANGELOG.md#203
|
||||
title: WinSW Changelog
|
||||
- url: https://github.com/jenkinsci/windows-slave-installer-module/blob/master/CHANGELOG.md#18
|
||||
title: Windows Agent Installer changelog
|
||||
- type: rfe
|
||||
message: >
|
||||
GC Performance: Avoid using <code>FileInputStream</code> and <code>FileOutputStream</code> in the core codebase.
|
||||
references:
|
||||
- url: https://bugs.openjdk.java.net/browse/JDK-8080225
|
||||
title: JDK-8080225
|
||||
issue: 42934
|
||||
pull: 2816
|
||||
- type: rfe
|
||||
issue: 34670
|
||||
pull: 2445
|
||||
message: >
|
||||
Internal API:
|
||||
Add support of a new full screen mode in <tt>layout.jelly</tt>.
|
||||
|
||||
# DO NOT EDIT THIS FILE DIRECTLY
|
||||
# ALL CHANGES MUST GO THROUGH PULL REQUESTS
|
||||
|
|
|
@ -25,27 +25,28 @@ notitle: true
|
|||
|
||||
|
||||
.container
|
||||
.row.body
|
||||
|
||||
.section_nav.pagination-links
|
||||
- if previous_chapter
|
||||
%a.prev.page-link{:href => File.join('..', previous_chapter.key)}
|
||||
⇐ #{previous_chapter.title}
|
||||
|
||||
%a.index.page-link{:href => '..'}
|
||||
Index
|
||||
|
||||
.row
|
||||
.col-md-4
|
||||
.row
|
||||
- if previous_chapter
|
||||
%a.prev.doc-page-link{:href => File.join('..', previous_chapter.key)}
|
||||
⇐ #{previous_chapter.title}
|
||||
.col-md-4
|
||||
.row
|
||||
%a.index.doc-page-link{:href => '../'}
|
||||
Index
|
||||
.col-md-4
|
||||
.row
|
||||
- if next_chapter
|
||||
- if next_is_section
|
||||
%a.next.page-link{:href => next_chapter.key}
|
||||
%a.next.doc-page-link{:href => next_chapter.key}
|
||||
#{next_chapter.title} ⇒
|
||||
- else
|
||||
%a.next.page-link{:href => File.join('..', next_chapter.key)}
|
||||
%a.next.doc-page-link{:href => File.join('..', next_chapter.key)}
|
||||
#{next_chapter.title} ⇒
|
||||
|
||||
|
||||
|
||||
|
||||
.container
|
||||
.row.body
|
||||
.section
|
||||
%h1
|
||||
= page.title
|
||||
|
@ -64,18 +65,25 @@ notitle: true
|
|||
|
||||
= content
|
||||
|
||||
%hr/
|
||||
|
||||
.section_nav.pagination-links
|
||||
- if previous_chapter
|
||||
%a.prev.page-link{:href => File.join('..', previous_chapter.key)}
|
||||
⇐ #{previous_chapter.title}
|
||||
|
||||
%a.index.page-link{:href => '..'}
|
||||
Index
|
||||
|
||||
- if next_is_section
|
||||
%a.next.page-link{:href => next_chapter.key}
|
||||
#{next_chapter.title} ⇒
|
||||
- elsif next_chapter
|
||||
%a.next.page-link{:href => File.join('..', next_chapter.key)}
|
||||
#{next_chapter.title} ⇒
|
||||
.container
|
||||
.row
|
||||
.col-md-4
|
||||
.row
|
||||
- if previous_chapter
|
||||
%a.prev.doc-page-link{:href => File.join('..', previous_chapter.key)}
|
||||
⇐ #{previous_chapter.title}
|
||||
.col-md-4
|
||||
.row
|
||||
%a.index.doc-page-link{:href => '../'}
|
||||
Index
|
||||
.col-md-4
|
||||
.row
|
||||
- if next_chapter
|
||||
- if next_is_section
|
||||
%a.next.doc-page-link{:href => next_chapter.key}
|
||||
#{next_chapter.title} ⇒
|
||||
- else
|
||||
%a.next.doc-page-link{:href => File.join('..', next_chapter.key)}
|
||||
#{next_chapter.title} ⇒
|
||||
|
|
|
@ -22,7 +22,7 @@ section: doc
|
|||
})
|
||||
|
||||
.container
|
||||
.row
|
||||
.row.body
|
||||
.col-lg-3
|
||||
.sidebar-nav.tour
|
||||
%h4
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!DOCTYPE html>
|
||||
!!!
|
||||
%html
|
||||
%head
|
||||
%title
|
||||
|
@ -7,81 +7,75 @@
|
|||
%meta{:'name' => 'description', :content => 'Jenkins is an open source automation server'}/
|
||||
%link{:rel => 'shortcut icon', :href => '/sites/default/files/jenkins_favicon.ico', :type => 'image/x-icon'}/
|
||||
|
||||
= partial('scriptlinks.html.haml')
|
||||
%meta{:charset => "utf-8"}/
|
||||
%meta{:content => "width=device-width, initial-scale=1", :name => "viewport"}/
|
||||
%meta{:content => "ie=edge", "http-equiv" => "x-ua-compatible"}/
|
||||
%link{:href => "img/favicon.ico", :rel => "icon", :sizes => "32x32", :type => "img/png"}/
|
||||
%link{:href => "img/favicon-32x32.png", :rel => "icon", :sizes => "32x32", :type => "image/png"}/
|
||||
%link{:href => "img/favicon-16x16.png", :rel => "icon", :sizes => "16x16", :type => "image/png"}/
|
||||
%link{:href => "img/apple-touch-icon-76x76.png", :rel => "apple-touch-icon", :sizes => "76x76"}/
|
||||
%link{:href => "img/apple-touch-icon-120x120.png", :rel => "apple-touch-icon", :sizes => "120x120"}/
|
||||
%link{:href => "img/apple-touch-icon-152x152.png", :rel => "apple-touch-icon", :sizes => "152x152"}/
|
||||
%meta{:content => page.title, :name => "apple-mobile-web-app-title"}/
|
||||
/ Twitter Card data
|
||||
%meta{:content => "summary_large_image", :name => "twitter:card"}/
|
||||
%meta{:content => "@JenkinsCI", :name => "twitter:site"}/
|
||||
%meta{:content => page.title, :name => "twitter:title"}/
|
||||
%meta{:content => "Jenkins – Continuous Delivery for every team", :name => "twitter:description"}/
|
||||
%meta{:content => "@JenkinsCI", :name => "twitter:creator"}/
|
||||
|
||||
/ Twitter Summary card images must be at least 120x120px
|
||||
%meta{:content => "img/blueocean.gif", :name => "twitter:image"}/
|
||||
%meta{:content => "img/blueocean.gif", :name => "twitter:image:src"}/
|
||||
|
||||
/ Open Graph data
|
||||
%meta{:content => page.title, :property => "og:title"}/
|
||||
%meta{:content => "article", :property => "og:type"}/
|
||||
%meta{:content => page.output_path, :property => "og:url"}/
|
||||
%meta{:content => "Jenkins – Continuous Delivery for every team", :property => "og:description"}/
|
||||
%meta{:content => page.title, :property => "og:site_name"}/
|
||||
- unless page.opengraph.nil?
|
||||
%meta{:content => page.opengraph[:image], :property => "og:image"}/
|
||||
|
||||
- if page.css
|
||||
- for style in page.css
|
||||
%link{:href => "#{site.base_url}#{style}", :rel => 'stylesheet', :media => 'screen'}/
|
||||
- else
|
||||
%link{:href => "#{site.base_url}/assets/bower/bootstrap/css/bootstrap.min.css",
|
||||
:rel => 'stylesheet',
|
||||
:media => 'screen'}/
|
||||
%link{:href => "#{site.base_url}/assets/bower/tether/css/tether.min.css",
|
||||
:rel => 'stylesheet',
|
||||
:media => 'screen'}/
|
||||
%link{:href => "#{site.base_url}/css/font-icons.css",
|
||||
:rel => 'stylesheet',
|
||||
:media => 'screen'}/
|
||||
%link{:href => "#{site.base_url}/css/jenkins.css",
|
||||
:rel => 'stylesheet',
|
||||
:media => 'screen'}/
|
||||
|
||||
/ Non-obtrusive CSS styles
|
||||
%link{:href => "#{site.base_url}/assets/bower/ionicons/ionicons.css",
|
||||
:rel => 'stylesheet',
|
||||
:media => 'screen'}/
|
||||
%link{:href => "#{site.base_url}/css/footer.css",
|
||||
:rel => 'stylesheet',
|
||||
:media => 'screen'}/
|
||||
%link{:href => "#{site.base_url}/css/font-awesome.min.css",
|
||||
:rel => 'stylesheet',
|
||||
:media => 'screen'}/
|
||||
|
||||
%body
|
||||
= content
|
||||
|
||||
%script{:src => "#{site.base_url}/assets/bower/jquery/jquery.min.js"}
|
||||
%script{:src => "#{site.base_url}/assets/bower/tether/js/tether.min.js"}
|
||||
%script{:src => "#{site.base_url}/assets/bower/bootstrap/js/bootstrap.min.js"}
|
||||
|
||||
%footer#footer
|
||||
|
||||
.container
|
||||
|
||||
.row
|
||||
|
||||
.links.col-lg-8.col-md-12.col-sm-12
|
||||
%ul.major-areas
|
||||
%li.area.solo.col-md-3.col-sm-6.col-xs-6
|
||||
.div-mar
|
||||
%h5 Resources
|
||||
|
||||
%ul.resources
|
||||
%li
|
||||
%a{:href => '/events'}
|
||||
Events
|
||||
%li
|
||||
%a{:href => '/doc'}
|
||||
Documentation
|
||||
%li
|
||||
%a{:href => '/node'}
|
||||
Blog
|
||||
|
||||
%li.area.multi.col-md-3.col-sm-6.col-xs-6
|
||||
.div-mar
|
||||
%h5 Solutions
|
||||
|
||||
%ul
|
||||
- site.solutions.keys.sort.each do |key|
|
||||
- link = "/solutions/#{key}"
|
||||
%li
|
||||
%a{:href => link}
|
||||
= site.solutions[key].usecase
|
||||
|
||||
%li.area.multi.col-md-3.col-sm-6.col-xs-6
|
||||
.div-mar
|
||||
%h5 Project
|
||||
|
||||
%ul.project
|
||||
%li
|
||||
%a{:href => 'https://issues.jenkins-ci.org'}
|
||||
Issue tracker
|
||||
%li
|
||||
%a{:href => 'https://wiki.jenkins-ci.org'}
|
||||
Wiki
|
||||
%li
|
||||
%a{:href => 'https://github.com/jenkinsci'}
|
||||
GitHub
|
||||
%li
|
||||
%a{:href => 'https://ci.jenkins.io'}
|
||||
Jenkins on Jenkins
|
||||
|
||||
%li.area.multi.col-md-3.col-sm-6.col-xs-6
|
||||
.div-mar
|
||||
%h5 Community
|
||||
|
||||
%ul.community
|
||||
%li
|
||||
%a{:href => 'https://groups.google.com/forum/#!forum/jenkinsci-users'}
|
||||
Users mailing list
|
||||
%li
|
||||
%a{:href => 'https://groups.google.com/forum/#!forum/jenkinsci-dev'}
|
||||
Developers mailing list
|
||||
%li
|
||||
%a{:href => 'https://twitter.com/jenkinsci'}
|
||||
Twitter
|
||||
%li
|
||||
%a{:href => 'https://reddit.com/r/jenkinsci'}
|
||||
Reddit
|
||||
|
||||
.col-lg-4.col-md-12.col-sm-12.col-xs-12.footer-left
|
||||
.col-md-4
|
||||
- unless page.uneditable
|
||||
%p.box
|
||||
%a{:href => "https://github.com/jenkins-infra/jenkins.io/edit/master/content/#{page.relative_source_path}",
|
||||
|
@ -99,6 +93,83 @@
|
|||
%img{:src => 'https://licensebuttons.net/l/by-sa/4.0/88x31.png'}/
|
||||
|
||||
%p
|
||||
The content driving this site is licensed under the Creative Commons Attribution-ShareAlike 4.0 license.
|
||||
The content driving this site is licensed under the Creative
|
||||
Commons Attribution-ShareAlike 4.0 license.
|
||||
|
||||
= partial('footer.html.haml')
|
||||
.links.col-md-8
|
||||
.container
|
||||
.row
|
||||
.area.col-md-3
|
||||
.div-mar
|
||||
%h5 Resources
|
||||
|
||||
%ul.resources
|
||||
%li
|
||||
%a{:href => '/events'}
|
||||
Events
|
||||
%li
|
||||
%a{:href => '/doc'}
|
||||
Documentation
|
||||
%li
|
||||
%a{:href => '/node'}
|
||||
Blog
|
||||
|
||||
.area.col-md-3
|
||||
.div-mar
|
||||
%h5 Solutions
|
||||
|
||||
%ul
|
||||
- site.solutions.keys.sort.each do |key|
|
||||
- link = "/solutions/#{key}"
|
||||
%li
|
||||
%a{:href => link}
|
||||
= site.solutions[key].usecase
|
||||
|
||||
.area.col-md-3
|
||||
.div-mar
|
||||
%h5 Project
|
||||
|
||||
%ul.project
|
||||
%li
|
||||
%a{:href => 'https://issues.jenkins-ci.org'}
|
||||
Issue tracker
|
||||
%li
|
||||
%a{:href => 'https://wiki.jenkins-ci.org'}
|
||||
Wiki
|
||||
%li
|
||||
%a{:href => 'https://github.com/jenkinsci'}
|
||||
GitHub
|
||||
%li
|
||||
%a{:href => 'https://ci.jenkins.io'}
|
||||
Jenkins on Jenkins
|
||||
|
||||
.area.col-md-3
|
||||
.div-mar
|
||||
%h5 Community
|
||||
|
||||
%ul.community
|
||||
%li
|
||||
%a{:href => 'https://groups.google.com/forum/#!forum/jenkinsci-users'}
|
||||
Users mailing list
|
||||
%li
|
||||
%a{:href => 'https://groups.google.com/forum/#!forum/jenkinsci-dev'}
|
||||
Developers mailing list
|
||||
%li
|
||||
%a{:href => 'https://twitter.com/jenkinsci'}
|
||||
Twitter
|
||||
%li
|
||||
%a{:href => 'https://reddit.com/r/jenkinsci'}
|
||||
Reddit
|
||||
|
||||
= google_analytics_universal
|
||||
|
||||
:javascript
|
||||
!function(d,s,id) {
|
||||
var js, fjs=d.getElementsByTagName(s)[0];
|
||||
if (!d.getElementById(id)) {
|
||||
js = d.createElement(s);
|
||||
js.id=id;
|
||||
js.src="//platform.twitter.com/widgets.js";
|
||||
fjs.parentNode.insertBefore(js,fjs);
|
||||
}
|
||||
}(document,"script","twitter-wjs");
|
||||
|
|
|
@ -19,7 +19,9 @@ layout: default
|
|||
%a{:href => page.url, :title => page.title}
|
||||
= page.title
|
||||
|
||||
= partial('tweetbutton.html.haml')
|
||||
%div{:style => 'float: right; clear: all;'}
|
||||
%a.twitter-share-button{:href => 'https://twitter.com/share', :'data-lang' => 'en'}
|
||||
Tweet
|
||||
|
||||
- if page.date
|
||||
%span.submitted
|
||||
|
|
|
@ -24,7 +24,7 @@ layout: default
|
|||
})
|
||||
|
||||
.container
|
||||
.row
|
||||
.row.body
|
||||
.col-lg-9
|
||||
%h1
|
||||
= page.title
|
||||
|
|
|
@ -32,56 +32,59 @@ notitle: true
|
|||
next_section = site.handbook.chapters[index + 1]
|
||||
end
|
||||
|
||||
.container
|
||||
.row
|
||||
.col-md-4
|
||||
.row
|
||||
- unless prev_section.nil?
|
||||
%a.prev.doc-page-link{:href => File.join('..', prev_section.key)}
|
||||
⇐ #{prev_section.title}
|
||||
.col-md-4
|
||||
.row
|
||||
%a.up.doc-page-link{:href => '../'}
|
||||
⇑ #{chapter.title}
|
||||
.row
|
||||
%a.index.doc-page-link{:href => '../../'}
|
||||
Index
|
||||
.col-md-4
|
||||
.row
|
||||
- unless next_section.nil?
|
||||
- if next_is_chapter
|
||||
%a.next.doc-page-link{:href => File.join('../../', next_section.key)}
|
||||
#{next_section.title} ⇒
|
||||
- else
|
||||
%a.next.doc-page-link{:href => File.join('..', next_section.key)}
|
||||
#{next_section.title} ⇒
|
||||
|
||||
.container
|
||||
.row.body
|
||||
|
||||
.section_nav.pagination-links
|
||||
- unless prev_section.nil?
|
||||
%a.prev.page-link{:href => File.join('..', prev_section.key)}
|
||||
⇐ #{prev_section.title}
|
||||
|
||||
%a.up.page-link{:href => '../'}
|
||||
⇑ #{chapter.title}
|
||||
|
||||
- unless next_section.nil?
|
||||
- if next_is_chapter
|
||||
%a.next.page-link{:href => File.join('../../', next_section.key)}
|
||||
#{next_section.title} ⇒
|
||||
- else
|
||||
%a.next.page-link{:href => File.join('..', next_section.key)}
|
||||
#{next_section.title} ⇒
|
||||
|
||||
%br/
|
||||
|
||||
%a.index.page-link{:href => '../../'}
|
||||
Index
|
||||
|
||||
|
||||
|
||||
.section
|
||||
%h1
|
||||
= page.title
|
||||
= content
|
||||
|
||||
%hr/
|
||||
|
||||
.section_nav.pagination-links
|
||||
- unless prev_section.nil?
|
||||
%a.prev.page-link{:href => File.join('..', prev_section.key)}
|
||||
⇐ #{prev_section.title}
|
||||
|
||||
%a.up.page-link{:href => '../'}
|
||||
⇑ #{chapter.title}
|
||||
|
||||
- unless next_section.nil?
|
||||
- if next_is_chapter
|
||||
%a.next.page-link{:href => File.join('../../', next_section.key)}
|
||||
#{next_section.title} ⇒
|
||||
- else
|
||||
%a.next.page-link{:href => File.join('..', next_section.key)}
|
||||
#{next_section.title} ⇒
|
||||
|
||||
%br/
|
||||
|
||||
%a.index.page-link{:href => '../../'}
|
||||
Index
|
||||
.container
|
||||
.row
|
||||
.col-md-4
|
||||
.row
|
||||
- unless prev_section.nil?
|
||||
%a.prev.doc-page-link{:href => File.join('..', prev_section.key)}
|
||||
⇐ #{prev_section.title}
|
||||
.col-md-4
|
||||
.row
|
||||
%a.up.doc-page-link{:href => '../'}
|
||||
⇑ #{chapter.title}
|
||||
.row
|
||||
%a.index.doc-page-link{:href => '../../'}
|
||||
Index
|
||||
.col-md-4
|
||||
.row
|
||||
- unless next_section.nil?
|
||||
- if next_is_chapter
|
||||
%a.next.doc-page-link{:href => File.join('../../', next_section.key)}
|
||||
#{next_section.title} ⇒
|
||||
- else
|
||||
%a.next.doc-page-link{:href => File.join('..', next_section.key)}
|
||||
#{next_section.title} ⇒
|
||||
|
|
|
@ -1,29 +0,0 @@
|
|||
.bloggers
|
||||
%h4
|
||||
Recent authors
|
||||
|
||||
%ul.authors
|
||||
%li.auth
|
||||
%a.icon-jenkins-head
|
||||
%li.auth
|
||||
%a.icon-jenkins-head
|
||||
%li.auth
|
||||
%a.icon-jenkins-head
|
||||
%li.auth
|
||||
%a.icon-jenkins-head
|
||||
%li.auth
|
||||
%a.icon-jenkins-head
|
||||
%li.auth
|
||||
%a.icon-jenkins-head
|
||||
%li.auth
|
||||
%a.icon-jenkins-head
|
||||
%li.auth
|
||||
%a.icon-jenkins-head
|
||||
%li.auth
|
||||
%a.icon-jenkins-head
|
||||
%li.auth
|
||||
%a.icon-jenkins-head
|
||||
%li.auth
|
||||
%a.icon-jenkins-head
|
||||
%li.auth
|
||||
%a.icon-jenkins-head
|
|
@ -1,58 +0,0 @@
|
|||
:javascript
|
||||
$(function () {
|
||||
function doPopovers(){
|
||||
var $popovers = $('[data-toggle="popover"]');
|
||||
var $popLayer = $('#popover-layer');
|
||||
if ($popovers.length > 0){
|
||||
if($popLayer.length < 1)
|
||||
$popLayer = $('<div/>').appendTo('body').addClass('popover-layer').attr('id','popover-layer');
|
||||
$('[data-toggle="popover"]').popover({
|
||||
container: '#popover-layer',
|
||||
template:'<div class="popover download-options" role="tooltip"><div class="popover-arrow"></div><div class="popover-content"></div></div>',
|
||||
placement:'top',
|
||||
content:function(){
|
||||
return $(this).next().html();
|
||||
},
|
||||
html:true
|
||||
});
|
||||
}
|
||||
}
|
||||
doPopovers();
|
||||
})
|
||||
|
||||
%div#ji-home-carousel.carousel.slide{'data-ride' => 'carousel',:class => page.topic}
|
||||
#ji-download
|
||||
.btn-group
|
||||
%button.btn-lg.btn.btn-primary{'data-toggle'=>"popover", 'aria-haspopup'=>"true", 'aria-expanded'=>"false"}
|
||||
Download Jenkins
|
||||
= partial('downloadlist.html.haml')
|
||||
.br
|
||||
.carousel-caption.secondary
|
||||
Get #{site.jenkins.stable} LTS .war or the latest #{site.jenkins.latest} weekly
|
||||
%ol.carousel-indicators.hidden
|
||||
%li.active{'data-target' => '#ji-home-carousel', 'data-slide-to' => 0}
|
||||
%li{'data-target' => '#ji-home-carousel', 'data-slide-to' => 1}
|
||||
%li{'data-target' => '#ji-home-carousel', 'data-slide-to' => 2}
|
||||
%li{'data-target' => '#ji-home-carousel', 'data-slide-to' => 3}
|
||||
%li{'data-target' => '#ji-home-carousel', 'data-slide-to' => 4}
|
||||
%div.carousel-inner{:role=>"listbox"}
|
||||
%div.carousel-item.active
|
||||
%video{:autoplay => ""}
|
||||
\//EDIT: loop="true" and autoplay="autoplay" are deprecated
|
||||
%source{:src => "/images/grow-city-sketch.mp4", :type => "video/mp4"}
|
||||
Your browser does not support the video tag.
|
||||
.mask
|
||||
%div.carousel-caption.primary
|
||||
%img.jenkins{:src=>"/images/226px-Jenkins_logo.svg.png"}
|
||||
%h1.page-title
|
||||
Jenkins
|
||||
%span.in-tag CD|CI
|
||||
%h5.sub-heading Build great things at any scale
|
||||
%p The leading open source automation server, Jenkins, provides hundreds of plugins to support building, testing, deploying and automating any project.
|
||||
|
||||
%a.left.carousel-control{:href=>"#ji-home-carousel",:role=>"button",'data-slide'=>"prev"}
|
||||
%span.icon-prev{"aria-hidden"=>"true"}
|
||||
%span.sr-only Previous
|
||||
%a.right.carousel-control{:href=>"#ji-home-carousel",:role=>"button",'data-slide'=>"next"}
|
||||
%span.icon-next{"aria-hidden"=>"true"}
|
||||
%span.sr-only Next
|
|
@ -1,35 +0,0 @@
|
|||
|
||||
%div#ji-home-carousel.carousel.slide{'data-ride' => 'carousel',:class => page.topic}
|
||||
#ji-download
|
||||
%button#download-banner-btn.btn-lg.btn.btn-primary{'data-toggle'=>"popover", 'aria-haspopup'=>"true", 'aria-expanded'=>"false"}
|
||||
Download Jenkins
|
||||
= partial('downloadlist.html.haml')
|
||||
.br
|
||||
.carousel-caption.secondary
|
||||
Get #{site.jenkins.stable} LTS .war or the latest #{site.jenkins.latest} weekly release
|
||||
%ol.carousel-indicators.hidden
|
||||
%li.active{'data-target' => '#ji-home-carousel', 'data-slide-to' => 0}
|
||||
%li{'data-target' => '#ji-home-carousel', 'data-slide-to' => 1}
|
||||
%li{'data-target' => '#ji-home-carousel', 'data-slide-to' => 2}
|
||||
%li{'data-target' => '#ji-home-carousel', 'data-slide-to' => 3}
|
||||
%li{'data-target' => '#ji-home-carousel', 'data-slide-to' => 4}
|
||||
%div.carousel-inner{:role=>"listbox"}
|
||||
%div.carousel-item.active
|
||||
%div.carousel-caption.primary
|
||||
%img.jenkins{:src=>"/images/226px-Jenkins_logo.svg.png"}
|
||||
%h1#main-page-title.page-title
|
||||
Jenkins
|
||||
%span.in-tag
|
||||
Automation Server
|
||||
%h5.sub-heading
|
||||
Build great things at any scale
|
||||
%p
|
||||
The leading open source automation server, Jenkins provides hundreds
|
||||
of plugins to support building, deploying and automating any project.
|
||||
|
||||
%a.left.carousel-control{:href=>"#ji-home-carousel",:role=>"button",'data-slide'=>"prev"}
|
||||
%span.icon-prev{"aria-hidden"=>"true"}
|
||||
%span.sr-only Previous
|
||||
%a.right.carousel-control{:href=>"#ji-home-carousel",:role=>"button",'data-slide'=>"next"}
|
||||
%span.icon-next{"aria-hidden"=>"true"}
|
||||
%span.sr-only Next
|
|
@ -1,120 +0,0 @@
|
|||
.dropdown-menu
|
||||
.row
|
||||
.col-md-6.text-xs-center
|
||||
%h3
|
||||
LTS Release
|
||||
|
||||
%p
|
||||
LTS (Long-Term Support) releases are chosen every 12 weeks from the
|
||||
stream of regular releases as the stable release for that time period.
|
||||
%a{'href' => 'https://wiki.jenkins-ci.org/display/JENKINS/LTS+Release+Line'}
|
||||
Learn more…
|
||||
|
||||
.col-md-6.text-xs-center
|
||||
%h3
|
||||
Weekly Release
|
||||
|
||||
%p
|
||||
A new release is produced weekly to deliver bug fixes and features to
|
||||
users and plugin developers.
|
||||
|
||||
.row
|
||||
.col-md-6.text-xs-center
|
||||
.btn-group
|
||||
%a.btn.btn-primary.chromeOnly{:href=>'http://mirrors.jenkins.io/war-stable/latest/jenkins.war'}
|
||||
%i.icon-box-add
|
||||
= site.jenkins.stable
|
||||
\.war
|
||||
%button.btn.btn-primary.dropdown-toggle{'data-toggle' => 'dropdown', 'data-trigger' => 'hover', 'aria-haspopup'=>"true", 'aria-expanded'=>"false"}
|
||||
.dropdown-menu
|
||||
%a.dropdown-item{:href=>'https://registry.hub.docker.com/_/jenkins/'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Docker
|
||||
%a.dropdown-item{:href => 'http://www.freshports.org/devel/jenkins-lts'}
|
||||
%span.icon
|
||||
%span.title
|
||||
FreeBSD
|
||||
%a.dropdown-item{:href=>'https://packages.gentoo.org/packages/dev-util/jenkins-bin'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Gentoo
|
||||
%a.dropdown-item{:href=>'/content/thank-you-downloading-os-x-installer#stable'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Mac OS X
|
||||
%a.dropdown-item{:href=>'http://openports.se/devel/jenkins/stable'}
|
||||
%span.icon
|
||||
%span.title
|
||||
OpenBSD
|
||||
%a.dropdown-item{:href=>'https://pkg.jenkins.io/opensuse-stable/'}
|
||||
%span.icon
|
||||
%span.title
|
||||
openSUSE
|
||||
%a.dropdown-item{:href=>'https://pkg.jenkins.io/redhat-stable/'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Red Hat/Fedora/CentOS
|
||||
%a.dropdown-item{:href=>'https://pkg.jenkins.io/debian-stable/'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Ubuntu/Debian
|
||||
%a.dropdown-item{:href=>'/content/thank-you-downloading-windows-installer#stable'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Windows
|
||||
%p.details
|
||||
%a.item{:href=>'/changelog-stable'} Changelog
|
||||
|
|
||||
%a.item{:href=>'/doc/upgrade-guide'} Upgrade Guide
|
||||
|
|
||||
%a.item{:href=>'http://mirrors.jenkins.io/war-stable/'} Past Releases
|
||||
|
||||
.col-md-6.text-xs-center
|
||||
.btn-group
|
||||
%a.btn.btn-primary.chromeOnly{:href=>'http://mirrors.jenkins.io/war/latest/jenkins.war'}
|
||||
%i.icon-box-add
|
||||
= site.jenkins.latest
|
||||
\.war
|
||||
%button.btn.btn-primary.dropdown-toggle{'data-toggle' => 'dropdown', 'data-trigger' => 'hover', 'aria-haspopup'=>"true", 'aria-expanded'=>"false"}
|
||||
.dropdown-menu
|
||||
%a.dropdown-item{:href=>'https://registry.hub.docker.com/u/jenkinsci/jenkins/'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Docker
|
||||
%a.dropdown-item{:href=>'http://www.freshports.org/devel/jenkins'}
|
||||
%span.icon
|
||||
%span.title
|
||||
FreeBSD
|
||||
%a.dropdown-item{:href=>'https://packages.gentoo.org/packages/dev-util/jenkins-bin'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Gentoo
|
||||
%a.dropdown-item{:href=>'/content/thank-you-downloading-os-x-installer'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Mac OS X
|
||||
%a.dropdown-item{:href=>'http://openports.se/devel/jenkins/devel'}
|
||||
%span.icon
|
||||
%span.title
|
||||
OpenBSD
|
||||
%a.dropdown-item{:href=>'https://pkg.jenkins.io/opensuse/'}
|
||||
%span.icon
|
||||
%span.title
|
||||
openSUSE
|
||||
%a.dropdown-item{:href=>'https://pkg.jenkins.io/redhat/'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Red Hat/Fedora/CentOS
|
||||
%a.dropdown-item{:href=>'https://pkg.jenkins.io/debian/'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Ubuntu/Debian
|
||||
%a.dropdown-item{:href=>'/content/thank-you-downloading-windows-installer'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Windows
|
||||
%p.details
|
||||
%a.item{:href=>'/changelog'} Changelog
|
||||
|
|
||||
%a.item{:href=>'http://mirrors.jenkins.io/war/'} Past Releases
|
|
@ -1,60 +0,0 @@
|
|||
#feature-list-segment.segment
|
||||
.container
|
||||
.row.chunks.features.uniform-height
|
||||
.col-md-6.col-lg-4
|
||||
.box.cicd
|
||||
%i.icon-arrow-shuffle
|
||||
%h5
|
||||
Continuous Integration and Continuous Delivery
|
||||
%p
|
||||
As an extensible automation server, Jenkins can be used as a simple
|
||||
CI server or turned into the continuous delivery hub for any project.
|
||||
|
||||
|
||||
.col-md-6.col-lg-4
|
||||
.box.install
|
||||
%i.icon-download
|
||||
%h5
|
||||
Easy installation
|
||||
%p
|
||||
Jenkins is a self-contained Java-based program, ready to run
|
||||
out-of-the-box, with packages for Windows, Mac OS X and other
|
||||
Unix-like operating systems.
|
||||
|
||||
.col-md-6.col-lg-4
|
||||
.box.settings
|
||||
%i.icon-settings
|
||||
%h5
|
||||
Easy configuration
|
||||
%p
|
||||
Jenkins can be easily set up and configured via its web interface,
|
||||
which includes on-the-fly error checks and built-in help.
|
||||
|
||||
.col-md-6.col-lg-4
|
||||
.box.ecosystem
|
||||
%i.icon-plug
|
||||
%h5
|
||||
Plugins
|
||||
%p
|
||||
With hundreds of plugins in the Update Center, Jenkins integrates
|
||||
with practically every tool in the continuous integration and
|
||||
continuous delivery toolchain.
|
||||
|
||||
.col-md-6.col-lg-4
|
||||
.box.extend
|
||||
%i.icon-puzzle-piece
|
||||
%h5
|
||||
Extensible
|
||||
%p
|
||||
Jenkins can be extended via its plugin architecture, providing
|
||||
nearly infinite possibilities for what Jenkins can do.
|
||||
|
||||
.col-md-6.col-lg-4
|
||||
.box.distributed
|
||||
%i.icon-uniE602
|
||||
%h5
|
||||
Distributed
|
||||
%p
|
||||
Jenkins can easily distribute work across multiple machines,
|
||||
helping drive builds, tests and deployments across multiple
|
||||
platforms faster.
|
|
@ -1,12 +0,0 @@
|
|||
= google_analytics_universal
|
||||
|
||||
:javascript
|
||||
!function(d,s,id) {
|
||||
var js, fjs=d.getElementsByTagName(s)[0];
|
||||
if (!d.getElementById(id)) {
|
||||
js = d.createElement(s);
|
||||
js.id=id;
|
||||
js.src="//platform.twitter.com/widgets.js";
|
||||
fjs.parentNode.insertBefore(js,fjs);
|
||||
}
|
||||
}(document,"script","twitter-wjs");
|
|
@ -1,9 +0,0 @@
|
|||
%div.jumbotron.jumbotron-fluid.intro{:class=>page.className}
|
||||
.container.center
|
||||
.center.col-md-6
|
||||
%h2 What is Jenkins?
|
||||
%p
|
||||
In a nutshell, Jenkins is the leading open source automation server. Built with Java, it provides
|
||||
%strong
|
||||
hundreds
|
||||
of plugins to support building, testing, deploying and automation virtually any project
|
|
@ -1,27 +0,0 @@
|
|||
%ol.jumbotron.getting-started.step-by-step
|
||||
.brick-tops.bottom
|
||||
%h3.header
|
||||
= page.title
|
||||
|
||||
- page.steps.each_index do |index|
|
||||
- step = page.steps[index]
|
||||
- icon = step.iconclass
|
||||
|
||||
%li.card.step
|
||||
%a.card-block{'data-toggle' => 'popover',
|
||||
'data-container' => '#ji-hover-layer',
|
||||
'data-placement' => 'top',
|
||||
'data-trigger' => 'hover focus',
|
||||
'data-title' => step.title,
|
||||
'data-content' => step.long,
|
||||
'href' => step.href}
|
||||
|
||||
%h4.card-title
|
||||
.tag
|
||||
.num
|
||||
- if step.iconclass
|
||||
%i(class=icon)
|
||||
%h5.title
|
||||
= step.title
|
||||
%p.short
|
||||
= step.short
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
.jumbotron.jumbotron-fluid.featured{:class => "featured_#{jumbotron_id}"}
|
||||
.container
|
||||
.rog
|
||||
.row
|
||||
.col-md-5
|
||||
%a{:href => page.href}
|
||||
%h2
|
||||
|
|
|
@ -1,16 +0,0 @@
|
|||
.jumbotron.quote-row
|
||||
.row
|
||||
.col-md-1
|
||||
.col-md-4
|
||||
.card.important
|
||||
.card-block
|
||||
%blockquote.blockquote
|
||||
%p Docker is an open-source project that automates the deployment of applications inside software containers, by providing an additional layer of abstraction and automation of operating-system-level virtualization on Linux. (courtesy Wikipedia)
|
||||
%footer
|
||||
%cite{:title=>"Source Title"}Wikipedia
|
||||
|
||||
.col-md-6
|
||||
%p For Jenkins users, this offers a means of isolating jobs from one another. Quickly clean a job's workspace or even dynamically deploy or schedule jobs with Docker containers to increase resource utilization and efficiency.
|
||||
%p Lorem ipsum dolor sit amet, et quas exerci tincidunt nec, et mea aeque essent everti, cibo honestatis ad pri. Nec zril iudico luptatum ne, ullamcorper definitiones definitionem an ius. Ius dicunt epicuri at, no aeque mundi maiestatis eum, mundi ignota eloquentiam mei ea. Vis liber intellegebat ut, alia invidunt adipiscing at pri, ei has tritani volumus. Sed summo dicant et, maiorum alienum at vis.
|
||||
|
||||
.col-md-1
|
|
@ -1,24 +0,0 @@
|
|||
%link{:href => "#{site.base_url}/css/font-awesome.min.css",
|
||||
:rel => 'stylesheet',
|
||||
:media => 'screen'}/
|
||||
|
||||
%link{:href => "#{site.base_url}/assets/bower/bootstrap/css/bootstrap.min.css",
|
||||
:rel => 'stylesheet',
|
||||
:media => 'screen'}/
|
||||
|
||||
%link{:href => "#{site.base_url}/assets/bower/ekko-lightbox/ekko-lightbox.min.css",
|
||||
:rel => 'stylesheet',
|
||||
:media => 'screen'}/
|
||||
|
||||
%link{:href => "#{site.base_url}/assets/bower/tether/css/tether.min.css",
|
||||
:rel => 'stylesheet',
|
||||
:media => 'screen'}/
|
||||
|
||||
%link{:href => "#{site.base_url}/css/font-icons.css", :rel => 'stylesheet', :media => 'screen'}/
|
||||
%link{:href => "#{site.base_url}/css/jenkins.css", :rel => 'stylesheet', :media => 'screen'}/
|
||||
|
||||
%script{:src => "#{site.base_url}/assets/bower/jquery/jquery.min.js"}
|
||||
%script{:src => "#{site.base_url}/assets/bower/tether/js/tether.min.js"}
|
||||
%script{:src => "#{site.base_url}/assets/bower/bootstrap/js/bootstrap.min.js"}
|
||||
%script{:src => "#{site.base_url}/assets/bower/ekko-lightbox/ekko-lightbox.min.js"}
|
||||
%script{:src => "#{site.base_url}/assets/bower/anchor-js/anchor.min.js"}
|
|
@ -1,26 +0,0 @@
|
|||
- if legacy?
|
||||
%div{:id => 'block-block-5', :class => 'block block-block even'}
|
||||
%h3
|
||||
What is Jenkins?
|
||||
|
||||
%div.content
|
||||
%p
|
||||
In a nutshell, Jenkins is the leading open source automation server.
|
||||
Built with Java, it provides
|
||||
%strong
|
||||
hundreds
|
||||
of plugins to support building, testing, deploying and automation
|
||||
for virtually any project
|
||||
|
||||
= partial('legacy/download.html.haml')
|
||||
= partial('legacy/book.html.haml')
|
||||
= partial('legacy/resources.html.haml')
|
||||
|
||||
- else
|
||||
|
||||
%div.content
|
||||
= partial('events.html.haml')
|
||||
|
||||
- if page.blogrollup
|
||||
= partial('blogrollup.html.haml')
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
:ruby
|
||||
# Images should all be between 300 and 350 pixels wide, and no more than 180px tall
|
||||
|
||||
sponsors = [
|
||||
['microsoft.png',
|
||||
'Microsoft Azure',
|
||||
'https://www.azure.com'],
|
||||
['cloudbees.png',
|
||||
'CloudBees, Inc.',
|
||||
'https://cloudbees.com'],
|
||||
['osuosl.png',
|
||||
'Oregon State University Open Source Lab',
|
||||
'https://osuosl.org'],
|
||||
['rackspace.png',
|
||||
'Rackspace, Inc.',
|
||||
'https://rackspace.com'],
|
||||
['redhat.png',
|
||||
'RedHat, Inc.',
|
||||
'https://redhat.com'],
|
||||
]
|
||||
supporters = [['Atlassian', 'https://atlassian.com'],
|
||||
['Datadog', 'https://www.datadoghq.com'],
|
||||
['JFrog', 'https://jfrog.com'],
|
||||
['Mac Cloud', 'http://maccloud.me/'],
|
||||
['PagerDuty', 'https://pagerduty.com'],
|
||||
['XMission', 'https://xmission.com'],
|
||||
]
|
||||
|
||||
#sponsorsblock.jumbotron
|
||||
.sponsors
|
||||
%p
|
||||
%strong
|
||||
We thank the following organizations for their major commitments to
|
||||
support the Jenkins project.
|
||||
|
||||
%ul
|
||||
|
||||
- sponsors.each do |logo, name, url|
|
||||
%li
|
||||
%a{:href => url, :target => '_blank'}
|
||||
%img{:alt => name, :title => name, :src => "/images/sponsors/#{logo}"}/
|
||||
|
||||
.supporters
|
||||
%p
|
||||
%strong
|
||||
We thank the following organizations for their support of the Jenkins
|
||||
project through free and/or open source licensing programs.
|
||||
|
||||
%ul
|
||||
- supporters.each do |name, url|
|
||||
%li
|
||||
%a{:href => url, :target => '_blank'}
|
||||
= name
|
|
@ -1,126 +1,77 @@
|
|||
:javascript
|
||||
$(function () {
|
||||
$(document).delegate('*[data-toggle="lightbox"]', 'click', function(event) {
|
||||
event.preventDefault();
|
||||
$(this).ekkoLightbox();
|
||||
});
|
||||
})
|
||||
|
||||
:javascript
|
||||
$(function () {
|
||||
function doPopovers(buttonContainer, placement, extraClass){
|
||||
var $popovers = $(buttonContainer + ' [data-toggle="popover"]');
|
||||
var $popLayer = $('#popover-layer');
|
||||
if ($popovers.length > 0){
|
||||
|
||||
$('body').click(function(e){
|
||||
var $target = $(e.target);
|
||||
console.log('toggle?');
|
||||
if($target.closest($popovers).length === 1){
|
||||
console.log($target);
|
||||
$popovers.popover('show');
|
||||
}
|
||||
else if($target.closest('.popover').length === 0 )
|
||||
$popovers.popover('hide');
|
||||
});
|
||||
|
||||
if($popLayer.length < 1)
|
||||
$popLayer = $('<div/>').appendTo('body').addClass('popover-layer').attr('id','popover-layer');
|
||||
$popovers.popover({
|
||||
container: '#popover-layer',
|
||||
trigger:'manual',
|
||||
template:'<div class="popover download-options ' + extraClass + '" role="tooltip"><div class="popover-arrow"></div><div class="popover-content"></div></div>',
|
||||
placement:placement,
|
||||
content:function(){
|
||||
return $(this).next().html();
|
||||
},
|
||||
html:true
|
||||
});
|
||||
}
|
||||
}
|
||||
doPopovers('#ji-download', 'top', 'download-popup-main');
|
||||
doPopovers('#download-menu', 'bottom', 'download-popup-menu');
|
||||
})
|
||||
|
||||
|
||||
#ji-hover-layer
|
||||
|
||||
.ji-toolbar-offset
|
||||
|
||||
.fixed.top
|
||||
|
||||
%nav#ji-toolbar.navbar.navbar-dark.bg-inverse
|
||||
|
||||
%a#home-logo.fixed.navbar-brand{:href => site.base_url}
|
||||
%nav#ji-toolbar.navbar.navbar-toggleable-md.navbar-inverse.top.bg-inverse
|
||||
.container
|
||||
%button.navbar-toggler.navbar-toggler-rght.hidden-lg-up.float-right{"data-target" => "#CollapsingNavbar", "data-toggle" => "collapse", :type => "button"}
|
||||
%i.ion-navicon
|
||||
%a.navbar-brand{:href => site.base_url}
|
||||
= site.base_title
|
||||
|
||||
%ul.nav.navbar-nav
|
||||
%li.nav-item.fixed
|
||||
#download-menu.btn-group
|
||||
%a.btn.btn-primary.dropdown-toggle{'data-toggle'=>"popover", 'data-offset' => '10 -240px', 'data-placement'=>'bottom', 'aria-haspopup'=>"true", 'aria-expanded'=>"false"}
|
||||
Downloads
|
||||
= partial('downloadlist.html.haml')
|
||||
%li.nav-item{:class => active_link?('blog')}
|
||||
%a.nav-link{:href => expand_link('node')}
|
||||
Blog
|
||||
%li.nav-item{:class => active_link?('doc')}
|
||||
%a.nav-link{:href => expand_link('doc')}
|
||||
Documentation
|
||||
%li.nav-item{:class => active_link?('plugins')}
|
||||
%a.nav-link{:href => 'https://plugins.jenkins.io/'}
|
||||
Plugins
|
||||
- # Can't use active_link? here because our section is going to be the actual solution page itself
|
||||
- # but we still want to highlight the active link on the Use-cases dropdown
|
||||
%li.nav-item.dropdown{:class => ('active' if (page.section && site.solutions.keys.include?(page.section.to_sym)))}
|
||||
%a.nav-link.dropdown-toggle{'data-toggle' => 'dropdown',
|
||||
:href=> "#", :role=>"button", 'aria-haspopup'=>"true", 'aria-expanded'=>"false"}
|
||||
Use-cases
|
||||
%div.dropdown-menu
|
||||
- site.solutions.keys.sort.each do |key|
|
||||
- link = expand_link("solutions/#{key}")
|
||||
%a.dropdown-item.feature{:href => link, :class => active_link?(key.to_s)}
|
||||
= site.solutions[key].usecase
|
||||
%li.nav-item{:class => active_link?('participate')}
|
||||
%a.nav-link{:href => expand_link("participate")}
|
||||
Participate
|
||||
%li.nav-item.dropdown{:class => ('active' if (page.section == 'projects'))}
|
||||
%a.nav-link.dropdown-toggle{'data-toggle' => 'dropdown',
|
||||
:href=> "/projects", :role=>"button", 'aria-haspopup'=>"true", 'aria-expanded'=>"false"}
|
||||
Sub-projects
|
||||
%div.dropdown-menu
|
||||
%a.dropdown-item.feature{:href => expand_link('projects/')}
|
||||
Overview
|
||||
- site.pages.map do |page|
|
||||
- next unless page.url.match(/\/projects\/(\w+)\/$/)
|
||||
%a.dropdown-item.feature{:href => page.url}
|
||||
= page.title
|
||||
%li.nav-item.dropdown
|
||||
%a.nav-link.dropdown-toggle{'data-toggle' => 'dropdown',
|
||||
:href=> '#', :role=>"button", 'aria-haspopup'=>"true", 'aria-expanded'=>"false"}
|
||||
Resources
|
||||
%div.dropdown-menu
|
||||
%a.dropdown-item.feature{:href => 'https://accounts.jenkins.io/', :title => 'Create/manage your account for accessing wiki, issue tracker, etc'}
|
||||
Account Management
|
||||
%a.dropdown-item{:href => expand_link("chat"), :title => "Chat with the rest of the Jenkins community on IRC"}
|
||||
Chat
|
||||
%a.dropdown-item.feature{:href => 'https://issues.jenkins-ci.org/'}
|
||||
Issue Tracker
|
||||
%a.dropdown-item{:href => expand_link("mailing-lists"), :title => "Browse Jenkins mailing list archives and/or subscribe to lists"}
|
||||
Mailing Lists
|
||||
%a.dropdown-item.feature{:href => 'https://wiki.jenkins-ci.org/'}
|
||||
Wiki
|
||||
%li.nav-item{:class => active_link?('security')}
|
||||
%a.nav-link{:href => expand_link('security')}
|
||||
Security
|
||||
%li.nav-item{:class => active_link?('press')}
|
||||
%a.nav-link{:href => expand_link('press')}
|
||||
Press
|
||||
%li.nav-item{:class => active_link?('conduct')}
|
||||
%a.nav-link{:href => expand_link('project/conduct')}
|
||||
Conduct
|
||||
#CollapsingNavbar.collapse.navbar-collapse
|
||||
%ul.nav.navbar-nav.ml-auto
|
||||
%li.nav-item{:class => active_link?('blog')}
|
||||
%a.nav-link{:href => expand_link('node')}
|
||||
Blog
|
||||
|
||||
#ji-top-peg
|
||||
%a#ji-fork-tag{:href => 'https://github.com/jenkinsci'}
|
||||
%img{:style => 'position: absolute; top: 0; right: 0; border: 0;',
|
||||
:src => 'https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png',
|
||||
:alt => 'Fork us on GitHub'}/
|
||||
%li.nav-item{:class => active_link?('doc')}
|
||||
%a.nav-link{:href => expand_link('doc')}
|
||||
Documentation
|
||||
|
||||
%li.nav-item{:class => active_link?('plugins')}
|
||||
%a.nav-link{:href => 'https://plugins.jenkins.io/'}
|
||||
Plugins
|
||||
|
||||
%li.nav-item.dropdown
|
||||
.nav-link.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", :role => "button"}
|
||||
Use-cases
|
||||
.dropdown-menu
|
||||
- site.solutions.keys.sort.each do |key|
|
||||
- link = expand_link("solutions/#{key}")
|
||||
%a.dropdown-item.feature{:href => link, :class => active_link?(key.to_s)}
|
||||
= site.solutions[key].usecase
|
||||
|
||||
%li.nav-item{:class => active_link?('participate')}
|
||||
%a.nav-link{:href => expand_link("participate")}
|
||||
Participate
|
||||
|
||||
%li.dropdown.nav-item
|
||||
.nav-link.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", :role => "button"} Sub-projects
|
||||
.dropdown-menu
|
||||
%a.dropdown-item.feature{:href => expand_link('projects/')}
|
||||
Overview
|
||||
- site.pages.map do |page|
|
||||
- next unless page.url.match(/\/projects\/(\w+)\/$/)
|
||||
%a.dropdown-item.feature{:href => expand_link(page.url)}
|
||||
= page.title
|
||||
|
||||
%li.nav-item.dropdown
|
||||
.nav-link.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", :role => "button"}
|
||||
Resources
|
||||
|
||||
.dropdown-menu
|
||||
%a.dropdown-item.feature{:href => "https://accounts.jenkins.io/", :title => "Create/manage your account for accessing wiki, issue tracker, etc"}
|
||||
Account Management
|
||||
|
||||
%a.dropdown-item{:href => expand_link('chat'), :title => "Chat with the rest of the Jenkins community on IRC"}
|
||||
Chat
|
||||
%a.dropdown-item.feature{:href => "https://issues.jenkins-ci.org/"}
|
||||
Issue Tracker
|
||||
%a.dropdown-item{:href => expand_link('mailing-lists'),
|
||||
:title => "Browse Jenkins mailing list archives and/or subscribe to lists"}
|
||||
Mailing Lists
|
||||
%a.dropdown-item.feature{:href => "https://wiki.jenkins-ci.org/"}
|
||||
Wiki
|
||||
|
||||
%li.nav-item.dropdown
|
||||
.nav-link.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", :role => "button"}
|
||||
About
|
||||
|
||||
.dropdown-menu
|
||||
%a.dropdown-item{:href => expand_link('security')}
|
||||
Security
|
||||
%a.dropdown-item{:href => expand_link('press')}
|
||||
Press
|
||||
%a.dropdown-item{:href => expand_link('project/conduct')}
|
||||
Conduct
|
||||
|
||||
%li.nav-item
|
||||
%a.nav-link.btn.btn-outline-secondary{:href => expand_link('download')}
|
||||
Download
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
%div{:style => 'float: right; clear: all;'}
|
||||
%a.twitter-share-button{:href => 'https://twitter.com/share', :'data-lang' => 'en'}
|
||||
Tweet
|
|
@ -0,0 +1,108 @@
|
|||
---
|
||||
layout: post
|
||||
title: "Say hello to Blue Ocean 1.0"
|
||||
tags:
|
||||
- blueocean
|
||||
- ux
|
||||
- pipeline
|
||||
author: i386
|
||||
---
|
||||
|
||||
Back in May 2016 link:/blog/2016/05/26/introducing-blue-ocean/[we announced our intent]
|
||||
to rethink the Jenkins User experience with the Blue Ocean project and today
|
||||
the Jenkins project are pleased to announce the general
|
||||
availability of Blue Ocean 1.0.
|
||||
|
||||
Blue Ocean is an entirely new, modern and fun way for developers to use Jenkins
|
||||
that has been built from the ground up to help teams of any size approach
|
||||
Continuous Delivery. Easily installed as a plugin for Jenkins and integrated
|
||||
with Jenkins Pipeline, it is available from today for production use.
|
||||
|
||||
Since the start of the beta at Jenkins World 2016 in September there are now
|
||||
over 7400+ installations making use of Blue Ocean. This wouldn’t be possible
|
||||
without the support of the entire Jenkins developer and
|
||||
user community - so thank you for your support!
|
||||
|
||||
Blue Ocean is available today from the update center and also as a
|
||||
Docker image - link:/projects/blueocean[why not give it a try?]
|
||||
|
||||
++++
|
||||
<center>
|
||||
<iframe width="853" height="480"
|
||||
src="https://www.youtube-nocookie.com/embed/k_fVlU1FwP4?rel=0" frameborder="0"
|
||||
allowfullscreen></iframe>
|
||||
</center>
|
||||
<br>
|
||||
++++
|
||||
|
||||
*Visual Pipeline Editing* - Team members of any skill level can create continuous
|
||||
delivery pipelines from start to finish, with just several clicks, using the
|
||||
intuitive, visual pipeline editor. Any pipeline created with the visual editor
|
||||
can also be edited in your favorite text editor
|
||||
bringing all the benefits of Pipeline as Code.
|
||||
|
||||
image:/images/blueocean/press/pipeline-editor.png[Editor, role=center]
|
||||
|
||||
*Pipeline Visualization* - Developers can visually represent pipelines in a way
|
||||
that anyone on the team can understand - even your boss's boss - improving
|
||||
clarity into the continuous delivery process for the whole organization.
|
||||
The visualization helps you focus on what the pipeline does, not how it does it.
|
||||
|
||||
image:/images/blueocean/press/pipeline-visualization.png[Pipeline visualization, role=center]
|
||||
|
||||
*Pinpoint Troubleshooting* - Blue Ocean enables developers to locate automation
|
||||
problems instantly, without endlessly scanning through logs or navigating
|
||||
through many screens, so you can get back to building the next big thing.
|
||||
|
||||
image:/images/blueocean/press/pipeline-diagnosis.png[Pinpoint Troubleshooting, role=center]
|
||||
|
||||
*GitHub and Git Integration* - Pipelines are created for all feature branches
|
||||
and pull requests, with their status reported back to GitHub.
|
||||
The whole team has visibility into whether changes need work or are good to go.
|
||||
|
||||
image:/images/blueocean/press/github-status.png[Github integration, role=center]
|
||||
|
||||
*Personalization* – Every team member can make Jenkins their own by customizing
|
||||
the dashboard so that they only see those pipelines that matter to them.
|
||||
Favoriting any pipeline or branch in Blue Ocean will show a favourite card on
|
||||
the dashboard so you can see its status at a glance.
|
||||
|
||||
image:/images/blueocean/press/personalization.png[Personalized dashboard, role=center]
|
||||
|
||||
Just one more thing – I’d like to pay special thanks to:
|
||||
|
||||
- *The Core team* – to Keith Zantow, Thorsten Scherler, Tom Fennelly,
|
||||
Ivan Meredith, Josh McDonald, Vivek Pandey, Brody Maclean and Cliff Meyers.
|
||||
Each of and everyone of you have brought your own passion, expertise and flair
|
||||
to the project – and it shows. It’s been crazy fun and I hope working on
|
||||
Blue Ocean is something you look back on fondly.
|
||||
- *Jenkins Developers* past and present – we recognise that we are standing on
|
||||
the shoulders of giants and none of this wouldn’t be possible without your
|
||||
hard work and dedication to free & open source software and Jenkins.
|
||||
Here’s to the next 10 years 🍻 !
|
||||
- *CloudBees* – in particular, Sacha Labourey (CEO), Harpreet Singh
|
||||
(VP of Product) and Spike Washburn (VP of Engineering) whose dedication to
|
||||
Jenkins, Open Source and continued faith in the vision and team made all of
|
||||
this possible, and of course Bob Bickel (Advisor) who dared us to dream big.
|
||||
- *Michael Neale* – who drank all the kool-aide and is just as obsessed with
|
||||
and dedicated to Blue Ocean as I am. This project would never have shipped
|
||||
without his hand steady at the tiller. I couldn’t ask for a better friend
|
||||
and partner-in-crime.
|
||||
- *Tyler Croy* – for guiding the project and myself on how to do open source
|
||||
The Right Way™. Tyler works tirelessly behind the scenes to to make Jenkins
|
||||
awesome and it wouldn’t be possible to keep this show running without
|
||||
his help and sage-like advice.
|
||||
- *Kohsuke Kawaguchi* – For creating Jenkins, getting Blue Ocean off of
|
||||
the ground, his tour of Tokyo and above all, his trust.
|
||||
- *Jenkins Users* – your enthusiasm for better development tools which
|
||||
kept our spirits and momentum up when the days grew long and things
|
||||
looked tough. We couldn’t ask for a better, more appreciative or
|
||||
passionate group of people. Hopefully we’ve done our job and you can get
|
||||
back to building your next big thing!
|
||||
|
||||
Next stop, some well needed rest & recovery then back to to making
|
||||
Jenkins one of the experiences for software developers worldwide!
|
||||
|
||||
If you’re interested in joining us to make Blue Ocean a great user experience
|
||||
for Jenkins, please join the Blue Ocean development
|
||||
team on link:https://gitter.im/jenkinsci/blueocean-plugin[Gitter]!
|
|
@ -0,0 +1,495 @@
|
|||
body {
|
||||
font-family: 'Lato', sans-serif;
|
||||
text-rendering: optimizeLegibility !important;
|
||||
-webkit-font-smoothing: antialiased !important; }
|
||||
|
||||
.h1,
|
||||
.h2,
|
||||
.h3,
|
||||
.h4,
|
||||
.h5,
|
||||
.h6,
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
font-weight: 700;
|
||||
line-height: 1.2;
|
||||
color: #4a4a4a; }
|
||||
|
||||
h1 {
|
||||
font-size: 30px; }
|
||||
@media (min-width: 767px) {
|
||||
h1 {
|
||||
font-size: 34px; } }
|
||||
|
||||
h2 {
|
||||
font-size: 24px;
|
||||
margin-bottom: 1rem; }
|
||||
@media (min-width: 767px) {
|
||||
h2 {
|
||||
font-size: 28px; } }
|
||||
|
||||
h3 {
|
||||
font-size: 20px; }
|
||||
@media (min-width: 767px) {
|
||||
h3 {
|
||||
font-size: 22px; } }
|
||||
|
||||
p {
|
||||
color: #9b9b9b;
|
||||
font-size: 15px;
|
||||
line-height: 21px; }
|
||||
@media (min-width: 767px) {
|
||||
p {
|
||||
font-size: 17px;
|
||||
line-height: 26px; }
|
||||
p.smaller {
|
||||
font-size: 15px;
|
||||
line-height: 21px; } }
|
||||
|
||||
.wow {
|
||||
visibility: hidden; }
|
||||
|
||||
.btn {
|
||||
border-radius: 3px;
|
||||
-webkit-transition: all 0.3s ease-out;
|
||||
-moz-transition: all 0.3s ease-out;
|
||||
-ms-transition: all 0.3s ease-out;
|
||||
-o-transition: all 0.3s ease-out;
|
||||
transition: all 0.3s ease-out; }
|
||||
.btn-primary {
|
||||
background: #4a90e2;
|
||||
border: 1px solid #4a90e2; }
|
||||
.btn-primary:focus, .btn-primary:hover {
|
||||
background-color: #2275d7;
|
||||
border: 1px solid #1b5dab; }
|
||||
.btn-primary:active, .btn-primary:active:focus, .btn-primary:active:hover, .btn-primary:active:hover:focus, .btn-primary:hover:focus {
|
||||
background-color: #3483de;
|
||||
border-color: #2275d7; }
|
||||
.btn-secondary, .btn-secondary:not([href]):not([tabindex]) {
|
||||
color: #4a90e2;
|
||||
background-color: transparent;
|
||||
border: 1px solid rgba(74, 144, 226, 0.5);
|
||||
cursor: pointer; }
|
||||
.btn-secondary span, .btn-secondary:not([href]):not([tabindex]) span {
|
||||
margin-right: 4px; }
|
||||
.btn-secondary:focus, .btn-secondary:hover, .btn-secondary:not([href]):not([tabindex]):focus, .btn-secondary:not([href]):not([tabindex]):hover {
|
||||
background-color: rgba(74, 144, 226, 0.12);
|
||||
border-color: rgba(74, 144, 226, 0.75);
|
||||
color: #1f69c1; }
|
||||
.btn-secondary:active, .btn-secondary:active:focus, .btn-secondary:active:hover, .btn-secondary:active:hover:focus, .btn-secondary:hover:focus, .btn-secondary:not([href]):not([tabindex]):active, .btn-secondary:not([href]):not([tabindex]):active:focus, .btn-secondary:not([href]):not([tabindex]):active:hover, .btn-secondary:not([href]):not([tabindex]):active:hover:focus, .btn-secondary:not([href]):not([tabindex]):hover:focus {
|
||||
background-color: rgba(74, 144, 226, 0.1);
|
||||
border-color: #4a90e2;
|
||||
color: #4a90e2; }
|
||||
|
||||
.navbar.navbar-toggleable-md {
|
||||
font-size: 0.875rem; }
|
||||
.navbar.navbar-toggleable-md.bg-inverse {
|
||||
background-color: #000; }
|
||||
.navbar.navbar-toggleable-md .navbar-brand {
|
||||
font-family: Georgia,Times,Times New Roman,serif;
|
||||
font-weight: 600;
|
||||
font-size: 20px;
|
||||
padding: 2px 0; }
|
||||
.navbar.navbar-toggleable-md .btn {
|
||||
font-size: 0.875rem;
|
||||
margin-left: 8px;
|
||||
margin-top: 1px; }
|
||||
.navbar.navbar-toggleable-md .btn.dropdown-toggle::after {
|
||||
margin: 0 0 0 8px; }
|
||||
.navbar.navbar-toggleable-md .btn.btn-outline-secondary.active, .navbar.navbar-toggleable-md .btn.btn-outline-secondary.focus, .navbar.navbar-toggleable-md .btn.btn-outline-secondary:active, .navbar.navbar-toggleable-md .btn.btn-outline-secondary:focus,
|
||||
.navbar.navbar-toggleable-md .btn .btn-outline-secondary.active,
|
||||
.navbar.navbar-toggleable-md .btn .btn-outline-secondary:active {
|
||||
background-color: rgba(255, 255, 255, 0.15); }
|
||||
.navbar.navbar-toggleable-md .btn.btn-outline-secondary:hover {
|
||||
background-color: rgba(255, 255, 255, 0.1); }
|
||||
.navbar.navbar-toggleable-md .show > .btn-outline-secondary.dropdown-toggle {
|
||||
background-color: rgba(255, 255, 255, 0.15); }
|
||||
.navbar.navbar-toggleable-md .nav-link {
|
||||
padding: 0.3rem 0.75rem 0.4rem; }
|
||||
.navbar.navbar-toggleable-md .nav-link.btn {
|
||||
color: rgba(255, 255, 255, 0.75); }
|
||||
.navbar.navbar-toggleable-md .dropdown-menu {
|
||||
font-size: 0.875rem; }
|
||||
@media (max-width: 767px) {
|
||||
.navbar.navbar-toggleable-md .dropdown-menu {
|
||||
background: none;
|
||||
border: none; }
|
||||
.navbar.navbar-toggleable-md .dropdown-menu .dropdown-item {
|
||||
color: #fff; } }
|
||||
@media (min-width: 767px) {
|
||||
.navbar.navbar-toggleable-md .dropdown-menu {
|
||||
background: none;
|
||||
border: none; }
|
||||
.navbar.navbar-toggleable-md .dropdown-menu .dropdown-item {
|
||||
color: #fff; } }
|
||||
@media (min-width: 992px) {
|
||||
.navbar.navbar-toggleable-md .dropdown-menu {
|
||||
background-color: #fff;
|
||||
border: 1px solid rgba(0, 0, 0, 0.15); }
|
||||
.navbar.navbar-toggleable-md .dropdown-menu .dropdown-item {
|
||||
color: #292b2c; } }
|
||||
.navbar.navbar-toggleable-md .navbar-toggler {
|
||||
font-size: 1.5rem; }
|
||||
@media (max-width: 767px) {
|
||||
.navbar.navbar-toggleable-md .container {
|
||||
width: 100%; } }
|
||||
|
||||
.header {
|
||||
position: relative;
|
||||
height: 370px;
|
||||
text-align: center;
|
||||
padding: 60px 0; }
|
||||
.header .logo {
|
||||
margin-bottom: 16px;
|
||||
display: inline-block; }
|
||||
.header .logo svg {
|
||||
float: left; }
|
||||
.header .logo .logo-jenkins {
|
||||
height: 80px; }
|
||||
@media (min-width: 767px) {
|
||||
.header .logo .logo-jenkins {
|
||||
height: 102px;
|
||||
width: 74px; } }
|
||||
.header h1 {
|
||||
margin-bottom: 24px; }
|
||||
.header h1 span {
|
||||
display: block;
|
||||
font-size: 0.65em;
|
||||
opacity: 0.5;
|
||||
margin-bottom: .25rem; }
|
||||
.header a.btn {
|
||||
margin: 0 4px; }
|
||||
@media (min-width: 767px) {
|
||||
.header {
|
||||
height: 480px;
|
||||
padding: 100px 0; } }
|
||||
@media (min-width: 992px) {
|
||||
.header {
|
||||
height: 570px;
|
||||
padding: 140px 0; } }
|
||||
|
||||
.header .skew:before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: -100px;
|
||||
overflow: visible;
|
||||
width: 100%;
|
||||
height: 600px;
|
||||
background: #F8F9FB;
|
||||
z-index: -1;
|
||||
-webkit-transform: skewY(-14deg);
|
||||
-moz-transform: skewY(-14deg);
|
||||
-ms-transform: skewY(-14deg);
|
||||
-o-transform: skewY(-14deg);
|
||||
transform: skewY(-14deg);
|
||||
-webkit-backface-visibility: hidden;
|
||||
backface-visibility: initial; }
|
||||
@media (min-width: 767px) {
|
||||
.header .skew:before {
|
||||
top: -350px;
|
||||
height: 900px; } }
|
||||
@media (min-width: 992px) {
|
||||
.header .skew:before {
|
||||
top: -350px;
|
||||
height: 1020px; } }
|
||||
|
||||
.header .skew .header-inner {
|
||||
padding: 20px;
|
||||
margin-left: auto;
|
||||
margin-right: auto; }
|
||||
|
||||
section {
|
||||
padding-top: 50px;
|
||||
padding-bottom: 50px; }
|
||||
@media (min-width: 767px) {
|
||||
section {
|
||||
padding-top: 80px;
|
||||
padding-bottom: 80px; } }
|
||||
@media (min-width: 992px) {
|
||||
section {
|
||||
padding-top: 100px;
|
||||
padding-bottom: 100px; } }
|
||||
|
||||
.intro img {
|
||||
width: calc(100% + 30px);
|
||||
margin: 0 -15px;
|
||||
z-index: 1;
|
||||
min-height: 220px; }
|
||||
.intro a.video {
|
||||
cursor: pointer; }
|
||||
.intro a.video video {
|
||||
width: calc(100% + 30px);
|
||||
margin: 0 -15px;
|
||||
z-index: 1;
|
||||
min-height: 220px;
|
||||
box-shadow: 0 2px 80px 0 rgba(0, 0, 0, 0.05); }
|
||||
@media (max-width: 767px) {
|
||||
.intro a.video video source {
|
||||
display: none; } }
|
||||
.intro a.video::after {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgba(1, 11, 25, 0.3);
|
||||
content: "";
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
-webkit-transition: all 0.3s ease-out;
|
||||
-moz-transition: all 0.3s ease-out;
|
||||
-ms-transition: all 0.3s ease-out;
|
||||
-o-transition: all 0.3s ease-out;
|
||||
transition: all 0.3s ease-out; }
|
||||
.intro a.video span {
|
||||
position: absolute;
|
||||
top: calc(50% - 60px);
|
||||
left: calc(50% - 60px);
|
||||
color: #fff;
|
||||
opacity: .9;
|
||||
border: 5px solid #fff;
|
||||
border-radius: 200px;
|
||||
padding: 30px;
|
||||
z-index: 999;
|
||||
font-size: 80px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
width: 120px;
|
||||
height: 120px;
|
||||
text-align: center;
|
||||
-webkit-transition: all 0.3s ease-out;
|
||||
-moz-transition: all 0.3s ease-out;
|
||||
-ms-transition: all 0.3s ease-out;
|
||||
-o-transition: all 0.3s ease-out;
|
||||
transition: all 0.3s ease-out; }
|
||||
.intro a.video span::before {
|
||||
margin-right: -12px;
|
||||
margin-bottom: -3px; }
|
||||
.intro a.video:hover::after {
|
||||
background-color: rgba(1, 11, 25, 0.4); }
|
||||
.intro a.video:hover span {
|
||||
opacity: 1; }
|
||||
.intro .introblurb {
|
||||
background: #FFFFFF;
|
||||
box-shadow: 10px 10px 40px 0 rgba(0, 0, 0, 0.15);
|
||||
z-index: 2;
|
||||
margin-top: -8px;
|
||||
display: inline-block;
|
||||
padding: 18px 24px;
|
||||
-webkit-transition: all 0.5s ease-out;
|
||||
-moz-transition: all 0.5s ease-out;
|
||||
-ms-transition: all 0.5s ease-out;
|
||||
-o-transition: all 0.5s ease-out;
|
||||
transition: all 0.5s ease-out; }
|
||||
.intro .introblurb:hover {
|
||||
-webkit-transform: translate(0px, -10px);
|
||||
-moz-transform: translate(0px, -10px);
|
||||
-ms-transform: translate(0px, -10px);
|
||||
-o-transform: translate(0px, -10px);
|
||||
transform: translate(0px, -10px);
|
||||
box-shadow: 10px 10px 40px 10px rgba(0, 0, 0, 0.1); }
|
||||
@media (min-width: 767px) {
|
||||
.intro img {
|
||||
min-height: 450px; }
|
||||
.intro .introblurb {
|
||||
margin-top: -80px;
|
||||
padding: 26px 32px; } }
|
||||
@media (min-width: 992px) {
|
||||
.intro img {
|
||||
min-height: 530px; }
|
||||
.intro .introblurb {
|
||||
margin-top: 0;
|
||||
bottom: 24px;
|
||||
position: absolute; } }
|
||||
@media (min-width: 1200px) {
|
||||
.intro img {
|
||||
min-height: 580px; }
|
||||
.intro .introblurb {
|
||||
bottom: 32px; } }
|
||||
|
||||
.features {
|
||||
text-align: center; }
|
||||
.features .col-lg-4 .icon {
|
||||
background-color: rgba(74, 144, 226, 0.07);
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
border-radius: 100px;
|
||||
margin-bottom: 16px;
|
||||
display: inline-block;
|
||||
text-align: center;
|
||||
font-size: 40px;
|
||||
padding: 10px;
|
||||
color: #4a90e2;
|
||||
-webkit-transition: all 0.5s ease-out;
|
||||
-moz-transition: all 0.5s ease-out;
|
||||
-ms-transition: all 0.5s ease-out;
|
||||
-o-transition: all 0.5s ease-out;
|
||||
transition: all 0.5s ease-out; }
|
||||
.features .col-lg-4 .icon svg {
|
||||
height: 48px;
|
||||
width: 35px;
|
||||
padding-top: 12px; }
|
||||
.features .col-lg-4 .icon svg path {
|
||||
fill: #4a90e2; }
|
||||
.features .col-lg-4 h3 {
|
||||
margin-bottom: 8px; }
|
||||
.features .col-lg-4 p {
|
||||
margin-bottom: 40px; }
|
||||
.features .col-lg-4:hover .icon {
|
||||
-webkit-transform: translate(0px, -10px);
|
||||
-moz-transform: translate(0px, -10px);
|
||||
-ms-transform: translate(0px, -10px);
|
||||
-o-transform: translate(0px, -10px);
|
||||
transform: translate(0px, -10px); }
|
||||
|
||||
.props .container {
|
||||
padding-top: 100px;
|
||||
padding-bottom: 100px;
|
||||
margin-top: -20px; }
|
||||
|
||||
.props .skew:before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 0;
|
||||
overflow: visible;
|
||||
width: 100%;
|
||||
height: 610px;
|
||||
background: #F8F9FB;
|
||||
z-index: -1;
|
||||
-webkit-transform: skewY(-2deg);
|
||||
-moz-transform: skewY(-2deg);
|
||||
-ms-transform: skewY(-2deg);
|
||||
-o-transform: skewY(-2deg);
|
||||
transform: skewY(-2deg);
|
||||
-webkit-backface-visibility: hidden;
|
||||
backface-visibility: initial; }
|
||||
@media (min-width: 767px) {
|
||||
.props .skew:before {
|
||||
height: 420px; } }
|
||||
@media (min-width: 992px) {
|
||||
.props .skew:before {
|
||||
height: 440px; } }
|
||||
@media (min-width: 1200px) {
|
||||
.props .skew:before {
|
||||
height: 420px; } }
|
||||
|
||||
.cta {
|
||||
text-align: center;
|
||||
margin-bottom: 80px; }
|
||||
|
||||
.socials {
|
||||
position: fixed;
|
||||
bottom: 10px;
|
||||
left: 10px;
|
||||
color: #fff;
|
||||
font-size: 20px; }
|
||||
@media (min-width: 1200px) {
|
||||
.socials {
|
||||
top: 210px;
|
||||
left: calc(((100vw - 1140px) / 2) - 64px); } }
|
||||
.socials .socialLinks {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 100px;
|
||||
color: #fff;
|
||||
margin-bottom: 4px;
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-decoration: none;
|
||||
-webkit-transition: all 0.35s ease-out;
|
||||
-moz-transition: all 0.35s ease-out;
|
||||
-ms-transition: all 0.35s ease-out;
|
||||
-o-transition: all 0.35s ease-out;
|
||||
transition: all 0.35s ease-out; }
|
||||
.socials .socialLinks .socialLabel {
|
||||
font-size: 15px;
|
||||
line-height: 21px;
|
||||
color: #fff;
|
||||
display: inline-block;
|
||||
opacity: 0;
|
||||
-webkit-transition: all 0.35s ease-out;
|
||||
-moz-transition: all 0.35s ease-out;
|
||||
-ms-transition: all 0.35s ease-out;
|
||||
-o-transition: all 0.35s ease-out;
|
||||
transition: all 0.35s ease-out; }
|
||||
.socials .socialLinks.showLabel, .socials .socialLinks:hover {
|
||||
width: 95px; }
|
||||
.socials .socialLinks.showLabel .socialLabel, .socials .socialLinks:hover .socialLabel {
|
||||
opacity: 1; }
|
||||
.socials .socialLinks.showLabel:hover, .socials .socialLinks:hover:hover {
|
||||
-webkit-transform: translate(3px, 0px);
|
||||
-moz-transform: translate(3px, 0px);
|
||||
-ms-transform: translate(3px, 0px);
|
||||
-o-transform: translate(3px, 0px);
|
||||
transform: translate(3px, 0px); }
|
||||
.socials .socialsFacebook {
|
||||
background: #3b5998;
|
||||
padding: 5px 16px; }
|
||||
.socials .socialsFacebook .socialLabel {
|
||||
position: relative;
|
||||
top: -3px;
|
||||
left: 10px; }
|
||||
.socials .socialsTwitter {
|
||||
background: #1da1f2;
|
||||
padding: 5px 11px; }
|
||||
.socials .socialsTwitter .socialLabel {
|
||||
position: relative;
|
||||
top: -3px;
|
||||
left: 5px; }
|
||||
.socials .socialsLinkedin {
|
||||
background: #0077b5;
|
||||
padding: 5px 13px; }
|
||||
.socials .socialsLinkedin .socialLabel {
|
||||
position: relative;
|
||||
top: -3px;
|
||||
left: 7px; }
|
||||
|
||||
.modal-content {
|
||||
background-color: transparent;
|
||||
border: none; }
|
||||
.modal-content .close {
|
||||
color: #fff;
|
||||
text-shadow: none;
|
||||
padding: 16px;
|
||||
opacity: 0.75;
|
||||
font-size: 2rem;
|
||||
margin-right: -8px;
|
||||
margin-top: -10px; }
|
||||
|
||||
.modal-backdrop.in {
|
||||
opacity: 0.7; }
|
||||
|
||||
.modal-dialog {
|
||||
width: 100vw;
|
||||
margin: 0; }
|
||||
.modal-dialog .modal-body {
|
||||
padding: 15% 0;
|
||||
width: 100vw; }
|
||||
.modal-dialog .modal-body iframe {
|
||||
height: 210px; }
|
||||
@media (min-width: 767px) {
|
||||
.modal-dialog .modal-body iframe {
|
||||
height: 432px; } }
|
||||
@media (min-width: 992px) {
|
||||
.modal-dialog .modal-body iframe {
|
||||
height: 578px; } }
|
||||
@media (min-width: 1200px) {
|
||||
.modal-dialog .modal-body iframe {
|
||||
height: 641px; } }
|
||||
@media (min-width: 992px) {
|
||||
.modal-dialog .modal-body {
|
||||
padding: 5% 0; } }
|
||||
@media (min-width: 1200px) {
|
||||
.modal-dialog .modal-body {
|
||||
width: 100%;
|
||||
padding: calc((100vh - 640px) / 2 - 55px) 0; } }
|
||||
@media (min-width: 1200px) {
|
||||
.modal-dialog {
|
||||
max-width: 1140px;
|
||||
margin: auto; } }
|
|
@ -0,0 +1,45 @@
|
|||
#footer {
|
||||
background: #1077ad;
|
||||
color: #fff;
|
||||
padding: 2rem;
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
width: 100%;
|
||||
float: left;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
#footer .license-box {
|
||||
float: left;
|
||||
font-size: .85rem;
|
||||
padding-left: 0
|
||||
}
|
||||
|
||||
#footer a {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#footer .links ul li {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
#footer .area {
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
font-size: .85rem
|
||||
}
|
||||
|
||||
#footer ul, #footer li {
|
||||
display: block;
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.links h5 {
|
||||
font-size: 1rem;
|
||||
font-weight: 800;
|
||||
letter-spacing: 0.05em;
|
||||
color: #fff;
|
||||
text-align: left;
|
||||
}
|
|
@ -30,10 +30,6 @@ h6[id]:before {
|
|||
padding: 0.4em 1em 0.4em 0.5em !important;
|
||||
}
|
||||
|
||||
body > .container {
|
||||
margin-top: 60px;
|
||||
}
|
||||
|
||||
.container.page {
|
||||
position: relative
|
||||
}
|
||||
|
@ -77,32 +73,6 @@ body .popover.download-options {
|
|||
}
|
||||
|
||||
|
||||
#ji-toolbar {
|
||||
left: 0;
|
||||
right: 0;
|
||||
z-index: 100;
|
||||
border-radius: 0;
|
||||
padding-right: 160px
|
||||
}
|
||||
|
||||
#ji-toolbar>.navbar-brand {
|
||||
font: bold 1.33rem 'georgia';
|
||||
line-height:1.5rem !important;
|
||||
}
|
||||
|
||||
#ji-toolbar .navbar-brand,
|
||||
#ji-toolbar li.download {
|
||||
-webkit-transition: all 1s ease-in-out;
|
||||
-moz-transition: all 1s ease-in-out;
|
||||
-o-transition: all 1s ease-in-out;
|
||||
transition: all 1s ease-in-out;
|
||||
}
|
||||
|
||||
#ji-toolbar .slide-out {
|
||||
margin: 0 0 0 -99rem !important;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
body h1.page-title {
|
||||
font: bold 4rem 'georgia';
|
||||
margin-top: -.2rem
|
||||
|
@ -121,48 +91,6 @@ body h1.page-title .in-tag {
|
|||
z-index:10;
|
||||
}
|
||||
|
||||
#doc-toolbar *,
|
||||
#ji-toolbar * {line-height:1.5rem !important; vertical-align:bottom !important;}
|
||||
|
||||
form.search {opacity:.9; float:right}
|
||||
nav .form-inline .input-group>.form-control {width:0; transition: all 0.5s ease;}
|
||||
nav form.search .input-group:hover>input.form-control,
|
||||
nav form.search .input-group:focus>input.form-control ,
|
||||
nav form.search .input-group>input.form-control:focus{opacity:1; width:12rem}
|
||||
#ji-toolbar.navbar-dark .navbar-nav .nav-link {
|
||||
color: rgba(255, 255, 255, .67)
|
||||
}
|
||||
|
||||
#ji-toolbar.navbar-dark .navbar-nav .nav-link:hover {
|
||||
color: rgba(255, 255, 255, .95)
|
||||
}
|
||||
|
||||
#ji-toolbar form {
|
||||
white-space: nowrap
|
||||
}
|
||||
|
||||
#ji-toolbar.bg-inverse {
|
||||
background: #000
|
||||
}
|
||||
|
||||
.ji-toolbar-offset {
|
||||
min-height: 3rem
|
||||
}
|
||||
|
||||
#ji-top-peg {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
text-align: center;
|
||||
left: 0;
|
||||
z-index: 101;
|
||||
}
|
||||
|
||||
#ji-top-peg #ji-fork-tag {
|
||||
position: fixed;
|
||||
right: 0
|
||||
}
|
||||
|
||||
.carousel-item {
|
||||
min-height: 27rem;
|
||||
background: #fff;
|
||||
|
@ -207,7 +135,7 @@ nav form.search .input-group>input.form-control:focus{opacity:1; width:12rem}
|
|||
}
|
||||
|
||||
/* so that banner do not float over fixed navbar*/
|
||||
.carousel{
|
||||
.carousel {
|
||||
z-index: 9;
|
||||
}
|
||||
|
||||
|
@ -700,55 +628,6 @@ body .gutter {
|
|||
padding-left: 3rem !important
|
||||
}
|
||||
|
||||
#footer {
|
||||
background: #1077ad;
|
||||
color: #fff;
|
||||
padding: 2rem;
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
width: 100%;
|
||||
float: left;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
#footer .license-box {
|
||||
float: left;
|
||||
font-size: .85rem;
|
||||
padding-left: 0
|
||||
}
|
||||
|
||||
#footer a {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#footer .links {
|
||||
text-align: right;
|
||||
float: right;
|
||||
}
|
||||
|
||||
#footer .links ul li {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
#footer ul>.area {
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
font-size: .85rem
|
||||
}
|
||||
|
||||
#footer ul, #footer li {
|
||||
display: block;
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#footer ul>.area h5 {
|
||||
font-size: 1rem;
|
||||
font-weight: 800;
|
||||
letter-spacing: 0.05em;
|
||||
}
|
||||
|
||||
body .ji-dated-list>.post {
|
||||
border-top: .1rem solid #ccc;
|
||||
margin-bottom: .5rem
|
||||
|
@ -1179,7 +1058,6 @@ z.f9f9f9.section .ji-blog-list>.post>.body>.teaser:after, .ji-dated-list>.post>.
|
|||
}
|
||||
|
||||
.uniform-height .box {
|
||||
background:#fff;
|
||||
padding: .67rem .75rem 0 4rem;
|
||||
position: relative;
|
||||
border-radius: 5px;
|
||||
|
@ -1617,16 +1495,9 @@ table {
|
|||
}
|
||||
|
||||
/** docbook section navigation **/
|
||||
.section_nav > .page-link {
|
||||
float: none;
|
||||
font-size: 0.75rem;
|
||||
}
|
||||
.index.page-link {
|
||||
line-height: 3.5;
|
||||
}
|
||||
.pagination-links {
|
||||
height: 4rem;
|
||||
text-align: center;
|
||||
.doc-page-link {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1682,3 +1553,90 @@ table.syntax > tbody > tr > th {
|
|||
.tour .active {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
|
||||
/** pilfered from blueocean-style.css **/
|
||||
.navbar.navbar-toggleable-md {
|
||||
font-size: 0.875rem; }
|
||||
.navbar.navbar-toggleable-md.bg-inverse {
|
||||
background-color: #000; }
|
||||
.navbar.navbar-toggleable-md .navbar-brand {
|
||||
font-family: Georgia,Times,Times New Roman,serif;
|
||||
font-weight: 600;
|
||||
font-size: 20px;
|
||||
padding: 2px 0; }
|
||||
.navbar.navbar-toggleable-md .btn {
|
||||
font-size: 0.875rem;
|
||||
margin-left: 8px;
|
||||
margin-top: 1px; }
|
||||
.navbar.navbar-toggleable-md .btn.dropdown-toggle::after {
|
||||
margin: 0 0 0 8px; }
|
||||
.navbar.navbar-toggleable-md .btn.btn-outline-secondary.active, .navbar.navbar-toggleable-md .btn.btn-outline-secondary.focus, .navbar.navbar-toggleable-md .btn.btn-outline-secondary:active, .navbar.navbar-toggleable-md .btn.btn-outline-secondary:focus,
|
||||
.navbar.navbar-toggleable-md .btn .btn-outline-secondary.active,
|
||||
.navbar.navbar-toggleable-md .btn .btn-outline-secondary:active {
|
||||
background-color: rgba(255, 255, 255, 0.15); }
|
||||
.navbar.navbar-toggleable-md .btn.btn-outline-secondary:hover {
|
||||
background-color: rgba(255, 255, 255, 0.1); }
|
||||
.navbar.navbar-toggleable-md .show > .btn-outline-secondary.dropdown-toggle {
|
||||
background-color: rgba(255, 255, 255, 0.15); }
|
||||
.navbar.navbar-toggleable-md .nav-link {
|
||||
padding: 0.3rem 0.75rem 0.4rem; }
|
||||
.navbar.navbar-toggleable-md .nav-link.btn {
|
||||
color: rgba(255, 255, 255, 0.75); }
|
||||
.navbar.navbar-toggleable-md .dropdown-menu {
|
||||
font-size: 0.875rem; }
|
||||
@media (max-width: 767px) {
|
||||
.navbar.navbar-toggleable-md .dropdown-menu {
|
||||
background: none;
|
||||
border: none; }
|
||||
.navbar.navbar-toggleable-md .dropdown-menu .dropdown-item {
|
||||
color: #fff; } }
|
||||
@media (min-width: 767px) {
|
||||
.navbar.navbar-toggleable-md .dropdown-menu {
|
||||
background: none;
|
||||
border: none; }
|
||||
.navbar.navbar-toggleable-md .dropdown-menu .dropdown-item {
|
||||
color: #fff; } }
|
||||
@media (min-width: 992px) {
|
||||
.navbar.navbar-toggleable-md .dropdown-menu {
|
||||
background-color: #fff;
|
||||
border: 1px solid rgba(0, 0, 0, 0.15); }
|
||||
.navbar.navbar-toggleable-md .dropdown-menu .dropdown-item {
|
||||
color: #292b2c; } }
|
||||
.navbar.navbar-toggleable-md .navbar-toggler {
|
||||
font-size: 1.5rem; }
|
||||
@media (max-width: 767px) {
|
||||
.navbar.navbar-toggleable-md .container {
|
||||
width: 100%; } }
|
||||
|
||||
|
||||
.banner-container .skew:before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: -100px;
|
||||
overflow: visible;
|
||||
width: 100%;
|
||||
height: 600px;
|
||||
background: #F8F9FB;
|
||||
z-index: -1;
|
||||
-webkit-transform: skewY(-14deg);
|
||||
-moz-transform: skewY(-14deg);
|
||||
-ms-transform: skewY(-14deg);
|
||||
-o-transform: skewY(-14deg);
|
||||
transform: skewY(-14deg);
|
||||
-webkit-backface-visibility: hidden;
|
||||
backface-visibility: initial; }
|
||||
@media (min-width: 767px) {
|
||||
.header .skew:before {
|
||||
top: -350px;
|
||||
height: 900px; } }
|
||||
@media (min-width: 992px) {
|
||||
.header .skew:before {
|
||||
top: -350px;
|
||||
height: 1020px; } }
|
||||
|
||||
|
||||
.jumbotron {
|
||||
background-color: #F8F9FB;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
sections:
|
||||
- getting-started
|
||||
- pipeline-editor
|
|
@ -0,0 +1,86 @@
|
|||
---
|
||||
layout: section
|
||||
title: Starting with Blue Ocean
|
||||
---
|
||||
:description:
|
||||
:author:
|
||||
:email: jenkinsci-docs@googlegroups.com
|
||||
:sectanchors:
|
||||
:toc:
|
||||
:imagesdir: /doc/book/resources
|
||||
:hide-uri-scheme:
|
||||
|
||||
= Starting with Blue Ocean
|
||||
|
||||
This section will show how to start using Blue Ocean.
|
||||
It will include instructions for installing and configuring the Blue Ocean plugin,
|
||||
and how to get switch into and out of the Blue Ocean UI.
|
||||
|
||||
== Installing
|
||||
|
||||
Blue Ocean can be installed in an existing Jenkins environment or be run
|
||||
<<blueocean-docker, with Docker>>.
|
||||
|
||||
To start using the plugin:blue-ocean[Blue Ocean plugin] in an existing Jenkins
|
||||
environment, it must be running Jenkins 2.7.x or later.:
|
||||
|
||||
. Login to your Jenkins server
|
||||
. Click **Manage Jenkins** in the sidebar then **Manage Plugins**
|
||||
. Choose the **Available** tab and use the search bar to find **Blue Ocean**
|
||||
. Click the checkbox in the Install column
|
||||
. Click either **Install without restart** or **Download now and install after
|
||||
restart**
|
||||
|
||||
image::blueocean/intro/plugin-install.png[Installing Blue Ocean, role=center]
|
||||
|
||||
For in-depth description on how to install and manage plugins,
|
||||
refer to the <<managing/plugins#, Managing Plugins>> section.
|
||||
|
||||
The majority of Blue Ocean requires no additional configuration after
|
||||
installation. Existing Pipelines and Jobs will continue to work as usual.
|
||||
However, the first time a <<creating-pipelines, Pipeline is created>>, Blue
|
||||
Ocean will ask for permissions to access your repositories (either Git or
|
||||
GitHub) in order to create pipelines based on those repositories.
|
||||
|
||||
|
||||
[[blueocean-docker]]
|
||||
=== With Docker
|
||||
|
||||
The Jenkins project publishes a Docker container with Blue Ocean built-in every
|
||||
time a new release of Blue Ocean is published. The `jenkinsci/blueocean`
|
||||
image is based off of the current link:/download[Jenkins Long-Term Support]
|
||||
(LTS) release and is production ready.
|
||||
|
||||
To start a new Jenkins with Blue Ocean pre-installed:
|
||||
|
||||
. Ensure Docker is installed.
|
||||
. Run `docker run -p 8888:8080 jenkinsci/blueocean:latest`
|
||||
. Browse to http://localhost:8888/blue
|
||||
|
||||
The Blue Ocean container can be configured using all the same
|
||||
link:https://github.com/jenkinsci/docker#usage[configuration options] available
|
||||
to the other images published by the Jenkins project.
|
||||
|
||||
== Starting Blue Ocean
|
||||
|
||||
Once a Jenkins environment has Blue Ocean installed, users can start using Blue
|
||||
Ocean by clicking the **Open Blue Ocean** in the top navigation bar of the
|
||||
Jenkins web UI. Alternatively, users can navigate directly to Blue Ocean at the
|
||||
`/blue` URL for their Jenkins environment, for example
|
||||
`http://JENKINS_URL/blue`.
|
||||
|
||||
image:blueocean/intro/switch-blue-ocean.png[Opening Blue Ocean, role=center]
|
||||
|
||||
=== Switching to the "Classic" UI
|
||||
|
||||
Blue Ocean may not support some legacy or administrative functions which are
|
||||
necessary to some users. For those wishing to exit the Blue Ocean user
|
||||
experience, an "exit" icon is located at the top of most pages in Blue Ocean.
|
||||
Clicking the exit icon will navigate to the most relevant page in "classic"
|
||||
which parallels the current page in Blue Ocean.
|
||||
|
||||
image::blueocean/intro/switch-classic.png[Returning to the "classic" web UI, role=center]
|
||||
|
||||
Some links in Blue Ocean, like **Administration**, will also navigate to the
|
||||
classic web UI when there is no Blue Ocean equivalent. In these cases, Blue
|
||||
Ocean will automatically take the user into the classic web UI as necessary.
|
|
@ -0,0 +1,174 @@
|
|||
---
|
||||
layout: chapter
|
||||
title: Blue Ocean
|
||||
---
|
||||
:notitle:
|
||||
:description:
|
||||
:author:
|
||||
:email: jenkinsci-users@googlegroups.com
|
||||
:sectanchors:
|
||||
:imagesdir: /doc/book/resources
|
||||
:toc:
|
||||
|
||||
[blue-ocean]
|
||||
= Blue Ocean
|
||||
|
||||
This chapter will cover all aspects of Blue Ocean, from the Dashboard,
|
||||
to viewing branches and results from individual Pipeline runs,
|
||||
to using the Visual Editor to modify Pipelines as code.
|
||||
|
||||
This chapter is intended for Jenkins users of all skill levels, but beginners
|
||||
may need to refer to some sections of "<<using#,Using Jenkins>>" to understand
|
||||
some topics covered in this chapter.
|
||||
|
||||
If you are not yet familiar with Jenkins terminology and features, start with
|
||||
<<getting-started#,Getting Started with Jenkins>>.
|
||||
|
||||
[[overview]]
|
||||
== What is Blue Ocean?
|
||||
|
||||
Blue Ocean rethinks the user experience of Jenkins. Designed from the ground
|
||||
up for <<pipeline#, Jenkins Pipeline>>, but still compatible with Freestyle
|
||||
jobs, Blue Ocean reduces clutter and increases clarity for every member of the
|
||||
team.
|
||||
|
||||
* *Sophisticated visualizations* of continuous delivery (CD) Pipelines,
|
||||
allowing for fast and intuitive comprehension of pipeline's status.
|
||||
* *Pipeline editor* makes creation of Pipelines approachable by guiding the user through an intuitive and visual process to create a Pipeline.
|
||||
* *Personalization* to suit the role-based needs of each member of the team.
|
||||
* *Pinpoint precision* when intervention is needed and/or issues arise. Blue Ocean shows where in the pipeline attention is needed, facilitating exception handling and increasing productivity.
|
||||
* *Native integration for branch and pull requests* enables maximum developer productivity when collaborating on code with others in GitHub and Bitbucket.
|
||||
|
||||
To start using Blue Ocean, see **<<blueocean/getting-started#,Getting Started
|
||||
with Blue Ocean>>**.
|
||||
|
||||
++++
|
||||
<center>
|
||||
<iframe width="853" height="480"
|
||||
src="https://www.youtube-nocookie.com/embed/k_fVlU1FwP4?rel=0" frameborder="0"
|
||||
allowfullscreen></iframe>
|
||||
</center>
|
||||
++++
|
||||
|
||||
== Join the community
|
||||
|
||||
There a few ways you can join the community:
|
||||
|
||||
. Chat with the community and development team on Gitter image:https://badges.gitter.im/jenkinsci/blueocean-plugin.svg[link="https://gitter.im/jenkinsci/blueocean-plugin?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge"]
|
||||
. Request features or report bugs against the https://issues.jenkins-ci.org/[`blueocean-plugin` component in JIRA].
|
||||
. Subscribe and ask questions on the https://groups.google.com/forum/#!forum/jenkinsci-users[Jenkins Users mailing list].
|
||||
. Developer? We've https://issues.jenkins-ci.org/issues/?filter=16142[labeled a few issues] that are great for anyone wanting to get started developing Blue Ocean. Don't forget to drop by the Gitter chat and introduce yourself!
|
||||
|
||||
|
||||
== Frequently Asked Questions
|
||||
|
||||
=== Why does Blue Ocean exist?
|
||||
|
||||
The world has moved on from developer tools that are purely functional to
|
||||
developer tools being part of a "developer experience". That is to say, it's no
|
||||
longer about a single tool but the many tools developers use throughout the day
|
||||
and how they work together to achieve a workflow that's beneficial for the
|
||||
developer - this is Developer Experience.
|
||||
|
||||
Developer tools companies like Heroku, Atlassian and Github have raised the bar
|
||||
for what is considered good developer experience, and developers are
|
||||
increasingly expecting exceptional design. In recent years developers are
|
||||
becoming more rapidly attracted to tools that are not only functional but are
|
||||
designed to fit into their workflow seamlessly and are a joy to use. This shift
|
||||
represents a higher standard of design and user experience that Jenkins needs
|
||||
to rise to meet.
|
||||
|
||||
Creating and visualising continuous delivery pipelines is something valuable
|
||||
for many Jenkins users and this is demonstrated in the 5+ plugins that the
|
||||
community has created to meet their needs. To us this indicates a need to
|
||||
revisit how Jenkins currently expresses these concepts and consider delivery
|
||||
pipelines as a central theme to the Jenkins user experience.
|
||||
|
||||
It's not just continuous delivery concepts but the tools that developers use
|
||||
every day – Github, Bitbucket, Slack, HipChat, Puppet or Docker. It's about
|
||||
more than Jenkins – it's the developer workflow that surrounds Jenkins that
|
||||
spans multiple tools.
|
||||
|
||||
New teams have little time for learning to assemble their own Jenkins
|
||||
experience – they want to improve their time to market by shipping better
|
||||
software faster. Assembling that ideal Jenkins experience is something we can
|
||||
work together as a community of Jenkins users and contributors to define. As
|
||||
time progresses, developers' expectations of good user experience will change
|
||||
and the mission of Blue Ocean will enable the Jenkins project to respond.
|
||||
|
||||
The Jenkins community has poured its sweat and tears into building the most
|
||||
technically capable and extensible software automation tool in existence. Not
|
||||
doing anything to revolutionize the Jenkins developer experience today is just
|
||||
inviting someone else – in closed source – to do it.
|
||||
|
||||
++++
|
||||
<center>
|
||||
<iframe width="853" height="480"
|
||||
src="https://www.youtube-nocookie.com/embed/mn61VFdScuk?rel=0" frameborder="0"
|
||||
allowfullscreen></iframe>
|
||||
</center>
|
||||
++++
|
||||
|
||||
|
||||
=== Where is the name from?
|
||||
|
||||
The name Blue Ocean comes from the book
|
||||
link:https://en.wikipedia.org/wiki/Blue_Ocean_Strategy[Blue Ocean Strategy]
|
||||
where instead of looking at strategic problems within a contested space you
|
||||
look at problems in the larger uncontested space. To put this more simply,
|
||||
consider this quote from ice hockey legend Wayne Gretzky: "skate to where the
|
||||
puck is going to be, not where it has been".
|
||||
|
||||
==== Does Blue Ocean support Freestyle jobs?
|
||||
|
||||
Blue Ocean aims to deliver a great experience around Pipeline and be compatible
|
||||
with any Freestyle jobs that you have configured in your system. However, they
|
||||
won't be able to benefit from any of the features built for Pipelines – for
|
||||
example, Pipeline visualization.
|
||||
|
||||
As Blue Ocean is designed to be extensible it will be possible for the
|
||||
community to extend it for other job types in the future.
|
||||
|
||||
=== What does this mean for the classic Jenkins UI?
|
||||
|
||||
The intention is that as Blue Ocean matures there will be less and less reasons
|
||||
for users to go back to the existing UI.
|
||||
|
||||
For example, in the first version we will mainly be targeting Pipeline jobs.
|
||||
You might be able to see your existing non-pipeline jobs in Blue Ocean but it
|
||||
might not be possible to configure them from the new UI for some time. This
|
||||
means users will have to jump back to the classic UI for configuration of
|
||||
non-pipeline jobs.
|
||||
|
||||
There are likely going to be more examples of this and that's why the classic
|
||||
UI will still be important in the long term.
|
||||
|
||||
=== What does this mean for my plugins?
|
||||
|
||||
Extensibility is a pretty core concept to Jenkins, so being able to extend the
|
||||
Blue Ocean UI is important. Based on some research, we worked out a way to
|
||||
allow `<ExtensionPoint name=..>` to be used in the markup of Blue Ocean,
|
||||
leaving places for plugins to contribute to the UI (plugins can have their own
|
||||
Blue Ocean extension points, just like they do today in Jenkins). Blue Ocean
|
||||
itself (as it is so far) is implemented using these extension points.
|
||||
Extensions are delivered by plugins, as normal, only if they wish to contribute
|
||||
to the Blue Ocean experience they will have some additional javascript that
|
||||
provides extensions.
|
||||
|
||||
=== What technologies are currently in use?
|
||||
|
||||
Blue Ocean is built as a collection of Jenkins plugins itself. There is one key
|
||||
difference, however. It provides both its own endpoint for http requests and
|
||||
delivers up html/javascript via a different path, without the existing Jenkins
|
||||
UI markup/scripts. React.js and ES6 are used to deliver the javascript
|
||||
components of Blue Ocean. Inspired by this excellent open source project
|
||||
(link:https://nylas.com/blog/react-plugins[react-plugins]) an <ExtensionPoint>pattern was
|
||||
established, that allows extensions to come from any Jenkins plugin (only with
|
||||
Javascript) and should they fail to load, have failures isolated.
|
||||
|
||||
=== Where can I find the source code?
|
||||
|
||||
The source code can be found on Github:
|
||||
|
||||
* link:http://github.com/jenkinsci/blueocean-plugin[Blue Ocean]
|
||||
* link:http://github.com/jenkinsci/jenkins-design-language[Jenkins Design Language]
|
|
@ -0,0 +1,29 @@
|
|||
---
|
||||
layout: section
|
||||
title: Pipeline Editor
|
||||
---
|
||||
:description:
|
||||
:author:
|
||||
:email: jenkinsci-docs@googlegroups.com
|
||||
:sectanchors:
|
||||
:toc:
|
||||
:imagesdir: /doc/book/resources
|
||||
:hide-uri-scheme:
|
||||
|
||||
= Pipeline Editor
|
||||
|
||||
The Blue Ocean Pipeline Editor is the simplest way for anyone wanting to get started with
|
||||
creating Pipelines in Jenkins. It's also great way for advanced Jenkins users
|
||||
to start adopting Pipeline.
|
||||
|
||||
The editor allows users to create and edit a Pipeline with different
|
||||
stages and parallelized tasks that can run at the same time, depending on their
|
||||
needs. After editing of the Pipeline is complete, the Pipeline can then be
|
||||
saved into a source code repository as a `Jenkinsfile`.
|
||||
|
||||
|
||||
If you ever need to change the Pipeline again,
|
||||
Blue Ocean makes it easy to jump back in into the visual editor to modify the
|
||||
Pipeline at any time, or you can change the Pipeline in code by editing the `Jenkinsfile` directly.
|
||||
|
||||
image:blueocean/pipeline-editor.png[Pipeline Editor, role=center]
|
|
@ -5,6 +5,7 @@ chapters:
|
|||
- managing
|
||||
- best-practice
|
||||
- pipeline
|
||||
- blueocean
|
||||
- use-case
|
||||
- operating
|
||||
- scaling
|
||||
|
|
After Width: | Height: | Size: 165 KiB |
After Width: | Height: | Size: 328 KiB |
After Width: | Height: | Size: 59 KiB |
After Width: | Height: | Size: 27 KiB |
After Width: | Height: | Size: 126 KiB |
After Width: | Height: | Size: 54 KiB |
After Width: | Height: | Size: 78 KiB |
After Width: | Height: | Size: 56 KiB |
After Width: | Height: | Size: 121 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 59 KiB |
After Width: | Height: | Size: 55 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 8.4 KiB |
After Width: | Height: | Size: 90 KiB |
After Width: | Height: | Size: 131 KiB |
After Width: | Height: | Size: 131 KiB |
After Width: | Height: | Size: 129 KiB |
After Width: | Height: | Size: 59 KiB |
After Width: | Height: | Size: 400 KiB |
After Width: | Height: | Size: 140 KiB |
|
@ -0,0 +1,19 @@
|
|||
---
|
||||
layout: documentation
|
||||
title: Jenkins Upgrade Guide
|
||||
notitle: true
|
||||
---
|
||||
|
||||
== Upgrading to Jenkins LTS 2.46.x
|
||||
|
||||
Each section covers the upgrade from the previous LTS release, the section on 2.46.1 covers the upgrade from 2.32.3.
|
||||
|
||||
=== Upgrading to Jenkins LTS 2.46.1
|
||||
|
||||
==== JNLP4 remoting protocol enabled by default
|
||||
|
||||
The JNLP4 protocol is now enabled by default for JNLP agent connections. It's more reliable than JNLP3, and also encrypted, making it the best choice for agent connections. Use of this protocol may require upgrades of +slave.jar+ files on agents.
|
||||
|
||||
==== Obsolete ciphers removed from SSHD
|
||||
|
||||
Jenkins exposes an SSH server that allows use of CLI commands via SSH. In this SSH server, support for the obsolete ciphers AES128CBC, TripleDESCBC, and BlowfishCBC has been removed.
|
|
@ -2,129 +2,166 @@
|
|||
layout: default
|
||||
title: Jenkins installation and setup
|
||||
---
|
||||
|
||||
= partial('downloadbanner.html.haml')
|
||||
|
||||
.container
|
||||
.row.body
|
||||
.col-md-1
|
||||
.col-md-8
|
||||
.col-md-10
|
||||
%h2
|
||||
Jenkins Installation and Setup
|
||||
.doc-block
|
||||
%h3
|
||||
Introduction
|
||||
%p
|
||||
With the release of 2.0, the installation of Jenkins remains
|
||||
largely the same but the initial setup is different. After you have
|
||||
chosen your preferred OS or container for installation the first
|
||||
time you run Jenkins you will be presented with a setup wizard to
|
||||
properly configure Jenkins. Jenkins will not be accessible via the
|
||||
web interface or CLI until the initial setup is complete.
|
||||
Getting started with Jenkins
|
||||
|
||||
%pre.code
|
||||
INFO: This is a new Jenkins instance. The Plugin Install Wizard will be launched.
|
||||
.container
|
||||
.row
|
||||
%p
|
||||
The Jenkins project produces two release lines, LTS and weekly.
|
||||
Depending on your organization's needs, one may be preferred over
|
||||
the either.
|
||||
%p
|
||||
Both release lines are distributed as
|
||||
%code
|
||||
\.war
|
||||
files, native packages, installers, and Docker containers.
|
||||
.row
|
||||
.col-md-6
|
||||
%h4
|
||||
Long-term Support (LTS)
|
||||
%p
|
||||
LTS (Long-Term Support) releases are chosen every 12 weeks from the
|
||||
stream of regular releases as the stable release for that time period.
|
||||
|
||||
%h4
|
||||
System Requirements
|
||||
%p
|
||||
Jenkins requires Java7 or above and Servlet 3.1 to function. Java8
|
||||
is recommended. Jenkins requires a fair amount of memory to operate
|
||||
well. Smaller installations should start around 256MB-1GB.
|
||||
%a{'href' => 'https://wiki.jenkins-ci.org/display/JENKINS/LTS+Release+Line'}
|
||||
Learn more…
|
||||
|
||||
%h3
|
||||
Installation
|
||||
%p.details
|
||||
%a.item{:href=>'/changelog-stable'}
|
||||
Changelog
|
||||
|
|
||||
%a.item{:href=>'/doc/upgrade-guide'}
|
||||
Upgrade Guide
|
||||
|
|
||||
%a.item{:href=>'http://mirrors.jenkins.io/war-stable/'}
|
||||
Past Releases
|
||||
|
||||
%h4
|
||||
Unix/Linux Installation
|
||||
%p
|
||||
Jenkins has native integrations with the following OSes. See
|
||||
respective sections for how to make Jenkins run in the background
|
||||
automatically:
|
||||
%ul
|
||||
%li
|
||||
%a{ href: 'https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Ubuntu' } Installing Jenkins on Ubuntu
|
||||
%li
|
||||
%a{ href: 'https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Red+Hat+distributions' } Installing Jenkins on Red Hat Distributions
|
||||
%li
|
||||
%a{ href: 'https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+with+Docker' } Installing Jenkins with Docker
|
||||
.col-md-6
|
||||
%h4
|
||||
Weekly
|
||||
%p
|
||||
A new release is produced weekly to deliver bug fixes and
|
||||
features to users and plugin developers.
|
||||
|
||||
%p
|
||||
Alternatively, if you have a servlet container that supports
|
||||
Servlet 3.1/JSP 2.0, then you can run them as services, and deploy
|
||||
jenkins.war as you would any other war file.
|
||||
%p.details
|
||||
%a.item{:href=>'/changelog'}
|
||||
Changelog
|
||||
|
|
||||
%a.item{:href=>'http://mirrors.jenkins.io/war/'}
|
||||
Past Releases
|
||||
.row
|
||||
.col-md-6
|
||||
%strong
|
||||
%i.icon-box-add
|
||||
Download Jenkins
|
||||
= site.jenkins.stable
|
||||
for:
|
||||
|
||||
%a{ href: "https://wiki.jenkins-ci.org/display/JENKINS/Containers" }
|
||||
Container specific
|
||||
documentation is available if you choose this route.
|
||||
.list-group
|
||||
%a.list-group-item.list-group-item-action{:href=>'https://registry.hub.docker.com/_/jenkins/'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Docker
|
||||
%a.list-group-item.list-group-item-action{:href => 'http://www.freshports.org/devel/jenkins-lts'}
|
||||
%span.icon
|
||||
%span.title
|
||||
FreeBSD
|
||||
%a.list-group-item.list-group-item-action{:href=>'https://packages.gentoo.org/packages/dev-util/jenkins-bin'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Gentoo
|
||||
%a.list-group-item.list-group-item-action{:href=>'/content/thank-you-downloading-os-x-installer#stable'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Mac OS X
|
||||
%a.list-group-item.list-group-item-action{:href=>'http://openports.se/devel/jenkins/stable'}
|
||||
%span.icon
|
||||
%span.title
|
||||
OpenBSD
|
||||
%a.list-group-item.list-group-item-action{:href=>'https://pkg.jenkins.io/opensuse-stable/'}
|
||||
%span.icon
|
||||
%span.title
|
||||
openSUSE
|
||||
%a.list-group-item.list-group-item-action{:href=>'https://pkg.jenkins.io/redhat-stable/'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Red Hat/Fedora/CentOS
|
||||
%a.list-group-item.list-group-item-action{:href=>'https://pkg.jenkins.io/debian-stable/'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Ubuntu/Debian
|
||||
%a.list-group-item.list-group-item-action{:href=>'/content/thank-you-downloading-windows-installer#stable'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Windows
|
||||
%a.list-group-item.list-group-item-action{:href=>'http://mirrors.jenkins.io/war-stable/latest/jenkins.war'}
|
||||
%span.title
|
||||
Generic Java package (.war)
|
||||
|
||||
%h4
|
||||
Windows Installation
|
||||
%p
|
||||
If you're running on Windows it is good to run Jenkins as a service
|
||||
so it starts up automatically without requiring a user to log in.
|
||||
The easiest way is to run the Windows installer, linked from
|
||||
Jenkins' homepage. This also has the advantage of being easier to
|
||||
automate.
|
||||
.col-md-6
|
||||
%strong
|
||||
%i.icon-box-add
|
||||
Download Jenkins
|
||||
= site.jenkins.latest
|
||||
for:
|
||||
|
||||
%p
|
||||
The manual way is to follow Installing Jenkins as a Windows
|
||||
service. Alternatively, you can install a servlet container like
|
||||
GlassFish and Tomcat, which can run as a service by itself, and
|
||||
then deploy Jenkins to it.
|
||||
.list-group
|
||||
%a.list-group-item.list-group-item-action{:href=>'https://registry.hub.docker.com/r/jenkinsci/jenkins/'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Docker
|
||||
%a.list-group-item.list-group-item-action{:href => 'http://www.freshports.org/devel/jenkins'}
|
||||
%span.icon
|
||||
%span.title
|
||||
FreeBSD
|
||||
%a.list-group-item.list-group-item-action{:href=>'https://packages.gentoo.org/packages/dev-util/jenkins-bin'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Gentoo
|
||||
%a.list-group-item.list-group-item-action{:href=>'/content/thank-you-downloading-os-x-installer'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Mac OS X
|
||||
%a.list-group-item.list-group-item-action{:href=>'http://openports.se/devel/jenkins/devel'}
|
||||
%span.icon
|
||||
%span.title
|
||||
OpenBSD
|
||||
%a.list-group-item.list-group-item-action{:href=>'https://pkg.jenkins.io/opensuse/'}
|
||||
%span.icon
|
||||
%span.title
|
||||
openSUSE
|
||||
%a.list-group-item.list-group-item-action{:href=>'https://pkg.jenkins.io/redhat/'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Red Hat/Fedora/CentOS
|
||||
%a.list-group-item.list-group-item-action{:href=>'https://pkg.jenkins.io/debian/'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Ubuntu/Debian
|
||||
%a.list-group-item.list-group-item-action{:href=>'/content/thank-you-downloading-windows-installer'}
|
||||
%span.icon
|
||||
%span.title
|
||||
Windows
|
||||
%a.list-group-item.list-group-item-action{:href=>'http://mirrors.jenkins.io/war/latest/jenkins.war'}
|
||||
%span.title
|
||||
Generic Java package (.war)
|
||||
|
||||
%p
|
||||
Since Jenkins was written to work on unix-like platforms, some
|
||||
parts assume the presence of unix-utilities. It is advised to
|
||||
install these as well on Windows. Install UnxUtils (this includes a
|
||||
shell that seems to work with forward and backwards slashes and
|
||||
does globbing correctly)(UnxUtils does not download), put it in the
|
||||
Windows PATH , and copy sh.exe to C:\bin\sh.exe (or whichever drive
|
||||
you use) to make shebang lines work. This should get you going. If
|
||||
UnxUtils gives you trouble (Fork Failed Errors), try Win-Bash.
|
||||
|
||||
%ul
|
||||
%li
|
||||
%a{ href: "https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+as+a+Windows+service", title: "Install Service"} Installing Jenkins as a Windows service
|
||||
%p
|
||||
%br
|
||||
%hr/
|
||||
|
||||
%h3
|
||||
Setup Wizard
|
||||
%p
|
||||
Jenkins 2.0 is no longer installed completely open and accessible
|
||||
to the world. Instead Jenkins is initially configured to be more
|
||||
secure. Jenkins can no longer be accessed without a username and
|
||||
password and open ports are limited. During the initial run of
|
||||
Jenkins a security token is generated and printed in the console
|
||||
log:
|
||||
|
||||
%pre.code
|
||||
*************************************************************
|
||||
*************************************************************
|
||||
*************************************************************
|
||||
|
||||
Jenkins initial setup is required. A security token is required to proceed.
|
||||
Please use the following security token to proceed to installation:
|
||||
|
||||
41d2b60b0e4cb5bf2025d33b21cb
|
||||
|
||||
*************************************************************
|
||||
*************************************************************
|
||||
*************************************************************
|
||||
|
||||
%p
|
||||
This token must be input in the Setup Wizard the first time you
|
||||
open the Jenkins UI. This token will also serve as the default
|
||||
password for the user 'admin' if you skip the user-creation step in
|
||||
the Setup Wizard.
|
||||
%p
|
||||
In addition to configuring the initial security for Jenkins the
|
||||
Setup Wizard will also install the initial plugins in your
|
||||
installation. Previously,Jenkins included several bundled plugins
|
||||
based on a set of assumed use cases. However, as technology and
|
||||
tools have changed the list of bundled plugins included with
|
||||
Jenkins has not kept up to date. Rather than continuously updating
|
||||
a list of bundled plugins, Jenkins 2.0 begins with a setup wizard
|
||||
asking the user to choose the initial plugins to be installed. The
|
||||
recommended set of plugins available are based on the most common
|
||||
use cases but users are free to customize their own installion.
|
||||
.row
|
||||
.col-md-12
|
||||
%p
|
||||
Once a Jenkins package has been downloaded, proceed to the
|
||||
%strong
|
||||
%a{:href => 'doc/book/getting-started/installing/'}
|
||||
Installing Jenkins
|
||||
section of the User Handbook.
|
||||
|
|
|
@ -1,90 +1,86 @@
|
|||
---
|
||||
layout: simplepage
|
||||
title: "Events"
|
||||
section: events # no such section (yet)
|
||||
# no such section (yet)
|
||||
section: events
|
||||
notitle: true
|
||||
---
|
||||
|
||||
:css
|
||||
.floating {
|
||||
float: left;
|
||||
width: 320px;
|
||||
}
|
||||
h1, p {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.container
|
||||
.row
|
||||
%h1
|
||||
Recurring Events
|
||||
.row
|
||||
.col-md-6.text-center
|
||||
%ul.ji-item-list
|
||||
%li.post.event.floating
|
||||
%a.body{:href => 'http://lists.jenkins-ci.org/pipermail/jenkins-infra/2017-February/001029.html', :target => '_blank'}
|
||||
.header.time
|
||||
.date-time
|
||||
.date
|
||||
.day
|
||||
Mondays
|
||||
.dow
|
||||
Mon
|
||||
.time
|
||||
20h UTC
|
||||
|
||||
%h1
|
||||
Recurring Events
|
||||
%div.item-list
|
||||
%ul.ji-item-list
|
||||
%li.post.event.floating
|
||||
%a.body{:href => 'http://lists.jenkins-ci.org/pipermail/jenkins-infra/2017-February/001029.html', :target => '_blank'}
|
||||
.header.time
|
||||
.date-time
|
||||
.date
|
||||
.day
|
||||
Mondays
|
||||
.dow
|
||||
Mon
|
||||
.time
|
||||
20h UTC
|
||||
%h5.title
|
||||
Infra Team Sync
|
||||
.col-md-6.text-center
|
||||
%ul.ji-item-list
|
||||
%li.post.event.floating
|
||||
%a.body{:href => 'https://jenkins.io/project/governance/#meeting', :target => '_blank'}
|
||||
.header.time
|
||||
.date-time
|
||||
.date
|
||||
.day.small
|
||||
Every other Wed
|
||||
.dow
|
||||
Wed
|
||||
.time
|
||||
18h UTC
|
||||
|
||||
%h5.title
|
||||
Infra Team Sync
|
||||
%h5.title
|
||||
Project Meeting
|
||||
.row
|
||||
%p
|
||||
Other recurring events can be found in the
|
||||
%a{:href => '/content/event-calendar'}
|
||||
Jenkins event calendar.
|
||||
|
||||
|
||||
%li.post.event.floating
|
||||
%a.body{:href => 'https://jenkins.io/project/governance/#meeting', :target => '_blank'}
|
||||
.header.time
|
||||
.date-time
|
||||
.date
|
||||
.day.small
|
||||
Every other Wed
|
||||
.dow
|
||||
Wed
|
||||
.time
|
||||
18h UTC
|
||||
|
||||
%h5.title
|
||||
Project Meeting
|
||||
|
||||
%p
|
||||
Other recurring events can be found in the
|
||||
%a{:href => '/content/event-calendar'}
|
||||
Jenkins event calendar.
|
||||
|
||||
%h1
|
||||
Upcoming Events
|
||||
|
||||
%div.item-list
|
||||
%ul.ji-item-list
|
||||
.row
|
||||
%h1
|
||||
Upcoming Events
|
||||
.row
|
||||
- # Sort by the date defined for each of the events
|
||||
- site.events.keys.sort { |x,y| Time.parse(site.events[x].date) <=> Time.parse(site.events[y].date) }.each do |name|
|
||||
- data = site.events[name]
|
||||
- raise "No `date` specified!" unless data.date
|
||||
- event_time = Time.parse(data.date)
|
||||
- next unless event_time > Time.now.utc
|
||||
%li.post.event.floating
|
||||
%a.body{:href => data.link, :target => '_blank'}
|
||||
.header.time
|
||||
.date-time
|
||||
.date
|
||||
.month
|
||||
= event_time.strftime('%b')
|
||||
.day
|
||||
= event_time.strftime('%-d')
|
||||
.dow
|
||||
= event_time.strftime('%a')
|
||||
.time
|
||||
= event_time.strftime('%l:%M %P')
|
||||
.col-md-3.text-center
|
||||
%ul.ji-item-list
|
||||
%li.post.event.floating
|
||||
%a.body{:href => data.link, :target => '_blank'}
|
||||
.header.time
|
||||
.date-time
|
||||
.date
|
||||
.month
|
||||
= event_time.strftime('%b')
|
||||
.day
|
||||
= event_time.strftime('%-d')
|
||||
.dow
|
||||
= event_time.strftime('%a')
|
||||
.time
|
||||
= event_time.strftime('%l:%M %P')
|
||||
|
||||
%h5.title
|
||||
= data.title
|
||||
%h5.title
|
||||
= data.title
|
||||
|
||||
%p.teaser
|
||||
= data.raw_content
|
||||
.more
|
||||
%p.teaser
|
||||
= data.raw_content
|
||||
.more
|
||||
|
||||
.attrs
|
||||
.attrs
|
||||
|
|
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 69 KiB |
After Width: | Height: | Size: 176 KiB |
After Width: | Height: | Size: 118 KiB |
After Width: | Height: | Size: 122 KiB |
After Width: | Height: | Size: 119 KiB |
After Width: | Height: | Size: 83 KiB |
After Width: | Height: | Size: 91 KiB |
|
@ -5,19 +5,138 @@ blogrollup: true
|
|||
homepage: true
|
||||
---
|
||||
|
||||
= partial('downloadbanner.html.haml')
|
||||
= partial('jumbotron.html.haml',
|
||||
:href => '/doc/book/pipeline',
|
||||
:title => 'Pipeline as Code',
|
||||
:intro => 'Pipeline provides an extensible set of tools for modeling simple-to-complex continuous delivery (CD) pipelines "as code". Create your first Pipeline and "Jenkinsfile" using the new Declarative Pipeline syntax.',
|
||||
:image => site.solutions[:pipeline].jumbotron.image,
|
||||
:call_to_action => {:text => 'Learn more', :href => '/doc/pipeline/tour/hello-world/'})
|
||||
= partial('featurelist.html.haml')
|
||||
= partial('steps.html.haml', site.steps[:firststart])
|
||||
:ruby
|
||||
# Images should all be between 300 and 350 pixels wide, and no more than 180px tall
|
||||
|
||||
%div
|
||||
.section.events.fff
|
||||
%div.container-fluid.events.no-margin
|
||||
sponsors = [
|
||||
['microsoft.png',
|
||||
'Microsoft Azure',
|
||||
'https://www.azure.com'],
|
||||
['cloudbees.png',
|
||||
'CloudBees, Inc.',
|
||||
'https://cloudbees.com'],
|
||||
['osuosl.png',
|
||||
'Oregon State University Open Source Lab',
|
||||
'https://osuosl.org'],
|
||||
['rackspace.png',
|
||||
'Rackspace, Inc.',
|
||||
'https://rackspace.com'],
|
||||
['redhat.png',
|
||||
'RedHat, Inc.',
|
||||
'https://redhat.com'],
|
||||
]
|
||||
supporters = [['Atlassian', 'https://atlassian.com'],
|
||||
['Datadog', 'https://www.datadoghq.com'],
|
||||
['JFrog', 'https://jfrog.com'],
|
||||
['Mac Cloud', 'http://maccloud.me/'],
|
||||
['PagerDuty', 'https://pagerduty.com'],
|
||||
['XMission', 'https://xmission.com'],
|
||||
]
|
||||
|
||||
.banner-container
|
||||
.skew
|
||||
.container
|
||||
.row
|
||||
|
||||
.row
|
||||
.col-md-2
|
||||
|
||||
.col-lg-4
|
||||
.logo{:style => 'width: 256px;'}
|
||||
= partial('logo.html.haml')
|
||||
|
||||
.col-md-4
|
||||
%h1.page-title
|
||||
%span>
|
||||
Jenkins
|
||||
%p
|
||||
%strong
|
||||
Build great things at any scale
|
||||
%p
|
||||
The leading open source automation server, Jenkins provides
|
||||
hundreds of plugins to support building, deploying and automating
|
||||
any project.
|
||||
|
||||
.container
|
||||
.row
|
||||
%a.btn.btn-secondary{:href => expand_link('doc')}
|
||||
Documentation
|
||||
%a.btn.btn-primary{:href => expand_link('download')}
|
||||
Download
|
||||
|
||||
.col-md-2
|
||||
|
||||
= partial('projectjumbotron.html.haml',
|
||||
:href => '/projects/blueocean',
|
||||
:title => 'Say “hello” to Blue Ocean 1.0',
|
||||
:intro => "Blue Ocean is a brand new user experience that puts Continuous Delivery in reach of any team — without sacrificing the power and sophistication of Jenkins.",
|
||||
:image => 'images/blueocean/blueocean-successful-pipeline.png',
|
||||
:call_to_action => {:text => 'Get started', :href => '/projects/blueocean'})
|
||||
|
||||
#feature-list-segment.segment
|
||||
.container
|
||||
.row.chunks.features.uniform-height
|
||||
.col-md-6.col-lg-4
|
||||
.box.cicd
|
||||
%i.icon-arrow-shuffle
|
||||
%h5
|
||||
Continuous Integration and Continuous Delivery
|
||||
%p
|
||||
As an extensible automation server, Jenkins can be used as a simple
|
||||
CI server or turned into the continuous delivery hub for any project.
|
||||
|
||||
|
||||
.col-md-6.col-lg-4
|
||||
.box.install
|
||||
%i.icon-download
|
||||
%h5
|
||||
Easy installation
|
||||
%p
|
||||
Jenkins is a self-contained Java-based program, ready to run
|
||||
out-of-the-box, with packages for Windows, Mac OS X and other
|
||||
Unix-like operating systems.
|
||||
|
||||
.col-md-6.col-lg-4
|
||||
.box.settings
|
||||
%i.icon-settings
|
||||
%h5
|
||||
Easy configuration
|
||||
%p
|
||||
Jenkins can be easily set up and configured via its web interface,
|
||||
which includes on-the-fly error checks and built-in help.
|
||||
|
||||
.col-md-6.col-lg-4
|
||||
.box.ecosystem
|
||||
%i.icon-plug
|
||||
%h5
|
||||
Plugins
|
||||
%p
|
||||
With hundreds of plugins in the Update Center, Jenkins integrates
|
||||
with practically every tool in the continuous integration and
|
||||
continuous delivery toolchain.
|
||||
|
||||
.col-md-6.col-lg-4
|
||||
.box.extend
|
||||
%i.icon-puzzle-piece
|
||||
%h5
|
||||
Extensible
|
||||
%p
|
||||
Jenkins can be extended via its plugin architecture, providing
|
||||
nearly infinite possibilities for what Jenkins can do.
|
||||
|
||||
.col-md-6.col-lg-4
|
||||
.box.distributed
|
||||
%i.icon-uniE602
|
||||
%h5
|
||||
Distributed
|
||||
%p
|
||||
Jenkins can easily distribute work across multiple machines,
|
||||
helping drive builds, tests and deployments across multiple
|
||||
platforms faster.
|
||||
|
||||
.container
|
||||
.section.events
|
||||
.container-fluid.events.no-margin
|
||||
%div.row
|
||||
%div#sidebar.col-md-12.events.horizontal
|
||||
= partial('events.html.haml')
|
||||
|
@ -34,4 +153,28 @@ homepage: true
|
|||
.col-md-1
|
||||
.col-md-2
|
||||
|
||||
= partial('sponsors.html.haml')
|
||||
#sponsorsblock.jumbotron
|
||||
.sponsors
|
||||
%p
|
||||
%strong
|
||||
We thank the following organizations for their major commitments to
|
||||
support the Jenkins project.
|
||||
|
||||
%ul
|
||||
|
||||
- sponsors.each do |logo, name, url|
|
||||
%li
|
||||
%a{:href => url, :target => '_blank'}
|
||||
%img{:alt => name, :title => name, :src => expand_link("images/sponsors/#{logo}")}/
|
||||
|
||||
.supporters
|
||||
%p
|
||||
%strong
|
||||
We thank the following organizations for their support of the Jenkins
|
||||
project through free and/or open source licensing programs.
|
||||
|
||||
%ul
|
||||
- supporters.each do |name, url|
|
||||
%li
|
||||
%a{:href => url, :target => '_blank'}
|
||||
= name
|
||||
|
|
|
@ -0,0 +1,64 @@
|
|||
var didScroll;
|
||||
var lastScrollTop = 0;
|
||||
var delta = 50;
|
||||
|
||||
$(window).scroll(function(event){
|
||||
didScroll = true;
|
||||
});
|
||||
|
||||
setInterval(function() {
|
||||
if (didScroll) {
|
||||
hasScrolled();
|
||||
didScroll = false;
|
||||
}
|
||||
}, 250);
|
||||
|
||||
function hasScrolled() {
|
||||
var st = $(this).scrollTop();
|
||||
|
||||
// Make sure they scroll more than delta
|
||||
if (Math.abs(lastScrollTop - st) <= delta)
|
||||
return;
|
||||
|
||||
if (st > lastScrollTop) {
|
||||
// Scroll Down
|
||||
$('.socialLinks').removeClass('showLabel');
|
||||
|
||||
} else {
|
||||
// Scroll Up
|
||||
if (st + $(window).height() < $(document).height()) {
|
||||
$('.socialLinks').addClass('showLabel');
|
||||
}
|
||||
}
|
||||
|
||||
lastScrollTop = st;
|
||||
}
|
||||
|
||||
function doyourthang(meh) {
|
||||
var x = screen.width / 2 - 700 / 2;
|
||||
var y = screen.height / 2 - 600 / 2;
|
||||
window.open(meh.href, "", 'height=700,width=600,left=' + x + ',top=' + y);
|
||||
}
|
||||
|
||||
// Youtube modal
|
||||
|
||||
$(function() {
|
||||
$(".video").click(function () {
|
||||
var theModal = $(this).data("target"),
|
||||
videoSRC = $(this).attr("data-video"),
|
||||
videoSRCauto = videoSRC + "?modestbranding=1&rel=0&html5=1&autoplay=1";
|
||||
$(theModal + ' iframe').attr('src', videoSRCauto);
|
||||
$(theModal + ' button.close').click(function () {
|
||||
$(theModal + ' iframe').attr('src', videoSRC);
|
||||
});
|
||||
$(theModal).click(function () {
|
||||
$(theModal + ' iframe').attr('src', videoSRC);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
$("#videoModal").on('hide.bs.modal', function(){
|
||||
var theModal = $(".video").data("target"),
|
||||
videoSRC = $(".video").attr("data-video");
|
||||
$(theModal + ' iframe').attr('src', videoSRC); //esc
|
||||
});
|
|
@ -0,0 +1,513 @@
|
|||
(function() {
|
||||
var MutationObserver, Util, WeakMap, getComputedStyle, getComputedStyleRX,
|
||||
bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
|
||||
indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
|
||||
|
||||
Util = (function() {
|
||||
function Util() {}
|
||||
|
||||
Util.prototype.extend = function(custom, defaults) {
|
||||
var key, value;
|
||||
for (key in defaults) {
|
||||
value = defaults[key];
|
||||
if (custom[key] == null) {
|
||||
custom[key] = value;
|
||||
}
|
||||
}
|
||||
return custom;
|
||||
};
|
||||
|
||||
Util.prototype.isMobile = function(agent) {
|
||||
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(agent);
|
||||
};
|
||||
|
||||
Util.prototype.createEvent = function(event, bubble, cancel, detail) {
|
||||
var customEvent;
|
||||
if (bubble == null) {
|
||||
bubble = false;
|
||||
}
|
||||
if (cancel == null) {
|
||||
cancel = false;
|
||||
}
|
||||
if (detail == null) {
|
||||
detail = null;
|
||||
}
|
||||
if (document.createEvent != null) {
|
||||
customEvent = document.createEvent('CustomEvent');
|
||||
customEvent.initCustomEvent(event, bubble, cancel, detail);
|
||||
} else if (document.createEventObject != null) {
|
||||
customEvent = document.createEventObject();
|
||||
customEvent.eventType = event;
|
||||
} else {
|
||||
customEvent.eventName = event;
|
||||
}
|
||||
return customEvent;
|
||||
};
|
||||
|
||||
Util.prototype.emitEvent = function(elem, event) {
|
||||
if (elem.dispatchEvent != null) {
|
||||
return elem.dispatchEvent(event);
|
||||
} else if (event in (elem != null)) {
|
||||
return elem[event]();
|
||||
} else if (("on" + event) in (elem != null)) {
|
||||
return elem["on" + event]();
|
||||
}
|
||||
};
|
||||
|
||||
Util.prototype.addEvent = function(elem, event, fn) {
|
||||
if (elem.addEventListener != null) {
|
||||
return elem.addEventListener(event, fn, false);
|
||||
} else if (elem.attachEvent != null) {
|
||||
return elem.attachEvent("on" + event, fn);
|
||||
} else {
|
||||
return elem[event] = fn;
|
||||
}
|
||||
};
|
||||
|
||||
Util.prototype.removeEvent = function(elem, event, fn) {
|
||||
if (elem.removeEventListener != null) {
|
||||
return elem.removeEventListener(event, fn, false);
|
||||
} else if (elem.detachEvent != null) {
|
||||
return elem.detachEvent("on" + event, fn);
|
||||
} else {
|
||||
return delete elem[event];
|
||||
}
|
||||
};
|
||||
|
||||
Util.prototype.innerHeight = function() {
|
||||
if ('innerHeight' in window) {
|
||||
return window.innerHeight;
|
||||
} else {
|
||||
return document.documentElement.clientHeight;
|
||||
}
|
||||
};
|
||||
|
||||
return Util;
|
||||
|
||||
})();
|
||||
|
||||
WeakMap = this.WeakMap || this.MozWeakMap || (WeakMap = (function() {
|
||||
function WeakMap() {
|
||||
this.keys = [];
|
||||
this.values = [];
|
||||
}
|
||||
|
||||
WeakMap.prototype.get = function(key) {
|
||||
var i, item, j, len, ref;
|
||||
ref = this.keys;
|
||||
for (i = j = 0, len = ref.length; j < len; i = ++j) {
|
||||
item = ref[i];
|
||||
if (item === key) {
|
||||
return this.values[i];
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
WeakMap.prototype.set = function(key, value) {
|
||||
var i, item, j, len, ref;
|
||||
ref = this.keys;
|
||||
for (i = j = 0, len = ref.length; j < len; i = ++j) {
|
||||
item = ref[i];
|
||||
if (item === key) {
|
||||
this.values[i] = value;
|
||||
return;
|
||||
}
|
||||
}
|
||||
this.keys.push(key);
|
||||
return this.values.push(value);
|
||||
};
|
||||
|
||||
return WeakMap;
|
||||
|
||||
})());
|
||||
|
||||
MutationObserver = this.MutationObserver || this.WebkitMutationObserver || this.MozMutationObserver || (MutationObserver = (function() {
|
||||
function MutationObserver() {
|
||||
if (typeof console !== "undefined" && console !== null) {
|
||||
console.warn('MutationObserver is not supported by your browser.');
|
||||
}
|
||||
if (typeof console !== "undefined" && console !== null) {
|
||||
console.warn('WOW.js cannot detect dom mutations, please call .sync() after loading new content.');
|
||||
}
|
||||
}
|
||||
|
||||
MutationObserver.notSupported = true;
|
||||
|
||||
MutationObserver.prototype.observe = function() {};
|
||||
|
||||
return MutationObserver;
|
||||
|
||||
})());
|
||||
|
||||
getComputedStyle = this.getComputedStyle || function(el, pseudo) {
|
||||
this.getPropertyValue = function(prop) {
|
||||
var ref;
|
||||
if (prop === 'float') {
|
||||
prop = 'styleFloat';
|
||||
}
|
||||
if (getComputedStyleRX.test(prop)) {
|
||||
prop.replace(getComputedStyleRX, function(_, _char) {
|
||||
return _char.toUpperCase();
|
||||
});
|
||||
}
|
||||
return ((ref = el.currentStyle) != null ? ref[prop] : void 0) || null;
|
||||
};
|
||||
return this;
|
||||
};
|
||||
|
||||
getComputedStyleRX = /(\-([a-z]){1})/g;
|
||||
|
||||
this.WOW = (function() {
|
||||
WOW.prototype.defaults = {
|
||||
boxClass: 'wow',
|
||||
animateClass: 'animated',
|
||||
offset: 0,
|
||||
mobile: true,
|
||||
live: true,
|
||||
callback: null,
|
||||
scrollContainer: null
|
||||
};
|
||||
|
||||
function WOW(options) {
|
||||
if (options == null) {
|
||||
options = {};
|
||||
}
|
||||
this.scrollCallback = bind(this.scrollCallback, this);
|
||||
this.scrollHandler = bind(this.scrollHandler, this);
|
||||
this.resetAnimation = bind(this.resetAnimation, this);
|
||||
this.start = bind(this.start, this);
|
||||
this.scrolled = true;
|
||||
this.config = this.util().extend(options, this.defaults);
|
||||
if (options.scrollContainer != null) {
|
||||
this.config.scrollContainer = document.querySelector(options.scrollContainer);
|
||||
}
|
||||
this.animationNameCache = new WeakMap();
|
||||
this.wowEvent = this.util().createEvent(this.config.boxClass);
|
||||
}
|
||||
|
||||
WOW.prototype.init = function() {
|
||||
var ref;
|
||||
this.element = window.document.documentElement;
|
||||
if ((ref = document.readyState) === "interactive" || ref === "complete") {
|
||||
this.start();
|
||||
} else {
|
||||
this.util().addEvent(document, 'DOMContentLoaded', this.start);
|
||||
}
|
||||
return this.finished = [];
|
||||
};
|
||||
|
||||
WOW.prototype.start = function() {
|
||||
var box, j, len, ref;
|
||||
this.stopped = false;
|
||||
this.boxes = (function() {
|
||||
var j, len, ref, results;
|
||||
ref = this.element.querySelectorAll("." + this.config.boxClass);
|
||||
results = [];
|
||||
for (j = 0, len = ref.length; j < len; j++) {
|
||||
box = ref[j];
|
||||
results.push(box);
|
||||
}
|
||||
return results;
|
||||
}).call(this);
|
||||
this.all = (function() {
|
||||
var j, len, ref, results;
|
||||
ref = this.boxes;
|
||||
results = [];
|
||||
for (j = 0, len = ref.length; j < len; j++) {
|
||||
box = ref[j];
|
||||
results.push(box);
|
||||
}
|
||||
return results;
|
||||
}).call(this);
|
||||
if (this.boxes.length) {
|
||||
if (this.disabled()) {
|
||||
this.resetStyle();
|
||||
} else {
|
||||
ref = this.boxes;
|
||||
for (j = 0, len = ref.length; j < len; j++) {
|
||||
box = ref[j];
|
||||
this.applyStyle(box, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!this.disabled()) {
|
||||
this.util().addEvent(this.config.scrollContainer || window, 'scroll', this.scrollHandler);
|
||||
this.util().addEvent(window, 'resize', this.scrollHandler);
|
||||
this.interval = setInterval(this.scrollCallback, 50);
|
||||
}
|
||||
if (this.config.live) {
|
||||
return new MutationObserver((function(_this) {
|
||||
return function(records) {
|
||||
var k, len1, node, record, results;
|
||||
results = [];
|
||||
for (k = 0, len1 = records.length; k < len1; k++) {
|
||||
record = records[k];
|
||||
results.push((function() {
|
||||
var l, len2, ref1, results1;
|
||||
ref1 = record.addedNodes || [];
|
||||
results1 = [];
|
||||
for (l = 0, len2 = ref1.length; l < len2; l++) {
|
||||
node = ref1[l];
|
||||
results1.push(this.doSync(node));
|
||||
}
|
||||
return results1;
|
||||
}).call(_this));
|
||||
}
|
||||
return results;
|
||||
};
|
||||
})(this)).observe(document.body, {
|
||||
childList: true,
|
||||
subtree: true
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
WOW.prototype.stop = function() {
|
||||
this.stopped = true;
|
||||
this.util().removeEvent(this.config.scrollContainer || window, 'scroll', this.scrollHandler);
|
||||
this.util().removeEvent(window, 'resize', this.scrollHandler);
|
||||
if (this.interval != null) {
|
||||
return clearInterval(this.interval);
|
||||
}
|
||||
};
|
||||
|
||||
WOW.prototype.sync = function(element) {
|
||||
if (MutationObserver.notSupported) {
|
||||
return this.doSync(this.element);
|
||||
}
|
||||
};
|
||||
|
||||
WOW.prototype.doSync = function(element) {
|
||||
var box, j, len, ref, results;
|
||||
if (element == null) {
|
||||
element = this.element;
|
||||
}
|
||||
if (element.nodeType !== 1) {
|
||||
return;
|
||||
}
|
||||
element = element.parentNode || element;
|
||||
ref = element.querySelectorAll("." + this.config.boxClass);
|
||||
results = [];
|
||||
for (j = 0, len = ref.length; j < len; j++) {
|
||||
box = ref[j];
|
||||
if (indexOf.call(this.all, box) < 0) {
|
||||
this.boxes.push(box);
|
||||
this.all.push(box);
|
||||
if (this.stopped || this.disabled()) {
|
||||
this.resetStyle();
|
||||
} else {
|
||||
this.applyStyle(box, true);
|
||||
}
|
||||
results.push(this.scrolled = true);
|
||||
} else {
|
||||
results.push(void 0);
|
||||
}
|
||||
}
|
||||
return results;
|
||||
};
|
||||
|
||||
WOW.prototype.show = function(box) {
|
||||
this.applyStyle(box);
|
||||
box.className = box.className + " " + this.config.animateClass;
|
||||
if (this.config.callback != null) {
|
||||
this.config.callback(box);
|
||||
}
|
||||
this.util().emitEvent(box, this.wowEvent);
|
||||
this.util().addEvent(box, 'animationend', this.resetAnimation);
|
||||
this.util().addEvent(box, 'oanimationend', this.resetAnimation);
|
||||
this.util().addEvent(box, 'webkitAnimationEnd', this.resetAnimation);
|
||||
this.util().addEvent(box, 'MSAnimationEnd', this.resetAnimation);
|
||||
return box;
|
||||
};
|
||||
|
||||
WOW.prototype.applyStyle = function(box, hidden) {
|
||||
var delay, duration, iteration;
|
||||
duration = box.getAttribute('data-wow-duration');
|
||||
delay = box.getAttribute('data-wow-delay');
|
||||
iteration = box.getAttribute('data-wow-iteration');
|
||||
return this.animate((function(_this) {
|
||||
return function() {
|
||||
return _this.customStyle(box, hidden, duration, delay, iteration);
|
||||
};
|
||||
})(this));
|
||||
};
|
||||
|
||||
WOW.prototype.animate = (function() {
|
||||
if ('requestAnimationFrame' in window) {
|
||||
return function(callback) {
|
||||
return window.requestAnimationFrame(callback);
|
||||
};
|
||||
} else {
|
||||
return function(callback) {
|
||||
return callback();
|
||||
};
|
||||
}
|
||||
})();
|
||||
|
||||
WOW.prototype.resetStyle = function() {
|
||||
var box, j, len, ref, results;
|
||||
ref = this.boxes;
|
||||
results = [];
|
||||
for (j = 0, len = ref.length; j < len; j++) {
|
||||
box = ref[j];
|
||||
results.push(box.style.visibility = 'visible');
|
||||
}
|
||||
return results;
|
||||
};
|
||||
|
||||
WOW.prototype.resetAnimation = function(event) {
|
||||
var target;
|
||||
if (event.type.toLowerCase().indexOf('animationend') >= 0) {
|
||||
target = event.target || event.srcElement;
|
||||
return target.className = target.className.replace(this.config.animateClass, '').trim();
|
||||
}
|
||||
};
|
||||
|
||||
WOW.prototype.customStyle = function(box, hidden, duration, delay, iteration) {
|
||||
if (hidden) {
|
||||
this.cacheAnimationName(box);
|
||||
}
|
||||
box.style.visibility = hidden ? 'hidden' : 'visible';
|
||||
if (duration) {
|
||||
this.vendorSet(box.style, {
|
||||
animationDuration: duration
|
||||
});
|
||||
}
|
||||
if (delay) {
|
||||
this.vendorSet(box.style, {
|
||||
animationDelay: delay
|
||||
});
|
||||
}
|
||||
if (iteration) {
|
||||
this.vendorSet(box.style, {
|
||||
animationIterationCount: iteration
|
||||
});
|
||||
}
|
||||
this.vendorSet(box.style, {
|
||||
animationName: hidden ? 'none' : this.cachedAnimationName(box)
|
||||
});
|
||||
return box;
|
||||
};
|
||||
|
||||
WOW.prototype.vendors = ["moz", "webkit"];
|
||||
|
||||
WOW.prototype.vendorSet = function(elem, properties) {
|
||||
var name, results, value, vendor;
|
||||
results = [];
|
||||
for (name in properties) {
|
||||
value = properties[name];
|
||||
elem["" + name] = value;
|
||||
results.push((function() {
|
||||
var j, len, ref, results1;
|
||||
ref = this.vendors;
|
||||
results1 = [];
|
||||
for (j = 0, len = ref.length; j < len; j++) {
|
||||
vendor = ref[j];
|
||||
results1.push(elem["" + vendor + (name.charAt(0).toUpperCase()) + (name.substr(1))] = value);
|
||||
}
|
||||
return results1;
|
||||
}).call(this));
|
||||
}
|
||||
return results;
|
||||
};
|
||||
|
||||
WOW.prototype.vendorCSS = function(elem, property) {
|
||||
var j, len, ref, result, style, vendor;
|
||||
style = getComputedStyle(elem);
|
||||
result = style.getPropertyCSSValue(property);
|
||||
ref = this.vendors;
|
||||
for (j = 0, len = ref.length; j < len; j++) {
|
||||
vendor = ref[j];
|
||||
result = result || style.getPropertyCSSValue("-" + vendor + "-" + property);
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
WOW.prototype.animationName = function(box) {
|
||||
var animationName;
|
||||
try {
|
||||
animationName = this.vendorCSS(box, 'animation-name').cssText;
|
||||
} catch (_error) {
|
||||
animationName = getComputedStyle(box).getPropertyValue('animation-name');
|
||||
}
|
||||
if (animationName === 'none') {
|
||||
return '';
|
||||
} else {
|
||||
return animationName;
|
||||
}
|
||||
};
|
||||
|
||||
WOW.prototype.cacheAnimationName = function(box) {
|
||||
return this.animationNameCache.set(box, this.animationName(box));
|
||||
};
|
||||
|
||||
WOW.prototype.cachedAnimationName = function(box) {
|
||||
return this.animationNameCache.get(box);
|
||||
};
|
||||
|
||||
WOW.prototype.scrollHandler = function() {
|
||||
return this.scrolled = true;
|
||||
};
|
||||
|
||||
WOW.prototype.scrollCallback = function() {
|
||||
var box;
|
||||
if (this.scrolled) {
|
||||
this.scrolled = false;
|
||||
this.boxes = (function() {
|
||||
var j, len, ref, results;
|
||||
ref = this.boxes;
|
||||
results = [];
|
||||
for (j = 0, len = ref.length; j < len; j++) {
|
||||
box = ref[j];
|
||||
if (!(box)) {
|
||||
continue;
|
||||
}
|
||||
if (this.isVisible(box)) {
|
||||
this.show(box);
|
||||
continue;
|
||||
}
|
||||
results.push(box);
|
||||
}
|
||||
return results;
|
||||
}).call(this);
|
||||
if (!(this.boxes.length || this.config.live)) {
|
||||
return this.stop();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
WOW.prototype.offsetTop = function(element) {
|
||||
var top;
|
||||
while (element.offsetTop === void 0) {
|
||||
element = element.parentNode;
|
||||
}
|
||||
top = element.offsetTop;
|
||||
while (element = element.offsetParent) {
|
||||
top += element.offsetTop;
|
||||
}
|
||||
return top;
|
||||
};
|
||||
|
||||
WOW.prototype.isVisible = function(box) {
|
||||
var bottom, offset, top, viewBottom, viewTop;
|
||||
offset = box.getAttribute('data-wow-offset') || this.config.offset;
|
||||
viewTop = (this.config.scrollContainer && this.config.scrollContainer.scrollTop) || window.pageYOffset;
|
||||
viewBottom = viewTop + Math.min(this.element.clientHeight, this.util().innerHeight()) - offset;
|
||||
top = this.offsetTop(box);
|
||||
bottom = top + box.clientHeight;
|
||||
return top <= viewBottom && bottom >= viewTop;
|
||||
};
|
||||
|
||||
WOW.prototype.util = function() {
|
||||
return this._util != null ? this._util : this._util = new Util();
|
||||
};
|
||||
|
||||
WOW.prototype.disabled = function() {
|
||||
return !this.config.mobile && this.util().isMobile(navigator.userAgent);
|
||||
};
|
||||
|
||||
return WOW;
|
||||
|
||||
})();
|
||||
|
||||
}).call(this);
|
|
@ -4,15 +4,20 @@ title: 'Jenkins Community Blog'
|
|||
section: blog
|
||||
---
|
||||
|
||||
%div.container.blog-post.no-margin
|
||||
:ruby
|
||||
page_index = page.posts.current_page_index
|
||||
first_skip = false
|
||||
second_skip = false
|
||||
skip_window = 3
|
||||
|
||||
%div.container.blog-post
|
||||
.row.body
|
||||
.col-md-1
|
||||
%div#content.col-md-8{:class => 'main-content with-sidebar'}
|
||||
%div#content-top
|
||||
%h2
|
||||
= page.title
|
||||
|
||||
%div.blogintro
|
||||
.blogintro
|
||||
The Jenkins project has a lot going on between core/plugin development,
|
||||
events and other open source automation related activities. To keep up with
|
||||
it subscribe to our
|
||||
|
@ -26,7 +31,39 @@ section: blog
|
|||
follow us on Twitter
|
||||
|
||||
= partial('blogcardlist.html.haml', :posts => page.posts)
|
||||
= page.posts.links
|
||||
|
||||
%div#sidebar.col-md-3.events.vertical
|
||||
= partial('sidebar.html.haml')
|
||||
%div
|
||||
%nav
|
||||
%ul.pagination
|
||||
%li.page-item{:class => (page.posts.previous_page or 'disabled')}
|
||||
%a.page-link{:href => (page.posts.previous_page and page.posts.previous_page.url)}
|
||||
«
|
||||
- page.posts.pages.each_index do |index|
|
||||
- if index == 0
|
||||
%li.page-item{:class => ((page_index == index) and 'active')}
|
||||
%a.page-link{:href => expand_link('node')}
|
||||
= index + 1
|
||||
- elsif (index >= skip_window) && !first_skip
|
||||
- first_skip = true
|
||||
%li.page-item.disabled
|
||||
%a.page-link{:href => '#'}
|
||||
\...
|
||||
- elsif (( index >= (page_index + skip_window)) && (index < ((page.posts.pages.size - skip_window) - 1)) && !second_skip )
|
||||
- second_skip = true
|
||||
%li.page-item.disabled
|
||||
%a.page-link{:href => '#'}
|
||||
\...
|
||||
- elsif second_skip && ((index < (page.posts.pages.size - skip_window) - 1))
|
||||
- next
|
||||
- else
|
||||
%li.page-item{:class => ((page_index == index) and 'active')}
|
||||
%a.page-link{:href => expand_link("node/page/#{index + 1}.html")}
|
||||
= index + 1
|
||||
%li.page-item{:class => (page.posts.next_page or 'disabled')}
|
||||
%a.page-link{:href => (page.posts.next_page and page.posts.next_page.url)}
|
||||
»
|
||||
|
||||
|
||||
.col-md-4.events.vertical
|
||||
.content
|
||||
= partial('events.html.haml')
|
||||
|
|
|
@ -10,145 +10,146 @@ section: participate
|
|||
Welcome aboard!
|
||||
|
||||
|
||||
%div
|
||||
%div.col-lg-6
|
||||
%h2
|
||||
Participate
|
||||
.container
|
||||
.row
|
||||
.col-lg-6
|
||||
%h2
|
||||
Participate
|
||||
|
||||
%p
|
||||
As a participant, you take an active role in the community.
|
||||
%p
|
||||
As a participant, you take an active role in the community.
|
||||
|
||||
%h3
|
||||
Meet
|
||||
%p
|
||||
Meet other Jenkins users and share your experiences.
|
||||
%ul
|
||||
%li
|
||||
Organize or attend
|
||||
%a{:href => '/projects/jam/'}
|
||||
Jenkins Area Meetups.
|
||||
%li
|
||||
Attend other events with a Jenkins presence, like SCALE or FOSDEM.
|
||||
%h3
|
||||
Meet
|
||||
%p
|
||||
Meet other Jenkins users and share your experiences.
|
||||
%ul
|
||||
%li
|
||||
Organize or attend
|
||||
%a{:href => '/projects/jam/'}
|
||||
Jenkins Area Meetups.
|
||||
%li
|
||||
Attend other events with a Jenkins presence, like SCALE or FOSDEM.
|
||||
|
||||
%h3
|
||||
Help
|
||||
%p
|
||||
As an experienced user, you can help others get the most out of Jenkins.
|
||||
%ul
|
||||
%li
|
||||
%a{:href => '/mailing-lists'}
|
||||
jenkinsci-users mailing list
|
||||
%li
|
||||
%a{:href => '/chat'}
|
||||
\#jenkins IRC channel on Freenode
|
||||
%li
|
||||
%a{:href => 'https://reddit.com/r/jenkinsci'}
|
||||
\/r/jenkins on Reddit
|
||||
%li
|
||||
%a{:href => 'http://stackoverflow.com/tags/jenkins'}
|
||||
Jenkins on Stack Overflow
|
||||
%h3
|
||||
Help
|
||||
%p
|
||||
As an experienced user, you can help others get the most out of Jenkins.
|
||||
%ul
|
||||
%li
|
||||
%a{:href => '/mailing-lists'}
|
||||
jenkinsci-users mailing list
|
||||
%li
|
||||
%a{:href => '/chat'}
|
||||
\#jenkins IRC channel on Freenode
|
||||
%li
|
||||
%a{:href => 'https://reddit.com/r/jenkinsci'}
|
||||
\/r/jenkins on Reddit
|
||||
%li
|
||||
%a{:href => 'http://stackoverflow.com/tags/jenkins'}
|
||||
Jenkins on Stack Overflow
|
||||
|
||||
%h3
|
||||
Discuss
|
||||
%ul
|
||||
%li
|
||||
%a{:href => '/mailing-lists'}
|
||||
Mailing lists
|
||||
%li
|
||||
%a{:href => '/chat'}
|
||||
IRC channels
|
||||
%h3
|
||||
Discuss
|
||||
%ul
|
||||
%li
|
||||
%a{:href => '/mailing-lists'}
|
||||
Mailing lists
|
||||
%li
|
||||
%a{:href => '/chat'}
|
||||
IRC channels
|
||||
|
||||
%h3
|
||||
Review changes
|
||||
%p
|
||||
Help review changes to code or documentation.
|
||||
%ul
|
||||
%li
|
||||
%a{:href => 'https://github.com/pulls?utf8=%E2%9C%93&q=is%3Aopen+is%3Apr+team%3Ajenkinsci%2Fcode-reviewers'}
|
||||
List of open pull requests for which
|
||||
%strong
|
||||
code reviews
|
||||
have been requested
|
||||
%li
|
||||
%a{:href => 'https://github.com/pulls?utf8=%E2%9C%93&q=is%3Aopen+is%3Apr+team%3Ajenkins-infra%2Fcopy-editors'}
|
||||
List of open pull requests for which
|
||||
%strong
|
||||
copy editing
|
||||
has been requested
|
||||
%h3
|
||||
Review changes
|
||||
%p
|
||||
Help review changes to code or documentation.
|
||||
%ul
|
||||
%li
|
||||
%a{:href => 'https://github.com/pulls?utf8=%E2%9C%93&q=is%3Aopen+is%3Apr+team%3Ajenkinsci%2Fcode-reviewers'}
|
||||
List of open pull requests for which
|
||||
%strong
|
||||
code reviews
|
||||
have been requested
|
||||
%li
|
||||
%a{:href => 'https://github.com/pulls?utf8=%E2%9C%93&q=is%3Aopen+is%3Apr+team%3Ajenkins-infra%2Fcopy-editors'}
|
||||
List of open pull requests for which
|
||||
%strong
|
||||
copy editing
|
||||
has been requested
|
||||
|
||||
%h3
|
||||
Provide feedback
|
||||
%p
|
||||
We cannot fix what we don't know is broken. So let us know about it!
|
||||
%ul
|
||||
%li
|
||||
%a{:href => 'https://wiki.jenkins-ci.org/display/JENKINS/How+to+report+an+issue'}
|
||||
How to report an issue in Jenkins
|
||||
%li
|
||||
The
|
||||
%a{:href => '/changelog'}
|
||||
changelog
|
||||
has an integrated feedback mechanism. Just select
|
||||
%em
|
||||
Community ratings
|
||||
and vote using the weather icons.
|
||||
%li
|
||||
Likewise, the
|
||||
%a{:href => '/changelog-stable'}
|
||||
LTS changelog
|
||||
provides the same functionality.
|
||||
%h3
|
||||
Provide feedback
|
||||
%p
|
||||
We cannot fix what we don't know is broken. So let us know about it!
|
||||
%ul
|
||||
%li
|
||||
%a{:href => 'https://wiki.jenkins-ci.org/display/JENKINS/How+to+report+an+issue'}
|
||||
How to report an issue in Jenkins
|
||||
%li
|
||||
The
|
||||
%a{:href => '/changelog'}
|
||||
changelog
|
||||
has an integrated feedback mechanism. Just select
|
||||
%em
|
||||
Community ratings
|
||||
and vote using the weather icons.
|
||||
%li
|
||||
Likewise, the
|
||||
%a{:href => '/changelog-stable'}
|
||||
LTS changelog
|
||||
provides the same functionality.
|
||||
|
||||
%div.col-lg-6
|
||||
%h2
|
||||
Contribute
|
||||
.col-lg-6
|
||||
%h2
|
||||
Contribute
|
||||
|
||||
%p
|
||||
As a contributor, you actively help improve Jenkins and plugins by contributing code, documentation, translations, or tests.
|
||||
%p
|
||||
As a contributor, you actively help improve Jenkins and plugins by contributing code, documentation, translations, or tests.
|
||||
|
||||
%h3
|
||||
Write code
|
||||
%p
|
||||
Do you enjoy writing code? There are numerous plugins and components for you to contribute to.
|
||||
%a{:href => 'code'}
|
||||
Learn more.
|
||||
%p
|
||||
Are you an established contributor to Jenkins and looking for a new challenge?
|
||||
The Jenkins Security Team is looking for members willing to help improve Jenkins security.
|
||||
%a{:href => '/security#team'}
|
||||
Learn more.
|
||||
%h3
|
||||
Write code
|
||||
%p
|
||||
Do you enjoy writing code? There are numerous plugins and components for you to contribute to.
|
||||
%a{:href => 'code'}
|
||||
Learn more.
|
||||
%p
|
||||
Are you an established contributor to Jenkins and looking for a new challenge?
|
||||
The Jenkins Security Team is looking for members willing to help improve Jenkins security.
|
||||
%a{:href => '/security#team'}
|
||||
Learn more.
|
||||
|
||||
%h3
|
||||
Translate
|
||||
%p
|
||||
Jenkins is used all over the world by speakers of dozens of different languages. If you're fluent in languages other than English, consider improving support for those languages
|
||||
%a{:href => 'https://wiki.jenkins-ci.org/display/JENKINS/Internationalization'}
|
||||
by contributing to core or plugin localizations.
|
||||
%h3
|
||||
Translate
|
||||
%p
|
||||
Jenkins is used all over the world by speakers of dozens of different languages. If you're fluent in languages other than English, consider improving support for those languages
|
||||
%a{:href => 'https://wiki.jenkins-ci.org/display/JENKINS/Internationalization'}
|
||||
by contributing to core or plugin localizations.
|
||||
|
||||
%h3
|
||||
Document
|
||||
%p
|
||||
Improve the documentation of Jenkins and plugins to make it easier for others to get started.
|
||||
%h3
|
||||
Document
|
||||
%p
|
||||
Improve the documentation of Jenkins and plugins to make it easier for others to get started.
|
||||
|
||||
%ul
|
||||
%li
|
||||
We coordinate and discuss documenting efforts using the
|
||||
%a{:href => 'https://groups.google.com/forum/#!forum/jenkinsci-docs'}
|
||||
jenkinsci-docs
|
||||
mailing list and the
|
||||
%a{:href => '/chat/'}
|
||||
\#jenkins-community IRC channel.
|
||||
%li
|
||||
%a{:href => 'https://github.com/jenkins-infra/jenkins.io/blob/master/CONTRIBUTING.adoc#adding-documentation'}
|
||||
Learn how to contribute documentation to jenkins.io
|
||||
%ul
|
||||
%li
|
||||
We coordinate and discuss documenting efforts using the
|
||||
%a{:href => 'https://groups.google.com/forum/#!forum/jenkinsci-docs'}
|
||||
jenkinsci-docs
|
||||
mailing list and the
|
||||
%a{:href => '/chat/'}
|
||||
\#jenkins-community IRC channel.
|
||||
%li
|
||||
%a{:href => 'https://github.com/jenkins-infra/jenkins.io/blob/master/CONTRIBUTING.adoc#adding-documentation'}
|
||||
Learn how to contribute documentation to jenkins.io
|
||||
|
||||
%h3
|
||||
Test
|
||||
%p
|
||||
The Jenkins project relies heavily on automated tests to ensure stability and consistency of features. By contributing automated tests that match your use cases, you can help prevent regressions that would affect you.
|
||||
%ul
|
||||
%li
|
||||
%a{:href => 'https://github.com/jenkinsci/acceptance-test-harness'}
|
||||
Acceptance Test Harness (ATH) on GitHub
|
||||
%li
|
||||
%a{:href => 'https://github.com/jenkinsci/jenkins-test-harness'}
|
||||
Jenkins Unit Test Harness on GitHub
|
||||
%h3
|
||||
Test
|
||||
%p
|
||||
The Jenkins project relies heavily on automated tests to ensure stability and consistency of features. By contributing automated tests that match your use cases, you can help prevent regressions that would affect you.
|
||||
%ul
|
||||
%li
|
||||
%a{:href => 'https://github.com/jenkinsci/acceptance-test-harness'}
|
||||
Acceptance Test Harness (ATH) on GitHub
|
||||
%li
|
||||
%a{:href => 'https://github.com/jenkinsci/jenkins-test-harness'}
|
||||
Jenkins Unit Test Harness on GitHub
|
||||
|
|
|
@ -4,6 +4,7 @@ title: "Jenkins Press Information"
|
|||
section: press
|
||||
---
|
||||
|
||||
:toc:
|
||||
|
||||
If you're a journalist, blogger or anybody else who might consider themselves
|
||||
"press" this page should help you refer to, explain or otherwise cite the
|
||||
|
@ -78,6 +79,62 @@ to be used over the `headshot.png` image.
|
|||
|
||||
If you have any questions about artwork, please ask one of the <<Press Contacts>>.
|
||||
|
||||
== About Blue Ocean
|
||||
|
||||
.Elevator Pitch
|
||||
""
|
||||
Blue Ocean is a new user experience for Jenkins based on a personalizable,
|
||||
modern design that allows users to graphically create, visualize and diagnose
|
||||
Continuous Delivery (CD) Pipelines
|
||||
""
|
||||
|
||||
=== Screenshots
|
||||
|
||||
.Pipeline Editor
|
||||
|
||||
""
|
||||
Developers of any skill level can create Continuous Delivery pipelines from start to finish using the intuitive and visual pipeline editor.
|
||||
""
|
||||
image:/images/blueocean/press/pipeline-editor.png[Editor, role=center]
|
||||
image:/images/blueocean/press/pipeline-editor-step.png[Editor with open step, role=center]
|
||||
|
||||
.Pipeline visualization
|
||||
""
|
||||
Enables developers to visually represent pipelines in a way even their boss's boss can understand, improving clarity into the CD process for the whole organization
|
||||
""
|
||||
image:/images/blueocean/press/pipeline-visualization.png[Pipeline visualization, role=center]
|
||||
|
||||
.Pipeline diagnosis
|
||||
""
|
||||
Developers locate automation problems instantly without endlessly scanning through logs or navigating through many screens.
|
||||
""
|
||||
image:/images/blueocean/press/pipeline-diagnosis.png[Pipeline diagnosis, role=center]
|
||||
|
||||
.Personalized dashboard
|
||||
|
||||
""
|
||||
Developers can make Jenkins their own by customizing their dashboard so that they only see the Pipelines that matter to them.
|
||||
""
|
||||
image:/images/blueocean/press/personalization.png[Personalized dashboard, role=center]
|
||||
|
||||
.Github integration
|
||||
|
||||
""
|
||||
Pipelines are run for all feature branches and pull requests, with their status reported back to Github, so the whole team knows if your changes need work or are good to go.
|
||||
""
|
||||
image:/images/blueocean/press/github-status.png[Github integration, role=center]
|
||||
|
||||
=== Video
|
||||
|
||||
Also available for download in link:https://www.dropbox.com/s/1824kdeh0czdgna/Blue_Ocean_01_End_Bumper.mov?dl=0[full high definition].
|
||||
++++
|
||||
<center>
|
||||
<iframe width="853" height="480"
|
||||
src="https://www.youtube-nocookie.com/embed/k_fVlU1FwP4?rel=0" frameborder="0"
|
||||
allowfullscreen></iframe>
|
||||
</center>
|
||||
++++
|
||||
|
||||
== Press Contacts
|
||||
|
||||
The following individuals can be reached out to for comment, clarification
|
||||
|
|
|
@ -1,324 +0,0 @@
|
|||
---
|
||||
layout: project
|
||||
title: "Blue Ocean"
|
||||
section: projects
|
||||
tags:
|
||||
- blueocean
|
||||
---
|
||||
|
||||
++++
|
||||
<style>
|
||||
.jumbotron.featured {
|
||||
background: #042E54 url(/images/post-images/blueocean/weather-icons.png) no-repeat center;
|
||||
background-size: cover;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
width: 100%;
|
||||
height: 160px;
|
||||
}
|
||||
</style>
|
||||
++++
|
||||
|
||||
Blue Ocean is a new project that rethinks the user experience of Jenkins.
|
||||
Designed from the ground up for Jenkins Pipeline and compatible with Freestyle
|
||||
jobs, Blue Ocean reduces clutter and increases clarity for every member of your
|
||||
team through the following key features:
|
||||
|
||||
* *Sophisticated visualizations* of CD pipelines, allowing for fast and intuitive comprehension of software pipeline status.
|
||||
* *Pipeline editor* (In Development) that makes automating CD pipelines approachable by guiding the user through an intuitive and visual process to create a pipeline.
|
||||
* *Personalization* of the Jenkins UI to suit the role-based needs of each member of the DevOps team.
|
||||
* *Pinpoint precision* when intervention is needed and/or issues arise. The Blue Ocean UI shows where in the pipeline attention is needed, facilitating exception handling and increasing productivity.
|
||||
* *Native integration for branch and pull requests* enables maximum developer productivity when collaborating on code with others in GitHub and Bitbucket.
|
||||
|
||||
== Use the beta
|
||||
Blue Ocean is available today as a plugin from the update center
|
||||
for Jenkins servers running Jenkins 2.7.x and above.
|
||||
|
||||
=== From Jenkins
|
||||
|
||||
To start using Blue Ocean from an existing Jenkins:
|
||||
|
||||
. Login to your Jenkins server
|
||||
. Click `Manage Jenkins` in the sidebar then `Manage Plugins`
|
||||
. Choose the `Available` tab and use the search bar to find `Blue Ocean beta`
|
||||
. Click the checkbox in the Install column
|
||||
. Click either `Install without restart` or `Download now and install after restart`
|
||||
. When installation is complete click the `Use Blue Ocean` button in the classic UI
|
||||
|
||||
=== From Docker
|
||||
|
||||
The Docker container is continuously updated to contain the latest Blue Ocean and Jenkins LTS releases.
|
||||
|
||||
To start a new Jenkins with Blue Ocean installed:
|
||||
. Install Docker
|
||||
. Run `docker run -p 8888:8080 jenkinsci/blueocean:latest`
|
||||
. Browse to `http://localhost:8888/blue`
|
||||
|
||||
== Join the community
|
||||
|
||||
There a a few ways you can join the community:
|
||||
|
||||
. Chat with the community and development team on Gitter image:https://badges.gitter.im/jenkinsci/blueocean-plugin.svg[link="https://gitter.im/jenkinsci/blueocean-plugin?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge"]
|
||||
. Request features or report bugs against the https://issues.jenkins-ci.org/[`blueocean-plugin` component in JIRA].
|
||||
. Subscribe and ask questions on the https://groups.google.com/forum/#!forum/jenkinsci-users[Jenkins Users mailing list].
|
||||
. Developer? We've https://issues.jenkins-ci.org/issues/?filter=16142[labeled a few issues] that are great for anyone wanting to get started developing Blue Ocean. Don't forget to drop by the Gitter chat and introduce yourself!
|
||||
|
||||
== Quick tour
|
||||
|
||||
Here is a quick tour of Blue Ocean.
|
||||
|
||||
image:/images/post-images/blueocean/pipeline-activity.png[Pipeline activity, role=center]
|
||||
|
||||
=== Pipelines
|
||||
|
||||
Blue Ocean is built from the ground up for Pipeline and uses its related concepts as a
|
||||
foundation to enable use cases that Jenkins hasn't handled before. The visualization
|
||||
makes it easy to follow along the flow of your Pipeline and gives you clarity
|
||||
into your Continuous Delivery processes.
|
||||
|
||||
image:/images/post-images/blueocean/successful-pipeline.png[Successful Pipeline, role=center]
|
||||
|
||||
We know many developers spend a lot of time staring at logs in Jenkins. That’s
|
||||
why we’ve broken up the log broken up step by step to make it much simpler to navigate.
|
||||
Gone are the days that we all spend scrolling through log files that are 10s of
|
||||
thousands or 100s of thousands of lines long.
|
||||
|
||||
When you open the pipeline visualisation you can immediately identify what
|
||||
problem that are causing the Pipeline to fail.
|
||||
|
||||
image:/images/post-images/blueocean/failing-pipeline.png[Successful Pipeline, role=center]
|
||||
|
||||
|
||||
=== Personalized Dashboard
|
||||
|
||||
The Personalized Dashboard surfaces a single developer the things that they care
|
||||
about so that they can work better with their team. It responds
|
||||
preemptively to your activity showing you the status of Pipelines that you are
|
||||
interested in.
|
||||
|
||||
If a developer favorites a Pipeline or one of its branches it will appear on the
|
||||
dashboard. Pipelines needed the developers attention, such as failing Pipelines,
|
||||
appear at the top of the dashboard.
|
||||
|
||||
And when the developer creates a branch in Git, Blue Ocean will automatically
|
||||
favourite it for them. When the branch is deleted the Pipeline's branch is
|
||||
removed from view.
|
||||
|
||||
image:/images/post-images/blueocean/personalized-dashboard.png[Personalized dashboard, role=center]
|
||||
|
||||
=== Branches and Pull Requests
|
||||
|
||||
Blue Ocean uses Jenkins Pipeline to discover new branches with `Jenkinsfile`s and
|
||||
runs them for you so that you are testing your Pipeline with every new feature
|
||||
branch that you create.
|
||||
|
||||
image:/images/post-images/blueocean/pipeline-branches.png[Branches, role=center]
|
||||
|
||||
If a developer opens a Pull Request against your repository, Jenkins will build it
|
||||
using your Pipeline and update Github or Bitbucket with the status of the Pipeline.
|
||||
This is extremely useful for reviewers of Pull Requests as successful Pipelines
|
||||
improve confidence that changes will integrate without causing havoc.
|
||||
|
||||
image:/images/post-images/blueocean/github-pipeline-status.png[Github Pipeline status, role=center]
|
||||
|
||||
=== Pipeline Editor (Coming Soon!)
|
||||
|
||||
The Pipeline Editor is the simplest way for anyone wanting to get started with
|
||||
creating Pipelines in Jenkins. It's also great way for advanced Jenkins users
|
||||
to start adopting Pipeline.
|
||||
|
||||
It allows developers to break up their Pipeline into different
|
||||
stages and parallelize tasks that can occur at the same time - its all up to you.
|
||||
When you are done authoring your Pipeline, the pipeline definition is saved back
|
||||
to your repository as a `Jenkinsfile`.
|
||||
|
||||
If you ever need to change the Pipeline again,
|
||||
the user interfaces allows you to jump back in into the editor to author the
|
||||
Pipeline at any time or you can do so in code by editing the `Jenkinsfile` directly.
|
||||
|
||||
image:/images/post-images/blueocean/pipeline-editor.png[Pipeline Editor, role=center]
|
||||
|
||||
|
||||
=== Design Language
|
||||
|
||||
Jenkins is nothing without its ecosystem of 1000+ plugins and we believe it's
|
||||
important that Blue Ocean brings them along for the ride. Most developers in
|
||||
our community don't consider themselves hot shot frontend developers or
|
||||
designers, that's why we are introducing a consistent design language and
|
||||
accompanying JavaScript and CSS framework. If you're familiar with Google's
|
||||
link:https://www.google.com/design/spec/material-design/introduction.html[Material
|
||||
Design], Twitter link:http://getbootstrap.com/[Bootstrap], Apple's
|
||||
link:https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/[Human
|
||||
Interface Guidelines] or Microsoft
|
||||
link:https://msdn.microsoft.com/en-us/library/windows/apps/hh465424.aspx[Modern
|
||||
UI] you will be right at home here.
|
||||
|
||||
For those curious about the technology stack here, we are working with a
|
||||
combination of
|
||||
link:https://medium.com/sons-of-javascript/javascript-an-introduction-to-es6-1819d0d89a0f#.72c3e6snq[ES6]
|
||||
and
|
||||
link:https://medium.com/@tomastrajan/introduction-to-react-and-flux-6043d63610cd#.stjh5un3g[React]
|
||||
which we believe will be provide a smooth learning experience for those strong
|
||||
in Java skills but not so confident in CSS/JS. React's component based way of
|
||||
describing user interfaces also complements the way that Jenkins Extensibility
|
||||
works. We've extended the plugin system and toolchain to work with React
|
||||
components.
|
||||
|
||||
image:/images/post-images/blueocean/jdl.png[Jenkins Design Language, role=center]
|
||||
|
||||
== Videos
|
||||
|
||||
=== Introducing Blue Ocean
|
||||
|
||||
++++
|
||||
<center>
|
||||
<iframe width="853" height="480"
|
||||
src="https://www.youtube-nocookie.com/embed/3dITffteCD4?rel=0" frameborder="0"
|
||||
allowfullscreen></iframe>
|
||||
</center>
|
||||
++++
|
||||
|
||||
=== Jenkins World 2016
|
||||
|
||||
++++
|
||||
<center>
|
||||
<iframe width="853" height="480"
|
||||
src="https://www.youtube-nocookie.com/embed/mn61VFdScuk?rel=0" frameborder="0"
|
||||
allowfullscreen></iframe>
|
||||
</center>
|
||||
++++
|
||||
|
||||
== FAQ
|
||||
|
||||
=== Why does this project exist?
|
||||
|
||||
The world has moved on from developer tools that are purely functional to
|
||||
developer tools being part of a "developer experience". That is to say, it's no
|
||||
longer about a single tool but the many tools developers use throughout the day
|
||||
and how they work together to achieve a workflow that's beneficial for the
|
||||
developer - this is Developer Experience.
|
||||
|
||||
Developer tools companies like Heroku, Atlassian and Github have raised the bar
|
||||
for what is considered good developer experience, and developers are
|
||||
increasingly expecting exceptional design. In recent years developers are
|
||||
becoming more rapidly attracted to tools that are not only functional but are
|
||||
designed to fit into their workflow seamlessly and are a joy to use. This shift
|
||||
represents a higher standard of design and user experience that Jenkins needs
|
||||
to rise to meet.
|
||||
|
||||
Creating and visualising continuous delivery pipelines is something valuable
|
||||
for many Jenkins users and this is demonstrated in the 5+ plugins that the
|
||||
community has created to meet their needs. To us this indicates a need to
|
||||
revisit how Jenkins currently expresses these concepts and consider delivery
|
||||
pipelines as a central theme to the Jenkins user experience.
|
||||
|
||||
It's not just continuous delivery concepts but the tools that developers use
|
||||
every day – Github, Bitbucket, Slack, HipChat, Puppet or Docker. It's about
|
||||
more than Jenkins – it's the developer workflow that surrounds Jenkins that
|
||||
spans multiple tools.
|
||||
|
||||
New teams have little time for learning to assemble their own Jenkins
|
||||
experience – they want to improve their time to market by shipping better
|
||||
software faster. Assembling that ideal Jenkins experience is something we can
|
||||
work together as a community of Jenkins users and contributors to define. As
|
||||
time progresses, developers' expectations of good user experience will change
|
||||
and the mission of Blue Ocean will enable the Jenkins project to respond.
|
||||
|
||||
The Jenkins community has poured its sweat and tears into building the most
|
||||
technically capable and extensible software automation tool in existence. Not
|
||||
doing anything to revolutionize the Jenkins developer experience today is just
|
||||
inviting someone else – in closed source – to do it.
|
||||
|
||||
=== Where is the name from?
|
||||
|
||||
The name Blue Ocean comes from the book
|
||||
link:https://en.wikipedia.org/wiki/Blue_Ocean_Strategy[Blue Ocean Strategy]
|
||||
where instead of looking at strategic problems within a contested space you
|
||||
look at problems in the larger uncontested space. To put this more simply,
|
||||
consider this quote from ice hockey legend Wayne Gretzky: "skate to where the
|
||||
puck is going to be, not where it has been".
|
||||
|
||||
=== Where can I find the source code?
|
||||
|
||||
The source code can be found on Github:
|
||||
|
||||
* link:http://github.com/jenkinsci/blueocean-plugin[Blue Ocean]
|
||||
* link:http://github.com/jenkinsci/jenkins-design-language[Jenkins Design Language]
|
||||
|
||||
|
||||
=== How will Jenkins users consume the Blue Ocean UI?
|
||||
|
||||
Blue Ocean is packaged as a plugin and made available for installation via
|
||||
the update center. The aim is to deliver it without modifying your existing
|
||||
Jenkins configuration so you can run it side by side with the classic Jenkins
|
||||
UI and switch between the two whenever you like.
|
||||
|
||||
=== What does this mean for the classic Jenkins UI?
|
||||
|
||||
The intention is that as Blue Ocean matures there will be less and less reasons
|
||||
for users to go back to the existing UI.
|
||||
|
||||
For example, in the first version we will mainly be targeting Pipeline jobs.
|
||||
You might be able to see your existing non-pipeline jobs in Blue Ocean but it
|
||||
might not be possible to configure them from the new UI for some time. This
|
||||
means users will have to jump back to the classic UI for configuration of
|
||||
non-pipeline jobs.
|
||||
|
||||
There are likely going to be more examples of this and that's why the classic
|
||||
UI will still be important in the long term.
|
||||
|
||||
=== What about my Freestyle jobs?
|
||||
|
||||
Blue Ocean aims to deliver a great experience around Pipeline and be compatible
|
||||
with any Freestyle jobs that you have configured in your system. However, they
|
||||
won't be able to benefit from any of the features built for Pipelines – for
|
||||
example, Pipeline visualization.
|
||||
|
||||
As Blue Ocean is designed to be extensible it will be possible for the
|
||||
community to extend it for other job types in the future.
|
||||
|
||||
=== Is this a CloudBees project?
|
||||
|
||||
|
||||
The short answer is *"no"*. The project has been originated and sponsored by
|
||||
CloudBees, but it is a *100% open project* (including sources, roadmaps, public
|
||||
discussions, etc.). Everybody is invited to contribute to it.
|
||||
|
||||
To quote link:https://github.com/i386[James Dumay] (Blue Ocean Product Manager
|
||||
at CloudBees):
|
||||
|
||||
____
|
||||
While the project's inception has happened within CloudBees we see this project
|
||||
being one owned by the community. At CloudBees we recognize the importance of a
|
||||
vibrant and healthy Jenkins community, we see the company and community working
|
||||
in symbiosis: a thriving developer community is good for CloudBees and CloudBees
|
||||
provides time and money back into the community to make it stronger. Blue Ocean
|
||||
is our way of giving back and strengthening. To that effect we've put together a
|
||||
new a team of product, UX, frontend and backend developers (some old faces and a
|
||||
lot of new ones!) that will be working on this project with the community full
|
||||
time
|
||||
____
|
||||
|
||||
|
||||
=== What does this mean for my plugins?
|
||||
|
||||
Extensibility is a pretty core concept to Jenkins, so being able to extend the
|
||||
Blue Ocean UI is important. Based on some research, we worked out a way to
|
||||
allow "<ExtensionPoint name=..>" to be used in the markup of Blue Ocean,
|
||||
leaving places for plugins to contribute to the UI (plugins can have their own
|
||||
Blue Ocean extension points, just like they do today in Jenkins). Blue Ocean
|
||||
itself (as it is so far) is implemented using these extension points.
|
||||
Extensions are delivered by plugins, as normal, only if they wish to contribute
|
||||
to the Blue Ocean experience they will have some additional javascript that
|
||||
provides extensions.
|
||||
|
||||
=== What technologies are currently in use?
|
||||
|
||||
Blue Ocean is built as a collection of Jenkins plugins itself. There is one key
|
||||
difference, however. It provides both its own endpoint for http requests and
|
||||
delivers up html/javascript via a different path, without the existing Jenkins
|
||||
UI markup/scripts. React.js and ES6 are used to deliver the javascript
|
||||
components of Blue Ocean. Inspired by this excellent open source project
|
||||
(link:https://nylas.com/blog/react-plugins[react-plugins]) an <ExtensionPoint>pattern was
|
||||
established, that allows extensions to come from any Jenkins plugin (only with
|
||||
Javascript) and should they fail to load, have failures isolated.
|
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 6.5 KiB |
After Width: | Height: | Size: 74 KiB |
After Width: | Height: | Size: 898 B |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 77 KiB |
After Width: | Height: | Size: 88 KiB |
|
@ -0,0 +1,162 @@
|
|||
---
|
||||
layout: default
|
||||
title: Blue Ocean
|
||||
css:
|
||||
- '/assets/bower/bootstrap/css/bootstrap.min.css'
|
||||
- '/css/blueocean-animate.css'
|
||||
- '/css/blueocean-style.css'
|
||||
opengraph:
|
||||
image: 'img/blueocean.gif'
|
||||
---
|
||||
|
||||
%header#header.header
|
||||
.skew
|
||||
.container.wow.fadeIn{"data-wow-delay" => "0.5s"}
|
||||
.row
|
||||
.header-inner.col-lg-12
|
||||
.logo
|
||||
= partial('logo.html.haml')
|
||||
%h1.intro-title
|
||||
%span>
|
||||
Introducing
|
||||
Jenkins Blue Ocean 1.0
|
||||
%a.btn.btn-secondary{:href => expand_link('doc/book/blueocean')}
|
||||
Documentation
|
||||
%a.btn.btn-primary{:href => expand_link('doc/book/blueocean')}
|
||||
Get started
|
||||
|
||||
%section.intro.wow.fadeInUp{"data-wow-delay" => "0.7s"}
|
||||
.container
|
||||
.row
|
||||
.col-xs-12.col-sm-11.col-lg-10.col-xl-9
|
||||
%a.video{"data-target" => "#videoModal", "data-toggle" => "modal", "data-video" => "https://www.youtube.com/embed/k_fVlU1FwP4"}
|
||||
%video{:autoplay => "", :loop => "", :muted => "", :poster => "img/video.png"}
|
||||
%source{:src => "img/video.webm", :type => "video/webm"}
|
||||
%source{:src => "img/video.mp4", :type => "video/mp4"}
|
||||
%span.ion-play
|
||||
.col-xs-12.col-sm-10.push-sm-2.col-md-8.push-md-4.col-lg-5.push-lg-7
|
||||
.introblurb.wow.fadeInUp{"data-wow-delay" => "0.1s"}
|
||||
%h2 Continous Delivery is no longer for the experts
|
||||
%p Thats why we’ve built Blue Ocean; the continuous delivery tool for teams just like yours.
|
||||
%p
|
||||
It’s a brand new way to use Jenkins that even your boss’s boss can understand.
|
||||
%span.emoji 😉
|
||||
%span.emoji 🙌
|
||||
%a.btn.btn-secondary{:href => expand_link('doc/book/blueocean'), :role => "button"} Get started
|
||||
%section.features
|
||||
.container
|
||||
.row
|
||||
.col-xl-10.push-xl-1
|
||||
.featuresblurb.col-md-10.push-md-1.col-lg-8.push-lg-2
|
||||
%h2 Continuous Delivery for every team
|
||||
%p Blue Ocean puts Continuous Delivery in reach of any team without sacrificing the power and sophistication of Jenkins.
|
||||
%br/
|
||||
.row
|
||||
.col-lg-4.col-md-6.col-sm-6.wow.fadeIn{"data-wow-delay" => "0.1s"}
|
||||
.icon
|
||||
%span.ion-edit
|
||||
%h3 Visual Pipeline Editor
|
||||
%p.smaller Create your first Continuous Delivery pipeline from start to finish.
|
||||
.col-lg-4.col-md-6.col-sm-6.wow.fadeIn{"data-wow-delay" => "0.2s"}
|
||||
.icon
|
||||
%span.ion-eye
|
||||
%h3 Pipeline visualization
|
||||
%p.smaller
|
||||
Visually represent pipelines so that even your boss’s boss can understand.
|
||||
.clearfix.hidden-lg-up
|
||||
.col-lg-4.col-md-6.col-sm-6.wow.fadeIn{"data-wow-delay" => "0.3s"}
|
||||
.icon
|
||||
%span.ion-ios-pulse-strong
|
||||
%h3 Diagnosis
|
||||
%p.smaller
|
||||
Diagnose problems instantly and say
|
||||
%br.hidden-lg-down/
|
||||
%em good-riddance
|
||||
to endlessly scanning through logs.
|
||||
.clearfix.hidden-md-down
|
||||
.col-lg-4.col-md-6.col-sm-6.wow.fadeIn{"data-wow-delay" => "0.4s"}
|
||||
.icon
|
||||
%span.ion-social-github
|
||||
%h3 Github & Git
|
||||
%p.smaller Run the pipleine for every feature branch and pull request.
|
||||
.clearfix.hidden-lg-up
|
||||
.col-lg-4.col-md-6.col-sm-6.wow.fadeIn{"data-wow-delay" => "0.5s"}
|
||||
.icon
|
||||
%span.ion-person
|
||||
%h3 Personalization
|
||||
%p.smaller Customize your dashboard so that you only see pipelines that matter to you.
|
||||
.col-lg-4.col-md-6.col-sm-6.wow.fadeIn{"data-wow-delay" => "0.6s"}
|
||||
.icon
|
||||
%svg{:height => "24px", :version => "1.1", :viewbox => "0 0 24 24", :width => "24px", :xmlns => "http://www.w3.org/2000/svg", "xmlns:xlink" => "http://www.w3.org/1999/xlink"}
|
||||
%path#Combined-Shape{:d => "M7.38341175,23.0798118 C3.04752489,21.2711041 0,16.9914458 0,12 C0,5.372583 5.372583,0 12,0 C18.627417,0 24,5.372583 24,12 C24,16.9914458 20.9524751,21.2711041 16.6165883,23.0798118 L13.5388628,15.6932706 C14.9841584,15.090368 16,13.6638153 16,12 C16,9.790861 14.209139,8 12,8 C9.790861,8 8,9.790861 8,12 C8,13.6638153 9.01584163,15.090368 10.4611372,15.6932706 L7.38341175,23.0798118 Z", :fill => "#000000", "fill-rule" => "evenodd", :stroke => "none"}
|
||||
%h3 100% Open Source
|
||||
%p.smaller
|
||||
Blue Ocean is 100% free and open source software. Yup, you heard right —
|
||||
%em free!
|
||||
%section.props
|
||||
.skew
|
||||
.container
|
||||
.row
|
||||
.col-lg-4.col-md-6.wow.fadeIn{"data-wow-delay" => "0.2s"}
|
||||
%blockquote.twitter-tweet{"data-cards" => "hidden", "data-lang" => "en"}
|
||||
%p{:dir => "ltr", :lang => "en"}>
|
||||
I've just been testing
|
||||
%a{:href => "https://twitter.com/jenkinsci"} @jenkinsci
|
||||
with the new UI/UX. Awesome! Very good job! Creating pipelines is now dead simple.
|
||||
%a{:href => "https://t.co/dSFlauhpxd"} pic.twitter.com/dSFlauhpxd
|
||||
—
|
||||
Jochen Breuer (@mr_brejoc)
|
||||
%a{:href => "https://twitter.com/mr_brejoc/status/846108945794191361"} March 26, 2017
|
||||
.col-lg-4.col-md-6.wow.fadeIn{"data-wow-delay" => "0.4s"}
|
||||
%blockquote.twitter-tweet{"data-conversation" => "none", "data-lang" => "en"}
|
||||
%p{:dir => "ltr", :lang => "en"}>
|
||||
%a{:href => "https://twitter.com/i386"} @i386
|
||||
blue ocean is life 👌🏻 you have made work fun again
|
||||
— Gabriel Csapo (@gabriel_csapo)
|
||||
%a{:href => "https://twitter.com/gabriel_csapo/status/845506373785796608"} March 25, 2017
|
||||
.col-lg-4.hidden-md-down.wow.fadeIn{"data-wow-delay" => "0.6s"}
|
||||
%blockquote.twitter-tweet{"data-lang" => "en"}
|
||||
%p{:dir => "ltr", :lang => "en"}>
|
||||
%a{:href => "https://twitter.com/hashtag/blueocean?src=hash"} #blueocean
|
||||
is going to change the way you use
|
||||
%a{:href => "https://twitter.com/jenkinsci"} @jenkinsci
|
||||
%a{:href => "https://twitter.com/hashtag/ModernUI?src=hash"} #ModernUI
|
||||
%a{:href => "https://t.co/bD4qaOGQLs"} https://t.co/bD4qaOGQLs
|
||||
— Mario Cruz (@mariocruz)
|
||||
%a{:href => "https://twitter.com/mariocruz/status/736250745725550593"} May 27, 2016
|
||||
%section.cta
|
||||
.container
|
||||
.row
|
||||
.col-md-10.push-md-1.col-lg-8.push-lg-2.col-xl-6.push-xl-3.wow.fadeIn{"data-wow-delay" => "0.3s"}
|
||||
%h2 Continuous Delivery shouldn’t be hard
|
||||
%p
|
||||
Blue Ocean focuses on the needs of regular developers
|
||||
= succeed "." do
|
||||
%em just like you
|
||||
%p We do all the hard work making things simple so you can get back to building your next big thing.
|
||||
%a.btn.btn-secondary{:href => "#", :role => "button"} Get started
|
||||
.socials.wow.fadeIn{"data-wow-delay" => "4s", "data-wow-duration" => ".5s"}
|
||||
%a.socialLinks.socialsFacebook{:href => "https://www.facebook.com/sharer/sharer.php?u=https%3A//jenkins.io/projects/blueocean/", :onclick => "doyourthang(this); return false;", :target => "_blank"}
|
||||
%i.icon.ion-social-facebook
|
||||
%p.socialLabel Share
|
||||
%a.socialLinks.socialsTwitter{:href => "https://twitter.com/share?url=http%3A%2F%2Fjenkins.io/projects/blueocean/&\r\n related=jenkinsci%2Ccloudbees&hashtags=jenkinsci,devops&text=Introducing%20Jenkins%20Blue%20Ocean%201.0%20%E2%80%93%20Continuous%20Delivery%20for%20every%20team.", :onclick => "doyourthang(this); return false;", :target => "_blank"}
|
||||
%i.icon.ion-social-twitter
|
||||
%p.socialLabel Share
|
||||
%a.socialLinks.socialsLinkedin{:href => "https://www.linkedin.com/shareArticle?mini=true&url=http%3A//jenkins.io/projects/blueocean/&title=Introducing%20Jenkins%20Blue%20Ocean%201.0&summary=Jenkins%20Blue%20Ocean%20%E2%80%93%20Continuous%20Delivery%20for%20every%20team&source=", :onclick => "doyourthang(this); return false;", :target => "_blank"}
|
||||
%i.icon.ion-social-linkedin
|
||||
%p.socialLabel Share
|
||||
#videoModal.modal.fade{"aria-hidden" => "true", "aria-labelledby" => "myModalLabel", :role => "dialog", :tabindex => "-1"}
|
||||
.modal-dialog.modal-lg
|
||||
.modal-content
|
||||
.modal-body
|
||||
%button.close{"aria-label" => "Close", "data-dismiss" => "modal", :type => "button"}
|
||||
%span{"aria-hidden" => "true"}
|
||||
%i.icon.ion-ios-close-outline
|
||||
%iframe{:allowfullscreen => "", :frameborder => "0", :height => "490", :src => "", :width => "100%"}
|
||||
|
||||
|
||||
|
||||
%script{:src => expand_link('js/wow.js'), :type => "text/javascript"}
|
||||
:javascript
|
||||
new WOW().init();
|
||||
%script{:charset => "utf-8", :src => expand_link('js/blueocean-landing-script.js')}
|
|
@ -27,7 +27,7 @@ plugins which effortlessly retain the look and feel of the Blue Ocean user
|
|||
experience.
|
||||
|
||||
|
||||
link:/projects/blueocean[*Learn more*]
|
||||
link:blueocean[*Learn more*]
|
||||
|
||||
---
|
||||
|
||||
|
@ -48,7 +48,7 @@ in completing their summer projects.
|
|||
The Jenkins project participated in the Google Summer of Code 2016 with
|
||||
link:https://summerofcode.withgoogle.com/organizations/5668199471251456/[five student projects].
|
||||
|
||||
link:/projects/gsoc[*Learn more*]
|
||||
link:gsoc[*Learn more*]
|
||||
|
||||
---
|
||||
|
||||
|
@ -66,7 +66,7 @@ developed to make the development of Jenkins core and plugins more efficient.
|
|||
There are various sub-groups and opportunities to contribute to the
|
||||
link:https://github.com/jenkins-infra[Jenkins project's infrastructure].
|
||||
|
||||
link:/projects/infrastructure[*Learn more*]
|
||||
link:infrastructure[*Learn more*]
|
||||
|
||||
---
|
||||
|
||||
|
@ -86,6 +86,6 @@ Jenkins Area Meetups are driven by local organizers but receive support from
|
|||
the Jenkins project via swag (stickers, etc), promotion, and help bootstrapping
|
||||
and operating the meetup group.
|
||||
|
||||
link:/projects/jam[*Learn more*]
|
||||
link:jam[*Learn more*]
|
||||
|
||||
---
|
||||
|
|