diff --git a/docs/404.html b/docs/404.html new file mode 100644 index 00000000..d8c28b72 --- /dev/null +++ b/docs/404.html @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + +404 Page not found | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+ +
+
+

Not found

+

Oops! This page doesn't exist. Try going back to our home page.

+ +

You can learn how to make a 404 page like this in Custom 404 Pages.

+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/about/index.html b/docs/about/index.html new file mode 100644 index 00000000..baa33a98 --- /dev/null +++ b/docs/about/index.html @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + +What's the Jenkins Operator? | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+ + + + + + + + +
+
+ +
+jenkins-operator is a Kubernetes native operator which fully manages Jenkins on Kubernetes.
It was built with immutability and declarative configuration as code in mind. +
+
+
+
+ + + + + + + + +
+
+
+ +
+ Logo +
+
+

The main reason why we decided to write the jenkins-operator is the fact that we faced a lot of problems with standard Jenkins deployment. We want to make Jenkins more robust, suitable for dynamic and multi-tenant environments.

+

+
+ Some of the problems we want to solve: +

    +
  • Volumes handling (AWS EBS volume attach/detach issue when using PVC)
  • +
  • Installing plugins with incompatible versions or security vulnerabilities
  • +
  • Better configuration as code
  • +
  • Lack of end to end tests
  • +
  • Handle graceful shutdown properly
  • +
  • Security and hardening out of the box
  • +
  • Orphaned jobs with no jnlp connection
  • +
  • Make errors more visible for end users
  • +
  • Backup and restore for jobs history
  • +
+

+ +
+
+
+
+ + + +
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/about/index.xml b/docs/about/index.xml new file mode 100644 index 00000000..b0b8993a --- /dev/null +++ b/docs/about/index.xml @@ -0,0 +1,22 @@ + + + Jenkins Operator – What's the Jenkins Operator? + /about/ + Recent Hugo news from gohugo.io + Hugo -- gohugo.io + + /img/hugo.png + GoHugo.io + /about/ + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/blog/2018/01/04/another-great-release/index.html b/docs/blog/2018/01/04/another-great-release/index.html new file mode 100644 index 00000000..2bad70c5 --- /dev/null +++ b/docs/blog/2018/01/04/another-great-release/index.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + + + + + + + + + + +Another Great Release | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Another Great Release | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ +
+ + RSS + + +
+

Another Great Release

+
A short lead descripton about this content page. Text here can also be bold or italic and can even be split over multiple paragraphs.
+ + + +

Text can be bold, italic, or strikethrough. Links should be blue with no underlines (unless hovered over).

+ +

There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs.

+ +

There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs.

+ +
+

There should be no margin above this first sentence.

+ +

Blockquotes should be a lighter gray with a border along the left side in the secondary color.

+ +

There should be no margin below this final sentence.

+
+ +

First Header

+ +

This is a normal paragraph following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

+ +

Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

+ +

On big screens, paragraphs and headings should not take up the full container width, but we want tables, code blocks and similar to take the full width.

+ +

Lorem markdownum tuta hospes stabat; idem saxum facit quaterque repetito +occumbere, oves novem gestit haerebat frena; qui. Respicit recurvam erat: +pignora hinc reppulit nos aut, aptos, ipsa.

+ +

Meae optatos passa est Epiros utiliter Talibus niveis, hoc lata, edidit. +Dixi ad aestum.

+ +

Header 2

+ +
+

This is a blockquote following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

+
+ +

Header 3

+ +
This is a code block following a header.
+
+ +

Header 4

+ +
    +
  • This is an unordered list following a header.
  • +
  • This is an unordered list following a header.
  • +
  • This is an unordered list following a header.
  • +
+ +
Header 5
+ +
    +
  1. This is an ordered list following a header.
  2. +
  3. This is an ordered list following a header.
  4. +
  5. This is an ordered list following a header.
  6. +
+ +
Header 6
+ + + + + + + + + + + + + + + + + + + + + + + + + +
WhatFollows
A tableA header
A tableA header
A tableA header
+ +
+ +

There’s a horizontal rule above and below this.

+ +
+ +

Here is an unordered list:

+ +
    +
  • Salt-n-Pepa
  • +
  • Bel Biv DeVoe
  • +
  • Kid ‘N Play
  • +
+ +

And an ordered list:

+ +
    +
  1. Michael Jackson
  2. +
  3. Michael Bolton
  4. +
  5. Michael Bublé
  6. +
+ +

And an unordered task list:

+ +
    +
  • +
  • +
  • +
+ +

And a “mixed” task list:

+ +
    +
  • +
  • ?
  • +
  • +
+ +

And a nested list:

+ +
    +
  • Jackson 5 + +
      +
    • Michael
    • +
    • Tito
    • +
    • Jackie
    • +
    • Marlon
    • +
    • Jermaine
    • +
  • +
  • TMNT + +
      +
    • Leonardo
    • +
    • Michelangelo
    • +
    • Donatello
    • +
    • Raphael
    • +
  • +
+ +

Definition lists can be used with Markdown syntax. Definition terms are bold.

+ +
+
Name
+
Godzilla
+
Born
+
1952
+
Birthplace
+
Japan
+
Color
+
Green
+
+ +
+ +

Tables should have bold headings and alternating shaded rows.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ArtistAlbumYear
Michael JacksonThriller1982
PrincePurple Rain1984
Beastie BoysLicense to Ill1986
+ +

If a table is too wide, it should scroll horizontally.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ArtistAlbumYearLabelAwardsSongs
Michael JacksonThriller1982Epic RecordsGrammy Award for Album of the Year, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&B Album, Brit Award for Best Selling Album, Grammy Award for Best Engineered Album, Non-ClassicalWanna Be Startin’ Somethin’, Baby Be Mine, The Girl Is Mine, Thriller, Beat It, Billie Jean, Human Nature, P.Y.T. (Pretty Young Thing), The Lady in My Life
PrincePurple Rain1984Warner Brothers RecordsGrammy Award for Best Score Soundtrack for Visual Media, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&B Album, Brit Award for Best Soundtrack/Cast Recording, Grammy Award for Best Rock Performance by a Duo or Group with VocalLet’s Go Crazy, Take Me With U, The Beautiful Ones, Computer Blue, Darling Nikki, When Doves Cry, I Would Die 4 U, Baby I’m a Star, Purple Rain
Beastie BoysLicense to Ill1986Mercury RecordsnoawardsbutthistablecelliswideRhymin & Stealin, The New Style, She’s Crafty, Posse in Effect, Slow Ride, Girls, (You Gotta) Fight for Your Right, No Sleep Till Brooklyn, Paul Revere, Hold It Now, Hit It, Brass Monkey, Slow and Low, Time to Get Ill
+ +
+ +

Code snippets like var foo = "bar"; can be shown inline.

+ +

Also, this should vertically align with this and this.

+ +

Code can also be shown in a block element.

+ +
foo := "bar";
+bar := "foo";
+
+ +

Code can also use syntax highlighting.

+
func main() {
+  input := `var foo = "bar";`
+
+  lexer := lexers.Get("javascript")
+  iterator, _ := lexer.Tokenise(nil, input)
+  style := styles.Get("github")
+  formatter := html.New(html.WithLineNumbers())
+
+  var buff bytes.Buffer
+  formatter.Format(&buff, style, iterator)
+
+  fmt.Println(buff.String())
+}
+
Long, single-line code blocks should not wrap. They should horizontally scroll if they are too long. This line should be long enough to demonstrate this.
+
+ +

Inline code inside table cells should still be distinguishable.

+ + + + + + + + + + + + + + + + + + + + +
LanguageCode
Javascriptvar foo = "bar";
Rubyfoo = "bar"{
+ +
+ +

Small images should be shown at their actual size.

+ +

+ +

Large images should always scale down and fit in the content container.

+ +

+ +

Components

+ +

Alerts

+ +

+ +

+ + + + + + + + + + + + + + + + +

+ +

Sizing

+ +

Add some sections here to see how the ToC looks like. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

+ +

Parameters available

+ +

Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

+ +

Using pixels

+ +

Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

+ +

Using rem

+ +

Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

+ +

Memory

+ +

Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

+ +

RAM to use

+ +

Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

+ +

More is better

+ +

Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

+ +

Used RAM

+ +

Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

+ +
This is the final element on the page and there should be no margin below this.
+
+ + + + + +
+ + +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/blog/2018/10/06/easy-documentation-with-docsy/featured-sunset-get.png b/docs/blog/2018/10/06/easy-documentation-with-docsy/featured-sunset-get.png new file mode 100644 index 00000000..db3373c0 Binary files /dev/null and b/docs/blog/2018/10/06/easy-documentation-with-docsy/featured-sunset-get.png differ diff --git a/docs/blog/2018/10/06/easy-documentation-with-docsy/featured-sunset-get_hu69849a7cdb847c2393a7b3a7f6061c86_387442_250x125_fill_catmullrom_smart1_2.png b/docs/blog/2018/10/06/easy-documentation-with-docsy/featured-sunset-get_hu69849a7cdb847c2393a7b3a7f6061c86_387442_250x125_fill_catmullrom_smart1_2.png new file mode 100644 index 00000000..c66ffdbe Binary files /dev/null and b/docs/blog/2018/10/06/easy-documentation-with-docsy/featured-sunset-get_hu69849a7cdb847c2393a7b3a7f6061c86_387442_250x125_fill_catmullrom_smart1_2.png differ diff --git a/docs/blog/2018/10/06/easy-documentation-with-docsy/featured-sunset-get_hu69849a7cdb847c2393a7b3a7f6061c86_387442_600x300_fill_catmullrom_smart1_2.png b/docs/blog/2018/10/06/easy-documentation-with-docsy/featured-sunset-get_hu69849a7cdb847c2393a7b3a7f6061c86_387442_600x300_fill_catmullrom_smart1_2.png new file mode 100644 index 00000000..a4bf4bd9 Binary files /dev/null and b/docs/blog/2018/10/06/easy-documentation-with-docsy/featured-sunset-get_hu69849a7cdb847c2393a7b3a7f6061c86_387442_600x300_fill_catmullrom_smart1_2.png differ diff --git a/docs/blog/2018/10/06/easy-documentation-with-docsy/featured-sunset-get_hu69849a7cdb847c2393a7b3a7f6061c86_387442_640x0_resize_catmullrom_2.png b/docs/blog/2018/10/06/easy-documentation-with-docsy/featured-sunset-get_hu69849a7cdb847c2393a7b3a7f6061c86_387442_640x0_resize_catmullrom_2.png new file mode 100644 index 00000000..369af77c Binary files /dev/null and b/docs/blog/2018/10/06/easy-documentation-with-docsy/featured-sunset-get_hu69849a7cdb847c2393a7b3a7f6061c86_387442_640x0_resize_catmullrom_2.png differ diff --git a/docs/blog/2018/10/06/easy-documentation-with-docsy/index.html b/docs/blog/2018/10/06/easy-documentation-with-docsy/index.html new file mode 100644 index 00000000..91f18221 --- /dev/null +++ b/docs/blog/2018/10/06/easy-documentation-with-docsy/index.html @@ -0,0 +1,328 @@ + + + + + + + + + + + + + + + + + + + + + + +Easy documentation with Docsy | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Easy documentation with Docsy | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + + + + +
+
+ + RSS + + +
+

Easy documentation with Docsy

+
The Docsy Hugo theme lets project maintainers and contributors focus on content, not on reinventing a website infrastructure from scratch
+ + + +

This is a typical blog post that includes images.

+ +

The front matter specifies the date of the blog post, its title, a short description that will be displayed on the blog landing page, and its author.

+ +

Including images

+ +

Here’s an image (featured-sunset-get.png) that includes a byline and a caption.

+ + + + + + + + +
+ + +
+

+Fetch and scale an image in the upcoming Hugo 0.43. +
Photo: Riona MacNamara / CC-BY-CA

+
+ +
+ +

The front matter of this post specifies properties to be assigned to all image resources:

+ +
resources:
+- src: "**.{png,jpg}"
+  title: "Image #:counter"
+  params:
+    byline: "Photo: Riona MacNamara / CC-BY-CA"
+
+ +

To include the image in a page, specify its details like this:

+ +

+
+
+
+
+
+
+
+ + +
+

+Fetch and scale an image in the upcoming Hugo 0.43. +
Photo: Riona MacNamara / CC-BY-CA

+
+ +
+
+ +

The image will be rendered at the size and byline specified in the front matter.

+ + + + + +
+ + +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/blog/2018/10/06/the-second-blog-post/index.html b/docs/blog/2018/10/06/the-second-blog-post/index.html new file mode 100644 index 00000000..a48c669b --- /dev/null +++ b/docs/blog/2018/10/06/the-second-blog-post/index.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + + + + + + + + + + +The second blog post | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The second blog post | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ +
+ + RSS + + +
+

The second blog post

+
A short lead descripton about this content page. Text here can also be bold or italic and can even be split over multiple paragraphs.
+ + + +

Text can be bold, italic, or strikethrough. Links should be blue with no underlines (unless hovered over).

+ +

There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs.

+ +

There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs.

+ +
+

There should be no margin above this first sentence.

+ +

Blockquotes should be a lighter gray with a border along the left side in the secondary color.

+ +

There should be no margin below this final sentence.

+
+ +

First Header

+ +

This is a normal paragraph following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

+ +

Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

+ +

On big screens, paragraphs and headings should not take up the full container width, but we want tables, code blocks and similar to take the full width.

+ +

Lorem markdownum tuta hospes stabat; idem saxum facit quaterque repetito +occumbere, oves novem gestit haerebat frena; qui. Respicit recurvam erat: +pignora hinc reppulit nos aut, aptos, ipsa.

+ +

Meae optatos passa est Epiros utiliter Talibus niveis, hoc lata, edidit. +Dixi ad aestum.

+ +

Header 2

+ +
+

This is a blockquote following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

+
+ +

Header 3

+ +
This is a code block following a header.
+
+ +

Header 4

+ +
    +
  • This is an unordered list following a header.
  • +
  • This is an unordered list following a header.
  • +
  • This is an unordered list following a header.
  • +
+ +
Header 5
+ +
    +
  1. This is an ordered list following a header.
  2. +
  3. This is an ordered list following a header.
  4. +
  5. This is an ordered list following a header.
  6. +
+ +
Header 6
+ + + + + + + + + + + + + + + + + + + + + + + + + +
WhatFollows
A tableA header
A tableA header
A tableA header
+ +
+ +

There’s a horizontal rule above and below this.

+ +
+ +

Here is an unordered list:

+ +
    +
  • Salt-n-Pepa
  • +
  • Bel Biv DeVoe
  • +
  • Kid ‘N Play
  • +
+ +

And an ordered list:

+ +
    +
  1. Michael Jackson
  2. +
  3. Michael Bolton
  4. +
  5. Michael Bublé
  6. +
+ +

And an unordered task list:

+ +
    +
  • +
  • +
  • +
+ +

And a “mixed” task list:

+ +
    +
  • +
  • ?
  • +
  • +
+ +

And a nested list:

+ +
    +
  • Jackson 5 + +
      +
    • Michael
    • +
    • Tito
    • +
    • Jackie
    • +
    • Marlon
    • +
    • Jermaine
    • +
  • +
  • TMNT + +
      +
    • Leonardo
    • +
    • Michelangelo
    • +
    • Donatello
    • +
    • Raphael
    • +
  • +
+ +

Definition lists can be used with Markdown syntax. Definition terms are bold.

+ +
+
Name
+
Godzilla
+
Born
+
1952
+
Birthplace
+
Japan
+
Color
+
Green
+
+ +
+ +

Tables should have bold headings and alternating shaded rows.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ArtistAlbumYear
Michael JacksonThriller1982
PrincePurple Rain1984
Beastie BoysLicense to Ill1986
+ +

If a table is too wide, it should scroll horizontally.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ArtistAlbumYearLabelAwardsSongs
Michael JacksonThriller1982Epic RecordsGrammy Award for Album of the Year, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&B Album, Brit Award for Best Selling Album, Grammy Award for Best Engineered Album, Non-ClassicalWanna Be Startin’ Somethin’, Baby Be Mine, The Girl Is Mine, Thriller, Beat It, Billie Jean, Human Nature, P.Y.T. (Pretty Young Thing), The Lady in My Life
PrincePurple Rain1984Warner Brothers RecordsGrammy Award for Best Score Soundtrack for Visual Media, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&B Album, Brit Award for Best Soundtrack/Cast Recording, Grammy Award for Best Rock Performance by a Duo or Group with VocalLet’s Go Crazy, Take Me With U, The Beautiful Ones, Computer Blue, Darling Nikki, When Doves Cry, I Would Die 4 U, Baby I’m a Star, Purple Rain
Beastie BoysLicense to Ill1986Mercury RecordsnoawardsbutthistablecelliswideRhymin & Stealin, The New Style, She’s Crafty, Posse in Effect, Slow Ride, Girls, (You Gotta) Fight for Your Right, No Sleep Till Brooklyn, Paul Revere, Hold It Now, Hit It, Brass Monkey, Slow and Low, Time to Get Ill
+ +
+ +

Code snippets like var foo = "bar"; can be shown inline.

+ +

Also, this should vertically align with this and this.

+ +

Code can also be shown in a block element.

+ +
foo := "bar";
+bar := "foo";
+
+ +

Code can also use syntax highlighting.

+
func main() {
+  input := `var foo = "bar";`
+
+  lexer := lexers.Get("javascript")
+  iterator, _ := lexer.Tokenise(nil, input)
+  style := styles.Get("github")
+  formatter := html.New(html.WithLineNumbers())
+
+  var buff bytes.Buffer
+  formatter.Format(&buff, style, iterator)
+
+  fmt.Println(buff.String())
+}
+
Long, single-line code blocks should not wrap. They should horizontally scroll if they are too long. This line should be long enough to demonstrate this.
+
+ +

Inline code inside table cells should still be distinguishable.

+ + + + + + + + + + + + + + + + + + + + +
LanguageCode
Javascriptvar foo = "bar";
Rubyfoo = "bar"{
+ +
+ +

Small images should be shown at their actual size.

+ +

+ +

Large images should always scale down and fit in the content container.

+ +

+ +

Components

+ +

Alerts

+ +

+ +

+ + + + + + + + + + + + + + + + +

+ +

Sizing

+ +

Add some sections here to see how the ToC looks like. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

+ +

Parameters available

+ +

Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

+ +

Using pixels

+ +

Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

+ +

Using rem

+ +

Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

+ +

Memory

+ +

Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

+ +

RAM to use

+ +

Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

+ +

More is better

+ +

Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

+ +

Used RAM

+ +

Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

+ +
This is the final element on the page and there should be no margin below this.
+
+ + + + + +
+ + +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/blog/index.html b/docs/blog/index.html new file mode 100644 index 00000000..66f92b6d --- /dev/null +++ b/docs/blog/index.html @@ -0,0 +1,319 @@ + + + + + + + + + + + + + + + + + + + + + + + +Docsy Blog | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + Docsy Blog | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + + +
+
+ + RSS + + + + + + + + + +
+
+ +

Posts in 2018

+
    + +
  • +
    +
    Second blog post
    +

    Saturday, October 06, 2018 in News

    + + + + + + +

    Text can be bold, italic, or strikethrough. Links should be blue with no underlines (unless hovered over). +There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. …

    +

    Read more

    +
    +
  • + +
  • +
    +
    Announcing Docsy
    +

    Saturday, October 06, 2018 in News

    + + + + + + + +
    +Featured Image for Easy documentation with Docsy + +
    Photo: Riona MacNamara / CC-BY-CA
    + +
    + +

    This is a typical blog post that includes images. +The front matter specifies the date of the blog post, its title, a short description that will be displayed on the blog landing page, and its author. +Including images Here’s an image …

    +

    Read more

    +
    +
  • + +
  • +
    +
    Release New Features
    +

    Thursday, January 04, 2018 in Releases

    + + + + + + +

    Text can be bold, italic, or strikethrough. Links should be blue with no underlines (unless hovered over). +There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. …

    +

    Read more

    +
    +
  • + +
+ +
+
+
+
+ + + +
+
+ +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/blog/index.xml b/docs/blog/index.xml new file mode 100644 index 00000000..40a16813 --- /dev/null +++ b/docs/blog/index.xml @@ -0,0 +1,869 @@ + + + Jenkins Operator – Docsy Blog + /blog/ + Recent Hugo news from gohugo.io + Hugo -- gohugo.io + + /img/hugo.png + GoHugo.io + /blog/ + + + + + + + + + + + + Blog: Easy documentation with Docsy + /blog/2018/10/06/easy-documentation-with-docsy/ + Sat, 06 Oct 2018 00:00:00 +0000 + + /blog/2018/10/06/easy-documentation-with-docsy/ + + + + + ]]> + + + +<p><strong>This is a typical blog post that includes images.</strong></p> + +<p>The front matter specifies the date of the blog post, its title, a short description that will be displayed on the blog landing page, and its author.</p> + +<h2 id="including-images">Including images</h2> + +<p>Here&rsquo;s an image (<code>featured-sunset-get.png</code>) that includes a byline and a caption.</p> + + + + + + + + +<div class="card rounded p-2 td-post-card mb-4 mt-4" style="max-width: 610px"> + <img class="card-img-top" src="/blog/2018/10/06/easy-documentation-with-docsy/featured-sunset-get_hu69849a7cdb847c2393a7b3a7f6061c86_387442_600x300_fill_catmullrom_smart1_2.png" width="600" height="300"> + + <div class="card-body px-0 pt-2 pb-0"> + <p class="card-text"> +Fetch and scale an image in the upcoming Hugo 0.43. +<small class="text-muted"><br/>Photo: Riona MacNamara / CC-BY-CA</small></p> + </div> + +</div> + +<p>The front matter of this post specifies properties to be assigned to all image resources:</p> + +<pre><code>resources: +- src: &quot;**.{png,jpg}&quot; + title: &quot;Image #:counter&quot; + params: + byline: &quot;Photo: Riona MacNamara / CC-BY-CA&quot; +</code></pre> + +<p>To include the image in a page, specify its details like this:</p> + +<pre><code> + + + + + + +<div class="card rounded p-2 td-post-card mb-4 mt-4" style="max-width: 610px"> + <img class="card-img-top" src="/blog/2018/10/06/easy-documentation-with-docsy/featured-sunset-get_hu69849a7cdb847c2393a7b3a7f6061c86_387442_600x300_fill_catmullrom_smart1_2.png" width="600" height="300"> + + <div class="card-body px-0 pt-2 pb-0"> + <p class="card-text"> +Fetch and scale an image in the upcoming Hugo 0.43. +<small class="text-muted"><br/>Photo: Riona MacNamara / CC-BY-CA</small></p> + </div> + +</div> +</code></pre> + +<p>The image will be rendered at the size and byline specified in the front matter.</p> + + + + + + Blog: The second blog post + /blog/2018/10/06/the-second-blog-post/ + Sat, 06 Oct 2018 00:00:00 +0000 + + /blog/2018/10/06/the-second-blog-post/ + + + + + +<p>Text can be <strong>bold</strong>, <em>italic</em>, or <del>strikethrough</del>. <a href="https://github.com" target="_blank">Links</a> should be blue with no underlines (unless hovered over).</p> + +<p>There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs.</p> + +<p>There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs.</p> + +<blockquote> +<p>There should be no margin above this first sentence.</p> + +<p>Blockquotes should be a lighter gray with a border along the left side in the secondary color.</p> + +<p>There should be no margin below this final sentence.</p> +</blockquote> + +<h2 id="first-header">First Header</h2> + +<p>This is a normal paragraph following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<p>On big screens, paragraphs and headings should not take up the full container width, but we want tables, code blocks and similar to take the full width.</p> + +<p>Lorem markdownum tuta hospes stabat; idem saxum facit quaterque repetito +occumbere, oves novem gestit haerebat frena; qui. Respicit recurvam erat: +pignora hinc reppulit nos <strong>aut</strong>, aptos, ipsa.</p> + +<p>Meae optatos <em>passa est</em> Epiros utiliter <em>Talibus niveis</em>, hoc lata, edidit. +Dixi ad aestum.</p> + +<h2 id="header-2">Header 2</h2> + +<blockquote> +<p>This is a blockquote following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> +</blockquote> + +<h3 id="header-3">Header 3</h3> + +<pre><code>This is a code block following a header. +</code></pre> + +<h4 id="header-4">Header 4</h4> + +<ul> +<li>This is an unordered list following a header.</li> +<li>This is an unordered list following a header.</li> +<li>This is an unordered list following a header.</li> +</ul> + +<h5 id="header-5">Header 5</h5> + +<ol> +<li>This is an ordered list following a header.</li> +<li>This is an ordered list following a header.</li> +<li>This is an ordered list following a header.</li> +</ol> + +<h6 id="header-6">Header 6</h6> + +<table> +<thead> +<tr> +<th>What</th> +<th>Follows</th> +</tr> +</thead> + +<tbody> +<tr> +<td>A table</td> +<td>A header</td> +</tr> + +<tr> +<td>A table</td> +<td>A header</td> +</tr> + +<tr> +<td>A table</td> +<td>A header</td> +</tr> +</tbody> +</table> + +<hr /> + +<p>There&rsquo;s a horizontal rule above and below this.</p> + +<hr /> + +<p>Here is an unordered list:</p> + +<ul> +<li>Salt-n-Pepa</li> +<li>Bel Biv DeVoe</li> +<li>Kid &lsquo;N Play</li> +</ul> + +<p>And an ordered list:</p> + +<ol> +<li>Michael Jackson</li> +<li>Michael Bolton</li> +<li>Michael Bublé</li> +</ol> + +<p>And an unordered task list:</p> + +<ul class="task-list"> +<li><label><input type="checkbox" checked disabled class="task-list-item"> Create a sample markdown document</label></li> +<li><label><input type="checkbox" checked disabled class="task-list-item"> Add task lists to it</label></li> +<li><label><input type="checkbox" disabled class="task-list-item"> Take a vacation</label></li> +</ul> + +<p>And a &ldquo;mixed&rdquo; task list:</p> + +<ul class="task-list"> +<li><label><input type="checkbox" disabled class="task-list-item"> Steal underpants</label></li> +<li>?</li> +<li><label><input type="checkbox" disabled class="task-list-item"> Profit!</label></li> +</ul> + +<p>And a nested list:</p> + +<ul> +<li>Jackson 5 + +<ul> +<li>Michael</li> +<li>Tito</li> +<li>Jackie</li> +<li>Marlon</li> +<li>Jermaine</li> +</ul></li> +<li>TMNT + +<ul> +<li>Leonardo</li> +<li>Michelangelo</li> +<li>Donatello</li> +<li>Raphael</li> +</ul></li> +</ul> + +<p>Definition lists can be used with Markdown syntax. Definition terms are bold.</p> + +<dl> +<dt>Name</dt> +<dd>Godzilla</dd> +<dt>Born</dt> +<dd>1952</dd> +<dt>Birthplace</dt> +<dd>Japan</dd> +<dt>Color</dt> +<dd>Green</dd> +</dl> + +<hr /> + +<p>Tables should have bold headings and alternating shaded rows.</p> + +<table> +<thead> +<tr> +<th>Artist</th> +<th>Album</th> +<th>Year</th> +</tr> +</thead> + +<tbody> +<tr> +<td>Michael Jackson</td> +<td>Thriller</td> +<td>1982</td> +</tr> + +<tr> +<td>Prince</td> +<td>Purple Rain</td> +<td>1984</td> +</tr> + +<tr> +<td>Beastie Boys</td> +<td>License to Ill</td> +<td>1986</td> +</tr> +</tbody> +</table> + +<p>If a table is too wide, it should scroll horizontally.</p> + +<table> +<thead> +<tr> +<th>Artist</th> +<th>Album</th> +<th>Year</th> +<th>Label</th> +<th>Awards</th> +<th>Songs</th> +</tr> +</thead> + +<tbody> +<tr> +<td>Michael Jackson</td> +<td>Thriller</td> +<td>1982</td> +<td>Epic Records</td> +<td>Grammy Award for Album of the Year, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&amp;B Album, Brit Award for Best Selling Album, Grammy Award for Best Engineered Album, Non-Classical</td> +<td>Wanna Be Startin&rsquo; Somethin&rsquo;, Baby Be Mine, The Girl Is Mine, Thriller, Beat It, Billie Jean, Human Nature, P.Y.T. (Pretty Young Thing), The Lady in My Life</td> +</tr> + +<tr> +<td>Prince</td> +<td>Purple Rain</td> +<td>1984</td> +<td>Warner Brothers Records</td> +<td>Grammy Award for Best Score Soundtrack for Visual Media, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&amp;B Album, Brit Award for Best Soundtrack/Cast Recording, Grammy Award for Best Rock Performance by a Duo or Group with Vocal</td> +<td>Let&rsquo;s Go Crazy, Take Me With U, The Beautiful Ones, Computer Blue, Darling Nikki, When Doves Cry, I Would Die 4 U, Baby I&rsquo;m a Star, Purple Rain</td> +</tr> + +<tr> +<td>Beastie Boys</td> +<td>License to Ill</td> +<td>1986</td> +<td>Mercury Records</td> +<td>noawardsbutthistablecelliswide</td> +<td>Rhymin &amp; Stealin, The New Style, She&rsquo;s Crafty, Posse in Effect, Slow Ride, Girls, (You Gotta) Fight for Your Right, No Sleep Till Brooklyn, Paul Revere, Hold It Now, Hit It, Brass Monkey, Slow and Low, Time to Get Ill</td> +</tr> +</tbody> +</table> + +<hr /> + +<p>Code snippets like <code>var foo = &quot;bar&quot;;</code> can be shown inline.</p> + +<p>Also, <code>this should vertically align</code> <del><code>with this</code></del> <del>and this</del>.</p> + +<p>Code can also be shown in a block element.</p> + +<pre><code>foo := &quot;bar&quot;; +bar := &quot;foo&quot;; +</code></pre> + +<p>Code can also use syntax highlighting.</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-go" data-lang="go"><span style="color:#204a87;font-weight:bold">func</span> <span style="color:#000">main</span><span style="color:#000;font-weight:bold">()</span> <span style="color:#000;font-weight:bold">{</span> + <span style="color:#000">input</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#4e9a06">`var foo = &#34;bar&#34;;`</span> + + <span style="color:#000">lexer</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">lexers</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Get</span><span style="color:#000;font-weight:bold">(</span><span style="color:#4e9a06">&#34;javascript&#34;</span><span style="color:#000;font-weight:bold">)</span> + <span style="color:#000">iterator</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">_</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">lexer</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Tokenise</span><span style="color:#000;font-weight:bold">(</span><span style="color:#204a87;font-weight:bold">nil</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">input</span><span style="color:#000;font-weight:bold">)</span> + <span style="color:#000">style</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">styles</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Get</span><span style="color:#000;font-weight:bold">(</span><span style="color:#4e9a06">&#34;github&#34;</span><span style="color:#000;font-weight:bold">)</span> + <span style="color:#000">formatter</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">html</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">New</span><span style="color:#000;font-weight:bold">(</span><span style="color:#000">html</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">WithLineNumbers</span><span style="color:#000;font-weight:bold">())</span> + + <span style="color:#204a87;font-weight:bold">var</span> <span style="color:#000">buff</span> <span style="color:#000">bytes</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Buffer</span> + <span style="color:#000">formatter</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Format</span><span style="color:#000;font-weight:bold">(</span><span style="color:#ce5c00;font-weight:bold">&amp;</span><span style="color:#000">buff</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">style</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">iterator</span><span style="color:#000;font-weight:bold">)</span> + + <span style="color:#000">fmt</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Println</span><span style="color:#000;font-weight:bold">(</span><span style="color:#000">buff</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">String</span><span style="color:#000;font-weight:bold">())</span> +<span style="color:#000;font-weight:bold">}</span></code></pre></div> +<pre><code>Long, single-line code blocks should not wrap. They should horizontally scroll if they are too long. This line should be long enough to demonstrate this. +</code></pre> + +<p>Inline code inside table cells should still be distinguishable.</p> + +<table> +<thead> +<tr> +<th>Language</th> +<th>Code</th> +</tr> +</thead> + +<tbody> +<tr> +<td>Javascript</td> +<td><code>var foo = &quot;bar&quot;;</code></td> +</tr> + +<tr> +<td>Ruby</td> +<td><code>foo = &quot;bar&quot;{</code></td> +</tr> +</tbody> +</table> + +<hr /> + +<p>Small images should be shown at their actual size.</p> + +<p><img src="http://placekitten.com/g/300/200/" alt="" /></p> + +<p>Large images should always scale down and fit in the content container.</p> + +<p><img src="http://placekitten.com/g/1200/800/" alt="" /></p> + +<h2 id="components">Components</h2> + +<h3 id="alerts">Alerts</h3> + +<p> + +<div class="alert alert-primary" role="alert"> + +This is an alert. +</div> + + + +<div class="alert alert-primary" role="alert"> +<h4 class="alert-heading">Note:</h4> +This is an alert with a title. +</div> + + + +<div class="alert alert-primary" role="alert"> + +This is a successful alert. +</div> + + + +<div class="alert alert-primary" role="alert"> + +This is a warning! +</div> + + + +<div class="alert alert-primary" role="alert"> +<h4 class="alert-heading">Warning!</h4> +This is a warning with a title! +</div> +</p> + +<h2 id="sizing">Sizing</h2> + +<p>Add some sections here to see how the ToC looks like. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="parameters-available">Parameters available</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="using-pixels">Using pixels</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="using-rem">Using rem</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h2 id="memory">Memory</h2> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="ram-to-use">RAM to use</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="more-is-better">More is better</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="used-ram">Used RAM</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<pre><code>This is the final element on the page and there should be no margin below this. +</code></pre> + + + + + + Blog: Another Great Release + /blog/2018/01/04/another-great-release/ + Thu, 04 Jan 2018 00:00:00 +0000 + + /blog/2018/01/04/another-great-release/ + + + + + +<p>Text can be <strong>bold</strong>, <em>italic</em>, or <del>strikethrough</del>. <a href="https://github.com" target="_blank">Links</a> should be blue with no underlines (unless hovered over).</p> + +<p>There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs.</p> + +<p>There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs.</p> + +<blockquote> +<p>There should be no margin above this first sentence.</p> + +<p>Blockquotes should be a lighter gray with a border along the left side in the secondary color.</p> + +<p>There should be no margin below this final sentence.</p> +</blockquote> + +<h2 id="first-header">First Header</h2> + +<p>This is a normal paragraph following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<p>On big screens, paragraphs and headings should not take up the full container width, but we want tables, code blocks and similar to take the full width.</p> + +<p>Lorem markdownum tuta hospes stabat; idem saxum facit quaterque repetito +occumbere, oves novem gestit haerebat frena; qui. Respicit recurvam erat: +pignora hinc reppulit nos <strong>aut</strong>, aptos, ipsa.</p> + +<p>Meae optatos <em>passa est</em> Epiros utiliter <em>Talibus niveis</em>, hoc lata, edidit. +Dixi ad aestum.</p> + +<h2 id="header-2">Header 2</h2> + +<blockquote> +<p>This is a blockquote following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> +</blockquote> + +<h3 id="header-3">Header 3</h3> + +<pre><code>This is a code block following a header. +</code></pre> + +<h4 id="header-4">Header 4</h4> + +<ul> +<li>This is an unordered list following a header.</li> +<li>This is an unordered list following a header.</li> +<li>This is an unordered list following a header.</li> +</ul> + +<h5 id="header-5">Header 5</h5> + +<ol> +<li>This is an ordered list following a header.</li> +<li>This is an ordered list following a header.</li> +<li>This is an ordered list following a header.</li> +</ol> + +<h6 id="header-6">Header 6</h6> + +<table> +<thead> +<tr> +<th>What</th> +<th>Follows</th> +</tr> +</thead> + +<tbody> +<tr> +<td>A table</td> +<td>A header</td> +</tr> + +<tr> +<td>A table</td> +<td>A header</td> +</tr> + +<tr> +<td>A table</td> +<td>A header</td> +</tr> +</tbody> +</table> + +<hr /> + +<p>There&rsquo;s a horizontal rule above and below this.</p> + +<hr /> + +<p>Here is an unordered list:</p> + +<ul> +<li>Salt-n-Pepa</li> +<li>Bel Biv DeVoe</li> +<li>Kid &lsquo;N Play</li> +</ul> + +<p>And an ordered list:</p> + +<ol> +<li>Michael Jackson</li> +<li>Michael Bolton</li> +<li>Michael Bublé</li> +</ol> + +<p>And an unordered task list:</p> + +<ul class="task-list"> +<li><label><input type="checkbox" checked disabled class="task-list-item"> Create a sample markdown document</label></li> +<li><label><input type="checkbox" checked disabled class="task-list-item"> Add task lists to it</label></li> +<li><label><input type="checkbox" disabled class="task-list-item"> Take a vacation</label></li> +</ul> + +<p>And a &ldquo;mixed&rdquo; task list:</p> + +<ul class="task-list"> +<li><label><input type="checkbox" disabled class="task-list-item"> Steal underpants</label></li> +<li>?</li> +<li><label><input type="checkbox" disabled class="task-list-item"> Profit!</label></li> +</ul> + +<p>And a nested list:</p> + +<ul> +<li>Jackson 5 + +<ul> +<li>Michael</li> +<li>Tito</li> +<li>Jackie</li> +<li>Marlon</li> +<li>Jermaine</li> +</ul></li> +<li>TMNT + +<ul> +<li>Leonardo</li> +<li>Michelangelo</li> +<li>Donatello</li> +<li>Raphael</li> +</ul></li> +</ul> + +<p>Definition lists can be used with Markdown syntax. Definition terms are bold.</p> + +<dl> +<dt>Name</dt> +<dd>Godzilla</dd> +<dt>Born</dt> +<dd>1952</dd> +<dt>Birthplace</dt> +<dd>Japan</dd> +<dt>Color</dt> +<dd>Green</dd> +</dl> + +<hr /> + +<p>Tables should have bold headings and alternating shaded rows.</p> + +<table> +<thead> +<tr> +<th>Artist</th> +<th>Album</th> +<th>Year</th> +</tr> +</thead> + +<tbody> +<tr> +<td>Michael Jackson</td> +<td>Thriller</td> +<td>1982</td> +</tr> + +<tr> +<td>Prince</td> +<td>Purple Rain</td> +<td>1984</td> +</tr> + +<tr> +<td>Beastie Boys</td> +<td>License to Ill</td> +<td>1986</td> +</tr> +</tbody> +</table> + +<p>If a table is too wide, it should scroll horizontally.</p> + +<table> +<thead> +<tr> +<th>Artist</th> +<th>Album</th> +<th>Year</th> +<th>Label</th> +<th>Awards</th> +<th>Songs</th> +</tr> +</thead> + +<tbody> +<tr> +<td>Michael Jackson</td> +<td>Thriller</td> +<td>1982</td> +<td>Epic Records</td> +<td>Grammy Award for Album of the Year, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&amp;B Album, Brit Award for Best Selling Album, Grammy Award for Best Engineered Album, Non-Classical</td> +<td>Wanna Be Startin&rsquo; Somethin&rsquo;, Baby Be Mine, The Girl Is Mine, Thriller, Beat It, Billie Jean, Human Nature, P.Y.T. (Pretty Young Thing), The Lady in My Life</td> +</tr> + +<tr> +<td>Prince</td> +<td>Purple Rain</td> +<td>1984</td> +<td>Warner Brothers Records</td> +<td>Grammy Award for Best Score Soundtrack for Visual Media, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&amp;B Album, Brit Award for Best Soundtrack/Cast Recording, Grammy Award for Best Rock Performance by a Duo or Group with Vocal</td> +<td>Let&rsquo;s Go Crazy, Take Me With U, The Beautiful Ones, Computer Blue, Darling Nikki, When Doves Cry, I Would Die 4 U, Baby I&rsquo;m a Star, Purple Rain</td> +</tr> + +<tr> +<td>Beastie Boys</td> +<td>License to Ill</td> +<td>1986</td> +<td>Mercury Records</td> +<td>noawardsbutthistablecelliswide</td> +<td>Rhymin &amp; Stealin, The New Style, She&rsquo;s Crafty, Posse in Effect, Slow Ride, Girls, (You Gotta) Fight for Your Right, No Sleep Till Brooklyn, Paul Revere, Hold It Now, Hit It, Brass Monkey, Slow and Low, Time to Get Ill</td> +</tr> +</tbody> +</table> + +<hr /> + +<p>Code snippets like <code>var foo = &quot;bar&quot;;</code> can be shown inline.</p> + +<p>Also, <code>this should vertically align</code> <del><code>with this</code></del> <del>and this</del>.</p> + +<p>Code can also be shown in a block element.</p> + +<pre><code>foo := &quot;bar&quot;; +bar := &quot;foo&quot;; +</code></pre> + +<p>Code can also use syntax highlighting.</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-go" data-lang="go"><span style="color:#204a87;font-weight:bold">func</span> <span style="color:#000">main</span><span style="color:#000;font-weight:bold">()</span> <span style="color:#000;font-weight:bold">{</span> + <span style="color:#000">input</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#4e9a06">`var foo = &#34;bar&#34;;`</span> + + <span style="color:#000">lexer</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">lexers</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Get</span><span style="color:#000;font-weight:bold">(</span><span style="color:#4e9a06">&#34;javascript&#34;</span><span style="color:#000;font-weight:bold">)</span> + <span style="color:#000">iterator</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">_</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">lexer</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Tokenise</span><span style="color:#000;font-weight:bold">(</span><span style="color:#204a87;font-weight:bold">nil</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">input</span><span style="color:#000;font-weight:bold">)</span> + <span style="color:#000">style</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">styles</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Get</span><span style="color:#000;font-weight:bold">(</span><span style="color:#4e9a06">&#34;github&#34;</span><span style="color:#000;font-weight:bold">)</span> + <span style="color:#000">formatter</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">html</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">New</span><span style="color:#000;font-weight:bold">(</span><span style="color:#000">html</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">WithLineNumbers</span><span style="color:#000;font-weight:bold">())</span> + + <span style="color:#204a87;font-weight:bold">var</span> <span style="color:#000">buff</span> <span style="color:#000">bytes</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Buffer</span> + <span style="color:#000">formatter</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Format</span><span style="color:#000;font-weight:bold">(</span><span style="color:#ce5c00;font-weight:bold">&amp;</span><span style="color:#000">buff</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">style</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">iterator</span><span style="color:#000;font-weight:bold">)</span> + + <span style="color:#000">fmt</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Println</span><span style="color:#000;font-weight:bold">(</span><span style="color:#000">buff</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">String</span><span style="color:#000;font-weight:bold">())</span> +<span style="color:#000;font-weight:bold">}</span></code></pre></div> +<pre><code>Long, single-line code blocks should not wrap. They should horizontally scroll if they are too long. This line should be long enough to demonstrate this. +</code></pre> + +<p>Inline code inside table cells should still be distinguishable.</p> + +<table> +<thead> +<tr> +<th>Language</th> +<th>Code</th> +</tr> +</thead> + +<tbody> +<tr> +<td>Javascript</td> +<td><code>var foo = &quot;bar&quot;;</code></td> +</tr> + +<tr> +<td>Ruby</td> +<td><code>foo = &quot;bar&quot;{</code></td> +</tr> +</tbody> +</table> + +<hr /> + +<p>Small images should be shown at their actual size.</p> + +<p><img src="http://placekitten.com/g/300/200/" alt="" /></p> + +<p>Large images should always scale down and fit in the content container.</p> + +<p><img src="http://placekitten.com/g/1200/800/" alt="" /></p> + +<h2 id="components">Components</h2> + +<h3 id="alerts">Alerts</h3> + +<p> + +<div class="alert alert-primary" role="alert"> + +This is an alert. +</div> + + + +<div class="alert alert-primary" role="alert"> +<h4 class="alert-heading">Note:</h4> +This is an alert with a title. +</div> + + + +<div class="alert alert-primary" role="alert"> + +This is a successful alert. +</div> + + + +<div class="alert alert-primary" role="alert"> + +This is a warning! +</div> + + + +<div class="alert alert-primary" role="alert"> +<h4 class="alert-heading">Warning!</h4> +This is a warning with a title! +</div> +</p> + +<h2 id="sizing">Sizing</h2> + +<p>Add some sections here to see how the ToC looks like. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="parameters-available">Parameters available</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="using-pixels">Using pixels</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="using-rem">Using rem</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h2 id="memory">Memory</h2> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="ram-to-use">RAM to use</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="more-is-better">More is better</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="used-ram">Used RAM</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<pre><code>This is the final element on the page and there should be no margin below this. +</code></pre> + + + + + + \ No newline at end of file diff --git a/docs/blog/news/index.html b/docs/blog/news/index.html new file mode 100644 index 00000000..fe7a0a63 --- /dev/null +++ b/docs/blog/news/index.html @@ -0,0 +1,304 @@ + + + + + + + + + + + + + + + + + + + + + + + +News About Docsy | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + News About Docsy | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + + +
+
+ + RSS + + + + + + + + + +
+
+ +

Posts in 2018

+
    + +
  • +
    +
    Second blog post
    +

    Saturday, October 06, 2018 in News

    + + + + + + +

    Text can be bold, italic, or strikethrough. Links should be blue with no underlines (unless hovered over). +There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. …

    +

    Read more

    +
    +
  • + +
  • +
    +
    Announcing Docsy
    +

    Saturday, October 06, 2018 in News

    + + + + + + + +
    +Featured Image for Easy documentation with Docsy + +
    Photo: Riona MacNamara / CC-BY-CA
    + +
    + +

    This is a typical blog post that includes images. +The front matter specifies the date of the blog post, its title, a short description that will be displayed on the blog landing page, and its author. +Including images Here’s an image …

    +

    Read more

    +
    +
  • + +
+ +
+
+
+
+ + + +
+
+ +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/blog/news/index.xml b/docs/blog/news/index.xml new file mode 100644 index 00000000..e7575fd3 --- /dev/null +++ b/docs/blog/news/index.xml @@ -0,0 +1,484 @@ + + + Jenkins Operator – News About Docsy + /blog/news/ + Recent Hugo news from gohugo.io + Hugo -- gohugo.io + Sat, 06 Oct 2018 00:00:00 +0000 + + /img/hugo.png + GoHugo.io + /blog/news/ + + + + + + + + + + + + Blog: Easy documentation with Docsy + /blog/2018/10/06/easy-documentation-with-docsy/ + Sat, 06 Oct 2018 00:00:00 +0000 + + /blog/2018/10/06/easy-documentation-with-docsy/ + + + + + ]]> + + + +<p><strong>This is a typical blog post that includes images.</strong></p> + +<p>The front matter specifies the date of the blog post, its title, a short description that will be displayed on the blog landing page, and its author.</p> + +<h2 id="including-images">Including images</h2> + +<p>Here&rsquo;s an image (<code>featured-sunset-get.png</code>) that includes a byline and a caption.</p> + + + + + + + + +<div class="card rounded p-2 td-post-card mb-4 mt-4" style="max-width: 610px"> + <img class="card-img-top" src="/blog/2018/10/06/easy-documentation-with-docsy/featured-sunset-get_hu69849a7cdb847c2393a7b3a7f6061c86_387442_600x300_fill_catmullrom_smart1_2.png" width="600" height="300"> + + <div class="card-body px-0 pt-2 pb-0"> + <p class="card-text"> +Fetch and scale an image in the upcoming Hugo 0.43. +<small class="text-muted"><br/>Photo: Riona MacNamara / CC-BY-CA</small></p> + </div> + +</div> + +<p>The front matter of this post specifies properties to be assigned to all image resources:</p> + +<pre><code>resources: +- src: &quot;**.{png,jpg}&quot; + title: &quot;Image #:counter&quot; + params: + byline: &quot;Photo: Riona MacNamara / CC-BY-CA&quot; +</code></pre> + +<p>To include the image in a page, specify its details like this:</p> + +<pre><code> + + + + + + +<div class="card rounded p-2 td-post-card mb-4 mt-4" style="max-width: 610px"> + <img class="card-img-top" src="/blog/2018/10/06/easy-documentation-with-docsy/featured-sunset-get_hu69849a7cdb847c2393a7b3a7f6061c86_387442_600x300_fill_catmullrom_smart1_2.png" width="600" height="300"> + + <div class="card-body px-0 pt-2 pb-0"> + <p class="card-text"> +Fetch and scale an image in the upcoming Hugo 0.43. +<small class="text-muted"><br/>Photo: Riona MacNamara / CC-BY-CA</small></p> + </div> + +</div> +</code></pre> + +<p>The image will be rendered at the size and byline specified in the front matter.</p> + + + + + + Blog: The second blog post + /blog/2018/10/06/the-second-blog-post/ + Sat, 06 Oct 2018 00:00:00 +0000 + + /blog/2018/10/06/the-second-blog-post/ + + + + + +<p>Text can be <strong>bold</strong>, <em>italic</em>, or <del>strikethrough</del>. <a href="https://github.com" target="_blank">Links</a> should be blue with no underlines (unless hovered over).</p> + +<p>There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs.</p> + +<p>There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs.</p> + +<blockquote> +<p>There should be no margin above this first sentence.</p> + +<p>Blockquotes should be a lighter gray with a border along the left side in the secondary color.</p> + +<p>There should be no margin below this final sentence.</p> +</blockquote> + +<h2 id="first-header">First Header</h2> + +<p>This is a normal paragraph following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<p>On big screens, paragraphs and headings should not take up the full container width, but we want tables, code blocks and similar to take the full width.</p> + +<p>Lorem markdownum tuta hospes stabat; idem saxum facit quaterque repetito +occumbere, oves novem gestit haerebat frena; qui. Respicit recurvam erat: +pignora hinc reppulit nos <strong>aut</strong>, aptos, ipsa.</p> + +<p>Meae optatos <em>passa est</em> Epiros utiliter <em>Talibus niveis</em>, hoc lata, edidit. +Dixi ad aestum.</p> + +<h2 id="header-2">Header 2</h2> + +<blockquote> +<p>This is a blockquote following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> +</blockquote> + +<h3 id="header-3">Header 3</h3> + +<pre><code>This is a code block following a header. +</code></pre> + +<h4 id="header-4">Header 4</h4> + +<ul> +<li>This is an unordered list following a header.</li> +<li>This is an unordered list following a header.</li> +<li>This is an unordered list following a header.</li> +</ul> + +<h5 id="header-5">Header 5</h5> + +<ol> +<li>This is an ordered list following a header.</li> +<li>This is an ordered list following a header.</li> +<li>This is an ordered list following a header.</li> +</ol> + +<h6 id="header-6">Header 6</h6> + +<table> +<thead> +<tr> +<th>What</th> +<th>Follows</th> +</tr> +</thead> + +<tbody> +<tr> +<td>A table</td> +<td>A header</td> +</tr> + +<tr> +<td>A table</td> +<td>A header</td> +</tr> + +<tr> +<td>A table</td> +<td>A header</td> +</tr> +</tbody> +</table> + +<hr /> + +<p>There&rsquo;s a horizontal rule above and below this.</p> + +<hr /> + +<p>Here is an unordered list:</p> + +<ul> +<li>Salt-n-Pepa</li> +<li>Bel Biv DeVoe</li> +<li>Kid &lsquo;N Play</li> +</ul> + +<p>And an ordered list:</p> + +<ol> +<li>Michael Jackson</li> +<li>Michael Bolton</li> +<li>Michael Bublé</li> +</ol> + +<p>And an unordered task list:</p> + +<ul class="task-list"> +<li><label><input type="checkbox" checked disabled class="task-list-item"> Create a sample markdown document</label></li> +<li><label><input type="checkbox" checked disabled class="task-list-item"> Add task lists to it</label></li> +<li><label><input type="checkbox" disabled class="task-list-item"> Take a vacation</label></li> +</ul> + +<p>And a &ldquo;mixed&rdquo; task list:</p> + +<ul class="task-list"> +<li><label><input type="checkbox" disabled class="task-list-item"> Steal underpants</label></li> +<li>?</li> +<li><label><input type="checkbox" disabled class="task-list-item"> Profit!</label></li> +</ul> + +<p>And a nested list:</p> + +<ul> +<li>Jackson 5 + +<ul> +<li>Michael</li> +<li>Tito</li> +<li>Jackie</li> +<li>Marlon</li> +<li>Jermaine</li> +</ul></li> +<li>TMNT + +<ul> +<li>Leonardo</li> +<li>Michelangelo</li> +<li>Donatello</li> +<li>Raphael</li> +</ul></li> +</ul> + +<p>Definition lists can be used with Markdown syntax. Definition terms are bold.</p> + +<dl> +<dt>Name</dt> +<dd>Godzilla</dd> +<dt>Born</dt> +<dd>1952</dd> +<dt>Birthplace</dt> +<dd>Japan</dd> +<dt>Color</dt> +<dd>Green</dd> +</dl> + +<hr /> + +<p>Tables should have bold headings and alternating shaded rows.</p> + +<table> +<thead> +<tr> +<th>Artist</th> +<th>Album</th> +<th>Year</th> +</tr> +</thead> + +<tbody> +<tr> +<td>Michael Jackson</td> +<td>Thriller</td> +<td>1982</td> +</tr> + +<tr> +<td>Prince</td> +<td>Purple Rain</td> +<td>1984</td> +</tr> + +<tr> +<td>Beastie Boys</td> +<td>License to Ill</td> +<td>1986</td> +</tr> +</tbody> +</table> + +<p>If a table is too wide, it should scroll horizontally.</p> + +<table> +<thead> +<tr> +<th>Artist</th> +<th>Album</th> +<th>Year</th> +<th>Label</th> +<th>Awards</th> +<th>Songs</th> +</tr> +</thead> + +<tbody> +<tr> +<td>Michael Jackson</td> +<td>Thriller</td> +<td>1982</td> +<td>Epic Records</td> +<td>Grammy Award for Album of the Year, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&amp;B Album, Brit Award for Best Selling Album, Grammy Award for Best Engineered Album, Non-Classical</td> +<td>Wanna Be Startin&rsquo; Somethin&rsquo;, Baby Be Mine, The Girl Is Mine, Thriller, Beat It, Billie Jean, Human Nature, P.Y.T. (Pretty Young Thing), The Lady in My Life</td> +</tr> + +<tr> +<td>Prince</td> +<td>Purple Rain</td> +<td>1984</td> +<td>Warner Brothers Records</td> +<td>Grammy Award for Best Score Soundtrack for Visual Media, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&amp;B Album, Brit Award for Best Soundtrack/Cast Recording, Grammy Award for Best Rock Performance by a Duo or Group with Vocal</td> +<td>Let&rsquo;s Go Crazy, Take Me With U, The Beautiful Ones, Computer Blue, Darling Nikki, When Doves Cry, I Would Die 4 U, Baby I&rsquo;m a Star, Purple Rain</td> +</tr> + +<tr> +<td>Beastie Boys</td> +<td>License to Ill</td> +<td>1986</td> +<td>Mercury Records</td> +<td>noawardsbutthistablecelliswide</td> +<td>Rhymin &amp; Stealin, The New Style, She&rsquo;s Crafty, Posse in Effect, Slow Ride, Girls, (You Gotta) Fight for Your Right, No Sleep Till Brooklyn, Paul Revere, Hold It Now, Hit It, Brass Monkey, Slow and Low, Time to Get Ill</td> +</tr> +</tbody> +</table> + +<hr /> + +<p>Code snippets like <code>var foo = &quot;bar&quot;;</code> can be shown inline.</p> + +<p>Also, <code>this should vertically align</code> <del><code>with this</code></del> <del>and this</del>.</p> + +<p>Code can also be shown in a block element.</p> + +<pre><code>foo := &quot;bar&quot;; +bar := &quot;foo&quot;; +</code></pre> + +<p>Code can also use syntax highlighting.</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-go" data-lang="go"><span style="color:#204a87;font-weight:bold">func</span> <span style="color:#000">main</span><span style="color:#000;font-weight:bold">()</span> <span style="color:#000;font-weight:bold">{</span> + <span style="color:#000">input</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#4e9a06">`var foo = &#34;bar&#34;;`</span> + + <span style="color:#000">lexer</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">lexers</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Get</span><span style="color:#000;font-weight:bold">(</span><span style="color:#4e9a06">&#34;javascript&#34;</span><span style="color:#000;font-weight:bold">)</span> + <span style="color:#000">iterator</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">_</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">lexer</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Tokenise</span><span style="color:#000;font-weight:bold">(</span><span style="color:#204a87;font-weight:bold">nil</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">input</span><span style="color:#000;font-weight:bold">)</span> + <span style="color:#000">style</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">styles</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Get</span><span style="color:#000;font-weight:bold">(</span><span style="color:#4e9a06">&#34;github&#34;</span><span style="color:#000;font-weight:bold">)</span> + <span style="color:#000">formatter</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">html</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">New</span><span style="color:#000;font-weight:bold">(</span><span style="color:#000">html</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">WithLineNumbers</span><span style="color:#000;font-weight:bold">())</span> + + <span style="color:#204a87;font-weight:bold">var</span> <span style="color:#000">buff</span> <span style="color:#000">bytes</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Buffer</span> + <span style="color:#000">formatter</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Format</span><span style="color:#000;font-weight:bold">(</span><span style="color:#ce5c00;font-weight:bold">&amp;</span><span style="color:#000">buff</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">style</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">iterator</span><span style="color:#000;font-weight:bold">)</span> + + <span style="color:#000">fmt</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Println</span><span style="color:#000;font-weight:bold">(</span><span style="color:#000">buff</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">String</span><span style="color:#000;font-weight:bold">())</span> +<span style="color:#000;font-weight:bold">}</span></code></pre></div> +<pre><code>Long, single-line code blocks should not wrap. They should horizontally scroll if they are too long. This line should be long enough to demonstrate this. +</code></pre> + +<p>Inline code inside table cells should still be distinguishable.</p> + +<table> +<thead> +<tr> +<th>Language</th> +<th>Code</th> +</tr> +</thead> + +<tbody> +<tr> +<td>Javascript</td> +<td><code>var foo = &quot;bar&quot;;</code></td> +</tr> + +<tr> +<td>Ruby</td> +<td><code>foo = &quot;bar&quot;{</code></td> +</tr> +</tbody> +</table> + +<hr /> + +<p>Small images should be shown at their actual size.</p> + +<p><img src="http://placekitten.com/g/300/200/" alt="" /></p> + +<p>Large images should always scale down and fit in the content container.</p> + +<p><img src="http://placekitten.com/g/1200/800/" alt="" /></p> + +<h2 id="components">Components</h2> + +<h3 id="alerts">Alerts</h3> + +<p> + +<div class="alert alert-primary" role="alert"> + +This is an alert. +</div> + + + +<div class="alert alert-primary" role="alert"> +<h4 class="alert-heading">Note:</h4> +This is an alert with a title. +</div> + + + +<div class="alert alert-primary" role="alert"> + +This is a successful alert. +</div> + + + +<div class="alert alert-primary" role="alert"> + +This is a warning! +</div> + + + +<div class="alert alert-primary" role="alert"> +<h4 class="alert-heading">Warning!</h4> +This is a warning with a title! +</div> +</p> + +<h2 id="sizing">Sizing</h2> + +<p>Add some sections here to see how the ToC looks like. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="parameters-available">Parameters available</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="using-pixels">Using pixels</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="using-rem">Using rem</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h2 id="memory">Memory</h2> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="ram-to-use">RAM to use</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="more-is-better">More is better</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="used-ram">Used RAM</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<pre><code>This is the final element on the page and there should be no margin below this. +</code></pre> + + + + + + \ No newline at end of file diff --git a/docs/blog/news/page/1/index.html b/docs/blog/news/page/1/index.html new file mode 100644 index 00000000..9f1c5bd4 --- /dev/null +++ b/docs/blog/news/page/1/index.html @@ -0,0 +1 @@ +/blog/news/ \ No newline at end of file diff --git a/docs/blog/page/1/index.html b/docs/blog/page/1/index.html new file mode 100644 index 00000000..a6fa7b2b --- /dev/null +++ b/docs/blog/page/1/index.html @@ -0,0 +1 @@ +/blog/ \ No newline at end of file diff --git a/docs/blog/releases/index.html b/docs/blog/releases/index.html new file mode 100644 index 00000000..fa21ebfb --- /dev/null +++ b/docs/blog/releases/index.html @@ -0,0 +1,279 @@ + + + + + + + + + + + + + + + + + + + + + + + +New Releases | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + New Releases | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + + +
+
+ + RSS + + + + + + + + + +
+
+ +

Posts in 2018

+
    + +
  • +
    +
    Release New Features
    +

    Thursday, January 04, 2018 in Releases

    + + + + + + +

    Text can be bold, italic, or strikethrough. Links should be blue with no underlines (unless hovered over). +There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. …

    +

    Read more

    +
    +
  • + +
+ +
+
+
+
+ + + +
+
+ +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/blog/releases/index.xml b/docs/blog/releases/index.xml new file mode 100644 index 00000000..c74bc909 --- /dev/null +++ b/docs/blog/releases/index.xml @@ -0,0 +1,409 @@ + + + Jenkins Operator – New Releases + /blog/releases/ + Recent Hugo news from gohugo.io + Hugo -- gohugo.io + Thu, 04 Jan 2018 00:00:00 +0000 + + /img/hugo.png + GoHugo.io + /blog/releases/ + + + + + + + + + + + + Blog: Another Great Release + /blog/2018/01/04/another-great-release/ + Thu, 04 Jan 2018 00:00:00 +0000 + + /blog/2018/01/04/another-great-release/ + + + + + +<p>Text can be <strong>bold</strong>, <em>italic</em>, or <del>strikethrough</del>. <a href="https://github.com" target="_blank">Links</a> should be blue with no underlines (unless hovered over).</p> + +<p>There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs.</p> + +<p>There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs.</p> + +<blockquote> +<p>There should be no margin above this first sentence.</p> + +<p>Blockquotes should be a lighter gray with a border along the left side in the secondary color.</p> + +<p>There should be no margin below this final sentence.</p> +</blockquote> + +<h2 id="first-header">First Header</h2> + +<p>This is a normal paragraph following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<p>On big screens, paragraphs and headings should not take up the full container width, but we want tables, code blocks and similar to take the full width.</p> + +<p>Lorem markdownum tuta hospes stabat; idem saxum facit quaterque repetito +occumbere, oves novem gestit haerebat frena; qui. Respicit recurvam erat: +pignora hinc reppulit nos <strong>aut</strong>, aptos, ipsa.</p> + +<p>Meae optatos <em>passa est</em> Epiros utiliter <em>Talibus niveis</em>, hoc lata, edidit. +Dixi ad aestum.</p> + +<h2 id="header-2">Header 2</h2> + +<blockquote> +<p>This is a blockquote following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> +</blockquote> + +<h3 id="header-3">Header 3</h3> + +<pre><code>This is a code block following a header. +</code></pre> + +<h4 id="header-4">Header 4</h4> + +<ul> +<li>This is an unordered list following a header.</li> +<li>This is an unordered list following a header.</li> +<li>This is an unordered list following a header.</li> +</ul> + +<h5 id="header-5">Header 5</h5> + +<ol> +<li>This is an ordered list following a header.</li> +<li>This is an ordered list following a header.</li> +<li>This is an ordered list following a header.</li> +</ol> + +<h6 id="header-6">Header 6</h6> + +<table> +<thead> +<tr> +<th>What</th> +<th>Follows</th> +</tr> +</thead> + +<tbody> +<tr> +<td>A table</td> +<td>A header</td> +</tr> + +<tr> +<td>A table</td> +<td>A header</td> +</tr> + +<tr> +<td>A table</td> +<td>A header</td> +</tr> +</tbody> +</table> + +<hr /> + +<p>There&rsquo;s a horizontal rule above and below this.</p> + +<hr /> + +<p>Here is an unordered list:</p> + +<ul> +<li>Salt-n-Pepa</li> +<li>Bel Biv DeVoe</li> +<li>Kid &lsquo;N Play</li> +</ul> + +<p>And an ordered list:</p> + +<ol> +<li>Michael Jackson</li> +<li>Michael Bolton</li> +<li>Michael Bublé</li> +</ol> + +<p>And an unordered task list:</p> + +<ul class="task-list"> +<li><label><input type="checkbox" checked disabled class="task-list-item"> Create a sample markdown document</label></li> +<li><label><input type="checkbox" checked disabled class="task-list-item"> Add task lists to it</label></li> +<li><label><input type="checkbox" disabled class="task-list-item"> Take a vacation</label></li> +</ul> + +<p>And a &ldquo;mixed&rdquo; task list:</p> + +<ul class="task-list"> +<li><label><input type="checkbox" disabled class="task-list-item"> Steal underpants</label></li> +<li>?</li> +<li><label><input type="checkbox" disabled class="task-list-item"> Profit!</label></li> +</ul> + +<p>And a nested list:</p> + +<ul> +<li>Jackson 5 + +<ul> +<li>Michael</li> +<li>Tito</li> +<li>Jackie</li> +<li>Marlon</li> +<li>Jermaine</li> +</ul></li> +<li>TMNT + +<ul> +<li>Leonardo</li> +<li>Michelangelo</li> +<li>Donatello</li> +<li>Raphael</li> +</ul></li> +</ul> + +<p>Definition lists can be used with Markdown syntax. Definition terms are bold.</p> + +<dl> +<dt>Name</dt> +<dd>Godzilla</dd> +<dt>Born</dt> +<dd>1952</dd> +<dt>Birthplace</dt> +<dd>Japan</dd> +<dt>Color</dt> +<dd>Green</dd> +</dl> + +<hr /> + +<p>Tables should have bold headings and alternating shaded rows.</p> + +<table> +<thead> +<tr> +<th>Artist</th> +<th>Album</th> +<th>Year</th> +</tr> +</thead> + +<tbody> +<tr> +<td>Michael Jackson</td> +<td>Thriller</td> +<td>1982</td> +</tr> + +<tr> +<td>Prince</td> +<td>Purple Rain</td> +<td>1984</td> +</tr> + +<tr> +<td>Beastie Boys</td> +<td>License to Ill</td> +<td>1986</td> +</tr> +</tbody> +</table> + +<p>If a table is too wide, it should scroll horizontally.</p> + +<table> +<thead> +<tr> +<th>Artist</th> +<th>Album</th> +<th>Year</th> +<th>Label</th> +<th>Awards</th> +<th>Songs</th> +</tr> +</thead> + +<tbody> +<tr> +<td>Michael Jackson</td> +<td>Thriller</td> +<td>1982</td> +<td>Epic Records</td> +<td>Grammy Award for Album of the Year, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&amp;B Album, Brit Award for Best Selling Album, Grammy Award for Best Engineered Album, Non-Classical</td> +<td>Wanna Be Startin&rsquo; Somethin&rsquo;, Baby Be Mine, The Girl Is Mine, Thriller, Beat It, Billie Jean, Human Nature, P.Y.T. (Pretty Young Thing), The Lady in My Life</td> +</tr> + +<tr> +<td>Prince</td> +<td>Purple Rain</td> +<td>1984</td> +<td>Warner Brothers Records</td> +<td>Grammy Award for Best Score Soundtrack for Visual Media, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&amp;B Album, Brit Award for Best Soundtrack/Cast Recording, Grammy Award for Best Rock Performance by a Duo or Group with Vocal</td> +<td>Let&rsquo;s Go Crazy, Take Me With U, The Beautiful Ones, Computer Blue, Darling Nikki, When Doves Cry, I Would Die 4 U, Baby I&rsquo;m a Star, Purple Rain</td> +</tr> + +<tr> +<td>Beastie Boys</td> +<td>License to Ill</td> +<td>1986</td> +<td>Mercury Records</td> +<td>noawardsbutthistablecelliswide</td> +<td>Rhymin &amp; Stealin, The New Style, She&rsquo;s Crafty, Posse in Effect, Slow Ride, Girls, (You Gotta) Fight for Your Right, No Sleep Till Brooklyn, Paul Revere, Hold It Now, Hit It, Brass Monkey, Slow and Low, Time to Get Ill</td> +</tr> +</tbody> +</table> + +<hr /> + +<p>Code snippets like <code>var foo = &quot;bar&quot;;</code> can be shown inline.</p> + +<p>Also, <code>this should vertically align</code> <del><code>with this</code></del> <del>and this</del>.</p> + +<p>Code can also be shown in a block element.</p> + +<pre><code>foo := &quot;bar&quot;; +bar := &quot;foo&quot;; +</code></pre> + +<p>Code can also use syntax highlighting.</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-go" data-lang="go"><span style="color:#204a87;font-weight:bold">func</span> <span style="color:#000">main</span><span style="color:#000;font-weight:bold">()</span> <span style="color:#000;font-weight:bold">{</span> + <span style="color:#000">input</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#4e9a06">`var foo = &#34;bar&#34;;`</span> + + <span style="color:#000">lexer</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">lexers</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Get</span><span style="color:#000;font-weight:bold">(</span><span style="color:#4e9a06">&#34;javascript&#34;</span><span style="color:#000;font-weight:bold">)</span> + <span style="color:#000">iterator</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">_</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">lexer</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Tokenise</span><span style="color:#000;font-weight:bold">(</span><span style="color:#204a87;font-weight:bold">nil</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">input</span><span style="color:#000;font-weight:bold">)</span> + <span style="color:#000">style</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">styles</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Get</span><span style="color:#000;font-weight:bold">(</span><span style="color:#4e9a06">&#34;github&#34;</span><span style="color:#000;font-weight:bold">)</span> + <span style="color:#000">formatter</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">html</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">New</span><span style="color:#000;font-weight:bold">(</span><span style="color:#000">html</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">WithLineNumbers</span><span style="color:#000;font-weight:bold">())</span> + + <span style="color:#204a87;font-weight:bold">var</span> <span style="color:#000">buff</span> <span style="color:#000">bytes</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Buffer</span> + <span style="color:#000">formatter</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Format</span><span style="color:#000;font-weight:bold">(</span><span style="color:#ce5c00;font-weight:bold">&amp;</span><span style="color:#000">buff</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">style</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">iterator</span><span style="color:#000;font-weight:bold">)</span> + + <span style="color:#000">fmt</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Println</span><span style="color:#000;font-weight:bold">(</span><span style="color:#000">buff</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">String</span><span style="color:#000;font-weight:bold">())</span> +<span style="color:#000;font-weight:bold">}</span></code></pre></div> +<pre><code>Long, single-line code blocks should not wrap. They should horizontally scroll if they are too long. This line should be long enough to demonstrate this. +</code></pre> + +<p>Inline code inside table cells should still be distinguishable.</p> + +<table> +<thead> +<tr> +<th>Language</th> +<th>Code</th> +</tr> +</thead> + +<tbody> +<tr> +<td>Javascript</td> +<td><code>var foo = &quot;bar&quot;;</code></td> +</tr> + +<tr> +<td>Ruby</td> +<td><code>foo = &quot;bar&quot;{</code></td> +</tr> +</tbody> +</table> + +<hr /> + +<p>Small images should be shown at their actual size.</p> + +<p><img src="http://placekitten.com/g/300/200/" alt="" /></p> + +<p>Large images should always scale down and fit in the content container.</p> + +<p><img src="http://placekitten.com/g/1200/800/" alt="" /></p> + +<h2 id="components">Components</h2> + +<h3 id="alerts">Alerts</h3> + +<p> + +<div class="alert alert-primary" role="alert"> + +This is an alert. +</div> + + + +<div class="alert alert-primary" role="alert"> +<h4 class="alert-heading">Note:</h4> +This is an alert with a title. +</div> + + + +<div class="alert alert-primary" role="alert"> + +This is a successful alert. +</div> + + + +<div class="alert alert-primary" role="alert"> + +This is a warning! +</div> + + + +<div class="alert alert-primary" role="alert"> +<h4 class="alert-heading">Warning!</h4> +This is a warning with a title! +</div> +</p> + +<h2 id="sizing">Sizing</h2> + +<p>Add some sections here to see how the ToC looks like. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="parameters-available">Parameters available</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="using-pixels">Using pixels</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="using-rem">Using rem</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h2 id="memory">Memory</h2> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="ram-to-use">RAM to use</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="more-is-better">More is better</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="used-ram">Used RAM</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<pre><code>This is the final element on the page and there should be no margin below this. +</code></pre> + + + + + + \ No newline at end of file diff --git a/docs/blog/releases/page/1/index.html b/docs/blog/releases/page/1/index.html new file mode 100644 index 00000000..c52179a7 --- /dev/null +++ b/docs/blog/releases/page/1/index.html @@ -0,0 +1 @@ +/blog/releases/ \ No newline at end of file diff --git a/docs/community/index.html b/docs/community/index.html new file mode 100644 index 00000000..fa52907c --- /dev/null +++ b/docs/community/index.html @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + +Community | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+ + + +
+
+ +

Join the Jenkins Operator community

+ +

Jenkins Operator is an open source project that anyone in the community can use, improve, and enjoy. We'd love you to join us! Here's a few ways to find out what's happening and get involved. + +

+
+ + + + + + + +
+ + +
+ + +
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/community/index.xml b/docs/community/index.xml new file mode 100644 index 00000000..eac548f2 --- /dev/null +++ b/docs/community/index.xml @@ -0,0 +1,22 @@ + + + Jenkins Operator – Community + /community/ + Recent Hugo news from gohugo.io + Hugo -- gohugo.io + + /img/hugo.png + GoHugo.io + /community/ + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/developer-guide/index.html b/docs/docs/developer-guide/index.html new file mode 100644 index 00000000..45a77bab --- /dev/null +++ b/docs/docs/developer-guide/index.html @@ -0,0 +1,631 @@ + + + + + + + + + + + + + + + + + + + + + + + +Developer Guide | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + Developer Guide | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

Developer Guide

+
Jenkins Operator for developers
+ + + + +
+

This document explains how to setup your development environment.

+ +
+ + +

Prerequisites

+ + + +

Clone repository and download dependencies

+
mkdir -p $GOPATH/src/github.com/jenkinsci
+cd $GOPATH/src/github.com/jenkinsci/
+git clone git@github.com:jenkinsci/kubernetes-operator.git
+cd kubernetes-operator
+make go-dependencies
+

Build and run with a minikube

+ +

Build and run jenkins-operator locally:

+
make minikube-run EXTRA_ARGS='--minikube --local'
+

Once minikube and jenkins-operator are up and running, apply Jenkins custom resource:

+
kubectl apply -f deploy/crds/jenkins_v1alpha2_jenkins_cr.yaml
+kubectl get jenkins -o yaml
+kubectl get po
+

Build and run with a remote Kubernetes cluster

+ +

You can also run the controller locally and make it listen to a remote Kubernetes server.

+
make run NAMESPACE=default KUBECTL_CONTEXT=remote-k8s EXTRA_ARGS='--kubeconfig ~/.kube/config'
+

Once minikube and jenkins-operator are up and running, apply Jenkins custom resource:

+
kubectl --context remote-k8s --namespace default apply -f deploy/crds/jenkins_v1alpha2_jenkins_cr.yaml
+kubectl --context remote-k8s --namespace default get jenkins -o yaml
+kubectl --context remote-k8s --namespace default get po
+

Testing

+ +

Run unit tests:

+
make test
+

Running E2E tests on Linux

+ +

Run e2e tests with minikube:

+
make minikube-start
+eval $(minikube docker-env)
+make build e2e
+

Run the specific e2e test:

+
make build e2e E2E_TEST_SELECTOR='^TestConfiguration$'
+

Running E2E tests on macOS

+ +

At first, you need to start minikube:

+
$ make minikube-start
+$ eval $(minikube docker-env) 
+

Build Docker image inside provided Linux container by:

+
$ make indocker
+

Build jenkins-operator inside container using:

+
$ make build
+

Then exit the container and run:

+ +
make e2e
+
+ +

Tips & Tricks

+ +

Building docker image on minikube (for e2e tests)

+ +

To be able to work with the docker daemon on minikube machine run the following command before building an image:

+
eval $(minikube docker-env)
+

When pkg/apis/jenkinsio/*/jenkins_types.go has changed

+ +

Run:

+
make deepcopy-gen
+

Getting Jenkins URL and basic credentials

+
minikube service jenkins-operator-http-<cr_name> --url
+kubectl get secret jenkins-operator-credentials-<cr_name> -o 'jsonpath={.data.user}' | base64 -d
+kubectl get secret jenkins-operator-credentials-<cr_name> -o 'jsonpath={.data.password}' | base64 -d
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ Tools +
+

Required tools for building and running Jenkins Operator +

+
+ + + + + + + + + + + + + + + + + +
+ + + +
Last modified August 5, 2019 +
+
+ +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/developer-guide/index.xml b/docs/docs/developer-guide/index.xml new file mode 100644 index 00000000..69404df4 --- /dev/null +++ b/docs/docs/developer-guide/index.xml @@ -0,0 +1,83 @@ + + + Jenkins Operator – Developer Guide + /docs/developer-guide/ + Recent Hugo news from gohugo.io + Hugo -- gohugo.io + Mon, 05 Aug 2019 00:00:00 +0000 + + /img/hugo.png + GoHugo.io + /docs/developer-guide/ + + + + + + + + + + + + Docs: Tools + /docs/developer-guide/tools/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/developer-guide/tools/ + + + + + + + +<div class="pageinfo pageinfo-primary"> +<p>This document explains how to install the Go tools used by the development process.</p> + +</div> + + +<h2 id="configure-environment-variables">Configure environment variables</h2> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#204a87">export</span> <span style="color:#000">GOPATH</span><span style="color:#ce5c00;font-weight:bold">=</span>/home/go <span style="color:#8f5902;font-style:italic"># example value</span> +<span style="color:#204a87">export</span> <span style="color:#000">GOROOT</span><span style="color:#ce5c00;font-weight:bold">=</span>/usr/lib/go-1.12 <span style="color:#8f5902;font-style:italic"># example value</span> +<span style="color:#204a87">export</span> <span style="color:#000">PATH</span><span style="color:#ce5c00;font-weight:bold">=</span><span style="color:#000">$GOPATH</span>/bin:<span style="color:#000">$PATH</span></code></pre></div> +<h2 id="goimports">goimports</h2> + +<pre><code>go get golang.org/x/tools/cmd/goimports +cd $GOPATH/src/golang.org/x/tools/cmd/goimports +go build +go install +</code></pre> + +<h2 id="golint">golint</h2> + +<pre><code>go get -u golang.org/x/lint/golint +cd $GOPATH/src/golang.org/x/lint/golint +go build +go install +</code></pre> + +<h2 id="checkmake">checkmake</h2> + +<pre><code>go get github.com/mrtazz/checkmake +cd $GOPATH/src/github.com/mrtazz/checkmake +go build +go install +</code></pre> + +<h2 id="staticcheck">staticcheck</h2> + +<pre><code>mkdir -p $GOPATH/src/github.com/dominikh/ +cd $GOPATH/src/github.com/dominikh/ +git clone https://github.com/dominikh/go-tools.git +cd $GOPATH/src/github.com/dominikh/go-tools/staticcheck +go build +go install +</code></pre> + + + + + + \ No newline at end of file diff --git a/docs/docs/developer-guide/tools/index.html b/docs/docs/developer-guide/tools/index.html new file mode 100644 index 00000000..767b2880 --- /dev/null +++ b/docs/docs/developer-guide/tools/index.html @@ -0,0 +1,542 @@ + + + + + + + + + + + + + + + + + + + + + + +Tools | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tools | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

Tools

+
Required tools for building and running Jenkins Operator
+ + + + +
+

This document explains how to install the Go tools used by the development process.

+ +
+ + +

Configure environment variables

+
export GOPATH=/home/go # example value
+export GOROOT=/usr/lib/go-1.12 # example value
+export PATH=$GOPATH/bin:$PATH
+

goimports

+ +
go get golang.org/x/tools/cmd/goimports
+cd $GOPATH/src/golang.org/x/tools/cmd/goimports
+go build
+go install
+
+ +

golint

+ +
go get -u golang.org/x/lint/golint
+cd  $GOPATH/src/golang.org/x/lint/golint
+go build
+go install
+
+ +

checkmake

+ +
go get github.com/mrtazz/checkmake
+cd $GOPATH/src/github.com/mrtazz/checkmake
+go build
+go install
+
+ +

staticcheck

+ +
mkdir -p $GOPATH/src/github.com/dominikh/
+cd $GOPATH/src/github.com/dominikh/
+git clone https://github.com/dominikh/go-tools.git
+cd  $GOPATH/src/github.com/dominikh/go-tools/staticcheck
+go build
+go install
+
+ + + +
Last modified August 5, 2019 +
+
+ + +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/getting-started/index.html b/docs/docs/getting-started/index.html new file mode 100644 index 00000000..20a4e3e8 --- /dev/null +++ b/docs/docs/getting-started/index.html @@ -0,0 +1,571 @@ + + + + + + + + + + + + + + + + + + + + + + + +Getting Started | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + Getting Started | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

Getting Started

+
How to work with jenkins-operator
+ + + + +
+

This document describes a getting started guide for jenkins-operator

+ +
+ + +

First Steps

+ +

Prepare your Kubernetes cluster and set up access. +Once you have running Kubernetes cluster you can focus on installing jenkins-operator according to the Installation guide.

+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ v0.1.1 +
+

How to work with jenkins-operator legacy version. We recommend migration to v0.2.0 version +

+
+ + + +
+
+ v0.2.0 +
+

How to work with jenkins-operator latest version +

+
+ + + + + + + + + + + + + + + + + + + + + +
+ + + +
Last modified August 5, 2019 +
+
+ +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/getting-started/index.xml b/docs/docs/getting-started/index.xml new file mode 100644 index 00000000..89fb29b4 --- /dev/null +++ b/docs/docs/getting-started/index.xml @@ -0,0 +1,77 @@ + + + Jenkins Operator – Getting Started + /docs/getting-started/ + Recent Hugo news from gohugo.io + Hugo -- gohugo.io + Mon, 05 Aug 2019 00:00:00 +0000 + + /img/hugo.png + GoHugo.io + /docs/getting-started/ + + + + + + + + + + + + Docs: v0.1.1 + /docs/getting-started/v0.1.1/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.1.1/ + + + + + + + +<div class="pageinfo pageinfo-primary"> +<p>This document describes a getting started guide for <strong>jenkins-operator</strong> <code>v0.1.1</code> and an additional configuration.</p> + +</div> + + +<h2 id="first-steps">First Steps</h2> + +<p>Prepare your Kubernetes cluster and set up access. +Once you have running Kubernetes cluster you can focus on installing <strong>jenkins-operator</strong> according to the <a href="/docs/installation/">Installation</a> guide.</p> + + + + + + Docs: v0.2.0 + /docs/getting-started/v0.2.0/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.2.0/ + + + + + + + +<div class="pageinfo pageinfo-primary"> +<p>This document describes a getting started guide for <strong>jenkins-operator</strong> <code>v0.2.0</code> and an additional configuration.</p> + +</div> + + +<h2 id="first-steps">First Steps</h2> + +<p>Prepare your Kubernetes cluster and set up access. +Once you have running Kubernetes cluster you can focus on installing <strong>jenkins-operator</strong> according to the <a href="/docs/installation/">Installation</a> guide.</p> + + + + + + \ No newline at end of file diff --git a/docs/docs/getting-started/v0.1.1/aks/index.html b/docs/docs/getting-started/v0.1.1/aks/index.html new file mode 100644 index 00000000..57cb6ed4 --- /dev/null +++ b/docs/docs/getting-started/v0.1.1/aks/index.html @@ -0,0 +1,516 @@ + + + + + + + + + + + + + + + + + + + + + + +AKS | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AKS | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

AKS

+
Additional configuration for Azure Kubernetes Service
+

Azure AKS managed Kubernetes service adds to every pod the following envs:

+
- name: KUBERNETES_PORT_443_TCP_ADDR
+  value:
+- name: KUBERNETES_PORT
+  value: tcp://
+- name: KUBERNETES_PORT_443_TCP
+  value: tcp://
+- name: KUBERNETES_SERVICE_HOST
+  value:
+

The operator is aware of it and omits these envs when checking if Jenkins pod envs have been changed. It prevents +restart Jenkins pod over and over again.

+ + + +
Last modified August 5, 2019 +
+
+ + +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/getting-started/v0.1.1/configuration/index.html b/docs/docs/getting-started/v0.1.1/configuration/index.html new file mode 100644 index 00000000..ddbd0f35 --- /dev/null +++ b/docs/docs/getting-started/v0.1.1/configuration/index.html @@ -0,0 +1,741 @@ + + + + + + + + + + + + + + + + + + + + + + +Configuration | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Configuration | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

Configuration

+
How to configure Jenkins with Operator
+ + +

Jenkins operator uses job-dsl and kubernetes-credentials-provider plugins for configuring jobs +and deploy keys.

+ +

Prepare job definitions and pipelines

+ +

First you have to prepare pipelines and job definition in your GitHub repository using the following structure:

+ +
cicd/
+├── jobs
+│   └── build.jenkins
+└── pipelines
+    └── build.jenkins
+
+ +

cicd/jobs/build.jenkins it’s a job definition:

+ +
#!/usr/bin/env groovy
+
+pipelineJob('build-jenkins-operator') {
+    displayName('Build jenkins-operator')
+
+    definition {
+        cpsScm {
+            scm {
+                git {
+                    remote {
+                        url('https://github.com/jenkinsci/kubernetes-operator.git')
+                        credentials('jenkins-operator')
+                    }
+                    branches('*/master')
+                }
+            }
+            scriptPath('cicd/pipelines/build.jenkins')
+        }
+    }
+}
+
+ +

cicd/jobs/build.jenkins it’s an actual Jenkins pipeline:

+ +
#!/usr/bin/env groovy
+
+def label = "build-jenkins-operator-${UUID.randomUUID().toString()}"
+def home = "/home/jenkins"
+def workspace = "${home}/workspace/build-jenkins-operator"
+def workdir = "${workspace}/src/github.com/jenkinsci/kubernetes-operator/"
+
+podTemplate(label: label,
+        containers: [
+                containerTemplate(name: 'jnlp', image: 'jenkins/jnlp-slave:alpine'),
+                containerTemplate(name: 'go', image: 'golang:1-alpine', command: 'cat', ttyEnabled: true),
+        ],
+        envVars: [
+                envVar(key: 'GOPATH', value: workspace),
+        ],
+        ) {
+
+    node(label) {
+        dir(workdir) {
+            stage('Init') {
+                timeout(time: 3, unit: 'MINUTES') {
+                    checkout scm
+                }
+                container('go') {
+                    sh 'apk --no-cache --update add make git gcc libc-dev'
+                }
+            }
+
+            stage('Dep') {
+                container('go') {
+                    sh 'make dep'
+                }
+            }
+
+            stage('Test') {
+                container('go') {
+                    sh 'make test'
+                }
+            }
+
+            stage('Build') {
+                container('go') {
+                    sh 'make build'
+                }
+            }
+        }
+    }
+}
+
+ +

Configure Seed Jobs

+ +

Jenkins Seed Jobs are configured using Jenkins.spec.seedJobs section from your custom resource manifest:

+ +
apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+  name: example
+spec:
+  seedJobs:
+  - id: jenkins-operator
+    targets: "cicd/jobs/*.jenkins"
+    description: "Jenkins Operator repository"
+    repositoryBranch: master
+    repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git
+
+ +

jenkins-operator will automatically discover and configure all seed jobs.

+ +

You can verify if deploy keys were successfully configured in Jenkins Credentials tab.

+ +

jenkins

+ +

You can verify if your pipelines were successfully configured in Jenkins Seed Job console output.

+ +

jenkins

+ +

If your GitHub repository is private you have to configure SSH or username/password authentication.

+ +

SSH authentication

+ +

Generate SSH Keys

+ +

There are two methods of SSH private key generation:

+
$ openssl genrsa -out <filename> 2048
+

or

+
$ ssh-keygen -t rsa -b 2048
+$ ssh-keygen -p -f <filename> -m pem
+

Then copy content from generated file.

+ +

Public key

+ +

If you want to upload your public key to your Git server you need to extract it.

+ +

If key was generated by openssl then you need to type this to extract public key:

+
$ openssl rsa -in <filename> -pubout > <filename>.pub
+

If key was generated by ssh-keygen the public key content is located in .pub and there is no need to extract public key

+ +

Configure SSH authentication

+ +

Configure seed job like:

+ +
apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+  name: example
+spec:
+  seedJobs:
+  - id: jenkins-operator-ssh
+    credentialType: basicSSHUserPrivateKey
+    credentialID: k8s-ssh
+    targets: "cicd/jobs/*.jenkins"
+    description: "Jenkins Operator repository"
+    repositoryBranch: master
+    repositoryUrl: git@github.com:jenkinsci/kubernetes-operator.git
+
+ +

and create Kubernetes Secret(name of secret should be the same from credentialID field):

+ +
apiVersion: v1
+kind: Secret
+metadata:
+  name: k8s-ssh
+stringData:
+  privateKey: |
+    -----BEGIN RSA PRIVATE KEY-----
+    MIIJKAIBAAKCAgEAxxDpleJjMCN5nusfW/AtBAZhx8UVVlhhhIKXvQ+dFODQIdzO
+    oDXybs1zVHWOj31zqbbJnsfsVZ9Uf3p9k6xpJ3WFY9b85WasqTDN1xmSd6swD4N8
+    ...
+  username: github_user_name
+
+ +

Username & password authentication

+ +

Configure seed job like:

+ +
apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+  name: example
+spec:
+  seedJobs:
+  - id: jenkins-operator-user-pass
+    credentialType: usernamePassword
+    credentialID: k8s-user-pass
+    targets: "cicd/jobs/*.jenkins"
+    description: "Jenkins Operator repository"
+    repositoryBranch: master
+    repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git
+
+ +

and create Kubernetes Secret(name of secret should be the same from credentialID field):

+ +
apiVersion: v1
+kind: Secret
+metadata:
+  name: k8s-user-pass
+stringData:
+  username: github_user_name
+  password: password_or_token
+
+ +

Jenkins login credentials

+ +

The operator automatically generate Jenkins user name and password and stores it in Kubernetes secret named +jenkins-operator-credentials-<cr_name> in namespace where Jenkins CR has been deployed.

+ +

If you want change it you can override the secret:

+
apiVersion: v1
+kind: Secret
+metadata:
+  name: jenkins-operator-credentials-<cr-name>
+  namespace: <namespace>
+data:
+  user: <base64-encoded-new-username>
+  password: <base64-encoded-new-password>
+

If needed jenkins-operator will restart Jenkins master pod and then you can login with the new user and password +credentials.

+ +

Override default Jenkins container command

+ +

The default command for the Jenkins master container jenkins/jenkins:lts looks like:

+
command:
+- bash
+- -c
+- /var/jenkins/scripts/init.sh && /sbin/tini -s -- /usr/local/bin/jenkins.sh
+

The script/var/jenkins/scripts/init.sh is provided be the operator and configures init.groovy.d(creates Jenkins user) +and installs plugins. +The /sbin/tini -s -- /usr/local/bin/jenkins.sh command runs the Jenkins master main process.

+ +

You can overwrite it in the following pattern:

+
command:
+- bash
+- -c
+- /var/jenkins/scripts/init.sh && <custom-code-here> && /sbin/tini -s -- /usr/local/bin/jenkins.sh
+ + +
Last modified August 5, 2019 +
+
+ + +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/getting-started/v0.1.1/configure-backup-and-restore/index.html b/docs/docs/getting-started/v0.1.1/configure-backup-and-restore/index.html new file mode 100644 index 00000000..c6202c06 --- /dev/null +++ b/docs/docs/getting-started/v0.1.1/configure-backup-and-restore/index.html @@ -0,0 +1,572 @@ + + + + + + + + + + + + + + + + + + + + + + +Configure backup and restore | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Configure backup and restore | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

Configure backup and restore

+
Prevent job history loss
+ + +

Backup and restore is done by container sidecar.

+ +

Create PVC

+ +

Save to file pvc.yaml:

+
apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: <pvc_name>
+  namespace: <namesapce>
+spec:
+  accessModes:
+  - ReadWriteOnce
+  resources:
+    requests:
+      storage: 500Gi
+

Run command:

+
$ kubectl -n <namesapce> create -f pvc.yaml
+

Configure Jenkins CR

+
apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+  name: <cr_name>
+  namespace: <namespace>
+spec:
+  master:
+    securityContext:
+      runAsUser: 1000
+      fsGroup: 1000
+    containers:
+    - name: jenkins-master
+      image: jenkins/jenkins:lts
+    - name: backup # container responsible for backup and restore
+      env:
+      - name: BACKUP_DIR
+        value: /backup
+      - name: JENKINS_HOME
+        value: /jenkins-home
+      - name: BACKUP_COUNT
+        value: "3" # keep only the 2 most recent backups
+      image: virtuslab/jenkins-operator-backup-pvc:v0.0.6 # look at backup/pvc directory
+      imagePullPolicy: IfNotPresent
+      volumeMounts:
+      - mountPath: /jenkins-home # Jenkins home volume
+        name: jenkins-home
+      - mountPath: /backup # backup volume
+        name: backup
+    volumes:
+    - name: backup # PVC volume where backups will be stored
+      persistentVolumeClaim:
+        claimName: <pvc_name>
+  backup:
+    containerName: backup # container name is responsible for backup
+    action:
+      exec:
+        command:
+        - /home/user/bin/backup.sh # this command is invoked on "backup" container to make backup, for example /home/user/bin/backup.sh <backup_number>, <backup_number> is passed by operator
+    interval: 30 # how often make backup in seconds
+    makeBackupBeforePodDeletion: true # make backup before pod deletion
+  restore:
+    containerName: backup # container name is responsible for restore backup
+    action:
+      exec:
+        command:
+        - /home/user/bin/restore.sh # this command is invoked on "backup" container to make restore backup, for example /home/user/bin/restore.sh <backup_number>, <backup_number> is passed by operator
+    #recoveryOnce: <backup_number> # if want to restore specific backup configure this field and then Jenkins will be restarted and desired backup will be restored
+ + +
Last modified August 5, 2019 +
+
+ + +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/getting-started/v0.1.1/customization/index.html b/docs/docs/getting-started/v0.1.1/customization/index.html new file mode 100644 index 00000000..fcc56d63 --- /dev/null +++ b/docs/docs/getting-started/v0.1.1/customization/index.html @@ -0,0 +1,607 @@ + + + + + + + + + + + + + + + + + + + + + + +Customization | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Customization | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

Customization

+
How to customize Jenkins
+ + +

Jenkins can be customized using groovy scripts or configuration as code plugin. All custom configuration is stored in +the jenkins-operator-user-configuration- ConfigMap which is automatically created by jenkins-operator.

+ +

jenkins-operator creates jenkins-operator-user-configuration- secret where user can store sensitive +information used for custom configuration. If you have entry in secret named PASSWORD then you can use it in +Configuration as Plugin as adminAddress: "${PASSWORD}".

+ +
kubectl get secret jenkins-operator-user-configuration-<cr_name> -o yaml
+
+kind: Secret
+apiVersion: v1
+type: Opaque
+metadata:
+  name: jenkins-operator-user-configuration-<cr_name>
+  namespace: default
+data:
+  SECRET_JENKINS_ADMIN_ADDRESS: YXNkZgo=
+
+
+ +
kubectl get configmap jenkins-operator-user-configuration-<cr_name> -o yaml
+
+apiVersion: v1
+data:
+  1-configure-theme.groovy: |2
+    import jenkins.*
+    import jenkins.model.*
+    import hudson.*
+    import hudson.model.*
+    import org.jenkinsci.plugins.simpletheme.ThemeElement
+    import org.jenkinsci.plugins.simpletheme.CssTextThemeElement
+    import org.jenkinsci.plugins.simpletheme.CssUrlThemeElement
+
+    Jenkins jenkins = Jenkins.getInstance()
+
+    def decorator = Jenkins.instance.getDescriptorByType(org.codefirst.SimpleThemeDecorator.class)
+
+    List<ThemeElement> configElements = new ArrayList<>();
+    configElements.add(new CssTextThemeElement("DEFAULT"));
+    configElements.add(new CssUrlThemeElement("https://cdn.rawgit.com/afonsof/jenkins-material-theme/gh-pages/dist/material-light-green.css"));
+    decorator.setElements(configElements);
+    decorator.save();
+
+    jenkins.save()
+  1-system-message.yaml: |2
+    jenkins:
+      systemMessage: "Configuration as Code integration works!!!"
+      adminAddress: "${SECRET_JENKINS_ADMIN_ADDRESS}"
+kind: ConfigMap
+metadata:
+  name: jenkins-operator-user-configuration-<cr_name>
+  namespace: default
+
+ +

When jenkins-operator-user-configuration- ConfigMap is updated Jenkins automatically +runs the jenkins-operator-user-configuration Jenkins Job which executes all scripts then +runs the jenkins-operator-user-configuration-casc Jenkins Job which applies Configuration as Code configuration.

+ +

Install Plugins

+ +

Edit CR under spec.master.plugins:

+ +
apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+  name: example
+spec:
+  master:
+   plugins:
+   - name: simple-theme-plugin
+     version: 0.5.1
+
+ +

Under spec.master.basePlugins you can find plugins for valid jenkins-operator work:

+
apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+  name: example
+spec:
+  master:
+    basePlugins:
+    - name: kubernetes
+      version: 1.18.3
+    - name: workflow-job
+      version: "2.34"
+    - name: workflow-aggregator
+      version: "2.6"
+    - name: git
+      version: 3.12.0
+    - name: job-dsl
+      version: "1.76"
+    - name: configuration-as-code
+      version: "1.29"
+    - name: configuration-as-code-support
+      version: "1.19"
+    - name: kubernetes-credentials-provider
+      version: 0.12.1
+

You can change version of them.

+ +

Then jenkins-operator will automatically install plugins after Jenkins master pod restart.

+ + + +
Last modified August 5, 2019 +
+
+ + +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/getting-started/v0.1.1/deploy-jenkins/index.html b/docs/docs/getting-started/v0.1.1/deploy-jenkins/index.html new file mode 100644 index 00000000..534879bf --- /dev/null +++ b/docs/docs/getting-started/v0.1.1/deploy-jenkins/index.html @@ -0,0 +1,567 @@ + + + + + + + + + + + + + + + + + + + + + + +Deploy Jenkins | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Deploy Jenkins | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

Deploy Jenkins

+
Deploy production ready Jenkins Operator manifest
+ + +

Deploy Jenkins

+ +

Once jenkins-operator is up and running let’s deploy actual Jenkins instance. +Create manifest ie. jenkins_instance.yaml with following data and save it on drive.

+
apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+  name: example
+spec:
+  master:
+    containers:
+    - name: jenkins-master
+      image: jenkins/jenkins:lts
+      imagePullPolicy: Always
+      livenessProbe:
+        failureThreshold: 12
+        httpGet:
+          path: /login
+          port: http
+          scheme: HTTP
+        initialDelaySeconds: 80
+        periodSeconds: 10
+        successThreshold: 1
+        timeoutSeconds: 5
+      readinessProbe:
+        failureThreshold: 3
+        httpGet:
+          path: /login
+          port: http
+          scheme: HTTP
+        initialDelaySeconds: 30
+        periodSeconds: 10
+        successThreshold: 1
+        timeoutSeconds: 1
+      resources:
+        limits:
+          cpu: 1500m
+          memory: 3Gi
+        requests:
+          cpu: "1"
+          memory: 500Mi
+  seedJobs:
+  - id: jenkins-operator
+    targets: "cicd/jobs/*.jenkins"
+    description: "Jenkins Operator repository"
+    repositoryBranch: master
+    repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git
+

Deploy Jenkins to K8s:

+
kubectl create -f jenkins_instance.yaml
+

Watch Jenkins instance being created:

+
kubectl get pods -w
+

Get Jenkins credentials:

+
kubectl get secret jenkins-operator-credentials-<cr_name> -o 'jsonpath={.data.user}' | base64 -d
+kubectl get secret jenkins-operator-credentials-<cr_name> -o 'jsonpath={.data.password}' | base64 -d
+

Connect to Jenkins (minikube):

+
minikube service jenkins-operator-http-<cr_name> --url
+

Connect to Jenkins (actual Kubernetes cluster):

+
kubectl port-forward jenkins-<cr_name> 8080:8080
+

Then open browser with address http://localhost:8080. +jenkins

+ + + +
Last modified August 5, 2019 +
+
+ + +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/getting-started/v0.1.1/diagnostics/index.html b/docs/docs/getting-started/v0.1.1/diagnostics/index.html new file mode 100644 index 00000000..4ee27b18 --- /dev/null +++ b/docs/docs/getting-started/v0.1.1/diagnostics/index.html @@ -0,0 +1,519 @@ + + + + + + + + + + + + + + + + + + + + + + +Diagnostics | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Diagnostics | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

Diagnostics

+
How to deal with jenkins-operator problems
+ + +

Turn on debug in jenkins-operator deployment:

+
sed -i 's|\(args:\).*|\1\ ["--debug"\]|' deploy/operator.yaml
+kubectl apply -f deploy/operator.yaml
+

Watch Kubernetes events:

+
kubectl get events --sort-by='{.lastTimestamp}'
+

Verify Jenkins master logs:

+
kubectl logs -f jenkins-<cr_name>
+

Verify jenkins-operator logs:

+
kubectl logs deployment/jenkins-operator
+

Troubleshooting

+ +

Delete Jenkins master pod and wait for the new one to come up:

+
kubectl delete pod jenkins-<cr_name>
+ + +
Last modified August 5, 2019 +
+
+ + +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/getting-started/v0.1.1/index.html b/docs/docs/getting-started/v0.1.1/index.html new file mode 100644 index 00000000..23155d57 --- /dev/null +++ b/docs/docs/getting-started/v0.1.1/index.html @@ -0,0 +1,629 @@ + + + + + + + + + + + + + + + + + + + + + + + +v0.1.1 | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + v0.1.1 | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

v0.1.1

+
How to work with jenkins-operator legacy version. We recommend migration to v0.2.0 version
+ + + + +
+

This document describes a getting started guide for jenkins-operator v0.1.1 and an additional configuration.

+ +
+ + +

First Steps

+ +

Prepare your Kubernetes cluster and set up access. +Once you have running Kubernetes cluster you can focus on installing jenkins-operator according to the Installation guide.

+ +
+ + + + +
+ + + + +
+
+ Deploy Jenkins +
+

Deploy production ready Jenkins Operator manifest +

+
+ + + + + + + +
+
+ Configuration +
+

How to configure Jenkins with Operator +

+
+ + + + + +
+
+ Customization +
+

How to customize Jenkins +

+
+ + + + + + + +
+
+ AKS +
+

Additional configuration for Azure Kubernetes Service +

+
+ + + + + +
+
+ Configure backup and restore +
+

Prevent job history loss +

+
+ + + + + + + + + + + + + + + + + + + +
+
+ Diagnostics +
+

How to deal with jenkins-operator problems +

+
+ + + + + +
+
+ Scheme +
+

API Schema definitions for Jenkins CR +

+
+ + + + + +
+
+ Migration guide from v1alpha1 to v1alpha2 +
+

How to migrate to new CRD manifest +

+
+ + + + + + + +
+ + + +
Last modified August 5, 2019 +
+
+ +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/getting-started/v0.1.1/index.xml b/docs/docs/getting-started/v0.1.1/index.xml new file mode 100644 index 00000000..1ad93d3f --- /dev/null +++ b/docs/docs/getting-started/v0.1.1/index.xml @@ -0,0 +1,2367 @@ + + + Jenkins Operator – v0.1.1 + /docs/getting-started/v0.1.1/ + Recent Hugo news from gohugo.io + Hugo -- gohugo.io + Mon, 05 Aug 2019 00:00:00 +0000 + + /img/hugo.png + GoHugo.io + /docs/getting-started/v0.1.1/ + + + + + + + + + + + + Docs: Deploy Jenkins + /docs/getting-started/v0.1.1/deploy-jenkins/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.1.1/deploy-jenkins/ + + + + + +<h2 id="deploy-jenkins">Deploy Jenkins</h2> + +<p>Once jenkins-operator is up and running let&rsquo;s deploy actual Jenkins instance. +Create manifest ie. <strong>jenkins_instance.yaml</strong> with following data and save it on drive.</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">apiVersion: jenkins.io/v1alpha2 +kind: Jenkins +metadata: + name: example +spec: + master: + containers: + - name: jenkins-master + image: jenkins/jenkins:lts + imagePullPolicy: Always + livenessProbe: + failureThreshold: <span style="color:#0000cf;font-weight:bold">12</span> + httpGet: + path: /login + port: http + scheme: HTTP + initialDelaySeconds: <span style="color:#0000cf;font-weight:bold">80</span> + periodSeconds: <span style="color:#0000cf;font-weight:bold">10</span> + successThreshold: <span style="color:#0000cf;font-weight:bold">1</span> + timeoutSeconds: <span style="color:#0000cf;font-weight:bold">5</span> + readinessProbe: + failureThreshold: <span style="color:#0000cf;font-weight:bold">3</span> + httpGet: + path: /login + port: http + scheme: HTTP + initialDelaySeconds: <span style="color:#0000cf;font-weight:bold">30</span> + periodSeconds: <span style="color:#0000cf;font-weight:bold">10</span> + successThreshold: <span style="color:#0000cf;font-weight:bold">1</span> + timeoutSeconds: <span style="color:#0000cf;font-weight:bold">1</span> + resources: + limits: + cpu: 1500m + memory: 3Gi + requests: + cpu: <span style="color:#4e9a06">&#34;1&#34;</span> + memory: 500Mi + seedJobs: + - id: jenkins-operator + targets: <span style="color:#4e9a06">&#34;cicd/jobs/*.jenkins&#34;</span> + description: <span style="color:#4e9a06">&#34;Jenkins Operator repository&#34;</span> + repositoryBranch: master + repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git</code></pre></div> +<p>Deploy Jenkins to K8s:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl create -f jenkins_instance.yaml</code></pre></div> +<p>Watch Jenkins instance being created:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl get pods -w</code></pre></div> +<p>Get Jenkins credentials:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl get secret jenkins-operator-credentials-&lt;cr_name&gt; -o <span style="color:#4e9a06">&#39;jsonpath={.data.user}&#39;</span> <span style="color:#000;font-weight:bold">|</span> base64 -d +kubectl get secret jenkins-operator-credentials-&lt;cr_name&gt; -o <span style="color:#4e9a06">&#39;jsonpath={.data.password}&#39;</span> <span style="color:#000;font-weight:bold">|</span> base64 -d</code></pre></div> +<p>Connect to Jenkins (minikube):</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">minikube service jenkins-operator-http-&lt;cr_name&gt; --url</code></pre></div> +<p>Connect to Jenkins (actual Kubernetes cluster):</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl port-forward jenkins-&lt;cr_name&gt; <span style="color:#0000cf;font-weight:bold">8080</span>:8080</code></pre></div> +<p>Then open browser with address <code>http://localhost:8080</code>. +<img src="/img/jenkins.png" alt="jenkins" /></p> + + + + + + Docs: Configuration + /docs/getting-started/v0.1.1/configuration/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.1.1/configuration/ + + + + + +<p>Jenkins operator uses <a href="https://github.com/jenkinsci/job-dsl-plugin" target="_blank">job-dsl</a> and <a href="https://jenkinsci.github.io/kubernetes-credentials-provider-plugin/" target="_blank">kubernetes-credentials-provider</a> plugins for configuring jobs +and deploy keys.</p> + +<h2 id="prepare-job-definitions-and-pipelines">Prepare job definitions and pipelines</h2> + +<p>First you have to prepare pipelines and job definition in your GitHub repository using the following structure:</p> + +<pre><code>cicd/ +├── jobs +│   └── build.jenkins +└── pipelines + └── build.jenkins +</code></pre> + +<p><strong>cicd/jobs/build.jenkins</strong> it&rsquo;s a job definition:</p> + +<pre><code>#!/usr/bin/env groovy + +pipelineJob('build-jenkins-operator') { + displayName('Build jenkins-operator') + + definition { + cpsScm { + scm { + git { + remote { + url('https://github.com/jenkinsci/kubernetes-operator.git') + credentials('jenkins-operator') + } + branches('*/master') + } + } + scriptPath('cicd/pipelines/build.jenkins') + } + } +} +</code></pre> + +<p><strong>cicd/jobs/build.jenkins</strong> it&rsquo;s an actual Jenkins pipeline:</p> + +<pre><code>#!/usr/bin/env groovy + +def label = &quot;build-jenkins-operator-${UUID.randomUUID().toString()}&quot; +def home = &quot;/home/jenkins&quot; +def workspace = &quot;${home}/workspace/build-jenkins-operator&quot; +def workdir = &quot;${workspace}/src/github.com/jenkinsci/kubernetes-operator/&quot; + +podTemplate(label: label, + containers: [ + containerTemplate(name: 'jnlp', image: 'jenkins/jnlp-slave:alpine'), + containerTemplate(name: 'go', image: 'golang:1-alpine', command: 'cat', ttyEnabled: true), + ], + envVars: [ + envVar(key: 'GOPATH', value: workspace), + ], + ) { + + node(label) { + dir(workdir) { + stage('Init') { + timeout(time: 3, unit: 'MINUTES') { + checkout scm + } + container('go') { + sh 'apk --no-cache --update add make git gcc libc-dev' + } + } + + stage('Dep') { + container('go') { + sh 'make dep' + } + } + + stage('Test') { + container('go') { + sh 'make test' + } + } + + stage('Build') { + container('go') { + sh 'make build' + } + } + } + } +} +</code></pre> + +<h2 id="configure-seed-jobs">Configure Seed Jobs</h2> + +<p>Jenkins Seed Jobs are configured using <code>Jenkins.spec.seedJobs</code> section from your custom resource manifest:</p> + +<pre><code>apiVersion: jenkins.io/v1alpha2 +kind: Jenkins +metadata: + name: example +spec: + seedJobs: + - id: jenkins-operator + targets: &quot;cicd/jobs/*.jenkins&quot; + description: &quot;Jenkins Operator repository&quot; + repositoryBranch: master + repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git +</code></pre> + +<p><strong>jenkins-operator</strong> will automatically discover and configure all seed jobs.</p> + +<p>You can verify if deploy keys were successfully configured in Jenkins <strong>Credentials</strong> tab.</p> + +<p><img src="/img/jenkins-credentials.png" alt="jenkins" /></p> + +<p>You can verify if your pipelines were successfully configured in Jenkins Seed Job console output.</p> + +<p><img src="/img/jenkins-seed.png" alt="jenkins" /></p> + +<p>If your GitHub repository is <strong>private</strong> you have to configure SSH or username/password authentication.</p> + +<h3 id="ssh-authentication">SSH authentication</h3> + +<h4 id="generate-ssh-keys">Generate SSH Keys</h4> + +<p>There are two methods of SSH private key generation:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ openssl genrsa -out &lt;filename&gt; <span style="color:#0000cf;font-weight:bold">2048</span></code></pre></div> +<p>or</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ ssh-keygen -t rsa -b <span style="color:#0000cf;font-weight:bold">2048</span> +$ ssh-keygen -p -f &lt;filename&gt; -m pem</code></pre></div> +<p>Then copy content from generated file.</p> + +<h4 id="public-key">Public key</h4> + +<p>If you want to upload your public key to your Git server you need to extract it.</p> + +<p>If key was generated by <code>openssl</code> then you need to type this to extract public key:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ openssl rsa -in &lt;filename&gt; -pubout &gt; &lt;filename&gt;.pub</code></pre></div> +<p>If key was generated by <code>ssh-keygen</code> the public key content is located in <filename>.pub and there is no need to extract public key</p> + +<h4 id="configure-ssh-authentication">Configure SSH authentication</h4> + +<p>Configure seed job like:</p> + +<pre><code>apiVersion: jenkins.io/v1alpha2 +kind: Jenkins +metadata: + name: example +spec: + seedJobs: + - id: jenkins-operator-ssh + credentialType: basicSSHUserPrivateKey + credentialID: k8s-ssh + targets: &quot;cicd/jobs/*.jenkins&quot; + description: &quot;Jenkins Operator repository&quot; + repositoryBranch: master + repositoryUrl: git@github.com:jenkinsci/kubernetes-operator.git +</code></pre> + +<p>and create Kubernetes Secret(name of secret should be the same from <code>credentialID</code> field):</p> + +<pre><code>apiVersion: v1 +kind: Secret +metadata: + name: k8s-ssh +stringData: + privateKey: | + -----BEGIN RSA PRIVATE KEY----- + MIIJKAIBAAKCAgEAxxDpleJjMCN5nusfW/AtBAZhx8UVVlhhhIKXvQ+dFODQIdzO + oDXybs1zVHWOj31zqbbJnsfsVZ9Uf3p9k6xpJ3WFY9b85WasqTDN1xmSd6swD4N8 + ... + username: github_user_name +</code></pre> + +<h3 id="username-password-authentication">Username &amp; password authentication</h3> + +<p>Configure seed job like:</p> + +<pre><code>apiVersion: jenkins.io/v1alpha2 +kind: Jenkins +metadata: + name: example +spec: + seedJobs: + - id: jenkins-operator-user-pass + credentialType: usernamePassword + credentialID: k8s-user-pass + targets: &quot;cicd/jobs/*.jenkins&quot; + description: &quot;Jenkins Operator repository&quot; + repositoryBranch: master + repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git +</code></pre> + +<p>and create Kubernetes Secret(name of secret should be the same from <code>credentialID</code> field):</p> + +<pre><code>apiVersion: v1 +kind: Secret +metadata: + name: k8s-user-pass +stringData: + username: github_user_name + password: password_or_token +</code></pre> + +<h2 id="jenkins-login-credentials">Jenkins login credentials</h2> + +<p>The operator automatically generate Jenkins user name and password and stores it in Kubernetes secret named +<code>jenkins-operator-credentials-&lt;cr_name&gt;</code> in namespace where Jenkins CR has been deployed.</p> + +<p>If you want change it you can override the secret:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>v1<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Secret<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-operator-credentials-&lt;cr-name<span style="color:#8f5902;font-style:italic">&gt; +</span><span style="color:#8f5902;font-style:italic"> namespace: &lt;namespace&gt;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>data<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>user<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>&lt;base64-encoded-new-username<span style="color:#8f5902;font-style:italic">&gt; +</span><span style="color:#8f5902;font-style:italic"> password: &lt;base64-encoded-new-password&gt;</span></code></pre></div> +<p>If needed <strong>jenkins-operator</strong> will restart Jenkins master pod and then you can login with the new user and password +credentials.</p> + +<h2 id="override-default-jenkins-container-command">Override default Jenkins container command</h2> + +<p>The default command for the Jenkins master container <code>jenkins/jenkins:lts</code> looks like:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">command<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>bash<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>-c<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>/var/jenkins/scripts/init.sh<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic">&amp;&amp;</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/sbin/tini<span style="color:#f8f8f8;text-decoration:underline"> </span>-s<span style="color:#f8f8f8;text-decoration:underline"> </span>--<span style="color:#f8f8f8;text-decoration:underline"> </span>/usr/local/bin/jenkins.sh</code></pre></div> +<p>The script<code>/var/jenkins/scripts/init.sh</code> is provided be the operator and configures init.groovy.d(creates Jenkins user) +and installs plugins. +The <code>/sbin/tini -s -- /usr/local/bin/jenkins.sh</code> command runs the Jenkins master main process.</p> + +<p>You can overwrite it in the following pattern:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">command<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>bash<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>-c<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>/var/jenkins/scripts/init.sh<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic">&amp;&amp;</span><span style="color:#f8f8f8;text-decoration:underline"> </span>&lt;custom-code-here&gt;<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic">&amp;&amp;</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/sbin/tini<span style="color:#f8f8f8;text-decoration:underline"> </span>-s<span style="color:#f8f8f8;text-decoration:underline"> </span>--<span style="color:#f8f8f8;text-decoration:underline"> </span>/usr/local/bin/jenkins.sh</code></pre></div> + + + + + Docs: Customization + /docs/getting-started/v0.1.1/customization/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.1.1/customization/ + + + + + +<p>Jenkins can be customized using groovy scripts or configuration as code plugin. All custom configuration is stored in +the <strong>jenkins-operator-user-configuration-<cr_name></strong> ConfigMap which is automatically created by <strong>jenkins-operator</strong>.</p> + +<p><strong>jenkins-operator</strong> creates <strong>jenkins-operator-user-configuration-<cr_name></strong> secret where user can store sensitive +information used for custom configuration. If you have entry in secret named <code>PASSWORD</code> then you can use it in +Configuration as Plugin as <code>adminAddress: &quot;${PASSWORD}&quot;</code>.</p> + +<pre><code>kubectl get secret jenkins-operator-user-configuration-&lt;cr_name&gt; -o yaml + +kind: Secret +apiVersion: v1 +type: Opaque +metadata: + name: jenkins-operator-user-configuration-&lt;cr_name&gt; + namespace: default +data: + SECRET_JENKINS_ADMIN_ADDRESS: YXNkZgo= + +</code></pre> + +<pre><code>kubectl get configmap jenkins-operator-user-configuration-&lt;cr_name&gt; -o yaml + +apiVersion: v1 +data: + 1-configure-theme.groovy: |2 + import jenkins.* + import jenkins.model.* + import hudson.* + import hudson.model.* + import org.jenkinsci.plugins.simpletheme.ThemeElement + import org.jenkinsci.plugins.simpletheme.CssTextThemeElement + import org.jenkinsci.plugins.simpletheme.CssUrlThemeElement + + Jenkins jenkins = Jenkins.getInstance() + + def decorator = Jenkins.instance.getDescriptorByType(org.codefirst.SimpleThemeDecorator.class) + + List&lt;ThemeElement&gt; configElements = new ArrayList&lt;&gt;(); + configElements.add(new CssTextThemeElement(&quot;DEFAULT&quot;)); + configElements.add(new CssUrlThemeElement(&quot;https://cdn.rawgit.com/afonsof/jenkins-material-theme/gh-pages/dist/material-light-green.css&quot;)); + decorator.setElements(configElements); + decorator.save(); + + jenkins.save() + 1-system-message.yaml: |2 + jenkins: + systemMessage: &quot;Configuration as Code integration works!!!&quot; + adminAddress: &quot;${SECRET_JENKINS_ADMIN_ADDRESS}&quot; +kind: ConfigMap +metadata: + name: jenkins-operator-user-configuration-&lt;cr_name&gt; + namespace: default +</code></pre> + +<p>When <strong>jenkins-operator-user-configuration-<cr_name></strong> ConfigMap is updated Jenkins automatically +runs the <strong>jenkins-operator-user-configuration</strong> Jenkins Job which executes all scripts then +runs the <strong>jenkins-operator-user-configuration-casc</strong> Jenkins Job which applies Configuration as Code configuration.</p> + +<h2 id="install-plugins">Install Plugins</h2> + +<p>Edit CR under <code>spec.master.plugins</code>:</p> + +<pre><code>apiVersion: jenkins.io/v1alpha2 +kind: Jenkins +metadata: + name: example +spec: + master: + plugins: + - name: simple-theme-plugin + version: 0.5.1 +</code></pre> + +<p>Under <code>spec.master.basePlugins</code> you can find plugins for valid <strong>jenkins-operator</strong> work:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.io/v1alpha2<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>example<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>spec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>master<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>basePlugins<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>kubernetes<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1.18.3</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-job<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;2.34&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-aggregator<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;2.6&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>git<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">3.12.0</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>job-dsl<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.76&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configuration-as-code<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.29&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configuration-as-code-support<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.19&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>kubernetes-credentials-provider<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">0.12.1</span></code></pre></div> +<p>You can change version of them.</p> + +<p>Then <strong>jenkins-operator</strong> will automatically install plugins after Jenkins master pod restart.</p> + + + + + + Docs: AKS + /docs/getting-started/v0.1.1/aks/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.1.1/aks/ + + + + <p>Azure AKS managed Kubernetes service adds to every pod the following envs:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>KUBERNETES_PORT_443_TCP_ADDR<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>KUBERNETES_PORT<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>tcp<span style="color:#000;font-weight:bold">:</span>//<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>KUBERNETES_PORT_443_TCP<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>tcp<span style="color:#000;font-weight:bold">:</span>//<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>KUBERNETES_SERVICE_HOST<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span></code></pre></div> +<p>The operator is aware of it and omits these envs when checking if Jenkins pod envs have been changed. It prevents +restart Jenkins pod over and over again.</p> + + + + + + Docs: Configure backup and restore + /docs/getting-started/v0.1.1/configure-backup-and-restore/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.1.1/configure-backup-and-restore/ + + + + + +<p>Backup and restore is done by container sidecar.</p> + +<h4 id="create-pvc">Create PVC</h4> + +<p>Save to file pvc.yaml:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>v1<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>PersistentVolumeClaim<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>&lt;pvc_name<span style="color:#8f5902;font-style:italic">&gt; +</span><span style="color:#8f5902;font-style:italic"> namespace: &lt;namesapce&gt;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>spec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>accessModes<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>ReadWriteOnce<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>resources<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>requests<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>storage<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>500Gi</code></pre></div> +<p>Run command:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ kubectl -n &lt;namesapce&gt; create -f pvc.yaml</code></pre></div> +<h4 id="configure-jenkins-cr">Configure Jenkins CR</h4> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.io/v1alpha2<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>&lt;cr_name<span style="color:#8f5902;font-style:italic">&gt; +</span><span style="color:#8f5902;font-style:italic"> namespace: &lt;namespace&gt;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>spec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>master<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>securityContext<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>runAsUser<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1000</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>fsGroup<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1000</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>containers<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-master<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>image<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins/jenkins<span style="color:#000;font-weight:bold">:</span>lts<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>backup<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># container responsible for backup and restore</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>env<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>BACKUP_DIR<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/backup<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>JENKINS_HOME<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/jenkins-home<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>BACKUP_COUNT<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;3&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># keep only the 2 most recent backups</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>image<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>virtuslab/jenkins-operator-backup-pvc<span style="color:#000;font-weight:bold">:</span>v0<span style="color:#0000cf;font-weight:bold">.0.6</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># look at backup/pvc directory</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>imagePullPolicy<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>IfNotPresent<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>volumeMounts<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>mountPath<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/jenkins-home<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># Jenkins home volume</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-home<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>mountPath<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/backup<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># backup volume</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>backup<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>volumes<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>backup<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># PVC volume where backups will be stored</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>persistentVolumeClaim<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>claimName<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>&lt;pvc_name<span style="color:#8f5902;font-style:italic">&gt; +</span><span style="color:#8f5902;font-style:italic"> backup:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>containerName<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>backup<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># container name is responsible for backup</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>action<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>exec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>command<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>/home/user/bin/backup.sh<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># this command is invoked on &#34;backup&#34; container to make backup, for example /home/user/bin/backup.sh &lt;backup_number&gt;, &lt;backup_number&gt; is passed by operator</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>interval<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">30</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># how often make backup in seconds</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>makeBackupBeforePodDeletion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#204a87;font-weight:bold">true</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># make backup before pod deletion</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>restore<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>containerName<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>backup<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># container name is responsible for restore backup</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>action<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>exec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>command<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>/home/user/bin/restore.sh<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># this command is invoked on &#34;backup&#34; container to make restore backup, for example /home/user/bin/restore.sh &lt;backup_number&gt;, &lt;backup_number&gt; is passed by operator</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic">#recoveryOnce: &lt;backup_number&gt; # if want to restore specific backup configure this field and then Jenkins will be restarted and desired backup will be restored</span></code></pre></div> + + + + + Docs: Diagnostics + /docs/getting-started/v0.1.1/diagnostics/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.1.1/diagnostics/ + + + + + +<p>Turn on debug in <strong>jenkins-operator</strong> deployment:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">sed -i <span style="color:#4e9a06">&#39;s|\(args:\).*|\1\ [&#34;--debug&#34;\]|&#39;</span> deploy/operator.yaml +kubectl apply -f deploy/operator.yaml</code></pre></div> +<p>Watch Kubernetes events:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl get events --sort-by<span style="color:#ce5c00;font-weight:bold">=</span><span style="color:#4e9a06">&#39;{.lastTimestamp}&#39;</span></code></pre></div> +<p>Verify Jenkins master logs:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl logs -f jenkins-&lt;cr_name&gt;</code></pre></div> +<p>Verify jenkins-operator logs:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl logs deployment/jenkins-operator</code></pre></div> +<h2 id="troubleshooting">Troubleshooting</h2> + +<p>Delete Jenkins master pod and wait for the new one to come up:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl delete pod jenkins-&lt;cr_name&gt;</code></pre></div> + + + + + Docs: Scheme + /docs/getting-started/v0.1.1/scheme/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.1.1/scheme/ + + + + + +<div class="pageinfo pageinfo-primary"> +<p>This document contains API scheme for <code>jenkins-operator</code> manifest</p> + +</div> + + +<p>Packages:</p> +<ul> +<li> +<a href="#jenkins.io">jenkins.io</a> +</li> +</ul> +<h2 id="jenkins.io">jenkins.io</h2> +<p> +<p>Package v1alpha2 contains API Schema definitions for the jenkins.io v1alpha2 API group</p> +</p> +Resource Types: +<ul><li> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Jenkins">Jenkins</a> +</li></ul> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Jenkins">Jenkins +</h3> +<p> +<p>Jenkins is the Schema for the jenkins API</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>apiVersion</code></br> +string</td> +<td> +<code> +jenkins.io/v1alpha2 +</code> +</td> +</tr> +<tr> +<td> +<code>kind</code></br> +string +</td> +<td><code>Jenkins</code></td> +</tr> +<tr> +<td> +<code>metadata</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#objectmeta-v1-meta"> +Kubernetes meta/v1.ObjectMeta +</a> +</em> +</td> +<td> +Refer to the Kubernetes API documentation for the fields of the +<code>metadata</code> field. +</td> +</tr> +<tr> +<td> +<code>spec</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsSpec"> +JenkinsSpec +</a> +</em> +</td> +<td> +<p>Spec defines the desired state of the Jenkins</p> +<br/> +<br/> +<table> +<tr> +<td> +<code>master</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsMaster"> +JenkinsMaster +</a> +</em> +</td> +<td> +<p>Master represents Jenkins master pod properties and Jenkins plugins. +Every single change here requires a pod restart.</p> +</td> +</tr> +<tr> +<td> +<code>seedJobs</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>SeedJobs defines list of Jenkins Seed Job configurations +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines</a></p> +</td> +</tr> +<tr> +<td> +<code>service</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Service"> +Service +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Service is Kubernetes service of Jenkins master HTTP pod +Defaults to : +port: 8080 +type: ClusterIP</p> +</td> +</tr> +<tr> +<td> +<code>slaveService</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Service"> +Service +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Service is Kubernetes service of Jenkins slave pods +Defaults to : +port: 50000 +type: ClusterIP</p> +</td> +</tr> +<tr> +<td> +<code>backup</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Backup"> +Backup +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Backup defines configuration of Jenkins backup +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore</a></p> +</td> +</tr> +<tr> +<td> +<code>restore</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Restore"> +Restore +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Backup defines configuration of Jenkins backup restore +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore</a></p> +</td> +</tr> +</table> +</td> +</tr> +<tr> +<td> +<code>status</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsStatus"> +JenkinsStatus +</a> +</em> +</td> +<td> +<p>Status defines the observed state of Jenkins</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Backup">Backup +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsSpec">JenkinsSpec</a>) +</p> +<p> +<p>Backup defines configuration of Jenkins backup</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>containerName</code></br> +<em> +string +</em> +</td> +<td> +<p>ContainerName is the container name responsible for backup operation</p> +</td> +</tr> +<tr> +<td> +<code>action</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Handler"> +Handler +</a> +</em> +</td> +<td> +<p>Action defines action which performs backup in backup container sidecar</p> +</td> +</tr> +<tr> +<td> +<code>interval</code></br> +<em> +uint64 +</em> +</td> +<td> +<p>Interval tells how often make backup in seconds +Defaults to 30.</p> +</td> +</tr> +<tr> +<td> +<code>makeBackupBeforePodDeletion</code></br> +<em> +bool +</em> +</td> +<td> +<p>MakeBackupBeforePodDeletion tells operator to make backup before Jenkins master pod deletion</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Build">Build +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsStatus">JenkinsStatus</a>) +</p> +<p> +<p>Build defines Jenkins Build status with corresponding metadata</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>jobName</code></br> +<em> +string +</em> +</td> +<td> +<p>JobName is the Jenkins job name</p> +</td> +</tr> +<tr> +<td> +<code>hash</code></br> +<em> +string +</em> +</td> +<td> +<p>Hash is the unique data identifier used in build</p> +</td> +</tr> +<tr> +<td> +<code>number</code></br> +<em> +int64 +</em> +</td> +<td> +<p>Number is the Jenkins build number</p> +</td> +</tr> +<tr> +<td> +<code>status</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.BuildStatus"> +BuildStatus +</a> +</em> +</td> +<td> +<p>Status is the status of Jenkins build</p> +</td> +</tr> +<tr> +<td> +<code>retries</code></br> +<em> +int +</em> +</td> +<td> +<p>Retires is the amount of Jenkins job build retries</p> +</td> +</tr> +<tr> +<td> +<code>createTime</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#time-v1-meta"> +Kubernetes meta/v1.Time +</a> +</em> +</td> +<td> +<p>CreateTime is the time when the first build has been created</p> +</td> +</tr> +<tr> +<td> +<code>lastUpdateTime</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#time-v1-meta"> +Kubernetes meta/v1.Time +</a> +</em> +</td> +<td> +<p>LastUpdateTime is the last update status time</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.BuildStatus">BuildStatus +(<code>string</code> alias)</p></h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Build">Build</a>) +</p> +<p> +<p>BuildStatus defines type of Jenkins build job status</p> +</p> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Container">Container +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsMaster">JenkinsMaster</a>) +</p> +<p> +<p>Container defines Kubernetes container attributes</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>name</code></br> +<em> +string +</em> +</td> +<td> +<p>Name of the container specified as a DNS_LABEL. +Each container in a pod must have a unique name (DNS_LABEL).</p> +</td> +</tr> +<tr> +<td> +<code>image</code></br> +<em> +string +</em> +</td> +<td> +<p>Docker image name. +More info: <a href="https://kubernetes.io/docs/concepts/containers/images">https://kubernetes.io/docs/concepts/containers/images</a></p> +</td> +</tr> +<tr> +<td> +<code>imagePullPolicy</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#pullpolicy-v1-core"> +Kubernetes core/v1.PullPolicy +</a> +</em> +</td> +<td> +<p>Image pull policy. +One of Always, Never, IfNotPresent. +Defaults to Always.</p> +</td> +</tr> +<tr> +<td> +<code>resources</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#resourcerequirements-v1-core"> +Kubernetes core/v1.ResourceRequirements +</a> +</em> +</td> +<td> +<p>Compute Resources required by this container. +More info: <a href="https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/">https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/</a></p> +</td> +</tr> +<tr> +<td> +<code>command</code></br> +<em> +[]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Entrypoint array. Not executed within a shell. +The docker image&rsquo;s ENTRYPOINT is used if this is not provided. +Variable references $(VAR_NAME) are expanded using the container&rsquo;s environment. If a variable +cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax +can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, +regardless of whether the variable exists or not. +More info: <a href="https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell">https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell</a></p> +</td> +</tr> +<tr> +<td> +<code>args</code></br> +<em> +[]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Arguments to the entrypoint. +The docker image&rsquo;s CMD is used if this is not provided. +Variable references $(VAR_NAME) are expanded using the container&rsquo;s environment. If a variable +cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax +can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, +regardless of whether the variable exists or not. +More info: <a href="https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell">https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell</a></p> +</td> +</tr> +<tr> +<td> +<code>workingDir</code></br> +<em> +string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Container&rsquo;s working directory. +If not specified, the container runtime&rsquo;s default will be used, which +might be configured in the container image.</p> +</td> +</tr> +<tr> +<td> +<code>ports</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#containerport-v1-core"> +[]Kubernetes core/v1.ContainerPort +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>List of ports to expose from the container. Exposing a port here gives +the system additional information about the network connections a +container uses, but is primarily informational. Not specifying a port here +DOES NOT prevent that port from being exposed. Any port which is +listening on the default &ldquo;0.0.0.0&rdquo; address inside a container will be +accessible from the network.</p> +</td> +</tr> +<tr> +<td> +<code>envFrom</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#envfromsource-v1-core"> +[]Kubernetes core/v1.EnvFromSource +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>List of sources to populate environment variables in the container. +The keys defined within a source must be a C_IDENTIFIER. All invalid keys +will be reported as an event when the container is starting. When a key exists in multiple +sources, the value associated with the last source will take precedence. +Values defined by an Env with a duplicate key will take precedence.</p> +</td> +</tr> +<tr> +<td> +<code>env</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#envvar-v1-core"> +[]Kubernetes core/v1.EnvVar +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>List of environment variables to set in the container.</p> +</td> +</tr> +<tr> +<td> +<code>volumeMounts</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#volumemount-v1-core"> +[]Kubernetes core/v1.VolumeMount +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Pod volumes to mount into the container&rsquo;s filesystem.</p> +</td> +</tr> +<tr> +<td> +<code>livenessProbe</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#probe-v1-core"> +Kubernetes core/v1.Probe +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Periodic probe of container liveness. +Container will be restarted if the probe fails.</p> +</td> +</tr> +<tr> +<td> +<code>readinessProbe</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#probe-v1-core"> +Kubernetes core/v1.Probe +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Periodic probe of container service readiness. +Container will be removed from service endpoints if the probe fails.</p> +</td> +</tr> +<tr> +<td> +<code>lifecycle</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#lifecycle-v1-core"> +Kubernetes core/v1.Lifecycle +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Actions that the management system should take in response to container lifecycle events.</p> +</td> +</tr> +<tr> +<td> +<code>securityContext</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#securitycontext-v1-core"> +Kubernetes core/v1.SecurityContext +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Security options the pod should run with. +More info: <a href="https://kubernetes.io/docs/concepts/policy/security-context/">https://kubernetes.io/docs/concepts/policy/security-context/</a> +More info: <a href="https://kubernetes.io/docs/tasks/configure-pod-container/security-context/">https://kubernetes.io/docs/tasks/configure-pod-container/security-context/</a></p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Handler">Handler +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Backup">Backup</a>, +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Restore">Restore</a>) +</p> +<p> +<p>Handler defines a specific action that should be taken</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>exec</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#execaction-v1-core"> +Kubernetes core/v1.ExecAction +</a> +</em> +</td> +<td> +<p>Exec specifies the action to take.</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsCredentialType">JenkinsCredentialType +(<code>string</code> alias)</p></h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.SeedJob">SeedJob</a>) +</p> +<p> +<p>JenkinsCredentialType defines type of Jenkins credential used to seed job mechanism</p> +</p> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsMaster">JenkinsMaster +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsSpec">JenkinsSpec</a>) +</p> +<p> +<p>JenkinsMaster defines the Jenkins master pod attributes and plugins, +every single change requires a Jenkins master pod restart</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>masterAnnotations</code></br> +<em> +map[string]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Annotations is an unstructured key value map stored with a resource that may be +set by external tools to store and retrieve arbitrary metadata. They are not +queryable and should be preserved when modifying objects. +More info: <a href="http://kubernetes.io/docs/user-guide/annotations">http://kubernetes.io/docs/user-guide/annotations</a></p> +</td> +</tr> +<tr> +<td> +<code>nodeSelector</code></br> +<em> +map[string]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>NodeSelector is a selector which must be true for the pod to fit on a node. +Selector which must match a node&rsquo;s labels for the pod to be scheduled on that node. +More info: <a href="https://kubernetes.io/docs/concepts/configuration/assign-pod-node/">https://kubernetes.io/docs/concepts/configuration/assign-pod-node/</a></p> +</td> +</tr> +<tr> +<td> +<code>securityContext</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#podsecuritycontext-v1-core"> +Kubernetes core/v1.PodSecurityContext +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>SecurityContext that applies to all the containers of the Jenkins +Master. As per kubernetes specification, it can be overridden +for each container individually. +Defaults to: +runAsUser: 1000 +fsGroup: 1000</p> +</td> +</tr> +<tr> +<td> +<code>containers</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Container"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Container +</a> +</em> +</td> +<td> +<p>List of containers belonging to the pod. +Containers cannot currently be added or removed. +There must be at least one container in a Pod. +Defaults to: +- image: jenkins/jenkins:lts +imagePullPolicy: Always +livenessProbe: +failureThreshold: 12 +httpGet: +path: /login +port: http +scheme: HTTP +initialDelaySeconds: 80 +periodSeconds: 10 +successThreshold: 1 +timeoutSeconds: 5 +name: jenkins-master +readinessProbe: +failureThreshold: 3 +httpGet: +path: /login +port: http +scheme: HTTP +initialDelaySeconds: 30 +periodSeconds: 10 +successThreshold: 1 +timeoutSeconds: 1 +resources: +limits: +cpu: 1500m +memory: 3Gi +requests: +cpu: &ldquo;1&rdquo; +memory: 600Mi</p> +</td> +</tr> +<tr> +<td> +<code>volumes</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#volume-v1-core"> +[]Kubernetes core/v1.Volume +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>List of volumes that can be mounted by containers belonging to the pod. +More info: <a href="https://kubernetes.io/docs/concepts/storage/volumes">https://kubernetes.io/docs/concepts/storage/volumes</a></p> +</td> +</tr> +<tr> +<td> +<code>basePlugins</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin +</a> +</em> +</td> +<td> +<p>BasePlugins contains plugins required by operator +Defaults to : +- name: kubernetes +version: 1.15.7 +- name: workflow-job +version: &ldquo;2.32&rdquo; +- name: workflow-aggregator +version: &ldquo;2.6&rdquo; +- name: git +version: 3.10.0 +- name: job-dsl +version: &ldquo;1.74&rdquo; +- name: configuration-as-code +version: &ldquo;1.19&rdquo; +- name: configuration-as-code-support +version: &ldquo;1.19&rdquo; +- name: kubernetes-credentials-provider +version: 0.12.1</p> +</td> +</tr> +<tr> +<td> +<code>plugins</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Plugins contains plugins required by user</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsSpec">JenkinsSpec +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Jenkins">Jenkins</a>) +</p> +<p> +<p>JenkinsSpec defines the desired state of the Jenkins</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>master</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsMaster"> +JenkinsMaster +</a> +</em> +</td> +<td> +<p>Master represents Jenkins master pod properties and Jenkins plugins. +Every single change here requires a pod restart.</p> +</td> +</tr> +<tr> +<td> +<code>seedJobs</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>SeedJobs defines list of Jenkins Seed Job configurations +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines</a></p> +</td> +</tr> +<tr> +<td> +<code>service</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Service"> +Service +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Service is Kubernetes service of Jenkins master HTTP pod +Defaults to : +port: 8080 +type: ClusterIP</p> +</td> +</tr> +<tr> +<td> +<code>slaveService</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Service"> +Service +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Service is Kubernetes service of Jenkins slave pods +Defaults to : +port: 50000 +type: ClusterIP</p> +</td> +</tr> +<tr> +<td> +<code>backup</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Backup"> +Backup +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Backup defines configuration of Jenkins backup +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore</a></p> +</td> +</tr> +<tr> +<td> +<code>restore</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Restore"> +Restore +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Backup defines configuration of Jenkins backup restore +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore</a></p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsStatus">JenkinsStatus +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Jenkins">Jenkins</a>) +</p> +<p> +<p>JenkinsStatus defines the observed state of Jenkins</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>operatorVersion</code></br> +<em> +string +</em> +</td> +<td> +<em>(Optional)</em> +<p>OperatorVersion is the operator version which manages this CR</p> +</td> +</tr> +<tr> +<td> +<code>provisionStartTime</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#time-v1-meta"> +Kubernetes meta/v1.Time +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>ProvisionStartTime is a time when Jenkins master pod has been created</p> +</td> +</tr> +<tr> +<td> +<code>baseConfigurationCompletedTime</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#time-v1-meta"> +Kubernetes meta/v1.Time +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>BaseConfigurationCompletedTime is a time when Jenkins base configuration phase has been completed</p> +</td> +</tr> +<tr> +<td> +<code>userConfigurationCompletedTime</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#time-v1-meta"> +Kubernetes meta/v1.Time +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>UserConfigurationCompletedTime is a time when Jenkins user configuration phase has been completed</p> +</td> +</tr> +<tr> +<td> +<code>builds</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Build"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Build +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Builds contains Jenkins builds statues</p> +</td> +</tr> +<tr> +<td> +<code>restoredBackup</code></br> +<em> +uint64 +</em> +</td> +<td> +<em>(Optional)</em> +<p>RestoredBackup is the restored backup number after Jenkins master pod restart</p> +</td> +</tr> +<tr> +<td> +<code>lastBackup</code></br> +<em> +uint64 +</em> +</td> +<td> +<em>(Optional)</em> +<p>LastBackup is the latest backup number</p> +</td> +</tr> +<tr> +<td> +<code>pendingBackup</code></br> +<em> +uint64 +</em> +</td> +<td> +<em>(Optional)</em> +<p>PendingBackup is the pending backup number</p> +</td> +</tr> +<tr> +<td> +<code>backupDoneBeforePodDeletion</code></br> +<em> +bool +</em> +</td> +<td> +<em>(Optional)</em> +<p>BackupDoneBeforePodDeletion tells if backup before pod deletion has been made</p> +</td> +</tr> +<tr> +<td> +<code>userAndPasswordHash</code></br> +<em> +string +</em> +</td> +<td> +<em>(Optional)</em> +<p>UserAndPasswordHash is a SHA256 hash made from user and password</p> +</td> +</tr> +<tr> +<td> +<code>createdSeedJobs</code></br> +<em> +[]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>CreatedSeedJobs contains list of seed job id already created in Jenkins</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin">Plugin +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsMaster">JenkinsMaster</a>) +</p> +<p> +<p>Plugin defines Jenkins plugin</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>name</code></br> +<em> +string +</em> +</td> +<td> +<p>Name is the name of Jenkins plugin</p> +</td> +</tr> +<tr> +<td> +<code>version</code></br> +<em> +string +</em> +</td> +<td> +<p>Version is the version of Jenkins plugin</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Restore">Restore +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsSpec">JenkinsSpec</a>) +</p> +<p> +<p>Restore defines configuration of Jenkins backup restore operation</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>containerName</code></br> +<em> +string +</em> +</td> +<td> +<p>ContainerName is the container name responsible for restore backup operation</p> +</td> +</tr> +<tr> +<td> +<code>action</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Handler"> +Handler +</a> +</em> +</td> +<td> +<p>Action defines action which performs restore backup in restore container sidecar</p> +</td> +</tr> +<tr> +<td> +<code>recoveryOnce</code></br> +<em> +uint64 +</em> +</td> +<td> +<em>(Optional)</em> +<p>RecoveryOnce if want to restore specific backup set this field and then Jenkins will be restarted and desired backup will be restored</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob">SeedJob +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsSpec">JenkinsSpec</a>) +</p> +<p> +<p>SeedJob defines configuration for seed job +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines</a></p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>id</code></br> +<em> +string +</em> +</td> +<td> +<p>ID is the unique seed job name</p> +</td> +</tr> +<tr> +<td> +<code>credentialID</code></br> +<em> +string +</em> +</td> +<td> +<p>CredentialID is the Kubernetes secret name which stores repository access credentials</p> +</td> +</tr> +<tr> +<td> +<code>description</code></br> +<em> +string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Description is the description of the seed job</p> +</td> +</tr> +<tr> +<td> +<code>targets</code></br> +<em> +string +</em> +</td> +<td> +<p>Targets is the repository path where are seed job definitions</p> +</td> +</tr> +<tr> +<td> +<code>repositoryBranch</code></br> +<em> +string +</em> +</td> +<td> +<p>RepositoryBranch is the repository branch where are seed job definitions</p> +</td> +</tr> +<tr> +<td> +<code>repositoryUrl</code></br> +<em> +string +</em> +</td> +<td> +<p>RepositoryURL is the repository access URL. Can be SSH or HTTPS.</p> +</td> +</tr> +<tr> +<td> +<code>credentialType</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsCredentialType"> +JenkinsCredentialType +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>JenkinsCredentialType is the <a href="https://jenkinsci.github.io/kubernetes-credentials-provider-plugin/">https://jenkinsci.github.io/kubernetes-credentials-provider-plugin/</a> credential type</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Service">Service +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsSpec">JenkinsSpec</a>) +</p> +<p> +<p>Service defines Kubernetes service attributes</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>annotations</code></br> +<em> +map[string]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Annotations is an unstructured key value map stored with a resource that may be +set by external tools to store and retrieve arbitrary metadata. They are not +queryable and should be preserved when modifying objects. +More info: <a href="http://kubernetes.io/docs/user-guide/annotations">http://kubernetes.io/docs/user-guide/annotations</a></p> +</td> +</tr> +<tr> +<td> +<code>labels</code></br> +<em> +map[string]string +</em> +</td> +<td> +<p>Route service traffic to pods with label keys and values matching this +selector. If empty or not present, the service is assumed to have an +external process managing its endpoints, which Kubernetes will not +modify. Only applies to types ClusterIP, NodePort, and LoadBalancer. +Ignored if type is ExternalName. +More info: <a href="https://kubernetes.io/docs/concepts/services-networking/service/">https://kubernetes.io/docs/concepts/services-networking/service/</a></p> +</td> +</tr> +<tr> +<td> +<code>type</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#servicetype-v1-core"> +Kubernetes core/v1.ServiceType +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Type determines how the Service is exposed. Defaults to ClusterIP. Valid +options are ExternalName, ClusterIP, NodePort, and LoadBalancer. +&ldquo;ExternalName&rdquo; maps to the specified externalName. +&ldquo;ClusterIP&rdquo; allocates a cluster-internal IP address for load-balancing to +endpoints. Endpoints are determined by the selector or if that is not +specified, by manual construction of an Endpoints object. If clusterIP is +&ldquo;None&rdquo;, no virtual IP is allocated and the endpoints are published as a +set of endpoints rather than a stable IP. +&ldquo;NodePort&rdquo; builds on ClusterIP and allocates a port on every node which +routes to the clusterIP. +&ldquo;LoadBalancer&rdquo; builds on NodePort and creates an +external load-balancer (if supported in the current cloud) which routes +to the clusterIP. +More info: <a href="https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services---service-types">https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services&mdash;service-types</a></p> +</td> +</tr> +<tr> +<td> +<code>port</code></br> +<em> +int32 +</em> +</td> +<td> +<p>The port that are exposed by this service. +More info: <a href="https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies">https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies</a></p> +</td> +</tr> +<tr> +<td> +<code>nodePort</code></br> +<em> +int32 +</em> +</td> +<td> +<em>(Optional)</em> +<p>The port on each node on which this service is exposed when type=NodePort or LoadBalancer. +Usually assigned by the system. If specified, it will be allocated to the service +if unused or else creation of the service will fail. +Default is to auto-allocate a port if the ServiceType of this Service requires one. +More info: <a href="https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport">https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport</a></p> +</td> +</tr> +<tr> +<td> +<code>loadBalancerSourceRanges</code></br> +<em> +[]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>If specified and supported by the platform, this will restrict traffic through the cloud-provider +load-balancer will be restricted to the specified client IPs. This field will be ignored if the +cloud-provider does not support the feature.&rdquo; +More info: <a href="https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/">https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/</a></p> +</td> +</tr> +<tr> +<td> +<code>loadBalancerIP</code></br> +<em> +string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Only applies to Service Type: LoadBalancer +LoadBalancer will get created with the IP specified in this field. +This feature depends on whether the underlying cloud-provider supports specifying +the loadBalancerIP when a load balancer is created. +This field will be ignored if the cloud-provider does not support the feature.</p> +</td> +</tr> +</tbody> +</table> +<hr/> +<p><em> +Generated with <code>gen-crd-api-reference-docs</code> +on git commit <code>37e531a</code>. +</em></p> + + + + + + Docs: Migration guide from v1alpha1 to v1alpha2 + /docs/getting-started/v0.1.1/migration-guide-v1alpha1-to-v1alpha2/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.1.1/migration-guide-v1alpha1-to-v1alpha2/ + + + + + +<p>Please not that <strong>CRD manifests are global</strong>, not namespaced, so every jenkins operator running on the cluster +will be impacted by the new CRD manifest. Multiple operator instances with different versions <em>should</em> continue to work.</p> + +<h2 id="stop-jenkins-operator-pod">Stop jenkins-operator pod</h2> + +<p>Run command:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ kubectl -n &lt;namespace&gt; scale deployment.apps/jenkins-operator --replicas<span style="color:#ce5c00;font-weight:bold">=</span><span style="color:#0000cf;font-weight:bold">0</span> +deployment.apps/jenkins-operator scaled</code></pre></div> +<p>Desired state:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ kubectl -n &lt;namespace&gt; get po +No resources found.</code></pre></div> +<h2 id="stop-jenkins-master-pod">Stop Jenkins master pod</h2> + +<p>Run command:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ kubectl -n &lt;namespace&gt; get po +NAME READY STATUS RESTARTS AGE +jenkins-operator-&lt;cr_name&gt; <span style="color:#0000cf;font-weight:bold">2</span>/2 Running <span style="color:#0000cf;font-weight:bold">0</span> 3m35s +$ kubectl -n &lt;namespace&gt; get delete po jenkins-operator-&lt;cr_name&gt; +pod <span style="color:#4e9a06">&#34;jenkins-operator-&lt;cr_name&gt;&#34;</span> deleted</code></pre></div> +<p>Desired state:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ kubectl -n &lt;namespace&gt; get po +No resources found.</code></pre></div> +<h2 id="save-jenkins-cr-to-jenkins-yaml-file">Save Jenkins CR to jenkins.yaml file</h2> + +<p>Run command:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ kubectl -n &lt;namespace&gt; get jenkins &lt;cr_name&gt; -o yaml &gt; jenkins.yaml</code></pre></div> +<h2 id="modify-jenkins-yaml-file">Modify jenkins.yaml file</h2> + +<p>Change apiVersion to <code>apiVersion: jenkins.io/v1alpha2</code></p> + +<p>New plugin format without dependent plugins:</p> + +<ul> +<li><p><code>spec.master.basePlugins</code> example:</p> + +<pre><code>spec: +master: +basePlugins: + - name: a-plugin-name + version: &quot;1.0.0&quot; + ... +</code></pre></li> + +<li><p><code>spec.master.plugins</code> example:</p> + +<pre><code> +spec: +master: +plugins: + - name: a-plugin-name + version: &quot;1.0.0&quot; +... +</code></pre></li> +</ul> + +<p>Move Jenkins <code>master</code> container properties to <code>spec.master.containers[jenkins-master]</code> (non exhaustive list): +- <code>spec.master.image</code> -&gt; <code>spec.master.containers[jenkins-master].image</code> +- <code>spec.master.imagePullPolicy</code> -&gt; <code>spec.master.containers[jenkins-master].imagePullPolicy</code> +- <code>spec.master.livenessProbe</code> -&gt; <code>spec.master.containers[jenkins-master].livenessProbe</code> +- <code>spec.master.readinessProbe</code> -&gt; <code>spec.master.containers[jenkins-master].readinessProbe</code> +- <code>spec.master.resources</code> -&gt; <code>spec.master.containers[jenkins-master].resources</code> +- <code>spec.master.env</code> -&gt; <code>spec.master.containers[jenkins-master].env</code></p> + +<pre><code>spec: + master: + containers: + - name: jenkins-master + image: jenkins/jenkins:lts + ... +</code></pre> + +<p>See also the examples bellow for more details. For even more details please look at the source code. +Code that defines the data structures can be found <a href="v0.1.1/jenkins-v1alpha2-scheme.md" target="_blank">here</a></p> + +<h3 id="examples">Examples</h3> + +<p>Old format:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.io/v1alpha1<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>&lt;cr_name<span style="color:#8f5902;font-style:italic">&gt; +</span><span style="color:#8f5902;font-style:italic"> namespace: &lt;namespace&gt;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>spec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>master<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>basePlugins<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configuration-as-code<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.17</span><span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>configuration-as-code-support<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.17</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>git<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">3.10.0</span><span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>apache-httpcomponents-client<span style="color:#0000cf;font-weight:bold">-4</span>-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">4.5.5-3.0</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>credentials<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>display-url-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.3.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>git-client<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.7.7</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>jsch<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">0.1.55</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>junit<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.28</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>mailer<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.23</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>matrix-project<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.14</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>scm-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.4.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>script-security<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.59</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>ssh-credentials<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.16</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>structs<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.34</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-scm-step<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.7</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-step-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>job-dsl<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.74</span><span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>script-security<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.59</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>structs<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>kubernetes-credentials-provider<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">0.12.1</span><span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>credentials<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>structs<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>variant<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.2</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>kubernetes<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.15.5</span><span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>apache-httpcomponents-client<span style="color:#0000cf;font-weight:bold">-4</span>-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">4.5.5-3.0</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>cloudbees-folder<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">6.8</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>credentials<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>durable-task<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.29</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>jackson2-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.9.9</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>kubernetes-credentials<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">0.4.0</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>plain-credentials<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.5</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>structs<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>variant<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.2</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-step-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-aggregator<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.6</span><span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>ace-editor<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>apache-httpcomponents-client<span style="color:#0000cf;font-weight:bold">-4</span>-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">4.5.5-3.0</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>authentication-tokens<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.3</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>branch-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.5.2</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>cloudbees-folder<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">6.8</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>credentials-binding<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.18</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>credentials<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>display-url-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.3.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>docker-commons<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.15</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>docker-workflow<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.18</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>durable-task<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.29</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>git-client<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.7.7</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>git-server<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.7</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>handlebars<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.1.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>jackson2-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.9.9</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>jquery-detached<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.2.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>jsch<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">0.1.55</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>junit<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.28</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>lockable-resources<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.5</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>mailer<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.23</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>matrix-project<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.14</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>momentjs<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.1.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-build-step<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.9</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-graph-analysis<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.10</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-input-step<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.10</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-milestone-step<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.3.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-model-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.3.8</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-model-declarative-agent<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.1.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-model-definition<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.3.8</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-model-extensions<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.3.8</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-rest-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.11</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-stage-step<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.3</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-stage-tags-metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.3.8</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-stage-view<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.11</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>plain-credentials<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.5</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>scm-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.4.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>script-security<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.59</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>ssh-credentials<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.16</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>structs<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.34</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-basic-steps<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.16</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-cps-global-lib<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.13</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-cps<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.69</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-durable-task-step<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.30</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-job<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.32</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-multibranch<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.21</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-scm-step<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.7</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-step-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-support<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">3.3</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-job<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.32</span><span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>scm-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.4.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>script-security<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.59</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>structs<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.34</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-step-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-support<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">3.3</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>image<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins/jenkins<span style="color:#000;font-weight:bold">:</span>lts<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>imagePullPolicy<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Always<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>livenessProbe<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>failureThreshold<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">12</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>httpGet<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>path<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/login<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>port<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">8080</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>scheme<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>HTTP<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>initialDelaySeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">30</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>periodSeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">10</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>successThreshold<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>timeoutSeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">5</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>plugins<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>simple-theme-plugin<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">0.5.1</span><span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#000;font-weight:bold">[]</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>slack<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.24</span><span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-step-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>credentials<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>display-url-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.3.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>junit<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.28</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>plain-credentials<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.5</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>script-security<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.59</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>structs<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>token-macro<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.8</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>readinessProbe<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>failureThreshold<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">12</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>httpGet<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>path<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/login<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>port<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">8080</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>scheme<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>HTTP<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>initialDelaySeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">30</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>periodSeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">10</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>successThreshold<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>timeoutSeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">5</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>resources<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>limits<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>cpu<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>1500m<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>memory<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>3Gi<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>requests<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>cpu<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>memory<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>500Mi</code></pre></div> +<p>New format:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.io/v1alpha2<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>&lt;cr_name<span style="color:#8f5902;font-style:italic">&gt; +</span><span style="color:#8f5902;font-style:italic"> namespace: &lt;namespace&gt;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>spec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>master<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>basePlugins<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>kubernetes<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1.15.7</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-job<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;2.32&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-aggregator<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;2.6&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>git<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">3.10.0</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>job-dsl<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.74&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configuration-as-code<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.19&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configuration-as-code-support<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.19&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>kubernetes-credentials-provider<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">0.12.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>containers<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-master<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>image<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins/jenkins<span style="color:#000;font-weight:bold">:</span>lts<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>imagePullPolicy<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Always<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>livenessProbe<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>failureThreshold<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">12</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>httpGet<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>path<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/login<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>port<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>http<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>scheme<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>HTTP<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>initialDelaySeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">30</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>periodSeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">10</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>successThreshold<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>timeoutSeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">5</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>readinessProbe<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>failureThreshold<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">3</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>httpGet<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>path<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/login<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>port<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>http<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>scheme<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>HTTP<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>initialDelaySeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">30</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>periodSeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">10</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>successThreshold<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>timeoutSeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>resources<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>limits<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>cpu<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>1500m<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>memory<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>3Gi<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>requests<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>cpu<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>memory<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>500Mi<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>plugins<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>simple-theme-plugin<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">0.5.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>slack<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">2.24</span></code></pre></div> +<h2 id="update-crd-to-new-version">Update CRD to new version</h2> + +<p>New version of the Custom Resource definition for the operator needs to be applied: +-<a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/deploy/crds/jenkins_v1alpha2_jenkins_crd.yaml" target="_blank">Jenkins CRD v1alpha2</a></p> + +<p>To use default CRD file:</p> + +<pre><code>kubectl -n &lt;namespace&gt; apply -f https://github.com/jenkinsci/kubernetes-operator/blob/master/deploy/crds/jenkins_v1alpha2_jenkins_crd.yaml +</code></pre> + +<h2 id="update-rbac-to-new-version">Update RBAC to new version</h2> + +<p>New operator version requires updated RBAC permissions:</p> + +<p>To use default Role file:</p> + +<pre><code>$ kubectl -n &lt;namespace&gt; apply -f https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/deploy/role.yaml +</code></pre> + +<h2 id="deploy-new-operator-manifests">Deploy new operator manifests</h2> + +<p>Replace your modified operator configuration file:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ kubectl -n &lt;namespace&gt; replace -f jenkins.yaml</code></pre></div> +<p>Update operator version in the deployment file to <code>image: virtuslab/jenkins-operator:v0.1.0</code> and scale up, +or use the default deployment manifest:</p> + +<pre><code>$ kubectl -n &lt;namespace&gt; apply -f https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/deploy/operator.yaml +</code></pre> + + + + + + \ No newline at end of file diff --git a/docs/docs/getting-started/v0.1.1/migration-guide-v1alpha1-to-v1alpha2/index.html b/docs/docs/getting-started/v0.1.1/migration-guide-v1alpha1-to-v1alpha2/index.html new file mode 100644 index 00000000..5ca32594 --- /dev/null +++ b/docs/docs/getting-started/v0.1.1/migration-guide-v1alpha1-to-v1alpha2/index.html @@ -0,0 +1,814 @@ + + + + + + + + + + + + + + + + + + + + + + +Migration guide from v1alpha1 to v1alpha2 | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Migration guide from v1alpha1 to v1alpha2 | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

Migration guide from v1alpha1 to v1alpha2

+
How to migrate to new CRD manifest
+ + +

Please not that CRD manifests are global, not namespaced, so every jenkins operator running on the cluster +will be impacted by the new CRD manifest. Multiple operator instances with different versions should continue to work.

+ +

Stop jenkins-operator pod

+ +

Run command:

+
$ kubectl -n <namespace> scale deployment.apps/jenkins-operator --replicas=0
+deployment.apps/jenkins-operator scaled
+

Desired state:

+
$ kubectl -n <namespace> get po
+No resources found.
+

Stop Jenkins master pod

+ +

Run command:

+
$ kubectl -n <namespace> get po
+NAME                       READY     STATUS        RESTARTS   AGE
+jenkins-operator-<cr_name>   2/2       Running       0          3m35s
+$ kubectl -n <namespace> get delete po jenkins-operator-<cr_name>
+pod "jenkins-operator-<cr_name>" deleted
+

Desired state:

+
$ kubectl -n <namespace> get po
+No resources found.
+

Save Jenkins CR to jenkins.yaml file

+ +

Run command:

+
$ kubectl -n <namespace> get jenkins <cr_name> -o yaml > jenkins.yaml
+

Modify jenkins.yaml file

+ +

Change apiVersion to apiVersion: jenkins.io/v1alpha2

+ +

New plugin format without dependent plugins:

+ +
    +
  • spec.master.basePlugins example:

    + +
    spec:
    +master:
    +basePlugins:
    +  - name: a-plugin-name
    +    version: "1.0.0"
    +  ...
    +
  • + +
  • spec.master.plugins example:

    + +
    
    +spec:
    +master:
    +plugins:
    +  - name: a-plugin-name
    +     version: "1.0.0"
    +...
    +
  • +
+ +

Move Jenkins master container properties to spec.master.containers[jenkins-master] (non exhaustive list): +- spec.master.image -> spec.master.containers[jenkins-master].image +- spec.master.imagePullPolicy -> spec.master.containers[jenkins-master].imagePullPolicy +- spec.master.livenessProbe -> spec.master.containers[jenkins-master].livenessProbe +- spec.master.readinessProbe -> spec.master.containers[jenkins-master].readinessProbe +- spec.master.resources -> spec.master.containers[jenkins-master].resources +- spec.master.env -> spec.master.containers[jenkins-master].env

+ +
spec:
+  master:
+    containers:
+      - name: jenkins-master
+        image: jenkins/jenkins:lts
+      ...
+
+ +

See also the examples bellow for more details. For even more details please look at the source code. +Code that defines the data structures can be found here

+ +

Examples

+ +

Old format:

+
apiVersion: jenkins.io/v1alpha1
+kind: Jenkins
+metadata:
+  name: <cr_name>
+  namespace: <namespace>
+spec:
+  master:
+    basePlugins:
+      configuration-as-code:1.17:
+      - configuration-as-code-support:1.17
+      git:3.10.0:
+      - apache-httpcomponents-client-4-api:4.5.5-3.0
+      - credentials:2.1.19
+      - display-url-api:2.3.1
+      - git-client:2.7.7
+      - jsch:0.1.55
+      - junit:1.28
+      - mailer:1.23
+      - matrix-project:1.14
+      - scm-api:2.4.1
+      - script-security:1.59
+      - ssh-credentials:1.16
+      - structs:1.19
+      - workflow-api:2.34
+      - workflow-scm-step:2.7
+      - workflow-step-api:2.19
+      job-dsl:1.74:
+      - script-security:1.59
+      - structs:1.19
+      kubernetes-credentials-provider:0.12.1:
+      - credentials:2.1.19
+      - structs:1.19
+      - variant:1.2
+      kubernetes:1.15.5:
+      - apache-httpcomponents-client-4-api:4.5.5-3.0
+      - cloudbees-folder:6.8
+      - credentials:2.1.19
+      - durable-task:1.29
+      - jackson2-api:2.9.9
+      - kubernetes-credentials:0.4.0
+      - plain-credentials:1.5
+      - structs:1.19
+      - variant:1.2
+      - workflow-step-api:2.19
+      workflow-aggregator:2.6:
+      - ace-editor:1.1
+      - apache-httpcomponents-client-4-api:4.5.5-3.0
+      - authentication-tokens:1.3
+      - branch-api:2.5.2
+      - cloudbees-folder:6.8
+      - credentials-binding:1.18
+      - credentials:2.1.19
+      - display-url-api:2.3.1
+      - docker-commons:1.15
+      - docker-workflow:1.18
+      - durable-task:1.29
+      - git-client:2.7.7
+      - git-server:1.7
+      - handlebars:1.1.1
+      - jackson2-api:2.9.9
+      - jquery-detached:1.2.1
+      - jsch:0.1.55
+      - junit:1.28
+      - lockable-resources:2.5
+      - mailer:1.23
+      - matrix-project:1.14
+      - momentjs:1.1.1
+      - pipeline-build-step:2.9
+      - pipeline-graph-analysis:1.10
+      - pipeline-input-step:2.10
+      - pipeline-milestone-step:1.3.1
+      - pipeline-model-api:1.3.8
+      - pipeline-model-declarative-agent:1.1.1
+      - pipeline-model-definition:1.3.8
+      - pipeline-model-extensions:1.3.8
+      - pipeline-rest-api:2.11
+      - pipeline-stage-step:2.3
+      - pipeline-stage-tags-metadata:1.3.8
+      - pipeline-stage-view:2.11
+      - plain-credentials:1.5
+      - scm-api:2.4.1
+      - script-security:1.59
+      - ssh-credentials:1.16
+      - structs:1.19
+      - workflow-api:2.34
+      - workflow-basic-steps:2.16
+      - workflow-cps-global-lib:2.13
+      - workflow-cps:2.69
+      - workflow-durable-task-step:2.30
+      - workflow-job:2.32
+      - workflow-multibranch:2.21
+      - workflow-scm-step:2.7
+      - workflow-step-api:2.19
+      - workflow-support:3.3
+      workflow-job:2.32:
+      - scm-api:2.4.1
+      - script-security:1.59
+      - structs:1.19
+      - workflow-api:2.34
+      - workflow-step-api:2.19
+      - workflow-support:3.3
+    image: jenkins/jenkins:lts
+    imagePullPolicy: Always
+    livenessProbe:
+      failureThreshold: 12
+      httpGet:
+        path: /login
+        port: 8080
+        scheme: HTTP
+      initialDelaySeconds: 30
+      periodSeconds: 10
+      successThreshold: 1
+      timeoutSeconds: 5
+    plugins:
+      simple-theme-plugin:0.5.1: []
+      slack:2.24:
+      - workflow-step-api:2.19
+      - credentials:2.1.19
+      - display-url-api:2.3.1
+      - junit:1.28
+      - plain-credentials:1.5
+      - script-security:1.59
+      - structs:1.19
+      - token-macro:2.8
+    readinessProbe:
+      failureThreshold: 12
+      httpGet:
+        path: /login
+        port: 8080
+        scheme: HTTP
+      initialDelaySeconds: 30
+      periodSeconds: 10
+      successThreshold: 1
+      timeoutSeconds: 5
+    resources:
+      limits:
+        cpu: 1500m
+        memory: 3Gi
+      requests:
+        cpu: "1"
+        memory: 500Mi
+

New format:

+
apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+  name: <cr_name>
+  namespace: <namespace>
+spec:
+  master:
+    basePlugins:
+    - name: kubernetes
+      version: 1.15.7
+    - name: workflow-job
+      version: "2.32"
+    - name: workflow-aggregator
+      version: "2.6"
+    - name: git
+      version: 3.10.0
+    - name: job-dsl
+      version: "1.74"
+    - name: configuration-as-code
+      version: "1.19"
+    - name: configuration-as-code-support
+      version: "1.19"
+    - name: kubernetes-credentials-provider
+      version: 0.12.1
+    containers:
+    - name: jenkins-master
+      image: jenkins/jenkins:lts
+      imagePullPolicy: Always
+      livenessProbe:
+        failureThreshold: 12
+        httpGet:
+          path: /login
+          port: http
+          scheme: HTTP
+        initialDelaySeconds: 30
+        periodSeconds: 10
+        successThreshold: 1
+        timeoutSeconds: 5
+      readinessProbe:
+        failureThreshold: 3
+        httpGet:
+          path: /login
+          port: http
+          scheme: HTTP
+        initialDelaySeconds: 30
+        periodSeconds: 10
+        successThreshold: 1
+        timeoutSeconds: 1
+      resources:
+        limits:
+          cpu: 1500m
+          memory: 3Gi
+        requests:
+          cpu: "1"
+          memory: 500Mi
+    plugins:
+    - name: simple-theme-plugin
+      version: 0.5.1
+    - name: slack
+      version: 2.24
+

Update CRD to new version

+ +

New version of the Custom Resource definition for the operator needs to be applied: +-Jenkins CRD v1alpha2

+ +

To use default CRD file:

+ +
kubectl -n <namespace> apply -f https://github.com/jenkinsci/kubernetes-operator/blob/master/deploy/crds/jenkins_v1alpha2_jenkins_crd.yaml
+
+ +

Update RBAC to new version

+ +

New operator version requires updated RBAC permissions:

+ +

To use default Role file:

+ +
$ kubectl -n <namespace> apply -f https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/deploy/role.yaml
+
+ +

Deploy new operator manifests

+ +

Replace your modified operator configuration file:

+
$ kubectl -n <namespace> replace -f jenkins.yaml
+

Update operator version in the deployment file to image: virtuslab/jenkins-operator:v0.1.0 and scale up, +or use the default deployment manifest:

+ +
$ kubectl -n <namespace> apply -f https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/deploy/operator.yaml
+
+ + + +
Last modified August 5, 2019 +
+
+ + +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/getting-started/v0.1.1/scheme/index.html b/docs/docs/getting-started/v0.1.1/scheme/index.html new file mode 100644 index 00000000..8215c1bb --- /dev/null +++ b/docs/docs/getting-started/v0.1.1/scheme/index.html @@ -0,0 +1,1944 @@ + + + + + + + + + + + + + + + + + + + + + + +Scheme | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Scheme | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

Scheme

+
API Schema definitions for Jenkins CR
+ + +
+

This document contains API scheme for jenkins-operator manifest

+ +
+ + +

Packages:

+ +

jenkins.io

+

+

Package v1alpha2 contains API Schema definitions for the jenkins.io v1alpha2 API group

+

+Resource Types: + +

Jenkins +

+

+

Jenkins is the Schema for the jenkins API

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+apiVersion
+string
+ +jenkins.io/v1alpha2 + +
+kind
+string +
Jenkins
+metadata
+ + +Kubernetes meta/v1.ObjectMeta + + +
+Refer to the Kubernetes API documentation for the fields of the +metadata field. +
+spec
+ + +JenkinsSpec + + +
+

Spec defines the desired state of the Jenkins

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+master
+ + +JenkinsMaster + + +
+

Master represents Jenkins master pod properties and Jenkins plugins. +Every single change here requires a pod restart.

+
+seedJobs
+ + +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob + + +
+(Optional) +

SeedJobs defines list of Jenkins Seed Job configurations +More info: https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines

+
+service
+ + +Service + + +
+(Optional) +

Service is Kubernetes service of Jenkins master HTTP pod +Defaults to : +port: 8080 +type: ClusterIP

+
+slaveService
+ + +Service + + +
+(Optional) +

Service is Kubernetes service of Jenkins slave pods +Defaults to : +port: 50000 +type: ClusterIP

+
+backup
+ + +Backup + + +
+(Optional) +

Backup defines configuration of Jenkins backup +More info: https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore

+
+restore
+ + +Restore + + +
+(Optional) +

Backup defines configuration of Jenkins backup restore +More info: https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore

+
+
+status
+ + +JenkinsStatus + + +
+

Status defines the observed state of Jenkins

+
+

Backup +

+

+(Appears on: +JenkinsSpec) +

+

+

Backup defines configuration of Jenkins backup

+

+ + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+containerName
+ +string + +
+

ContainerName is the container name responsible for backup operation

+
+action
+ + +Handler + + +
+

Action defines action which performs backup in backup container sidecar

+
+interval
+ +uint64 + +
+

Interval tells how often make backup in seconds +Defaults to 30.

+
+makeBackupBeforePodDeletion
+ +bool + +
+

MakeBackupBeforePodDeletion tells operator to make backup before Jenkins master pod deletion

+
+

Build +

+

+(Appears on: +JenkinsStatus) +

+

+

Build defines Jenkins Build status with corresponding metadata

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+jobName
+ +string + +
+

JobName is the Jenkins job name

+
+hash
+ +string + +
+

Hash is the unique data identifier used in build

+
+number
+ +int64 + +
+

Number is the Jenkins build number

+
+status
+ + +BuildStatus + + +
+

Status is the status of Jenkins build

+
+retries
+ +int + +
+

Retires is the amount of Jenkins job build retries

+
+createTime
+ + +Kubernetes meta/v1.Time + + +
+

CreateTime is the time when the first build has been created

+
+lastUpdateTime
+ + +Kubernetes meta/v1.Time + + +
+

LastUpdateTime is the last update status time

+
+

BuildStatus +(string alias)

+

+(Appears on: +Build) +

+

+

BuildStatus defines type of Jenkins build job status

+

+

Container +

+

+(Appears on: +JenkinsMaster) +

+

+

Container defines Kubernetes container attributes

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+name
+ +string + +
+

Name of the container specified as a DNS_LABEL. +Each container in a pod must have a unique name (DNS_LABEL).

+
+image
+ +string + +
+

Docker image name. +More info: https://kubernetes.io/docs/concepts/containers/images

+
+imagePullPolicy
+ + +Kubernetes core/v1.PullPolicy + + +
+

Image pull policy. +One of Always, Never, IfNotPresent. +Defaults to Always.

+
+resources
+ + +Kubernetes core/v1.ResourceRequirements + + +
+

Compute Resources required by this container. +More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/

+
+command
+ +[]string + +
+(Optional) +

Entrypoint array. Not executed within a shell. +The docker image’s ENTRYPOINT is used if this is not provided. +Variable references $(VAR_NAME) are expanded using the container’s environment. If a variable +cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax +can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, +regardless of whether the variable exists or not. +More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell

+
+args
+ +[]string + +
+(Optional) +

Arguments to the entrypoint. +The docker image’s CMD is used if this is not provided. +Variable references $(VAR_NAME) are expanded using the container’s environment. If a variable +cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax +can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, +regardless of whether the variable exists or not. +More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell

+
+workingDir
+ +string + +
+(Optional) +

Container’s working directory. +If not specified, the container runtime’s default will be used, which +might be configured in the container image.

+
+ports
+ + +[]Kubernetes core/v1.ContainerPort + + +
+(Optional) +

List of ports to expose from the container. Exposing a port here gives +the system additional information about the network connections a +container uses, but is primarily informational. Not specifying a port here +DOES NOT prevent that port from being exposed. Any port which is +listening on the default “0.0.0.0” address inside a container will be +accessible from the network.

+
+envFrom
+ + +[]Kubernetes core/v1.EnvFromSource + + +
+(Optional) +

List of sources to populate environment variables in the container. +The keys defined within a source must be a C_IDENTIFIER. All invalid keys +will be reported as an event when the container is starting. When a key exists in multiple +sources, the value associated with the last source will take precedence. +Values defined by an Env with a duplicate key will take precedence.

+
+env
+ + +[]Kubernetes core/v1.EnvVar + + +
+(Optional) +

List of environment variables to set in the container.

+
+volumeMounts
+ + +[]Kubernetes core/v1.VolumeMount + + +
+(Optional) +

Pod volumes to mount into the container’s filesystem.

+
+livenessProbe
+ + +Kubernetes core/v1.Probe + + +
+(Optional) +

Periodic probe of container liveness. +Container will be restarted if the probe fails.

+
+readinessProbe
+ + +Kubernetes core/v1.Probe + + +
+(Optional) +

Periodic probe of container service readiness. +Container will be removed from service endpoints if the probe fails.

+
+lifecycle
+ + +Kubernetes core/v1.Lifecycle + + +
+(Optional) +

Actions that the management system should take in response to container lifecycle events.

+
+securityContext
+ + +Kubernetes core/v1.SecurityContext + + +
+(Optional) +

Security options the pod should run with. +More info: https://kubernetes.io/docs/concepts/policy/security-context/ +More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/

+
+

Handler +

+

+(Appears on: +Backup, +Restore) +

+

+

Handler defines a specific action that should be taken

+

+ + + + + + + + + + + + + +
FieldDescription
+exec
+ + +Kubernetes core/v1.ExecAction + + +
+

Exec specifies the action to take.

+
+

JenkinsCredentialType +(string alias)

+

+(Appears on: +SeedJob) +

+

+

JenkinsCredentialType defines type of Jenkins credential used to seed job mechanism

+

+

JenkinsMaster +

+

+(Appears on: +JenkinsSpec) +

+

+

JenkinsMaster defines the Jenkins master pod attributes and plugins, +every single change requires a Jenkins master pod restart

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+masterAnnotations
+ +map[string]string + +
+(Optional) +

Annotations is an unstructured key value map stored with a resource that may be +set by external tools to store and retrieve arbitrary metadata. They are not +queryable and should be preserved when modifying objects. +More info: http://kubernetes.io/docs/user-guide/annotations

+
+nodeSelector
+ +map[string]string + +
+(Optional) +

NodeSelector is a selector which must be true for the pod to fit on a node. +Selector which must match a node’s labels for the pod to be scheduled on that node. +More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/

+
+securityContext
+ + +Kubernetes core/v1.PodSecurityContext + + +
+(Optional) +

SecurityContext that applies to all the containers of the Jenkins +Master. As per kubernetes specification, it can be overridden +for each container individually. +Defaults to: +runAsUser: 1000 +fsGroup: 1000

+
+containers
+ + +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Container + + +
+

List of containers belonging to the pod. +Containers cannot currently be added or removed. +There must be at least one container in a Pod. +Defaults to: +- image: jenkins/jenkins:lts +imagePullPolicy: Always +livenessProbe: +failureThreshold: 12 +httpGet: +path: /login +port: http +scheme: HTTP +initialDelaySeconds: 80 +periodSeconds: 10 +successThreshold: 1 +timeoutSeconds: 5 +name: jenkins-master +readinessProbe: +failureThreshold: 3 +httpGet: +path: /login +port: http +scheme: HTTP +initialDelaySeconds: 30 +periodSeconds: 10 +successThreshold: 1 +timeoutSeconds: 1 +resources: +limits: +cpu: 1500m +memory: 3Gi +requests: +cpu: “1” +memory: 600Mi

+
+volumes
+ + +[]Kubernetes core/v1.Volume + + +
+(Optional) +

List of volumes that can be mounted by containers belonging to the pod. +More info: https://kubernetes.io/docs/concepts/storage/volumes

+
+basePlugins
+ + +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin + + +
+

BasePlugins contains plugins required by operator +Defaults to : +- name: kubernetes +version: 1.15.7 +- name: workflow-job +version: “2.32” +- name: workflow-aggregator +version: “2.6” +- name: git +version: 3.10.0 +- name: job-dsl +version: “1.74” +- name: configuration-as-code +version: “1.19” +- name: configuration-as-code-support +version: “1.19” +- name: kubernetes-credentials-provider +version: 0.12.1

+
+plugins
+ + +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin + + +
+(Optional) +

Plugins contains plugins required by user

+
+

JenkinsSpec +

+

+(Appears on: +Jenkins) +

+

+

JenkinsSpec defines the desired state of the Jenkins

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+master
+ + +JenkinsMaster + + +
+

Master represents Jenkins master pod properties and Jenkins plugins. +Every single change here requires a pod restart.

+
+seedJobs
+ + +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob + + +
+(Optional) +

SeedJobs defines list of Jenkins Seed Job configurations +More info: https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines

+
+service
+ + +Service + + +
+(Optional) +

Service is Kubernetes service of Jenkins master HTTP pod +Defaults to : +port: 8080 +type: ClusterIP

+
+slaveService
+ + +Service + + +
+(Optional) +

Service is Kubernetes service of Jenkins slave pods +Defaults to : +port: 50000 +type: ClusterIP

+
+backup
+ + +Backup + + +
+(Optional) +

Backup defines configuration of Jenkins backup +More info: https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore

+
+restore
+ + +Restore + + +
+(Optional) +

Backup defines configuration of Jenkins backup restore +More info: https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore

+
+

JenkinsStatus +

+

+(Appears on: +Jenkins) +

+

+

JenkinsStatus defines the observed state of Jenkins

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+operatorVersion
+ +string + +
+(Optional) +

OperatorVersion is the operator version which manages this CR

+
+provisionStartTime
+ + +Kubernetes meta/v1.Time + + +
+(Optional) +

ProvisionStartTime is a time when Jenkins master pod has been created

+
+baseConfigurationCompletedTime
+ + +Kubernetes meta/v1.Time + + +
+(Optional) +

BaseConfigurationCompletedTime is a time when Jenkins base configuration phase has been completed

+
+userConfigurationCompletedTime
+ + +Kubernetes meta/v1.Time + + +
+(Optional) +

UserConfigurationCompletedTime is a time when Jenkins user configuration phase has been completed

+
+builds
+ + +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Build + + +
+(Optional) +

Builds contains Jenkins builds statues

+
+restoredBackup
+ +uint64 + +
+(Optional) +

RestoredBackup is the restored backup number after Jenkins master pod restart

+
+lastBackup
+ +uint64 + +
+(Optional) +

LastBackup is the latest backup number

+
+pendingBackup
+ +uint64 + +
+(Optional) +

PendingBackup is the pending backup number

+
+backupDoneBeforePodDeletion
+ +bool + +
+(Optional) +

BackupDoneBeforePodDeletion tells if backup before pod deletion has been made

+
+userAndPasswordHash
+ +string + +
+(Optional) +

UserAndPasswordHash is a SHA256 hash made from user and password

+
+createdSeedJobs
+ +[]string + +
+(Optional) +

CreatedSeedJobs contains list of seed job id already created in Jenkins

+
+

Plugin +

+

+(Appears on: +JenkinsMaster) +

+

+

Plugin defines Jenkins plugin

+

+ + + + + + + + + + + + + + + + + +
FieldDescription
+name
+ +string + +
+

Name is the name of Jenkins plugin

+
+version
+ +string + +
+

Version is the version of Jenkins plugin

+
+

Restore +

+

+(Appears on: +JenkinsSpec) +

+

+

Restore defines configuration of Jenkins backup restore operation

+

+ + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+containerName
+ +string + +
+

ContainerName is the container name responsible for restore backup operation

+
+action
+ + +Handler + + +
+

Action defines action which performs restore backup in restore container sidecar

+
+recoveryOnce
+ +uint64 + +
+(Optional) +

RecoveryOnce if want to restore specific backup set this field and then Jenkins will be restarted and desired backup will be restored

+
+

SeedJob +

+

+(Appears on: +JenkinsSpec) +

+

+

SeedJob defines configuration for seed job +More info: https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+id
+ +string + +
+

ID is the unique seed job name

+
+credentialID
+ +string + +
+

CredentialID is the Kubernetes secret name which stores repository access credentials

+
+description
+ +string + +
+(Optional) +

Description is the description of the seed job

+
+targets
+ +string + +
+

Targets is the repository path where are seed job definitions

+
+repositoryBranch
+ +string + +
+

RepositoryBranch is the repository branch where are seed job definitions

+
+repositoryUrl
+ +string + +
+

RepositoryURL is the repository access URL. Can be SSH or HTTPS.

+
+credentialType
+ + +JenkinsCredentialType + + +
+(Optional) +

JenkinsCredentialType is the https://jenkinsci.github.io/kubernetes-credentials-provider-plugin/ credential type

+
+

Service +

+

+(Appears on: +JenkinsSpec) +

+

+

Service defines Kubernetes service attributes

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+annotations
+ +map[string]string + +
+(Optional) +

Annotations is an unstructured key value map stored with a resource that may be +set by external tools to store and retrieve arbitrary metadata. They are not +queryable and should be preserved when modifying objects. +More info: http://kubernetes.io/docs/user-guide/annotations

+
+labels
+ +map[string]string + +
+

Route service traffic to pods with label keys and values matching this +selector. If empty or not present, the service is assumed to have an +external process managing its endpoints, which Kubernetes will not +modify. Only applies to types ClusterIP, NodePort, and LoadBalancer. +Ignored if type is ExternalName. +More info: https://kubernetes.io/docs/concepts/services-networking/service/

+
+type
+ + +Kubernetes core/v1.ServiceType + + +
+(Optional) +

Type determines how the Service is exposed. Defaults to ClusterIP. Valid +options are ExternalName, ClusterIP, NodePort, and LoadBalancer. +“ExternalName” maps to the specified externalName. +“ClusterIP” allocates a cluster-internal IP address for load-balancing to +endpoints. Endpoints are determined by the selector or if that is not +specified, by manual construction of an Endpoints object. If clusterIP is +“None”, no virtual IP is allocated and the endpoints are published as a +set of endpoints rather than a stable IP. +“NodePort” builds on ClusterIP and allocates a port on every node which +routes to the clusterIP. +“LoadBalancer” builds on NodePort and creates an +external load-balancer (if supported in the current cloud) which routes +to the clusterIP. +More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services—service-types

+
+port
+ +int32 + +
+

The port that are exposed by this service. +More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies

+
+nodePort
+ +int32 + +
+(Optional) +

The port on each node on which this service is exposed when type=NodePort or LoadBalancer. +Usually assigned by the system. If specified, it will be allocated to the service +if unused or else creation of the service will fail. +Default is to auto-allocate a port if the ServiceType of this Service requires one. +More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport

+
+loadBalancerSourceRanges
+ +[]string + +
+(Optional) +

If specified and supported by the platform, this will restrict traffic through the cloud-provider +load-balancer will be restricted to the specified client IPs. This field will be ignored if the +cloud-provider does not support the feature.” +More info: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/

+
+loadBalancerIP
+ +string + +
+(Optional) +

Only applies to Service Type: LoadBalancer +LoadBalancer will get created with the IP specified in this field. +This feature depends on whether the underlying cloud-provider supports specifying +the loadBalancerIP when a load balancer is created. +This field will be ignored if the cloud-provider does not support the feature.

+
+
+

+Generated with gen-crd-api-reference-docs +on git commit 37e531a. +

+ + + +
Last modified August 5, 2019 +
+
+ + +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/getting-started/v0.2.0/aks/index.html b/docs/docs/getting-started/v0.2.0/aks/index.html new file mode 100644 index 00000000..0b630410 --- /dev/null +++ b/docs/docs/getting-started/v0.2.0/aks/index.html @@ -0,0 +1,516 @@ + + + + + + + + + + + + + + + + + + + + + + +AKS | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AKS | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

AKS

+
Additional configuration for Azure Kubernetes Service
+

Azure AKS managed Kubernetes service adds to every pod the following envs:

+
- name: KUBERNETES_PORT_443_TCP_ADDR
+  value:
+- name: KUBERNETES_PORT
+  value: tcp://
+- name: KUBERNETES_PORT_443_TCP
+  value: tcp://
+- name: KUBERNETES_SERVICE_HOST
+  value:
+

The operator is aware of it and omits these envs when checking if Jenkins pod envs have been changed. It prevents +restart Jenkins pod over and over again.

+ + + +
Last modified August 5, 2019 +
+
+ + +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/getting-started/v0.2.0/configuration/index.html b/docs/docs/getting-started/v0.2.0/configuration/index.html new file mode 100644 index 00000000..bab4941c --- /dev/null +++ b/docs/docs/getting-started/v0.2.0/configuration/index.html @@ -0,0 +1,782 @@ + + + + + + + + + + + + + + + + + + + + + + +Configuration | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Configuration | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

Configuration

+
How to configure Jenkins with Operator
+ + +

Configure Seed Jobs and Pipelines

+ +

Jenkins operator uses job-dsl and kubernetes-credentials-provider plugins for configuring jobs +and deploy keys.

+ +

Prepare job definitions and pipelines

+ +

First you have to prepare pipelines and job definition in your GitHub repository using the following structure:

+ +
cicd/
+├── jobs
+│   └── build.jenkins
+└── pipelines
+    └── build.jenkins
+
+ +

cicd/jobs/build.jenkins it’s a job definition:

+ +
#!/usr/bin/env groovy
+
+pipelineJob('build-jenkins-operator') {
+    displayName('Build jenkins-operator')
+
+    definition {
+        cpsScm {
+            scm {
+                git {
+                    remote {
+                        url('https://github.com/jenkinsci/kubernetes-operator.git')
+                        credentials('jenkins-operator')
+                    }
+                    branches('*/master')
+                }
+            }
+            scriptPath('cicd/pipelines/build.jenkins')
+        }
+    }
+}
+
+ +

cicd/jobs/build.jenkins it’s an actual Jenkins pipeline:

+ +
#!/usr/bin/env groovy
+
+def label = "build-jenkins-operator-${UUID.randomUUID().toString()}"
+def home = "/home/jenkins"
+def workspace = "${home}/workspace/build-jenkins-operator"
+def workdir = "${workspace}/src/github.com/jenkinsci/kubernetes-operator/"
+
+podTemplate(label: label,
+        containers: [
+                containerTemplate(name: 'jnlp', image: 'jenkins/jnlp-slave:alpine'),
+                containerTemplate(name: 'go', image: 'golang:1-alpine', command: 'cat', ttyEnabled: true),
+        ],
+        envVars: [
+                envVar(key: 'GOPATH', value: workspace),
+        ],
+        ) {
+
+    node(label) {
+        dir(workdir) {
+            stage('Init') {
+                timeout(time: 3, unit: 'MINUTES') {
+                    checkout scm
+                }
+                container('go') {
+                    sh 'apk --no-cache --update add make git gcc libc-dev'
+                }
+            }
+
+            stage('Dep') {
+                container('go') {
+                    sh 'make dep'
+                }
+            }
+
+            stage('Test') {
+                container('go') {
+                    sh 'make test'
+                }
+            }
+
+            stage('Build') {
+                container('go') {
+                    sh 'make build'
+                }
+            }
+        }
+    }
+}
+
+ +

Configure Seed Jobs

+ +

Jenkins Seed Jobs are configured using Jenkins.spec.seedJobs section from your custom resource manifest:

+ +
apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+  name: example
+spec:
+  seedJobs:
+  - id: jenkins-operator
+    targets: "cicd/jobs/*.jenkins"
+    description: "Jenkins Operator repository"
+    repositoryBranch: master
+    repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git
+
+ +

jenkins-operator will automatically discover and configure all seed jobs.

+ +

You can verify if deploy keys were successfully configured in Jenkins Credentials tab.

+ +

jenkins

+ +

You can verify if your pipelines were successfully configured in Jenkins Seed Job console output.

+ +

jenkins

+ +

If your GitHub repository is private you have to configure SSH or username/password authentication.

+ +

SSH authentication

+ +

Generate SSH Keys

+ +

There are two methods of SSH private key generation:

+
$ openssl genrsa -out <filename> 2048
+

or

+
$ ssh-keygen -t rsa -b 2048
+$ ssh-keygen -p -f <filename> -m pem
+

Then copy content from generated file.

+ +

Public key

+ +

If you want to upload your public key to your Git server you need to extract it.

+ +

If key was generated by openssl then you need to type this to extract public key:

+
$ openssl rsa -in <filename> -pubout > <filename>.pub
+

If key was generated by ssh-keygen the public key content is located in .pub and there is no need to extract public key

+ +

Configure SSH authentication

+ +

Configure seed job like:

+ +
apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+  name: example
+spec:
+  seedJobs:
+  - id: jenkins-operator-ssh
+    credentialType: basicSSHUserPrivateKey
+    credentialID: k8s-ssh
+    targets: "cicd/jobs/*.jenkins"
+    description: "Jenkins Operator repository"
+    repositoryBranch: master
+    repositoryUrl: git@github.com:jenkinsci/kubernetes-operator.git
+
+ +

and create Kubernetes Secret(name of secret should be the same from credentialID field):

+ +
apiVersion: v1
+kind: Secret
+metadata:
+  name: k8s-ssh
+stringData:
+  privateKey: |
+    -----BEGIN RSA PRIVATE KEY-----
+    MIIJKAIBAAKCAgEAxxDpleJjMCN5nusfW/AtBAZhx8UVVlhhhIKXvQ+dFODQIdzO
+    oDXybs1zVHWOj31zqbbJnsfsVZ9Uf3p9k6xpJ3WFY9b85WasqTDN1xmSd6swD4N8
+    ...
+  username: github_user_name
+
+ +

Username & password authentication

+ +

Configure seed job like:

+ +
apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+  name: example
+spec:
+  seedJobs:
+  - id: jenkins-operator-user-pass
+    credentialType: usernamePassword
+    credentialID: k8s-user-pass
+    targets: "cicd/jobs/*.jenkins"
+    description: "Jenkins Operator repository"
+    repositoryBranch: master
+    repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git
+
+ +

and create Kubernetes Secret(name of secret should be the same from credentialID field):

+ +
apiVersion: v1
+kind: Secret
+metadata:
+  name: k8s-user-pass
+stringData:
+  username: github_user_name
+  password: password_or_token
+
+ +

Pulling Docker images from private repositories

+ +

To pull Docker Image from private repository you can use imagePullSecrets.

+ +

Please follow the instructions on creating a secret with a docker config.

+ +

Docker Hub Configuration

+ +

To use Docker Hub additional steps are required.

+ +

Edit the previously created secret:

+
kubectl -n <namespace> edit secret <name>
+

The .dockerconfigjson key’s value needs to be replaced with a modified version.

+ +

After modifications it needs to be encoded as Base64 value before setting the .dockerconfigjson key:q.

+ +

Example config file to modify and use:

+ +
{
+    "auths":{
+        "https://index.docker.io/v1/":{
+            "username":"user",
+            "password":"password",
+            "email":"yourdockeremail@gmail.com",
+            "auth":"base64 of string user:password"
+        },
+        "auth.docker.io":{
+            "username":"user",
+            "password":"password",
+            "email":"yourdockeremail@gmail.com",
+            "auth":"base64 of string user:password"
+        },
+        "registry.docker.io":{
+            "username":"user",
+            "password":"password",
+            "email":"yourdockeremail@gmail.com",
+            "auth":"base64 of string user:password"
+        },
+        "docker.io":{
+            "username":"user",
+            "password":"password",
+            "email":"yourdockeremail@gmail.com",
+            "auth":"base64 of string user:password"
+        },
+        "https://registry-1.docker.io/v2/": {
+            "username":"user",
+            "password":"password",
+            "email":"yourdockeremail@gmail.com",
+            "auth":"base64 of string user:password"
+        },
+        "registry-1.docker.io/v2/": {
+            "username":"user",
+            "password":"password",
+            "email":"yourdockeremail@gmail.com",
+            "auth":"base64 of string user:password"
+        },
+        "registry-1.docker.io": {
+            "username":"user",
+            "password":"password",
+            "email":"yourdockeremail@gmail.com",
+            "auth":"base64 of string user:password"
+        },
+        "https://registry-1.docker.io": {
+            "username":"user",
+            "password":"password",
+            "email":"yourdockeremail@gmail.com",
+            "auth":"base64 of string user:password"
+        }
+    }
+}
+
+ + + +
Last modified August 5, 2019 +
+
+ + +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/getting-started/v0.2.0/configure-backup-and-restore/index.html b/docs/docs/getting-started/v0.2.0/configure-backup-and-restore/index.html new file mode 100644 index 00000000..881a8ce8 --- /dev/null +++ b/docs/docs/getting-started/v0.2.0/configure-backup-and-restore/index.html @@ -0,0 +1,574 @@ + + + + + + + + + + + + + + + + + + + + + + +Configure backup and restore | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Configure backup and restore | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

Configure backup and restore

+
Prevent job history loss
+ + +

Backup and restore is done by container sidecar.

+ +

PVC

+ +

Create PVC

+ +

Save to file pvc.yaml:

+
apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: <pvc_name>
+  namespace: <namesapce>
+spec:
+  accessModes:
+  - ReadWriteOnce
+  resources:
+    requests:
+      storage: 500Gi
+

Run command:

+
$ kubectl -n <namesapce> create -f pvc.yaml
+

Configure Jenkins CR

+
apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+  name: <cr_name>
+  namespace: <namespace>
+spec:
+  master:
+    securityContext:
+      runAsUser: 1000
+      fsGroup: 1000
+    containers:
+    - name: jenkins-master
+      image: jenkins/jenkins:lts
+    - name: backup # container responsible for backup and restore
+      env:
+      - name: BACKUP_DIR
+        value: /backup
+      - name: JENKINS_HOME
+        value: /jenkins-home
+      - name: BACKUP_COUNT
+        value: "3" # keep only the 2 most recent backups
+      image: virtuslab/jenkins-operator-backup-pvc:v0.0.6 # look at backup/pvc directory
+      imagePullPolicy: IfNotPresent
+      volumeMounts:
+      - mountPath: /jenkins-home # Jenkins home volume
+        name: jenkins-home
+      - mountPath: /backup # backup volume
+        name: backup
+    volumes:
+    - name: backup # PVC volume where backups will be stored
+      persistentVolumeClaim:
+        claimName: <pvc_name>
+  backup:
+    containerName: backup # container name is responsible for backup
+    action:
+      exec:
+        command:
+        - /home/user/bin/backup.sh # this command is invoked on "backup" container to make backup, for example /home/user/bin/backup.sh <backup_number>, <backup_number> is passed by operator
+    interval: 30 # how often make backup in seconds
+    makeBackupBeforePodDeletion: true # make backup before pod deletion
+  restore:
+    containerName: backup # container name is responsible for restore backup
+    action:
+      exec:
+        command:
+        - /home/user/bin/restore.sh # this command is invoked on "backup" container to make restore backup, for example /home/user/bin/restore.sh <backup_number>, <backup_number> is passed by operator
+    #recoveryOnce: <backup_number> # if want to restore specific backup configure this field and then Jenkins will be restarted and desired backup will be restored
+ + +
Last modified August 5, 2019 +
+
+ + +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/getting-started/v0.2.0/customization/index.html b/docs/docs/getting-started/v0.2.0/customization/index.html new file mode 100644 index 00000000..3483a69d --- /dev/null +++ b/docs/docs/getting-started/v0.2.0/customization/index.html @@ -0,0 +1,658 @@ + + + + + + + + + + + + + + + + + + + + + + +Customization | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Customization | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

Customization

+
How to customize Jenkins
+ + +

Jenkins can be customized using groovy scripts or configuration as code plugin. +By using ConfigMap you can create own Jenkins customized configuration. +Then you must reference the ConfigMap in Jenkins pod customization file in spec.groovyScripts or spec.configurationAsCode

+ +

For example create ConfigMap with name jenkins-operator-user-configuration. Then, modify the Jenkins manifest to look like this:

+
apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+  name: example
+spec:
+  configurationAsCode:
+    configurations: 
+    - name: jenkins-operator-user-configuration
+  groovyScripts:
+    configurations:
+    - name: jenkins-operator-user-configuration
+

Here is example of jenkins-operator-user-configuration:

+
apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: jenkins-operator-user-configuration
+data:
+  1-configure-theme.groovy: | 
+    import jenkins.*
+    import jenkins.model.*
+    import hudson.*
+    import hudson.model.*
+    import org.jenkinsci.plugins.simpletheme.ThemeElement
+    import org.jenkinsci.plugins.simpletheme.CssTextThemeElement
+    import org.jenkinsci.plugins.simpletheme.CssUrlThemeElement
+
+    Jenkins jenkins = Jenkins.getInstance()
+
+    def decorator = Jenkins.instance.getDescriptorByType(org.codefirst.SimpleThemeDecorator.class)
+
+    List<ThemeElement> configElements = new ArrayList<>();
+    configElements.add(new CssTextThemeElement("DEFAULT"));
+    configElements.add(new CssUrlThemeElement("https://cdn.rawgit.com/afonsof/jenkins-material-theme/gh-pages/dist/material-light-green.css"));
+    decorator.setElements(configElements);
+    decorator.save();
+
+    jenkins.save()
+  1-system-message.yaml: |
+    jenkins:
+      systemMessage: "Configuration as Code integration works!!!"
+
    +
  • *.groovy is Groovy script configuration
  • +
  • *.yaml is configuration as code
  • +
+ +

If you want to correct your configuration you can edit it while jenkins-operator is running. +Jenkins will reconcile and apply new configuration.

+ +

Using secrets inside Groovy script

+ +

If you configured spec.groovyScripts.secret.name, then this secret is available to use inside map Groovy scripts. +The secrets are loaded to secrets map.

+ +

Create a secret with for eg. jenkins-conf-secrets name.

+
kind: Secret
+apiVersion: v1
+type: Opaque
+metadata:
+  name: jenkins-conf-secrets
+  namespace: default
+data:
+  SYSTEM_MESSAGE: SGVsbG8gd29ybGQ=
+

Then modify the Jenkins pod manifest by changing spec.groovyScripts.secret.name to jenkins-conf-secrets.

+
apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+  name: example
+spec:
+  configurationAsCode:
+    configurations: 
+    - name: jenkins-operator-user-configuration
+    secret:
+      name: jenkins-conf-secrets
+  groovyScripts:
+    configurations:
+    - name: jenkins-operator-user-configuration
+    secret:
+      name: jenkins-conf-secrets
+

Now you can test that the secret is mounted by applying this ConfigMap for Groovy script:

+
apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: jenkins-operator-user-configuration
+data:
+  1-system-message.groovy: | 
+    import jenkins.*
+    import jenkins.model.*
+    import hudson.*
+    import hudson.model.*
+    Jenkins jenkins = Jenkins.getInstance()
+    
+    jenkins.setSystemMessage(secrets["SYSTEM_MESSAGE"])
+    jenkins.save()
+

Or by applying configuration as code:

+
apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: jenkins-operator-user-configuration
+data:
+  1-system-message.yaml: |
+    jenkins:
+      systemMessage: ${SYSTEM_MESSAGE}
+

After this, you should see the Hello world system message at Jenkins homepage.

+ +

Install Plugins

+ +

Edit CR under spec.master.plugins:

+ +
apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+  name: example
+spec:
+  master:
+   plugins:
+   - name: simple-theme-plugin
+     version: 0.5.1
+
+ +

Under spec.master.basePlugins you can find plugins for valid jenkins-operator work:

+
apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+  name: example
+spec:
+  master:
+    basePlugins:
+    - name: kubernetes
+      version: 1.18.3
+    - name: workflow-job
+      version: "2.34"
+    - name: workflow-aggregator
+      version: "2.6"
+    - name: git
+      version: 3.12.0
+    - name: job-dsl
+      version: "1.76"
+    - name: configuration-as-code
+      version: "1.29"
+    - name: configuration-as-code-support
+      version: "1.19"
+    - name: kubernetes-credentials-provider
+      version: 0.12.1
+

You can change version of them.

+ +

Then jenkins-operator will automatically install plugins after Jenkins master pod restart.

+ + + +
Last modified August 5, 2019 +
+
+ + +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/getting-started/v0.2.0/deploy-jenkins/index.html b/docs/docs/getting-started/v0.2.0/deploy-jenkins/index.html new file mode 100644 index 00000000..c715bb5d --- /dev/null +++ b/docs/docs/getting-started/v0.2.0/deploy-jenkins/index.html @@ -0,0 +1,563 @@ + + + + + + + + + + + + + + + + + + + + + + +Deploy Jenkins | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Deploy Jenkins | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

Deploy Jenkins

+
Deploy production ready Jenkins Operator manifest
+

Once jenkins-operator is up and running let’s deploy actual Jenkins instance. +Create manifest ie. jenkins_instance.yaml with following data and save it on drive.

+
apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+  name: example
+spec:
+  master:
+    containers:
+    - name: jenkins-master
+      image: jenkins/jenkins:lts
+      imagePullPolicy: Always
+      livenessProbe:
+        failureThreshold: 12
+        httpGet:
+          path: /login
+          port: http
+          scheme: HTTP
+        initialDelaySeconds: 80
+        periodSeconds: 10
+        successThreshold: 1
+        timeoutSeconds: 5
+      readinessProbe:
+        failureThreshold: 3
+        httpGet:
+          path: /login
+          port: http
+          scheme: HTTP
+        initialDelaySeconds: 30
+        periodSeconds: 10
+        successThreshold: 1
+        timeoutSeconds: 1
+      resources:
+        limits:
+          cpu: 1500m
+          memory: 3Gi
+        requests:
+          cpu: "1"
+          memory: 500Mi
+  seedJobs:
+  - id: jenkins-operator
+    targets: "cicd/jobs/*.jenkins"
+    description: "Jenkins Operator repository"
+    repositoryBranch: master
+    repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git
+

Deploy Jenkins to K8s:

+
kubectl create -f jenkins_instance.yaml
+

Watch Jenkins instance being created:

+
kubectl get pods -w
+

Get Jenkins credentials:

+
kubectl get secret jenkins-operator-credentials-<cr_name> -o 'jsonpath={.data.user}' | base64 -d
+kubectl get secret jenkins-operator-credentials-<cr_name> -o 'jsonpath={.data.password}' | base64 -d
+

Connect to Jenkins (minikube):

+
minikube service jenkins-operator-http-<cr_name> --url
+

Connect to Jenkins (actual Kubernetes cluster):

+
kubectl port-forward jenkins-<cr_name> 8080:8080
+

Then open browser with address http://localhost:8080. +jenkins

+ + + +
Last modified August 5, 2019 +
+
+ + +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/getting-started/v0.2.0/diagnostics/index.html b/docs/docs/getting-started/v0.2.0/diagnostics/index.html new file mode 100644 index 00000000..276eba5f --- /dev/null +++ b/docs/docs/getting-started/v0.2.0/diagnostics/index.html @@ -0,0 +1,519 @@ + + + + + + + + + + + + + + + + + + + + + + +Diagnostics | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Diagnostics | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

Diagnostics

+
How to deal with jenkins-operator problems
+ + +

Turn on debug in jenkins-operator deployment:

+
sed -i 's|\(args:\).*|\1\ ["--debug"\]|' deploy/operator.yaml
+kubectl apply -f deploy/operator.yaml
+

Watch Kubernetes events:

+
kubectl get events --sort-by='{.lastTimestamp}'
+

Verify Jenkins master logs:

+
kubectl logs -f jenkins-<cr_name>
+

Verify jenkins-operator logs:

+
kubectl logs deployment/jenkins-operator
+

Troubleshooting

+ +

Delete Jenkins master pod and wait for the new one to come up:

+
kubectl delete pod jenkins-<cr_name>
+ + +
Last modified August 5, 2019 +
+
+ + +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/getting-started/v0.2.0/index.html b/docs/docs/getting-started/v0.2.0/index.html new file mode 100644 index 00000000..7ade35c6 --- /dev/null +++ b/docs/docs/getting-started/v0.2.0/index.html @@ -0,0 +1,629 @@ + + + + + + + + + + + + + + + + + + + + + + + +v0.2.0 | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + v0.2.0 | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

v0.2.0

+
How to work with jenkins-operator latest version
+ + + + +
+

This document describes a getting started guide for jenkins-operator v0.2.0 and an additional configuration.

+ +
+ + +

First Steps

+ +

Prepare your Kubernetes cluster and set up access. +Once you have running Kubernetes cluster you can focus on installing jenkins-operator according to the Installation guide.

+ +
+ + + + +
+ + + + + + +
+
+ Deploy Jenkins +
+

Deploy production ready Jenkins Operator manifest +

+
+ + + + + + + +
+
+ Configuration +
+

How to configure Jenkins with Operator +

+
+ + + + + +
+
+ Customization +
+

How to customize Jenkins +

+
+ + + + + + + +
+
+ AKS +
+

Additional configuration for Azure Kubernetes Service +

+
+ + + + + +
+
+ Configure backup and restore +
+

Prevent job history loss +

+
+ + + + + + + +
+
+ Migration from v0.1.1 +
+

How to migrate from v0.1.1 to v0.2.0 +

+
+ + + + + + + + + + + + + +
+
+ Diagnostics +
+

How to deal with jenkins-operator problems +

+
+ + + + + +
+
+ Scheme +
+

API Schema definitions for Jenkins CR +

+
+ + + + + + + + + +
+ + + +
Last modified August 5, 2019 +
+
+ +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/getting-started/v0.2.0/index.xml b/docs/docs/getting-started/v0.2.0/index.xml new file mode 100644 index 00000000..cd8cba35 --- /dev/null +++ b/docs/docs/getting-started/v0.2.0/index.xml @@ -0,0 +1,2175 @@ + + + Jenkins Operator – v0.2.0 + /docs/getting-started/v0.2.0/ + Recent Hugo news from gohugo.io + Hugo -- gohugo.io + Mon, 05 Aug 2019 00:00:00 +0000 + + /img/hugo.png + GoHugo.io + /docs/getting-started/v0.2.0/ + + + + + + + + + + + + Docs: Deploy Jenkins + /docs/getting-started/v0.2.0/deploy-jenkins/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.2.0/deploy-jenkins/ + + + + <p>Once jenkins-operator is up and running let&rsquo;s deploy actual Jenkins instance. +Create manifest ie. <strong>jenkins_instance.yaml</strong> with following data and save it on drive.</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">apiVersion: jenkins.io/v1alpha2 +kind: Jenkins +metadata: + name: example +spec: + master: + containers: + - name: jenkins-master + image: jenkins/jenkins:lts + imagePullPolicy: Always + livenessProbe: + failureThreshold: <span style="color:#0000cf;font-weight:bold">12</span> + httpGet: + path: /login + port: http + scheme: HTTP + initialDelaySeconds: <span style="color:#0000cf;font-weight:bold">80</span> + periodSeconds: <span style="color:#0000cf;font-weight:bold">10</span> + successThreshold: <span style="color:#0000cf;font-weight:bold">1</span> + timeoutSeconds: <span style="color:#0000cf;font-weight:bold">5</span> + readinessProbe: + failureThreshold: <span style="color:#0000cf;font-weight:bold">3</span> + httpGet: + path: /login + port: http + scheme: HTTP + initialDelaySeconds: <span style="color:#0000cf;font-weight:bold">30</span> + periodSeconds: <span style="color:#0000cf;font-weight:bold">10</span> + successThreshold: <span style="color:#0000cf;font-weight:bold">1</span> + timeoutSeconds: <span style="color:#0000cf;font-weight:bold">1</span> + resources: + limits: + cpu: 1500m + memory: 3Gi + requests: + cpu: <span style="color:#4e9a06">&#34;1&#34;</span> + memory: 500Mi + seedJobs: + - id: jenkins-operator + targets: <span style="color:#4e9a06">&#34;cicd/jobs/*.jenkins&#34;</span> + description: <span style="color:#4e9a06">&#34;Jenkins Operator repository&#34;</span> + repositoryBranch: master + repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git</code></pre></div> +<p>Deploy Jenkins to K8s:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl create -f jenkins_instance.yaml</code></pre></div> +<p>Watch Jenkins instance being created:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl get pods -w</code></pre></div> +<p>Get Jenkins credentials:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl get secret jenkins-operator-credentials-&lt;cr_name&gt; -o <span style="color:#4e9a06">&#39;jsonpath={.data.user}&#39;</span> <span style="color:#000;font-weight:bold">|</span> base64 -d +kubectl get secret jenkins-operator-credentials-&lt;cr_name&gt; -o <span style="color:#4e9a06">&#39;jsonpath={.data.password}&#39;</span> <span style="color:#000;font-weight:bold">|</span> base64 -d</code></pre></div> +<p>Connect to Jenkins (minikube):</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">minikube service jenkins-operator-http-&lt;cr_name&gt; --url</code></pre></div> +<p>Connect to Jenkins (actual Kubernetes cluster):</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl port-forward jenkins-&lt;cr_name&gt; <span style="color:#0000cf;font-weight:bold">8080</span>:8080</code></pre></div> +<p>Then open browser with address <code>http://localhost:8080</code>. +<img src="/img/jenkins.png" alt="jenkins" /></p> + + + + + + Docs: Configuration + /docs/getting-started/v0.2.0/configuration/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.2.0/configuration/ + + + + + +<h2 id="configure-seed-jobs-and-pipelines">Configure Seed Jobs and Pipelines</h2> + +<p>Jenkins operator uses <a href="https://github.com/jenkinsci/job-dsl-plugin" target="_blank">job-dsl</a> and <a href="https://jenkinsci.github.io/kubernetes-credentials-provider-plugin/" target="_blank">kubernetes-credentials-provider</a> plugins for configuring jobs +and deploy keys.</p> + +<h2 id="prepare-job-definitions-and-pipelines">Prepare job definitions and pipelines</h2> + +<p>First you have to prepare pipelines and job definition in your GitHub repository using the following structure:</p> + +<pre><code>cicd/ +├── jobs +│   └── build.jenkins +└── pipelines + └── build.jenkins +</code></pre> + +<p><strong>cicd/jobs/build.jenkins</strong> it&rsquo;s a job definition:</p> + +<pre><code>#!/usr/bin/env groovy + +pipelineJob('build-jenkins-operator') { + displayName('Build jenkins-operator') + + definition { + cpsScm { + scm { + git { + remote { + url('https://github.com/jenkinsci/kubernetes-operator.git') + credentials('jenkins-operator') + } + branches('*/master') + } + } + scriptPath('cicd/pipelines/build.jenkins') + } + } +} +</code></pre> + +<p><strong>cicd/jobs/build.jenkins</strong> it&rsquo;s an actual Jenkins pipeline:</p> + +<pre><code>#!/usr/bin/env groovy + +def label = &quot;build-jenkins-operator-${UUID.randomUUID().toString()}&quot; +def home = &quot;/home/jenkins&quot; +def workspace = &quot;${home}/workspace/build-jenkins-operator&quot; +def workdir = &quot;${workspace}/src/github.com/jenkinsci/kubernetes-operator/&quot; + +podTemplate(label: label, + containers: [ + containerTemplate(name: 'jnlp', image: 'jenkins/jnlp-slave:alpine'), + containerTemplate(name: 'go', image: 'golang:1-alpine', command: 'cat', ttyEnabled: true), + ], + envVars: [ + envVar(key: 'GOPATH', value: workspace), + ], + ) { + + node(label) { + dir(workdir) { + stage('Init') { + timeout(time: 3, unit: 'MINUTES') { + checkout scm + } + container('go') { + sh 'apk --no-cache --update add make git gcc libc-dev' + } + } + + stage('Dep') { + container('go') { + sh 'make dep' + } + } + + stage('Test') { + container('go') { + sh 'make test' + } + } + + stage('Build') { + container('go') { + sh 'make build' + } + } + } + } +} +</code></pre> + +<h2 id="configure-seed-jobs">Configure Seed Jobs</h2> + +<p>Jenkins Seed Jobs are configured using <code>Jenkins.spec.seedJobs</code> section from your custom resource manifest:</p> + +<pre><code>apiVersion: jenkins.io/v1alpha2 +kind: Jenkins +metadata: + name: example +spec: + seedJobs: + - id: jenkins-operator + targets: &quot;cicd/jobs/*.jenkins&quot; + description: &quot;Jenkins Operator repository&quot; + repositoryBranch: master + repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git +</code></pre> + +<p><strong>jenkins-operator</strong> will automatically discover and configure all seed jobs.</p> + +<p>You can verify if deploy keys were successfully configured in Jenkins <strong>Credentials</strong> tab.</p> + +<p><img src="/img/jenkins-credentials.png" alt="jenkins" /></p> + +<p>You can verify if your pipelines were successfully configured in Jenkins Seed Job console output.</p> + +<p><img src="/img/jenkins-seed.png" alt="jenkins" /></p> + +<p>If your GitHub repository is <strong>private</strong> you have to configure SSH or username/password authentication.</p> + +<h3 id="ssh-authentication">SSH authentication</h3> + +<h4 id="generate-ssh-keys">Generate SSH Keys</h4> + +<p>There are two methods of SSH private key generation:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ openssl genrsa -out &lt;filename&gt; <span style="color:#0000cf;font-weight:bold">2048</span></code></pre></div> +<p>or</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ ssh-keygen -t rsa -b <span style="color:#0000cf;font-weight:bold">2048</span> +$ ssh-keygen -p -f &lt;filename&gt; -m pem</code></pre></div> +<p>Then copy content from generated file.</p> + +<h4 id="public-key">Public key</h4> + +<p>If you want to upload your public key to your Git server you need to extract it.</p> + +<p>If key was generated by <code>openssl</code> then you need to type this to extract public key:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ openssl rsa -in &lt;filename&gt; -pubout &gt; &lt;filename&gt;.pub</code></pre></div> +<p>If key was generated by <code>ssh-keygen</code> the public key content is located in <filename>.pub and there is no need to extract public key</p> + +<h4 id="configure-ssh-authentication">Configure SSH authentication</h4> + +<p>Configure seed job like:</p> + +<pre><code>apiVersion: jenkins.io/v1alpha2 +kind: Jenkins +metadata: + name: example +spec: + seedJobs: + - id: jenkins-operator-ssh + credentialType: basicSSHUserPrivateKey + credentialID: k8s-ssh + targets: &quot;cicd/jobs/*.jenkins&quot; + description: &quot;Jenkins Operator repository&quot; + repositoryBranch: master + repositoryUrl: git@github.com:jenkinsci/kubernetes-operator.git +</code></pre> + +<p>and create Kubernetes Secret(name of secret should be the same from <code>credentialID</code> field):</p> + +<pre><code>apiVersion: v1 +kind: Secret +metadata: + name: k8s-ssh +stringData: + privateKey: | + -----BEGIN RSA PRIVATE KEY----- + MIIJKAIBAAKCAgEAxxDpleJjMCN5nusfW/AtBAZhx8UVVlhhhIKXvQ+dFODQIdzO + oDXybs1zVHWOj31zqbbJnsfsVZ9Uf3p9k6xpJ3WFY9b85WasqTDN1xmSd6swD4N8 + ... + username: github_user_name +</code></pre> + +<h3 id="username-password-authentication">Username &amp; password authentication</h3> + +<p>Configure seed job like:</p> + +<pre><code>apiVersion: jenkins.io/v1alpha2 +kind: Jenkins +metadata: + name: example +spec: + seedJobs: + - id: jenkins-operator-user-pass + credentialType: usernamePassword + credentialID: k8s-user-pass + targets: &quot;cicd/jobs/*.jenkins&quot; + description: &quot;Jenkins Operator repository&quot; + repositoryBranch: master + repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git +</code></pre> + +<p>and create Kubernetes Secret(name of secret should be the same from <code>credentialID</code> field):</p> + +<pre><code>apiVersion: v1 +kind: Secret +metadata: + name: k8s-user-pass +stringData: + username: github_user_name + password: password_or_token +</code></pre> + +<h2 id="pulling-docker-images-from-private-repositories">Pulling Docker images from private repositories</h2> + +<p>To pull Docker Image from private repository you can use <code>imagePullSecrets</code>.</p> + +<p>Please follow the instructions on <a href="https://kubernetes.io/docs/concepts/containers/images/?origin_team=T42NTAGHM#creating-a-secret-with-a-docker-config" target="_blank">creating a secret with a docker config</a>.</p> + +<h3 id="docker-hub-configuration">Docker Hub Configuration</h3> + +<p>To use Docker Hub additional steps are required.</p> + +<p>Edit the previously created secret:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl -n &lt;namespace&gt; edit secret &lt;name&gt;</code></pre></div> +<p>The <code>.dockerconfigjson</code> key&rsquo;s value needs to be replaced with a modified version.</p> + +<p>After modifications it needs to be encoded as Base64 value before setting the <code>.dockerconfigjson</code> key:q.</p> + +<p>Example config file to modify and use:</p> + +<pre><code>{ + &quot;auths&quot;:{ + &quot;https://index.docker.io/v1/&quot;:{ + &quot;username&quot;:&quot;user&quot;, + &quot;password&quot;:&quot;password&quot;, + &quot;email&quot;:&quot;yourdockeremail@gmail.com&quot;, + &quot;auth&quot;:&quot;base64 of string user:password&quot; + }, + &quot;auth.docker.io&quot;:{ + &quot;username&quot;:&quot;user&quot;, + &quot;password&quot;:&quot;password&quot;, + &quot;email&quot;:&quot;yourdockeremail@gmail.com&quot;, + &quot;auth&quot;:&quot;base64 of string user:password&quot; + }, + &quot;registry.docker.io&quot;:{ + &quot;username&quot;:&quot;user&quot;, + &quot;password&quot;:&quot;password&quot;, + &quot;email&quot;:&quot;yourdockeremail@gmail.com&quot;, + &quot;auth&quot;:&quot;base64 of string user:password&quot; + }, + &quot;docker.io&quot;:{ + &quot;username&quot;:&quot;user&quot;, + &quot;password&quot;:&quot;password&quot;, + &quot;email&quot;:&quot;yourdockeremail@gmail.com&quot;, + &quot;auth&quot;:&quot;base64 of string user:password&quot; + }, + &quot;https://registry-1.docker.io/v2/&quot;: { + &quot;username&quot;:&quot;user&quot;, + &quot;password&quot;:&quot;password&quot;, + &quot;email&quot;:&quot;yourdockeremail@gmail.com&quot;, + &quot;auth&quot;:&quot;base64 of string user:password&quot; + }, + &quot;registry-1.docker.io/v2/&quot;: { + &quot;username&quot;:&quot;user&quot;, + &quot;password&quot;:&quot;password&quot;, + &quot;email&quot;:&quot;yourdockeremail@gmail.com&quot;, + &quot;auth&quot;:&quot;base64 of string user:password&quot; + }, + &quot;registry-1.docker.io&quot;: { + &quot;username&quot;:&quot;user&quot;, + &quot;password&quot;:&quot;password&quot;, + &quot;email&quot;:&quot;yourdockeremail@gmail.com&quot;, + &quot;auth&quot;:&quot;base64 of string user:password&quot; + }, + &quot;https://registry-1.docker.io&quot;: { + &quot;username&quot;:&quot;user&quot;, + &quot;password&quot;:&quot;password&quot;, + &quot;email&quot;:&quot;yourdockeremail@gmail.com&quot;, + &quot;auth&quot;:&quot;base64 of string user:password&quot; + } + } +} +</code></pre> + + + + + + Docs: Customization + /docs/getting-started/v0.2.0/customization/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.2.0/customization/ + + + + + +<p>Jenkins can be customized using groovy scripts or <a href="https://github.com/jenkinsci/configuration-as-code-plugin" target="_blank">configuration as code plugin</a>. +By using <a href="https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/" target="_blank">ConfigMap</a> you can create own <strong>Jenkins</strong> customized configuration. +Then you must reference the <em>ConfigMap</em> in <strong>Jenkins</strong> pod customization file in <code>spec.groovyScripts</code> or <code>spec.configurationAsCode</code></p> + +<p>For example create <em>ConfigMap</em> with name <code>jenkins-operator-user-configuration</code>. Then, modify the <strong>Jenkins</strong> manifest to look like this:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.io/v1alpha2<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>example<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>spec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configurationAsCode<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configurations<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-operator-user-configuration<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>groovyScripts<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configurations<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-operator-user-configuration</code></pre></div> +<p>Here is example of <code>jenkins-operator-user-configuration</code>:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>v1<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>ConfigMap<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-operator-user-configuration<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>data<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1</span>-configure-theme.groovy<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic">| +</span><span style="color:#8f5902;font-style:italic"> import jenkins.*</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>import<span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.model.*<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>import<span style="color:#f8f8f8;text-decoration:underline"> </span>hudson.*<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>import<span style="color:#f8f8f8;text-decoration:underline"> </span>hudson.model.*<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>import<span style="color:#f8f8f8;text-decoration:underline"> </span>org.jenkinsci.plugins.simpletheme.ThemeElement<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>import<span style="color:#f8f8f8;text-decoration:underline"> </span>org.jenkinsci.plugins.simpletheme.CssTextThemeElement<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>import<span style="color:#f8f8f8;text-decoration:underline"> </span>org.jenkinsci.plugins.simpletheme.CssUrlThemeElement<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins<span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins<span style="color:#f8f8f8;text-decoration:underline"> </span>=<span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins.getInstance()<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>def<span style="color:#f8f8f8;text-decoration:underline"> </span>decorator<span style="color:#f8f8f8;text-decoration:underline"> </span>=<span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins.instance.getDescriptorByType(org.codefirst.SimpleThemeDecorator.class)<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>List&lt;ThemeElement&gt;<span style="color:#f8f8f8;text-decoration:underline"> </span>configElements<span style="color:#f8f8f8;text-decoration:underline"> </span>=<span style="color:#f8f8f8;text-decoration:underline"> </span>new<span style="color:#f8f8f8;text-decoration:underline"> </span>ArrayList&lt;&gt;();<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configElements.add(new<span style="color:#f8f8f8;text-decoration:underline"> </span>CssTextThemeElement(<span style="color:#4e9a06">&#34;DEFAULT&#34;</span>));<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configElements.add(new<span style="color:#f8f8f8;text-decoration:underline"> </span>CssUrlThemeElement(<span style="color:#4e9a06">&#34;https://cdn.rawgit.com/afonsof/jenkins-material-theme/gh-pages/dist/material-light-green.css&#34;</span>));<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>decorator.setElements(configElements);<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>decorator.save();<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.save()<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1</span>-system-message.yaml<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic">| +</span><span style="color:#8f5902;font-style:italic"> jenkins:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>systemMessage<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;Configuration as Code integration works!!!&#34;</span></code></pre></div> +<ul> +<li>*.groovy is Groovy script configuration</li> +<li>*.yaml is configuration as code</li> +</ul> + +<p>If you want to correct your configuration you can edit it while <strong>jenkins-operator</strong> is running. +Jenkins will reconcile and apply new configuration.</p> + +<h3 id="using-secrets-inside-groovy-script">Using secrets inside Groovy script</h3> + +<p>If you configured <code>spec.groovyScripts.secret.name</code>, then this secret is available to use inside map Groovy scripts. +The secrets are loaded to <code>secrets</code> map.</p> + +<p>Create a <a href="https://kubernetes.io/docs/concepts/configuration/secret/" target="_blank">secret</a> with for eg. <code>jenkins-conf-secrets</code> name.</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Secret<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>v1<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>type<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Opaque<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-conf-secrets<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>namespace<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>default<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>data<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>SYSTEM_MESSAGE<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>SGVsbG8gd29ybGQ=</code></pre></div> +<p>Then modify the <strong>Jenkins</strong> pod manifest by changing <code>spec.groovyScripts.secret.name</code> to <code>jenkins-conf-secrets</code>.</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.io/v1alpha2<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>example<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>spec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configurationAsCode<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configurations<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-operator-user-configuration<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>secret<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-conf-secrets<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>groovyScripts<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configurations<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-operator-user-configuration<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>secret<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-conf-secrets</code></pre></div> +<p>Now you can test that the secret is mounted by applying this ConfigMap for Groovy script:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>v1<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>ConfigMap<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-operator-user-configuration<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>data<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1</span>-system-message.groovy<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic">| +</span><span style="color:#8f5902;font-style:italic"> import jenkins.*</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>import<span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.model.*<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>import<span style="color:#f8f8f8;text-decoration:underline"> </span>hudson.*<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>import<span style="color:#f8f8f8;text-decoration:underline"> </span>hudson.model.*<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins<span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins<span style="color:#f8f8f8;text-decoration:underline"> </span>=<span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins.getInstance()<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.setSystemMessage(secrets<span style="color:#000;font-weight:bold">[</span><span style="color:#4e9a06">&#34;SYSTEM_MESSAGE&#34;</span><span style="color:#000;font-weight:bold">]</span>)<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.save()</code></pre></div> +<p>Or by applying configuration as code:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>v1<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>ConfigMap<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-operator-user-configuration<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>data<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1</span>-system-message.yaml<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic">| +</span><span style="color:#8f5902;font-style:italic"> jenkins:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>systemMessage<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>${SYSTEM_MESSAGE}</code></pre></div> +<p>After this, you should see the <code>Hello world</code> system message at <strong>Jenkins</strong> homepage.</p> + +<h2 id="install-plugins">Install Plugins</h2> + +<p>Edit CR under <code>spec.master.plugins</code>:</p> + +<pre><code>apiVersion: jenkins.io/v1alpha2 +kind: Jenkins +metadata: + name: example +spec: + master: + plugins: + - name: simple-theme-plugin + version: 0.5.1 +</code></pre> + +<p>Under <code>spec.master.basePlugins</code> you can find plugins for valid <strong>jenkins-operator</strong> work:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.io/v1alpha2<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>example<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>spec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>master<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>basePlugins<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>kubernetes<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1.18.3</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-job<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;2.34&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-aggregator<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;2.6&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>git<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">3.12.0</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>job-dsl<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.76&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configuration-as-code<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.29&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configuration-as-code-support<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.19&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>kubernetes-credentials-provider<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">0.12.1</span></code></pre></div> +<p>You can change version of them.</p> + +<p>Then <strong>jenkins-operator</strong> will automatically install plugins after Jenkins master pod restart.</p> + + + + + + Docs: AKS + /docs/getting-started/v0.2.0/aks/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.2.0/aks/ + + + + <p>Azure AKS managed Kubernetes service adds to every pod the following envs:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>KUBERNETES_PORT_443_TCP_ADDR<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>KUBERNETES_PORT<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>tcp<span style="color:#000;font-weight:bold">:</span>//<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>KUBERNETES_PORT_443_TCP<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>tcp<span style="color:#000;font-weight:bold">:</span>//<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>KUBERNETES_SERVICE_HOST<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span></code></pre></div> +<p>The operator is aware of it and omits these envs when checking if Jenkins pod envs have been changed. It prevents +restart Jenkins pod over and over again.</p> + + + + + + Docs: Configure backup and restore + /docs/getting-started/v0.2.0/configure-backup-and-restore/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.2.0/configure-backup-and-restore/ + + + + + +<p>Backup and restore is done by container sidecar.</p> + +<h3 id="pvc">PVC</h3> + +<h4 id="create-pvc">Create PVC</h4> + +<p>Save to file pvc.yaml:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>v1<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>PersistentVolumeClaim<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>&lt;pvc_name<span style="color:#8f5902;font-style:italic">&gt; +</span><span style="color:#8f5902;font-style:italic"> namespace: &lt;namesapce&gt;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>spec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>accessModes<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>ReadWriteOnce<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>resources<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>requests<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>storage<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>500Gi</code></pre></div> +<p>Run command:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ kubectl -n &lt;namesapce&gt; create -f pvc.yaml</code></pre></div> +<h4 id="configure-jenkins-cr">Configure Jenkins CR</h4> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.io/v1alpha2<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>&lt;cr_name<span style="color:#8f5902;font-style:italic">&gt; +</span><span style="color:#8f5902;font-style:italic"> namespace: &lt;namespace&gt;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>spec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>master<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>securityContext<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>runAsUser<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1000</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>fsGroup<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1000</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>containers<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-master<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>image<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins/jenkins<span style="color:#000;font-weight:bold">:</span>lts<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>backup<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># container responsible for backup and restore</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>env<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>BACKUP_DIR<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/backup<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>JENKINS_HOME<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/jenkins-home<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>BACKUP_COUNT<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;3&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># keep only the 2 most recent backups</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>image<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>virtuslab/jenkins-operator-backup-pvc<span style="color:#000;font-weight:bold">:</span>v0<span style="color:#0000cf;font-weight:bold">.0.6</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># look at backup/pvc directory</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>imagePullPolicy<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>IfNotPresent<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>volumeMounts<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>mountPath<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/jenkins-home<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># Jenkins home volume</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-home<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>mountPath<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/backup<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># backup volume</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>backup<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>volumes<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>backup<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># PVC volume where backups will be stored</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>persistentVolumeClaim<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>claimName<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>&lt;pvc_name<span style="color:#8f5902;font-style:italic">&gt; +</span><span style="color:#8f5902;font-style:italic"> backup:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>containerName<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>backup<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># container name is responsible for backup</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>action<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>exec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>command<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>/home/user/bin/backup.sh<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># this command is invoked on &#34;backup&#34; container to make backup, for example /home/user/bin/backup.sh &lt;backup_number&gt;, &lt;backup_number&gt; is passed by operator</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>interval<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">30</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># how often make backup in seconds</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>makeBackupBeforePodDeletion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#204a87;font-weight:bold">true</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># make backup before pod deletion</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>restore<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>containerName<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>backup<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># container name is responsible for restore backup</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>action<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>exec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>command<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>/home/user/bin/restore.sh<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># this command is invoked on &#34;backup&#34; container to make restore backup, for example /home/user/bin/restore.sh &lt;backup_number&gt;, &lt;backup_number&gt; is passed by operator</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic">#recoveryOnce: &lt;backup_number&gt; # if want to restore specific backup configure this field and then Jenkins will be restarted and desired backup will be restored</span></code></pre></div> + + + + + Docs: Migration from v0.1.1 + /docs/getting-started/v0.2.0/migration/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.2.0/migration/ + + + + + +<h3 id="added-seed-job-agent">Added seed job agent</h3> + +<p>Now seed jobs are not built by master executors, but by dedicated agent deployed into Kubernetes. We disabled master executors for security reasons.</p> + +<h3 id="apply-jenkins-configuration-via-groovy-scripts-instead-of-jenkins-jobs">Apply Jenkins configuration via Groovy scripts instead of Jenkins jobs</h3> + +<p>We have removed hardcoded configuration by <strong>Jenkins</strong> jobs.</p> + +<p>In <code>v0.1.1</code> <strong>jenkins-operator</strong> configuration was stored in <code>jenkins-operator-user-configuration-&lt;cr_name&gt;</code> +If you want to use <code>v0.2.0</code> or newer you must simply write refer to old ConfigMap by modifying CR, for example:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.io/v1alpha2<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>example<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>spec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configurationAsCode<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configurations<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-operator-user-configuration-&lt;cr_name<span style="color:#8f5902;font-style:italic">&gt; +</span><span style="color:#8f5902;font-style:italic"> groovyScripts:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configurations<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-operator-user-configuration-&lt;cr_name&gt;</code></pre></div> +<p><strong>Jenkins</strong> configuration jobs (<em>Configure Seed Jobs</em>, <em>jenkins-operator-base-configuration</em>, <em>jenkins-operator-user-configuration</em>) have been removed from <strong>Jenkins</strong>.</p> + +<p>In <code>v0.1.1</code> you can see if configuration failed or successfully updated in <strong>Jenkins</strong> UI (job build logs). +Now, when Jenkins configuration jobs are removed, you must use this command to see if configuration was failed.</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ kubectl -n logs deployment/jenkins-operator</code></pre></div> + + + + + Docs: Diagnostics + /docs/getting-started/v0.2.0/diagnostics/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.2.0/diagnostics/ + + + + + +<p>Turn on debug in <strong>jenkins-operator</strong> deployment:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">sed -i <span style="color:#4e9a06">&#39;s|\(args:\).*|\1\ [&#34;--debug&#34;\]|&#39;</span> deploy/operator.yaml +kubectl apply -f deploy/operator.yaml</code></pre></div> +<p>Watch Kubernetes events:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl get events --sort-by<span style="color:#ce5c00;font-weight:bold">=</span><span style="color:#4e9a06">&#39;{.lastTimestamp}&#39;</span></code></pre></div> +<p>Verify Jenkins master logs:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl logs -f jenkins-&lt;cr_name&gt;</code></pre></div> +<p>Verify jenkins-operator logs:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl logs deployment/jenkins-operator</code></pre></div> +<h2 id="troubleshooting">Troubleshooting</h2> + +<p>Delete Jenkins master pod and wait for the new one to come up:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl delete pod jenkins-&lt;cr_name&gt;</code></pre></div> + + + + + Docs: Scheme + /docs/getting-started/v0.2.0/scheme/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.2.0/scheme/ + + + + + +<div class="pageinfo pageinfo-primary"> +<p>This document contains API scheme for <code>jenkins-operator</code> manifest</p> + +</div> + + +<p>Packages:</p> +<ul> +<li> +<a href="#jenkins.io">jenkins.io</a> +</li> +</ul> +<h2 id="jenkins.io">jenkins.io</h2> +<p> +<p>Package v1alpha2 contains API Schema definitions for the jenkins.io v1alpha2 API group</p> +</p> +Resource Types: +<ul><li> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Jenkins">Jenkins</a> +</li></ul> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Jenkins">Jenkins +</h3> +<p> +<p>Jenkins is the Schema for the jenkins API</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>apiVersion</code></br> +string</td> +<td> +<code> +jenkins.io/v1alpha2 +</code> +</td> +</tr> +<tr> +<td> +<code>kind</code></br> +string +</td> +<td><code>Jenkins</code></td> +</tr> +<tr> +<td> +<code>metadata</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#objectmeta-v1-meta"> +Kubernetes meta/v1.ObjectMeta +</a> +</em> +</td> +<td> +Refer to the Kubernetes API documentation for the fields of the +<code>metadata</code> field. +</td> +</tr> +<tr> +<td> +<code>spec</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsSpec"> +JenkinsSpec +</a> +</em> +</td> +<td> +<p>Spec defines the desired state of the Jenkins</p> +<br/> +<br/> +<table> +<tr> +<td> +<code>master</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsMaster"> +JenkinsMaster +</a> +</em> +</td> +<td> +<p>Master represents Jenkins master pod properties and Jenkins plugins. +Every single change here requires a pod restart.</p> +</td> +</tr> +<tr> +<td> +<code>seedJobs</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>SeedJobs defines list of Jenkins Seed Job configurations +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines</a></p> +</td> +</tr> +<tr> +<td> +<code>service</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Service"> +Service +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Service is Kubernetes service of Jenkins master HTTP pod +Defaults to : +port: 8080 +type: ClusterIP</p> +</td> +</tr> +<tr> +<td> +<code>slaveService</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Service"> +Service +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Service is Kubernetes service of Jenkins slave pods +Defaults to : +port: 50000 +type: ClusterIP</p> +</td> +</tr> +<tr> +<td> +<code>backup</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Backup"> +Backup +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Backup defines configuration of Jenkins backup +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore</a></p> +</td> +</tr> +<tr> +<td> +<code>restore</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Restore"> +Restore +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Backup defines configuration of Jenkins backup restore +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore</a></p> +</td> +</tr> +</table> +</td> +</tr> +<tr> +<td> +<code>status</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsStatus"> +JenkinsStatus +</a> +</em> +</td> +<td> +<p>Status defines the observed state of Jenkins</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Backup">Backup +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsSpec">JenkinsSpec</a>) +</p> +<p> +<p>Backup defines configuration of Jenkins backup</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>containerName</code></br> +<em> +string +</em> +</td> +<td> +<p>ContainerName is the container name responsible for backup operation</p> +</td> +</tr> +<tr> +<td> +<code>action</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Handler"> +Handler +</a> +</em> +</td> +<td> +<p>Action defines action which performs backup in backup container sidecar</p> +</td> +</tr> +<tr> +<td> +<code>interval</code></br> +<em> +uint64 +</em> +</td> +<td> +<p>Interval tells how often make backup in seconds +Defaults to 30.</p> +</td> +</tr> +<tr> +<td> +<code>makeBackupBeforePodDeletion</code></br> +<em> +bool +</em> +</td> +<td> +<p>MakeBackupBeforePodDeletion tells operator to make backup before Jenkins master pod deletion</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Build">Build +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsStatus">JenkinsStatus</a>) +</p> +<p> +<p>Build defines Jenkins Build status with corresponding metadata</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>jobName</code></br> +<em> +string +</em> +</td> +<td> +<p>JobName is the Jenkins job name</p> +</td> +</tr> +<tr> +<td> +<code>hash</code></br> +<em> +string +</em> +</td> +<td> +<p>Hash is the unique data identifier used in build</p> +</td> +</tr> +<tr> +<td> +<code>number</code></br> +<em> +int64 +</em> +</td> +<td> +<p>Number is the Jenkins build number</p> +</td> +</tr> +<tr> +<td> +<code>status</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.BuildStatus"> +BuildStatus +</a> +</em> +</td> +<td> +<p>Status is the status of Jenkins build</p> +</td> +</tr> +<tr> +<td> +<code>retries</code></br> +<em> +int +</em> +</td> +<td> +<p>Retires is the amount of Jenkins job build retries</p> +</td> +</tr> +<tr> +<td> +<code>createTime</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#time-v1-meta"> +Kubernetes meta/v1.Time +</a> +</em> +</td> +<td> +<p>CreateTime is the time when the first build has been created</p> +</td> +</tr> +<tr> +<td> +<code>lastUpdateTime</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#time-v1-meta"> +Kubernetes meta/v1.Time +</a> +</em> +</td> +<td> +<p>LastUpdateTime is the last update status time</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.BuildStatus">BuildStatus +(<code>string</code> alias)</p></h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Build">Build</a>) +</p> +<p> +<p>BuildStatus defines type of Jenkins build job status</p> +</p> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Container">Container +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsMaster">JenkinsMaster</a>) +</p> +<p> +<p>Container defines Kubernetes container attributes</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>name</code></br> +<em> +string +</em> +</td> +<td> +<p>Name of the container specified as a DNS_LABEL. +Each container in a pod must have a unique name (DNS_LABEL).</p> +</td> +</tr> +<tr> +<td> +<code>image</code></br> +<em> +string +</em> +</td> +<td> +<p>Docker image name. +More info: <a href="https://kubernetes.io/docs/concepts/containers/images">https://kubernetes.io/docs/concepts/containers/images</a></p> +</td> +</tr> +<tr> +<td> +<code>imagePullPolicy</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#pullpolicy-v1-core"> +Kubernetes core/v1.PullPolicy +</a> +</em> +</td> +<td> +<p>Image pull policy. +One of Always, Never, IfNotPresent. +Defaults to Always.</p> +</td> +</tr> +<tr> +<td> +<code>resources</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#resourcerequirements-v1-core"> +Kubernetes core/v1.ResourceRequirements +</a> +</em> +</td> +<td> +<p>Compute Resources required by this container. +More info: <a href="https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/">https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/</a></p> +</td> +</tr> +<tr> +<td> +<code>command</code></br> +<em> +[]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Entrypoint array. Not executed within a shell. +The docker image&rsquo;s ENTRYPOINT is used if this is not provided. +Variable references $(VAR_NAME) are expanded using the container&rsquo;s environment. If a variable +cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax +can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, +regardless of whether the variable exists or not. +More info: <a href="https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell">https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell</a></p> +</td> +</tr> +<tr> +<td> +<code>args</code></br> +<em> +[]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Arguments to the entrypoint. +The docker image&rsquo;s CMD is used if this is not provided. +Variable references $(VAR_NAME) are expanded using the container&rsquo;s environment. If a variable +cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax +can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, +regardless of whether the variable exists or not. +More info: <a href="https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell">https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell</a></p> +</td> +</tr> +<tr> +<td> +<code>workingDir</code></br> +<em> +string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Container&rsquo;s working directory. +If not specified, the container runtime&rsquo;s default will be used, which +might be configured in the container image.</p> +</td> +</tr> +<tr> +<td> +<code>ports</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#containerport-v1-core"> +[]Kubernetes core/v1.ContainerPort +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>List of ports to expose from the container. Exposing a port here gives +the system additional information about the network connections a +container uses, but is primarily informational. Not specifying a port here +DOES NOT prevent that port from being exposed. Any port which is +listening on the default &ldquo;0.0.0.0&rdquo; address inside a container will be +accessible from the network.</p> +</td> +</tr> +<tr> +<td> +<code>envFrom</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#envfromsource-v1-core"> +[]Kubernetes core/v1.EnvFromSource +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>List of sources to populate environment variables in the container. +The keys defined within a source must be a C_IDENTIFIER. All invalid keys +will be reported as an event when the container is starting. When a key exists in multiple +sources, the value associated with the last source will take precedence. +Values defined by an Env with a duplicate key will take precedence.</p> +</td> +</tr> +<tr> +<td> +<code>env</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#envvar-v1-core"> +[]Kubernetes core/v1.EnvVar +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>List of environment variables to set in the container.</p> +</td> +</tr> +<tr> +<td> +<code>volumeMounts</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#volumemount-v1-core"> +[]Kubernetes core/v1.VolumeMount +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Pod volumes to mount into the container&rsquo;s filesystem.</p> +</td> +</tr> +<tr> +<td> +<code>livenessProbe</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#probe-v1-core"> +Kubernetes core/v1.Probe +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Periodic probe of container liveness. +Container will be restarted if the probe fails.</p> +</td> +</tr> +<tr> +<td> +<code>readinessProbe</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#probe-v1-core"> +Kubernetes core/v1.Probe +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Periodic probe of container service readiness. +Container will be removed from service endpoints if the probe fails.</p> +</td> +</tr> +<tr> +<td> +<code>lifecycle</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#lifecycle-v1-core"> +Kubernetes core/v1.Lifecycle +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Actions that the management system should take in response to container lifecycle events.</p> +</td> +</tr> +<tr> +<td> +<code>securityContext</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#securitycontext-v1-core"> +Kubernetes core/v1.SecurityContext +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Security options the pod should run with. +More info: <a href="https://kubernetes.io/docs/concepts/policy/security-context/">https://kubernetes.io/docs/concepts/policy/security-context/</a> +More info: <a href="https://kubernetes.io/docs/tasks/configure-pod-container/security-context/">https://kubernetes.io/docs/tasks/configure-pod-container/security-context/</a></p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Handler">Handler +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Backup">Backup</a>, +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Restore">Restore</a>) +</p> +<p> +<p>Handler defines a specific action that should be taken</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>exec</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#execaction-v1-core"> +Kubernetes core/v1.ExecAction +</a> +</em> +</td> +<td> +<p>Exec specifies the action to take.</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsCredentialType">JenkinsCredentialType +(<code>string</code> alias)</p></h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.SeedJob">SeedJob</a>) +</p> +<p> +<p>JenkinsCredentialType defines type of Jenkins credential used to seed job mechanism</p> +</p> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsMaster">JenkinsMaster +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsSpec">JenkinsSpec</a>) +</p> +<p> +<p>JenkinsMaster defines the Jenkins master pod attributes and plugins, +every single change requires a Jenkins master pod restart</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>masterAnnotations</code></br> +<em> +map[string]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Annotations is an unstructured key value map stored with a resource that may be +set by external tools to store and retrieve arbitrary metadata. They are not +queryable and should be preserved when modifying objects. +More info: <a href="http://kubernetes.io/docs/user-guide/annotations">http://kubernetes.io/docs/user-guide/annotations</a></p> +</td> +</tr> +<tr> +<td> +<code>nodeSelector</code></br> +<em> +map[string]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>NodeSelector is a selector which must be true for the pod to fit on a node. +Selector which must match a node&rsquo;s labels for the pod to be scheduled on that node. +More info: <a href="https://kubernetes.io/docs/concepts/configuration/assign-pod-node/">https://kubernetes.io/docs/concepts/configuration/assign-pod-node/</a></p> +</td> +</tr> +<tr> +<td> +<code>securityContext</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#podsecuritycontext-v1-core"> +Kubernetes core/v1.PodSecurityContext +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>SecurityContext that applies to all the containers of the Jenkins +Master. As per kubernetes specification, it can be overridden +for each container individually. +Defaults to: +runAsUser: 1000 +fsGroup: 1000</p> +</td> +</tr> +<tr> +<td> +<code>containers</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Container"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Container +</a> +</em> +</td> +<td> +<p>List of containers belonging to the pod. +Containers cannot currently be added or removed. +There must be at least one container in a Pod. +Defaults to: +- image: jenkins/jenkins:lts +imagePullPolicy: Always +livenessProbe: +failureThreshold: 12 +httpGet: +path: /login +port: http +scheme: HTTP +initialDelaySeconds: 80 +periodSeconds: 10 +successThreshold: 1 +timeoutSeconds: 5 +name: jenkins-master +readinessProbe: +failureThreshold: 3 +httpGet: +path: /login +port: http +scheme: HTTP +initialDelaySeconds: 30 +periodSeconds: 10 +successThreshold: 1 +timeoutSeconds: 1 +resources: +limits: +cpu: 1500m +memory: 3Gi +requests: +cpu: &ldquo;1&rdquo; +memory: 600Mi</p> +</td> +</tr> +<tr> +<td> +<code>volumes</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#volume-v1-core"> +[]Kubernetes core/v1.Volume +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>List of volumes that can be mounted by containers belonging to the pod. +More info: <a href="https://kubernetes.io/docs/concepts/storage/volumes">https://kubernetes.io/docs/concepts/storage/volumes</a></p> +</td> +</tr> +<tr> +<td> +<code>basePlugins</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin +</a> +</em> +</td> +<td> +<p>BasePlugins contains plugins required by operator +Defaults to : +- name: kubernetes +version: 1.15.7 +- name: workflow-job +version: &ldquo;2.32&rdquo; +- name: workflow-aggregator +version: &ldquo;2.6&rdquo; +- name: git +version: 3.10.0 +- name: job-dsl +version: &ldquo;1.74&rdquo; +- name: configuration-as-code +version: &ldquo;1.19&rdquo; +- name: configuration-as-code-support +version: &ldquo;1.19&rdquo; +- name: kubernetes-credentials-provider +version: 0.12.1</p> +</td> +</tr> +<tr> +<td> +<code>plugins</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Plugins contains plugins required by user</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsSpec">JenkinsSpec +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Jenkins">Jenkins</a>) +</p> +<p> +<p>JenkinsSpec defines the desired state of the Jenkins</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>master</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsMaster"> +JenkinsMaster +</a> +</em> +</td> +<td> +<p>Master represents Jenkins master pod properties and Jenkins plugins. +Every single change here requires a pod restart.</p> +</td> +</tr> +<tr> +<td> +<code>seedJobs</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>SeedJobs defines list of Jenkins Seed Job configurations +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines</a></p> +</td> +</tr> +<tr> +<td> +<code>service</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Service"> +Service +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Service is Kubernetes service of Jenkins master HTTP pod +Defaults to : +port: 8080 +type: ClusterIP</p> +</td> +</tr> +<tr> +<td> +<code>slaveService</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Service"> +Service +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Service is Kubernetes service of Jenkins slave pods +Defaults to : +port: 50000 +type: ClusterIP</p> +</td> +</tr> +<tr> +<td> +<code>backup</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Backup"> +Backup +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Backup defines configuration of Jenkins backup +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore</a></p> +</td> +</tr> +<tr> +<td> +<code>restore</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Restore"> +Restore +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Backup defines configuration of Jenkins backup restore +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore</a></p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsStatus">JenkinsStatus +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Jenkins">Jenkins</a>) +</p> +<p> +<p>JenkinsStatus defines the observed state of Jenkins</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>operatorVersion</code></br> +<em> +string +</em> +</td> +<td> +<em>(Optional)</em> +<p>OperatorVersion is the operator version which manages this CR</p> +</td> +</tr> +<tr> +<td> +<code>provisionStartTime</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#time-v1-meta"> +Kubernetes meta/v1.Time +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>ProvisionStartTime is a time when Jenkins master pod has been created</p> +</td> +</tr> +<tr> +<td> +<code>baseConfigurationCompletedTime</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#time-v1-meta"> +Kubernetes meta/v1.Time +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>BaseConfigurationCompletedTime is a time when Jenkins base configuration phase has been completed</p> +</td> +</tr> +<tr> +<td> +<code>userConfigurationCompletedTime</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#time-v1-meta"> +Kubernetes meta/v1.Time +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>UserConfigurationCompletedTime is a time when Jenkins user configuration phase has been completed</p> +</td> +</tr> +<tr> +<td> +<code>builds</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Build"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Build +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Builds contains Jenkins builds statues</p> +</td> +</tr> +<tr> +<td> +<code>restoredBackup</code></br> +<em> +uint64 +</em> +</td> +<td> +<em>(Optional)</em> +<p>RestoredBackup is the restored backup number after Jenkins master pod restart</p> +</td> +</tr> +<tr> +<td> +<code>lastBackup</code></br> +<em> +uint64 +</em> +</td> +<td> +<em>(Optional)</em> +<p>LastBackup is the latest backup number</p> +</td> +</tr> +<tr> +<td> +<code>pendingBackup</code></br> +<em> +uint64 +</em> +</td> +<td> +<em>(Optional)</em> +<p>PendingBackup is the pending backup number</p> +</td> +</tr> +<tr> +<td> +<code>backupDoneBeforePodDeletion</code></br> +<em> +bool +</em> +</td> +<td> +<em>(Optional)</em> +<p>BackupDoneBeforePodDeletion tells if backup before pod deletion has been made</p> +</td> +</tr> +<tr> +<td> +<code>userAndPasswordHash</code></br> +<em> +string +</em> +</td> +<td> +<em>(Optional)</em> +<p>UserAndPasswordHash is a SHA256 hash made from user and password</p> +</td> +</tr> +<tr> +<td> +<code>createdSeedJobs</code></br> +<em> +[]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>CreatedSeedJobs contains list of seed job id already created in Jenkins</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin">Plugin +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsMaster">JenkinsMaster</a>) +</p> +<p> +<p>Plugin defines Jenkins plugin</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>name</code></br> +<em> +string +</em> +</td> +<td> +<p>Name is the name of Jenkins plugin</p> +</td> +</tr> +<tr> +<td> +<code>version</code></br> +<em> +string +</em> +</td> +<td> +<p>Version is the version of Jenkins plugin</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Restore">Restore +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsSpec">JenkinsSpec</a>) +</p> +<p> +<p>Restore defines configuration of Jenkins backup restore operation</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>containerName</code></br> +<em> +string +</em> +</td> +<td> +<p>ContainerName is the container name responsible for restore backup operation</p> +</td> +</tr> +<tr> +<td> +<code>action</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Handler"> +Handler +</a> +</em> +</td> +<td> +<p>Action defines action which performs restore backup in restore container sidecar</p> +</td> +</tr> +<tr> +<td> +<code>recoveryOnce</code></br> +<em> +uint64 +</em> +</td> +<td> +<em>(Optional)</em> +<p>RecoveryOnce if want to restore specific backup set this field and then Jenkins will be restarted and desired backup will be restored</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob">SeedJob +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsSpec">JenkinsSpec</a>) +</p> +<p> +<p>SeedJob defines configuration for seed job +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines</a></p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>id</code></br> +<em> +string +</em> +</td> +<td> +<p>ID is the unique seed job name</p> +</td> +</tr> +<tr> +<td> +<code>credentialID</code></br> +<em> +string +</em> +</td> +<td> +<p>CredentialID is the Kubernetes secret name which stores repository access credentials</p> +</td> +</tr> +<tr> +<td> +<code>description</code></br> +<em> +string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Description is the description of the seed job</p> +</td> +</tr> +<tr> +<td> +<code>targets</code></br> +<em> +string +</em> +</td> +<td> +<p>Targets is the repository path where are seed job definitions</p> +</td> +</tr> +<tr> +<td> +<code>repositoryBranch</code></br> +<em> +string +</em> +</td> +<td> +<p>RepositoryBranch is the repository branch where are seed job definitions</p> +</td> +</tr> +<tr> +<td> +<code>repositoryUrl</code></br> +<em> +string +</em> +</td> +<td> +<p>RepositoryURL is the repository access URL. Can be SSH or HTTPS.</p> +</td> +</tr> +<tr> +<td> +<code>credentialType</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsCredentialType"> +JenkinsCredentialType +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>JenkinsCredentialType is the <a href="https://jenkinsci.github.io/kubernetes-credentials-provider-plugin/">https://jenkinsci.github.io/kubernetes-credentials-provider-plugin/</a> credential type</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Service">Service +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsSpec">JenkinsSpec</a>) +</p> +<p> +<p>Service defines Kubernetes service attributes</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>annotations</code></br> +<em> +map[string]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Annotations is an unstructured key value map stored with a resource that may be +set by external tools to store and retrieve arbitrary metadata. They are not +queryable and should be preserved when modifying objects. +More info: <a href="http://kubernetes.io/docs/user-guide/annotations">http://kubernetes.io/docs/user-guide/annotations</a></p> +</td> +</tr> +<tr> +<td> +<code>labels</code></br> +<em> +map[string]string +</em> +</td> +<td> +<p>Route service traffic to pods with label keys and values matching this +selector. If empty or not present, the service is assumed to have an +external process managing its endpoints, which Kubernetes will not +modify. Only applies to types ClusterIP, NodePort, and LoadBalancer. +Ignored if type is ExternalName. +More info: <a href="https://kubernetes.io/docs/concepts/services-networking/service/">https://kubernetes.io/docs/concepts/services-networking/service/</a></p> +</td> +</tr> +<tr> +<td> +<code>type</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#servicetype-v1-core"> +Kubernetes core/v1.ServiceType +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Type determines how the Service is exposed. Defaults to ClusterIP. Valid +options are ExternalName, ClusterIP, NodePort, and LoadBalancer. +&ldquo;ExternalName&rdquo; maps to the specified externalName. +&ldquo;ClusterIP&rdquo; allocates a cluster-internal IP address for load-balancing to +endpoints. Endpoints are determined by the selector or if that is not +specified, by manual construction of an Endpoints object. If clusterIP is +&ldquo;None&rdquo;, no virtual IP is allocated and the endpoints are published as a +set of endpoints rather than a stable IP. +&ldquo;NodePort&rdquo; builds on ClusterIP and allocates a port on every node which +routes to the clusterIP. +&ldquo;LoadBalancer&rdquo; builds on NodePort and creates an +external load-balancer (if supported in the current cloud) which routes +to the clusterIP. +More info: <a href="https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services---service-types">https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services&mdash;service-types</a></p> +</td> +</tr> +<tr> +<td> +<code>port</code></br> +<em> +int32 +</em> +</td> +<td> +<p>The port that are exposed by this service. +More info: <a href="https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies">https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies</a></p> +</td> +</tr> +<tr> +<td> +<code>nodePort</code></br> +<em> +int32 +</em> +</td> +<td> +<em>(Optional)</em> +<p>The port on each node on which this service is exposed when type=NodePort or LoadBalancer. +Usually assigned by the system. If specified, it will be allocated to the service +if unused or else creation of the service will fail. +Default is to auto-allocate a port if the ServiceType of this Service requires one. +More info: <a href="https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport">https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport</a></p> +</td> +</tr> +<tr> +<td> +<code>loadBalancerSourceRanges</code></br> +<em> +[]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>If specified and supported by the platform, this will restrict traffic through the cloud-provider +load-balancer will be restricted to the specified client IPs. This field will be ignored if the +cloud-provider does not support the feature.&rdquo; +More info: <a href="https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/">https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/</a></p> +</td> +</tr> +<tr> +<td> +<code>loadBalancerIP</code></br> +<em> +string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Only applies to Service Type: LoadBalancer +LoadBalancer will get created with the IP specified in this field. +This feature depends on whether the underlying cloud-provider supports specifying +the loadBalancerIP when a load balancer is created. +This field will be ignored if the cloud-provider does not support the feature.</p> +</td> +</tr> +</tbody> +</table> +<hr/> +<p><em> +Generated with <code>gen-crd-api-reference-docs</code> +on git commit <code>37e531a</code>. +</em></p> + + + + + + \ No newline at end of file diff --git a/docs/docs/getting-started/v0.2.0/migration/index.html b/docs/docs/getting-started/v0.2.0/migration/index.html new file mode 100644 index 00000000..466dae42 --- /dev/null +++ b/docs/docs/getting-started/v0.2.0/migration/index.html @@ -0,0 +1,532 @@ + + + + + + + + + + + + + + + + + + + + + + +Migration from v0.1.1 | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Migration from v0.1.1 | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

Migration from v0.1.1

+
How to migrate from v0.1.1 to v0.2.0
+ + +

Added seed job agent

+ +

Now seed jobs are not built by master executors, but by dedicated agent deployed into Kubernetes. We disabled master executors for security reasons.

+ +

Apply Jenkins configuration via Groovy scripts instead of Jenkins jobs

+ +

We have removed hardcoded configuration by Jenkins jobs.

+ +

In v0.1.1 jenkins-operator configuration was stored in jenkins-operator-user-configuration-<cr_name> +If you want to use v0.2.0 or newer you must simply write refer to old ConfigMap by modifying CR, for example:

+
apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+  name: example
+spec:
+  configurationAsCode:
+    configurations: 
+    - name: jenkins-operator-user-configuration-<cr_name>
+  groovyScripts:
+    configurations:
+    - name: jenkins-operator-user-configuration-<cr_name>
+

Jenkins configuration jobs (Configure Seed Jobs, jenkins-operator-base-configuration, jenkins-operator-user-configuration) have been removed from Jenkins.

+ +

In v0.1.1 you can see if configuration failed or successfully updated in Jenkins UI (job build logs). +Now, when Jenkins configuration jobs are removed, you must use this command to see if configuration was failed.

+
$ kubectl -n logs deployment/jenkins-operator
+ + +
Last modified August 5, 2019 +
+
+ + +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/getting-started/v0.2.0/scheme/index.html b/docs/docs/getting-started/v0.2.0/scheme/index.html new file mode 100644 index 00000000..4b1c264f --- /dev/null +++ b/docs/docs/getting-started/v0.2.0/scheme/index.html @@ -0,0 +1,1944 @@ + + + + + + + + + + + + + + + + + + + + + + +Scheme | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Scheme | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

Scheme

+
API Schema definitions for Jenkins CR
+ + +
+

This document contains API scheme for jenkins-operator manifest

+ +
+ + +

Packages:

+ +

jenkins.io

+

+

Package v1alpha2 contains API Schema definitions for the jenkins.io v1alpha2 API group

+

+Resource Types: + +

Jenkins +

+

+

Jenkins is the Schema for the jenkins API

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+apiVersion
+string
+ +jenkins.io/v1alpha2 + +
+kind
+string +
Jenkins
+metadata
+ + +Kubernetes meta/v1.ObjectMeta + + +
+Refer to the Kubernetes API documentation for the fields of the +metadata field. +
+spec
+ + +JenkinsSpec + + +
+

Spec defines the desired state of the Jenkins

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+master
+ + +JenkinsMaster + + +
+

Master represents Jenkins master pod properties and Jenkins plugins. +Every single change here requires a pod restart.

+
+seedJobs
+ + +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob + + +
+(Optional) +

SeedJobs defines list of Jenkins Seed Job configurations +More info: https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines

+
+service
+ + +Service + + +
+(Optional) +

Service is Kubernetes service of Jenkins master HTTP pod +Defaults to : +port: 8080 +type: ClusterIP

+
+slaveService
+ + +Service + + +
+(Optional) +

Service is Kubernetes service of Jenkins slave pods +Defaults to : +port: 50000 +type: ClusterIP

+
+backup
+ + +Backup + + +
+(Optional) +

Backup defines configuration of Jenkins backup +More info: https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore

+
+restore
+ + +Restore + + +
+(Optional) +

Backup defines configuration of Jenkins backup restore +More info: https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore

+
+
+status
+ + +JenkinsStatus + + +
+

Status defines the observed state of Jenkins

+
+

Backup +

+

+(Appears on: +JenkinsSpec) +

+

+

Backup defines configuration of Jenkins backup

+

+ + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+containerName
+ +string + +
+

ContainerName is the container name responsible for backup operation

+
+action
+ + +Handler + + +
+

Action defines action which performs backup in backup container sidecar

+
+interval
+ +uint64 + +
+

Interval tells how often make backup in seconds +Defaults to 30.

+
+makeBackupBeforePodDeletion
+ +bool + +
+

MakeBackupBeforePodDeletion tells operator to make backup before Jenkins master pod deletion

+
+

Build +

+

+(Appears on: +JenkinsStatus) +

+

+

Build defines Jenkins Build status with corresponding metadata

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+jobName
+ +string + +
+

JobName is the Jenkins job name

+
+hash
+ +string + +
+

Hash is the unique data identifier used in build

+
+number
+ +int64 + +
+

Number is the Jenkins build number

+
+status
+ + +BuildStatus + + +
+

Status is the status of Jenkins build

+
+retries
+ +int + +
+

Retires is the amount of Jenkins job build retries

+
+createTime
+ + +Kubernetes meta/v1.Time + + +
+

CreateTime is the time when the first build has been created

+
+lastUpdateTime
+ + +Kubernetes meta/v1.Time + + +
+

LastUpdateTime is the last update status time

+
+

BuildStatus +(string alias)

+

+(Appears on: +Build) +

+

+

BuildStatus defines type of Jenkins build job status

+

+

Container +

+

+(Appears on: +JenkinsMaster) +

+

+

Container defines Kubernetes container attributes

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+name
+ +string + +
+

Name of the container specified as a DNS_LABEL. +Each container in a pod must have a unique name (DNS_LABEL).

+
+image
+ +string + +
+

Docker image name. +More info: https://kubernetes.io/docs/concepts/containers/images

+
+imagePullPolicy
+ + +Kubernetes core/v1.PullPolicy + + +
+

Image pull policy. +One of Always, Never, IfNotPresent. +Defaults to Always.

+
+resources
+ + +Kubernetes core/v1.ResourceRequirements + + +
+

Compute Resources required by this container. +More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/

+
+command
+ +[]string + +
+(Optional) +

Entrypoint array. Not executed within a shell. +The docker image’s ENTRYPOINT is used if this is not provided. +Variable references $(VAR_NAME) are expanded using the container’s environment. If a variable +cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax +can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, +regardless of whether the variable exists or not. +More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell

+
+args
+ +[]string + +
+(Optional) +

Arguments to the entrypoint. +The docker image’s CMD is used if this is not provided. +Variable references $(VAR_NAME) are expanded using the container’s environment. If a variable +cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax +can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, +regardless of whether the variable exists or not. +More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell

+
+workingDir
+ +string + +
+(Optional) +

Container’s working directory. +If not specified, the container runtime’s default will be used, which +might be configured in the container image.

+
+ports
+ + +[]Kubernetes core/v1.ContainerPort + + +
+(Optional) +

List of ports to expose from the container. Exposing a port here gives +the system additional information about the network connections a +container uses, but is primarily informational. Not specifying a port here +DOES NOT prevent that port from being exposed. Any port which is +listening on the default “0.0.0.0” address inside a container will be +accessible from the network.

+
+envFrom
+ + +[]Kubernetes core/v1.EnvFromSource + + +
+(Optional) +

List of sources to populate environment variables in the container. +The keys defined within a source must be a C_IDENTIFIER. All invalid keys +will be reported as an event when the container is starting. When a key exists in multiple +sources, the value associated with the last source will take precedence. +Values defined by an Env with a duplicate key will take precedence.

+
+env
+ + +[]Kubernetes core/v1.EnvVar + + +
+(Optional) +

List of environment variables to set in the container.

+
+volumeMounts
+ + +[]Kubernetes core/v1.VolumeMount + + +
+(Optional) +

Pod volumes to mount into the container’s filesystem.

+
+livenessProbe
+ + +Kubernetes core/v1.Probe + + +
+(Optional) +

Periodic probe of container liveness. +Container will be restarted if the probe fails.

+
+readinessProbe
+ + +Kubernetes core/v1.Probe + + +
+(Optional) +

Periodic probe of container service readiness. +Container will be removed from service endpoints if the probe fails.

+
+lifecycle
+ + +Kubernetes core/v1.Lifecycle + + +
+(Optional) +

Actions that the management system should take in response to container lifecycle events.

+
+securityContext
+ + +Kubernetes core/v1.SecurityContext + + +
+(Optional) +

Security options the pod should run with. +More info: https://kubernetes.io/docs/concepts/policy/security-context/ +More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/

+
+

Handler +

+

+(Appears on: +Backup, +Restore) +

+

+

Handler defines a specific action that should be taken

+

+ + + + + + + + + + + + + +
FieldDescription
+exec
+ + +Kubernetes core/v1.ExecAction + + +
+

Exec specifies the action to take.

+
+

JenkinsCredentialType +(string alias)

+

+(Appears on: +SeedJob) +

+

+

JenkinsCredentialType defines type of Jenkins credential used to seed job mechanism

+

+

JenkinsMaster +

+

+(Appears on: +JenkinsSpec) +

+

+

JenkinsMaster defines the Jenkins master pod attributes and plugins, +every single change requires a Jenkins master pod restart

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+masterAnnotations
+ +map[string]string + +
+(Optional) +

Annotations is an unstructured key value map stored with a resource that may be +set by external tools to store and retrieve arbitrary metadata. They are not +queryable and should be preserved when modifying objects. +More info: http://kubernetes.io/docs/user-guide/annotations

+
+nodeSelector
+ +map[string]string + +
+(Optional) +

NodeSelector is a selector which must be true for the pod to fit on a node. +Selector which must match a node’s labels for the pod to be scheduled on that node. +More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/

+
+securityContext
+ + +Kubernetes core/v1.PodSecurityContext + + +
+(Optional) +

SecurityContext that applies to all the containers of the Jenkins +Master. As per kubernetes specification, it can be overridden +for each container individually. +Defaults to: +runAsUser: 1000 +fsGroup: 1000

+
+containers
+ + +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Container + + +
+

List of containers belonging to the pod. +Containers cannot currently be added or removed. +There must be at least one container in a Pod. +Defaults to: +- image: jenkins/jenkins:lts +imagePullPolicy: Always +livenessProbe: +failureThreshold: 12 +httpGet: +path: /login +port: http +scheme: HTTP +initialDelaySeconds: 80 +periodSeconds: 10 +successThreshold: 1 +timeoutSeconds: 5 +name: jenkins-master +readinessProbe: +failureThreshold: 3 +httpGet: +path: /login +port: http +scheme: HTTP +initialDelaySeconds: 30 +periodSeconds: 10 +successThreshold: 1 +timeoutSeconds: 1 +resources: +limits: +cpu: 1500m +memory: 3Gi +requests: +cpu: “1” +memory: 600Mi

+
+volumes
+ + +[]Kubernetes core/v1.Volume + + +
+(Optional) +

List of volumes that can be mounted by containers belonging to the pod. +More info: https://kubernetes.io/docs/concepts/storage/volumes

+
+basePlugins
+ + +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin + + +
+

BasePlugins contains plugins required by operator +Defaults to : +- name: kubernetes +version: 1.15.7 +- name: workflow-job +version: “2.32” +- name: workflow-aggregator +version: “2.6” +- name: git +version: 3.10.0 +- name: job-dsl +version: “1.74” +- name: configuration-as-code +version: “1.19” +- name: configuration-as-code-support +version: “1.19” +- name: kubernetes-credentials-provider +version: 0.12.1

+
+plugins
+ + +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin + + +
+(Optional) +

Plugins contains plugins required by user

+
+

JenkinsSpec +

+

+(Appears on: +Jenkins) +

+

+

JenkinsSpec defines the desired state of the Jenkins

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+master
+ + +JenkinsMaster + + +
+

Master represents Jenkins master pod properties and Jenkins plugins. +Every single change here requires a pod restart.

+
+seedJobs
+ + +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob + + +
+(Optional) +

SeedJobs defines list of Jenkins Seed Job configurations +More info: https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines

+
+service
+ + +Service + + +
+(Optional) +

Service is Kubernetes service of Jenkins master HTTP pod +Defaults to : +port: 8080 +type: ClusterIP

+
+slaveService
+ + +Service + + +
+(Optional) +

Service is Kubernetes service of Jenkins slave pods +Defaults to : +port: 50000 +type: ClusterIP

+
+backup
+ + +Backup + + +
+(Optional) +

Backup defines configuration of Jenkins backup +More info: https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore

+
+restore
+ + +Restore + + +
+(Optional) +

Backup defines configuration of Jenkins backup restore +More info: https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore

+
+

JenkinsStatus +

+

+(Appears on: +Jenkins) +

+

+

JenkinsStatus defines the observed state of Jenkins

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+operatorVersion
+ +string + +
+(Optional) +

OperatorVersion is the operator version which manages this CR

+
+provisionStartTime
+ + +Kubernetes meta/v1.Time + + +
+(Optional) +

ProvisionStartTime is a time when Jenkins master pod has been created

+
+baseConfigurationCompletedTime
+ + +Kubernetes meta/v1.Time + + +
+(Optional) +

BaseConfigurationCompletedTime is a time when Jenkins base configuration phase has been completed

+
+userConfigurationCompletedTime
+ + +Kubernetes meta/v1.Time + + +
+(Optional) +

UserConfigurationCompletedTime is a time when Jenkins user configuration phase has been completed

+
+builds
+ + +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Build + + +
+(Optional) +

Builds contains Jenkins builds statues

+
+restoredBackup
+ +uint64 + +
+(Optional) +

RestoredBackup is the restored backup number after Jenkins master pod restart

+
+lastBackup
+ +uint64 + +
+(Optional) +

LastBackup is the latest backup number

+
+pendingBackup
+ +uint64 + +
+(Optional) +

PendingBackup is the pending backup number

+
+backupDoneBeforePodDeletion
+ +bool + +
+(Optional) +

BackupDoneBeforePodDeletion tells if backup before pod deletion has been made

+
+userAndPasswordHash
+ +string + +
+(Optional) +

UserAndPasswordHash is a SHA256 hash made from user and password

+
+createdSeedJobs
+ +[]string + +
+(Optional) +

CreatedSeedJobs contains list of seed job id already created in Jenkins

+
+

Plugin +

+

+(Appears on: +JenkinsMaster) +

+

+

Plugin defines Jenkins plugin

+

+ + + + + + + + + + + + + + + + + +
FieldDescription
+name
+ +string + +
+

Name is the name of Jenkins plugin

+
+version
+ +string + +
+

Version is the version of Jenkins plugin

+
+

Restore +

+

+(Appears on: +JenkinsSpec) +

+

+

Restore defines configuration of Jenkins backup restore operation

+

+ + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+containerName
+ +string + +
+

ContainerName is the container name responsible for restore backup operation

+
+action
+ + +Handler + + +
+

Action defines action which performs restore backup in restore container sidecar

+
+recoveryOnce
+ +uint64 + +
+(Optional) +

RecoveryOnce if want to restore specific backup set this field and then Jenkins will be restarted and desired backup will be restored

+
+

SeedJob +

+

+(Appears on: +JenkinsSpec) +

+

+

SeedJob defines configuration for seed job +More info: https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+id
+ +string + +
+

ID is the unique seed job name

+
+credentialID
+ +string + +
+

CredentialID is the Kubernetes secret name which stores repository access credentials

+
+description
+ +string + +
+(Optional) +

Description is the description of the seed job

+
+targets
+ +string + +
+

Targets is the repository path where are seed job definitions

+
+repositoryBranch
+ +string + +
+

RepositoryBranch is the repository branch where are seed job definitions

+
+repositoryUrl
+ +string + +
+

RepositoryURL is the repository access URL. Can be SSH or HTTPS.

+
+credentialType
+ + +JenkinsCredentialType + + +
+(Optional) +

JenkinsCredentialType is the https://jenkinsci.github.io/kubernetes-credentials-provider-plugin/ credential type

+
+

Service +

+

+(Appears on: +JenkinsSpec) +

+

+

Service defines Kubernetes service attributes

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+annotations
+ +map[string]string + +
+(Optional) +

Annotations is an unstructured key value map stored with a resource that may be +set by external tools to store and retrieve arbitrary metadata. They are not +queryable and should be preserved when modifying objects. +More info: http://kubernetes.io/docs/user-guide/annotations

+
+labels
+ +map[string]string + +
+

Route service traffic to pods with label keys and values matching this +selector. If empty or not present, the service is assumed to have an +external process managing its endpoints, which Kubernetes will not +modify. Only applies to types ClusterIP, NodePort, and LoadBalancer. +Ignored if type is ExternalName. +More info: https://kubernetes.io/docs/concepts/services-networking/service/

+
+type
+ + +Kubernetes core/v1.ServiceType + + +
+(Optional) +

Type determines how the Service is exposed. Defaults to ClusterIP. Valid +options are ExternalName, ClusterIP, NodePort, and LoadBalancer. +“ExternalName” maps to the specified externalName. +“ClusterIP” allocates a cluster-internal IP address for load-balancing to +endpoints. Endpoints are determined by the selector or if that is not +specified, by manual construction of an Endpoints object. If clusterIP is +“None”, no virtual IP is allocated and the endpoints are published as a +set of endpoints rather than a stable IP. +“NodePort” builds on ClusterIP and allocates a port on every node which +routes to the clusterIP. +“LoadBalancer” builds on NodePort and creates an +external load-balancer (if supported in the current cloud) which routes +to the clusterIP. +More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services—service-types

+
+port
+ +int32 + +
+

The port that are exposed by this service. +More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies

+
+nodePort
+ +int32 + +
+(Optional) +

The port on each node on which this service is exposed when type=NodePort or LoadBalancer. +Usually assigned by the system. If specified, it will be allocated to the service +if unused or else creation of the service will fail. +Default is to auto-allocate a port if the ServiceType of this Service requires one. +More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport

+
+loadBalancerSourceRanges
+ +[]string + +
+(Optional) +

If specified and supported by the platform, this will restrict traffic through the cloud-provider +load-balancer will be restricted to the specified client IPs. This field will be ignored if the +cloud-provider does not support the feature.” +More info: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/

+
+loadBalancerIP
+ +string + +
+(Optional) +

Only applies to Service Type: LoadBalancer +LoadBalancer will get created with the IP specified in this field. +This feature depends on whether the underlying cloud-provider supports specifying +the loadBalancerIP when a load balancer is created. +This field will be ignored if the cloud-provider does not support the feature.

+
+
+

+Generated with gen-crd-api-reference-docs +on git commit 37e531a. +

+ + + +
Last modified August 5, 2019 +
+
+ + +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/how-it-works/architecture-and-design/index.html b/docs/docs/how-it-works/architecture-and-design/index.html new file mode 100644 index 00000000..8089158c --- /dev/null +++ b/docs/docs/how-it-works/architecture-and-design/index.html @@ -0,0 +1,521 @@ + + + + + + + + + + + + + + + + + + + + + + +Architecture and design | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Architecture and design | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

Architecture and design

+
Jenkins Operator fundamentals
+ + +

The jenkins-operator design incorporates the following concepts: +- watches any changes of manifests and maintain the desired state according to deployed custom resource manifest +- implements the main reconciliation loop which consists of two smaller reconciliation loops - base and user

+ +

reconcile

+ +

Base reconciliation loop takes care of reconciling base Jenkins configuration, which consists of: +- Ensure Manifests - monitors any changes in manifests +- Ensure Jenkins Pod - creates and verifies status of Jenkins master Pod +- Ensure Jenkins Configuration - configures Jenkins instance including hardening, initial configuration for plugins, etc. +- Ensure Jenkins API token - generates Jenkins API token and initialized Jenkins client

+ +

User reconciliation loop takes care of reconciling user provided configuration, which consists of: +- Ensure Restore Job - creates Restore job and ensures that restore has been successfully performed
+- Ensure Seed Jobs - creates Seed Jobs and ensures that all of them have been successfully executed +- Ensure User Configuration - executed user provided configuration, like groovy scripts, configuration as code or plugins +- Ensure Backup Job - creates Backup job and ensures that backup has been successfully performed

+ +

reconcile

+ +

Operator State

+ +

Operator state is kept in custom resource status section, which is used for storing any configuration events or job statuses managed by the operator. +It helps to maintain or recover desired state even after operator or Jenkins restarts.

+ + + +
Last modified August 5, 2019 +
+
+ + +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/how-it-works/index.html b/docs/docs/how-it-works/index.html new file mode 100644 index 00000000..1b1a302f --- /dev/null +++ b/docs/docs/how-it-works/index.html @@ -0,0 +1,564 @@ + + + + + + + + + + + + + + + + + + + + + + + +How it works | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + How it works | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

How it works

+
How Jenkins Operator works
+ + +
+

This document describes a high level overview how jenkins-operator works.

+ +
+ + +
+ + + + +
+ + +
+
+ Architecture and design +
+

Jenkins Operator fundamentals +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ Jenkins Docker Images +
+

Jenkins default image details +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Last modified August 5, 2019 +
+
+ +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/how-it-works/index.xml b/docs/docs/how-it-works/index.xml new file mode 100644 index 00000000..8ac09699 --- /dev/null +++ b/docs/docs/how-it-works/index.xml @@ -0,0 +1,77 @@ + + + Jenkins Operator – How it works + /docs/how-it-works/ + Recent Hugo news from gohugo.io + Hugo -- gohugo.io + Mon, 05 Aug 2019 00:00:00 +0000 + + /img/hugo.png + GoHugo.io + /docs/how-it-works/ + + + + + + + + + + + + Docs: Architecture and design + /docs/how-it-works/architecture-and-design/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/how-it-works/architecture-and-design/ + + + + + +<p>The <strong>jenkins-operator</strong> design incorporates the following concepts: +- watches any changes of manifests and maintain the desired state according to deployed custom resource manifest +- implements the main reconciliation loop which consists of two smaller reconciliation loops - base and user</p> + +<p><img src="/img/reconcile.png" alt="reconcile" /></p> + +<p><strong>Base</strong> reconciliation loop takes care of reconciling base Jenkins configuration, which consists of: +- Ensure Manifests - monitors any changes in manifests +- Ensure Jenkins Pod - creates and verifies status of Jenkins master Pod +- Ensure Jenkins Configuration - configures Jenkins instance including hardening, initial configuration for plugins, etc. +- Ensure Jenkins API token - generates Jenkins API token and initialized Jenkins client</p> + +<p><strong>User</strong> reconciliation loop takes care of reconciling user provided configuration, which consists of: +- Ensure Restore Job - creates Restore job and ensures that restore has been successfully performed<br /> +- Ensure Seed Jobs - creates Seed Jobs and ensures that all of them have been successfully executed +- Ensure User Configuration - executed user provided configuration, like groovy scripts, configuration as code or plugins +- Ensure Backup Job - creates Backup job and ensures that backup has been successfully performed</p> + +<p><img src="/img/phases.png" alt="reconcile" /></p> + +<h2 id="operator-state">Operator State</h2> + +<p>Operator state is kept in custom resource status section, which is used for storing any configuration events or job statuses managed by the operator. +It helps to maintain or recover desired state even after operator or Jenkins restarts.</p> + + + + + + Docs: Jenkins Docker Images + /docs/how-it-works/jenkins-docker-images/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/how-it-works/jenkins-docker-images/ + + + + <p><strong>jenkins-operator</strong> is fully compatible with <strong>jenkins:lts</strong> docker image and does not introduce any hidden changes there. +If needed, the docker image can easily be changed in custom resource manifest as long as it supports standard Jenkins file system structure.</p> + + + + + + \ No newline at end of file diff --git a/docs/docs/how-it-works/jenkins-docker-images/index.html b/docs/docs/how-it-works/jenkins-docker-images/index.html new file mode 100644 index 00000000..b1bebf7b --- /dev/null +++ b/docs/docs/how-it-works/jenkins-docker-images/index.html @@ -0,0 +1,497 @@ + + + + + + + + + + + + + + + + + + + + + + +Jenkins Docker Images | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Jenkins Docker Images | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

Jenkins Docker Images

+
Jenkins default image details
+

jenkins-operator is fully compatible with jenkins:lts docker image and does not introduce any hidden changes there. +If needed, the docker image can easily be changed in custom resource manifest as long as it supports standard Jenkins file system structure.

+ + + +
Last modified August 5, 2019 +
+
+ + +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/index.html b/docs/docs/index.html new file mode 100644 index 00000000..9c399ed1 --- /dev/null +++ b/docs/docs/index.html @@ -0,0 +1,575 @@ + + + + + + + + + + + + + + + + + + + + + + + +Documentation | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + Documentation | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

Documentation

+ + + +
+

This project was originally developed by VirtusLab and the following CONTRIBUTORS.

+ +
+ + +
+ + + + +
+ + + + + + + + +
+
+ Installation +
+

How to install Jenkins Operator +

+
+ + + + + + + + + + + +
+
+ How it works +
+

How Jenkins Operator works +

+
+ + + + + + + + + + + +
+
+ Getting Started +
+

How to work with jenkins-operator +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ Security +
+

Jenkins security and hardening out of the box +

+
+ + + +
+
+ Developer Guide +
+

Jenkins Operator for developers +

+
+ + + +
+ + + +
Last modified September 3, 2019 +
+
+ +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/index.xml b/docs/docs/index.xml new file mode 100644 index 00000000..ed1ede6e --- /dev/null +++ b/docs/docs/index.xml @@ -0,0 +1,4633 @@ + + + Jenkins Operator – Documentation + /docs/ + Recent Hugo news from gohugo.io + Hugo -- gohugo.io + Tue, 03 Sep 2019 00:00:00 +0000 + + /img/hugo.png + GoHugo.io + /docs/ + + + + + + + + + + + + Docs: Architecture and design + /docs/how-it-works/architecture-and-design/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/how-it-works/architecture-and-design/ + + + + + +<p>The <strong>jenkins-operator</strong> design incorporates the following concepts: +- watches any changes of manifests and maintain the desired state according to deployed custom resource manifest +- implements the main reconciliation loop which consists of two smaller reconciliation loops - base and user</p> + +<p><img src="/img/reconcile.png" alt="reconcile" /></p> + +<p><strong>Base</strong> reconciliation loop takes care of reconciling base Jenkins configuration, which consists of: +- Ensure Manifests - monitors any changes in manifests +- Ensure Jenkins Pod - creates and verifies status of Jenkins master Pod +- Ensure Jenkins Configuration - configures Jenkins instance including hardening, initial configuration for plugins, etc. +- Ensure Jenkins API token - generates Jenkins API token and initialized Jenkins client</p> + +<p><strong>User</strong> reconciliation loop takes care of reconciling user provided configuration, which consists of: +- Ensure Restore Job - creates Restore job and ensures that restore has been successfully performed<br /> +- Ensure Seed Jobs - creates Seed Jobs and ensures that all of them have been successfully executed +- Ensure User Configuration - executed user provided configuration, like groovy scripts, configuration as code or plugins +- Ensure Backup Job - creates Backup job and ensures that backup has been successfully performed</p> + +<p><img src="/img/phases.png" alt="reconcile" /></p> + +<h2 id="operator-state">Operator State</h2> + +<p>Operator state is kept in custom resource status section, which is used for storing any configuration events or job statuses managed by the operator. +It helps to maintain or recover desired state even after operator or Jenkins restarts.</p> + + + + + + Docs: Deploy Jenkins + /docs/getting-started/v0.1.1/deploy-jenkins/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.1.1/deploy-jenkins/ + + + + + +<h2 id="deploy-jenkins">Deploy Jenkins</h2> + +<p>Once jenkins-operator is up and running let&rsquo;s deploy actual Jenkins instance. +Create manifest ie. <strong>jenkins_instance.yaml</strong> with following data and save it on drive.</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">apiVersion: jenkins.io/v1alpha2 +kind: Jenkins +metadata: + name: example +spec: + master: + containers: + - name: jenkins-master + image: jenkins/jenkins:lts + imagePullPolicy: Always + livenessProbe: + failureThreshold: <span style="color:#0000cf;font-weight:bold">12</span> + httpGet: + path: /login + port: http + scheme: HTTP + initialDelaySeconds: <span style="color:#0000cf;font-weight:bold">80</span> + periodSeconds: <span style="color:#0000cf;font-weight:bold">10</span> + successThreshold: <span style="color:#0000cf;font-weight:bold">1</span> + timeoutSeconds: <span style="color:#0000cf;font-weight:bold">5</span> + readinessProbe: + failureThreshold: <span style="color:#0000cf;font-weight:bold">3</span> + httpGet: + path: /login + port: http + scheme: HTTP + initialDelaySeconds: <span style="color:#0000cf;font-weight:bold">30</span> + periodSeconds: <span style="color:#0000cf;font-weight:bold">10</span> + successThreshold: <span style="color:#0000cf;font-weight:bold">1</span> + timeoutSeconds: <span style="color:#0000cf;font-weight:bold">1</span> + resources: + limits: + cpu: 1500m + memory: 3Gi + requests: + cpu: <span style="color:#4e9a06">&#34;1&#34;</span> + memory: 500Mi + seedJobs: + - id: jenkins-operator + targets: <span style="color:#4e9a06">&#34;cicd/jobs/*.jenkins&#34;</span> + description: <span style="color:#4e9a06">&#34;Jenkins Operator repository&#34;</span> + repositoryBranch: master + repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git</code></pre></div> +<p>Deploy Jenkins to K8s:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl create -f jenkins_instance.yaml</code></pre></div> +<p>Watch Jenkins instance being created:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl get pods -w</code></pre></div> +<p>Get Jenkins credentials:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl get secret jenkins-operator-credentials-&lt;cr_name&gt; -o <span style="color:#4e9a06">&#39;jsonpath={.data.user}&#39;</span> <span style="color:#000;font-weight:bold">|</span> base64 -d +kubectl get secret jenkins-operator-credentials-&lt;cr_name&gt; -o <span style="color:#4e9a06">&#39;jsonpath={.data.password}&#39;</span> <span style="color:#000;font-weight:bold">|</span> base64 -d</code></pre></div> +<p>Connect to Jenkins (minikube):</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">minikube service jenkins-operator-http-&lt;cr_name&gt; --url</code></pre></div> +<p>Connect to Jenkins (actual Kubernetes cluster):</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl port-forward jenkins-&lt;cr_name&gt; <span style="color:#0000cf;font-weight:bold">8080</span>:8080</code></pre></div> +<p>Then open browser with address <code>http://localhost:8080</code>. +<img src="/img/jenkins.png" alt="jenkins" /></p> + + + + + + Docs: Deploy Jenkins + /docs/getting-started/v0.2.0/deploy-jenkins/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.2.0/deploy-jenkins/ + + + + <p>Once jenkins-operator is up and running let&rsquo;s deploy actual Jenkins instance. +Create manifest ie. <strong>jenkins_instance.yaml</strong> with following data and save it on drive.</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">apiVersion: jenkins.io/v1alpha2 +kind: Jenkins +metadata: + name: example +spec: + master: + containers: + - name: jenkins-master + image: jenkins/jenkins:lts + imagePullPolicy: Always + livenessProbe: + failureThreshold: <span style="color:#0000cf;font-weight:bold">12</span> + httpGet: + path: /login + port: http + scheme: HTTP + initialDelaySeconds: <span style="color:#0000cf;font-weight:bold">80</span> + periodSeconds: <span style="color:#0000cf;font-weight:bold">10</span> + successThreshold: <span style="color:#0000cf;font-weight:bold">1</span> + timeoutSeconds: <span style="color:#0000cf;font-weight:bold">5</span> + readinessProbe: + failureThreshold: <span style="color:#0000cf;font-weight:bold">3</span> + httpGet: + path: /login + port: http + scheme: HTTP + initialDelaySeconds: <span style="color:#0000cf;font-weight:bold">30</span> + periodSeconds: <span style="color:#0000cf;font-weight:bold">10</span> + successThreshold: <span style="color:#0000cf;font-weight:bold">1</span> + timeoutSeconds: <span style="color:#0000cf;font-weight:bold">1</span> + resources: + limits: + cpu: 1500m + memory: 3Gi + requests: + cpu: <span style="color:#4e9a06">&#34;1&#34;</span> + memory: 500Mi + seedJobs: + - id: jenkins-operator + targets: <span style="color:#4e9a06">&#34;cicd/jobs/*.jenkins&#34;</span> + description: <span style="color:#4e9a06">&#34;Jenkins Operator repository&#34;</span> + repositoryBranch: master + repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git</code></pre></div> +<p>Deploy Jenkins to K8s:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl create -f jenkins_instance.yaml</code></pre></div> +<p>Watch Jenkins instance being created:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl get pods -w</code></pre></div> +<p>Get Jenkins credentials:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl get secret jenkins-operator-credentials-&lt;cr_name&gt; -o <span style="color:#4e9a06">&#39;jsonpath={.data.user}&#39;</span> <span style="color:#000;font-weight:bold">|</span> base64 -d +kubectl get secret jenkins-operator-credentials-&lt;cr_name&gt; -o <span style="color:#4e9a06">&#39;jsonpath={.data.password}&#39;</span> <span style="color:#000;font-weight:bold">|</span> base64 -d</code></pre></div> +<p>Connect to Jenkins (minikube):</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">minikube service jenkins-operator-http-&lt;cr_name&gt; --url</code></pre></div> +<p>Connect to Jenkins (actual Kubernetes cluster):</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl port-forward jenkins-&lt;cr_name&gt; <span style="color:#0000cf;font-weight:bold">8080</span>:8080</code></pre></div> +<p>Then open browser with address <code>http://localhost:8080</code>. +<img src="/img/jenkins.png" alt="jenkins" /></p> + + + + + + Docs: Configuration + /docs/getting-started/v0.1.1/configuration/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.1.1/configuration/ + + + + + +<p>Jenkins operator uses <a href="https://github.com/jenkinsci/job-dsl-plugin" target="_blank">job-dsl</a> and <a href="https://jenkinsci.github.io/kubernetes-credentials-provider-plugin/" target="_blank">kubernetes-credentials-provider</a> plugins for configuring jobs +and deploy keys.</p> + +<h2 id="prepare-job-definitions-and-pipelines">Prepare job definitions and pipelines</h2> + +<p>First you have to prepare pipelines and job definition in your GitHub repository using the following structure:</p> + +<pre><code>cicd/ +├── jobs +│   └── build.jenkins +└── pipelines + └── build.jenkins +</code></pre> + +<p><strong>cicd/jobs/build.jenkins</strong> it&rsquo;s a job definition:</p> + +<pre><code>#!/usr/bin/env groovy + +pipelineJob('build-jenkins-operator') { + displayName('Build jenkins-operator') + + definition { + cpsScm { + scm { + git { + remote { + url('https://github.com/jenkinsci/kubernetes-operator.git') + credentials('jenkins-operator') + } + branches('*/master') + } + } + scriptPath('cicd/pipelines/build.jenkins') + } + } +} +</code></pre> + +<p><strong>cicd/jobs/build.jenkins</strong> it&rsquo;s an actual Jenkins pipeline:</p> + +<pre><code>#!/usr/bin/env groovy + +def label = &quot;build-jenkins-operator-${UUID.randomUUID().toString()}&quot; +def home = &quot;/home/jenkins&quot; +def workspace = &quot;${home}/workspace/build-jenkins-operator&quot; +def workdir = &quot;${workspace}/src/github.com/jenkinsci/kubernetes-operator/&quot; + +podTemplate(label: label, + containers: [ + containerTemplate(name: 'jnlp', image: 'jenkins/jnlp-slave:alpine'), + containerTemplate(name: 'go', image: 'golang:1-alpine', command: 'cat', ttyEnabled: true), + ], + envVars: [ + envVar(key: 'GOPATH', value: workspace), + ], + ) { + + node(label) { + dir(workdir) { + stage('Init') { + timeout(time: 3, unit: 'MINUTES') { + checkout scm + } + container('go') { + sh 'apk --no-cache --update add make git gcc libc-dev' + } + } + + stage('Dep') { + container('go') { + sh 'make dep' + } + } + + stage('Test') { + container('go') { + sh 'make test' + } + } + + stage('Build') { + container('go') { + sh 'make build' + } + } + } + } +} +</code></pre> + +<h2 id="configure-seed-jobs">Configure Seed Jobs</h2> + +<p>Jenkins Seed Jobs are configured using <code>Jenkins.spec.seedJobs</code> section from your custom resource manifest:</p> + +<pre><code>apiVersion: jenkins.io/v1alpha2 +kind: Jenkins +metadata: + name: example +spec: + seedJobs: + - id: jenkins-operator + targets: &quot;cicd/jobs/*.jenkins&quot; + description: &quot;Jenkins Operator repository&quot; + repositoryBranch: master + repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git +</code></pre> + +<p><strong>jenkins-operator</strong> will automatically discover and configure all seed jobs.</p> + +<p>You can verify if deploy keys were successfully configured in Jenkins <strong>Credentials</strong> tab.</p> + +<p><img src="/img/jenkins-credentials.png" alt="jenkins" /></p> + +<p>You can verify if your pipelines were successfully configured in Jenkins Seed Job console output.</p> + +<p><img src="/img/jenkins-seed.png" alt="jenkins" /></p> + +<p>If your GitHub repository is <strong>private</strong> you have to configure SSH or username/password authentication.</p> + +<h3 id="ssh-authentication">SSH authentication</h3> + +<h4 id="generate-ssh-keys">Generate SSH Keys</h4> + +<p>There are two methods of SSH private key generation:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ openssl genrsa -out &lt;filename&gt; <span style="color:#0000cf;font-weight:bold">2048</span></code></pre></div> +<p>or</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ ssh-keygen -t rsa -b <span style="color:#0000cf;font-weight:bold">2048</span> +$ ssh-keygen -p -f &lt;filename&gt; -m pem</code></pre></div> +<p>Then copy content from generated file.</p> + +<h4 id="public-key">Public key</h4> + +<p>If you want to upload your public key to your Git server you need to extract it.</p> + +<p>If key was generated by <code>openssl</code> then you need to type this to extract public key:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ openssl rsa -in &lt;filename&gt; -pubout &gt; &lt;filename&gt;.pub</code></pre></div> +<p>If key was generated by <code>ssh-keygen</code> the public key content is located in <filename>.pub and there is no need to extract public key</p> + +<h4 id="configure-ssh-authentication">Configure SSH authentication</h4> + +<p>Configure seed job like:</p> + +<pre><code>apiVersion: jenkins.io/v1alpha2 +kind: Jenkins +metadata: + name: example +spec: + seedJobs: + - id: jenkins-operator-ssh + credentialType: basicSSHUserPrivateKey + credentialID: k8s-ssh + targets: &quot;cicd/jobs/*.jenkins&quot; + description: &quot;Jenkins Operator repository&quot; + repositoryBranch: master + repositoryUrl: git@github.com:jenkinsci/kubernetes-operator.git +</code></pre> + +<p>and create Kubernetes Secret(name of secret should be the same from <code>credentialID</code> field):</p> + +<pre><code>apiVersion: v1 +kind: Secret +metadata: + name: k8s-ssh +stringData: + privateKey: | + -----BEGIN RSA PRIVATE KEY----- + MIIJKAIBAAKCAgEAxxDpleJjMCN5nusfW/AtBAZhx8UVVlhhhIKXvQ+dFODQIdzO + oDXybs1zVHWOj31zqbbJnsfsVZ9Uf3p9k6xpJ3WFY9b85WasqTDN1xmSd6swD4N8 + ... + username: github_user_name +</code></pre> + +<h3 id="username-password-authentication">Username &amp; password authentication</h3> + +<p>Configure seed job like:</p> + +<pre><code>apiVersion: jenkins.io/v1alpha2 +kind: Jenkins +metadata: + name: example +spec: + seedJobs: + - id: jenkins-operator-user-pass + credentialType: usernamePassword + credentialID: k8s-user-pass + targets: &quot;cicd/jobs/*.jenkins&quot; + description: &quot;Jenkins Operator repository&quot; + repositoryBranch: master + repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git +</code></pre> + +<p>and create Kubernetes Secret(name of secret should be the same from <code>credentialID</code> field):</p> + +<pre><code>apiVersion: v1 +kind: Secret +metadata: + name: k8s-user-pass +stringData: + username: github_user_name + password: password_or_token +</code></pre> + +<h2 id="jenkins-login-credentials">Jenkins login credentials</h2> + +<p>The operator automatically generate Jenkins user name and password and stores it in Kubernetes secret named +<code>jenkins-operator-credentials-&lt;cr_name&gt;</code> in namespace where Jenkins CR has been deployed.</p> + +<p>If you want change it you can override the secret:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>v1<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Secret<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-operator-credentials-&lt;cr-name<span style="color:#8f5902;font-style:italic">&gt; +</span><span style="color:#8f5902;font-style:italic"> namespace: &lt;namespace&gt;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>data<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>user<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>&lt;base64-encoded-new-username<span style="color:#8f5902;font-style:italic">&gt; +</span><span style="color:#8f5902;font-style:italic"> password: &lt;base64-encoded-new-password&gt;</span></code></pre></div> +<p>If needed <strong>jenkins-operator</strong> will restart Jenkins master pod and then you can login with the new user and password +credentials.</p> + +<h2 id="override-default-jenkins-container-command">Override default Jenkins container command</h2> + +<p>The default command for the Jenkins master container <code>jenkins/jenkins:lts</code> looks like:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">command<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>bash<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>-c<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>/var/jenkins/scripts/init.sh<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic">&amp;&amp;</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/sbin/tini<span style="color:#f8f8f8;text-decoration:underline"> </span>-s<span style="color:#f8f8f8;text-decoration:underline"> </span>--<span style="color:#f8f8f8;text-decoration:underline"> </span>/usr/local/bin/jenkins.sh</code></pre></div> +<p>The script<code>/var/jenkins/scripts/init.sh</code> is provided be the operator and configures init.groovy.d(creates Jenkins user) +and installs plugins. +The <code>/sbin/tini -s -- /usr/local/bin/jenkins.sh</code> command runs the Jenkins master main process.</p> + +<p>You can overwrite it in the following pattern:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">command<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>bash<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>-c<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>/var/jenkins/scripts/init.sh<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic">&amp;&amp;</span><span style="color:#f8f8f8;text-decoration:underline"> </span>&lt;custom-code-here&gt;<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic">&amp;&amp;</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/sbin/tini<span style="color:#f8f8f8;text-decoration:underline"> </span>-s<span style="color:#f8f8f8;text-decoration:underline"> </span>--<span style="color:#f8f8f8;text-decoration:underline"> </span>/usr/local/bin/jenkins.sh</code></pre></div> + + + + + Docs: Configuration + /docs/getting-started/v0.2.0/configuration/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.2.0/configuration/ + + + + + +<h2 id="configure-seed-jobs-and-pipelines">Configure Seed Jobs and Pipelines</h2> + +<p>Jenkins operator uses <a href="https://github.com/jenkinsci/job-dsl-plugin" target="_blank">job-dsl</a> and <a href="https://jenkinsci.github.io/kubernetes-credentials-provider-plugin/" target="_blank">kubernetes-credentials-provider</a> plugins for configuring jobs +and deploy keys.</p> + +<h2 id="prepare-job-definitions-and-pipelines">Prepare job definitions and pipelines</h2> + +<p>First you have to prepare pipelines and job definition in your GitHub repository using the following structure:</p> + +<pre><code>cicd/ +├── jobs +│   └── build.jenkins +└── pipelines + └── build.jenkins +</code></pre> + +<p><strong>cicd/jobs/build.jenkins</strong> it&rsquo;s a job definition:</p> + +<pre><code>#!/usr/bin/env groovy + +pipelineJob('build-jenkins-operator') { + displayName('Build jenkins-operator') + + definition { + cpsScm { + scm { + git { + remote { + url('https://github.com/jenkinsci/kubernetes-operator.git') + credentials('jenkins-operator') + } + branches('*/master') + } + } + scriptPath('cicd/pipelines/build.jenkins') + } + } +} +</code></pre> + +<p><strong>cicd/jobs/build.jenkins</strong> it&rsquo;s an actual Jenkins pipeline:</p> + +<pre><code>#!/usr/bin/env groovy + +def label = &quot;build-jenkins-operator-${UUID.randomUUID().toString()}&quot; +def home = &quot;/home/jenkins&quot; +def workspace = &quot;${home}/workspace/build-jenkins-operator&quot; +def workdir = &quot;${workspace}/src/github.com/jenkinsci/kubernetes-operator/&quot; + +podTemplate(label: label, + containers: [ + containerTemplate(name: 'jnlp', image: 'jenkins/jnlp-slave:alpine'), + containerTemplate(name: 'go', image: 'golang:1-alpine', command: 'cat', ttyEnabled: true), + ], + envVars: [ + envVar(key: 'GOPATH', value: workspace), + ], + ) { + + node(label) { + dir(workdir) { + stage('Init') { + timeout(time: 3, unit: 'MINUTES') { + checkout scm + } + container('go') { + sh 'apk --no-cache --update add make git gcc libc-dev' + } + } + + stage('Dep') { + container('go') { + sh 'make dep' + } + } + + stage('Test') { + container('go') { + sh 'make test' + } + } + + stage('Build') { + container('go') { + sh 'make build' + } + } + } + } +} +</code></pre> + +<h2 id="configure-seed-jobs">Configure Seed Jobs</h2> + +<p>Jenkins Seed Jobs are configured using <code>Jenkins.spec.seedJobs</code> section from your custom resource manifest:</p> + +<pre><code>apiVersion: jenkins.io/v1alpha2 +kind: Jenkins +metadata: + name: example +spec: + seedJobs: + - id: jenkins-operator + targets: &quot;cicd/jobs/*.jenkins&quot; + description: &quot;Jenkins Operator repository&quot; + repositoryBranch: master + repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git +</code></pre> + +<p><strong>jenkins-operator</strong> will automatically discover and configure all seed jobs.</p> + +<p>You can verify if deploy keys were successfully configured in Jenkins <strong>Credentials</strong> tab.</p> + +<p><img src="/img/jenkins-credentials.png" alt="jenkins" /></p> + +<p>You can verify if your pipelines were successfully configured in Jenkins Seed Job console output.</p> + +<p><img src="/img/jenkins-seed.png" alt="jenkins" /></p> + +<p>If your GitHub repository is <strong>private</strong> you have to configure SSH or username/password authentication.</p> + +<h3 id="ssh-authentication">SSH authentication</h3> + +<h4 id="generate-ssh-keys">Generate SSH Keys</h4> + +<p>There are two methods of SSH private key generation:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ openssl genrsa -out &lt;filename&gt; <span style="color:#0000cf;font-weight:bold">2048</span></code></pre></div> +<p>or</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ ssh-keygen -t rsa -b <span style="color:#0000cf;font-weight:bold">2048</span> +$ ssh-keygen -p -f &lt;filename&gt; -m pem</code></pre></div> +<p>Then copy content from generated file.</p> + +<h4 id="public-key">Public key</h4> + +<p>If you want to upload your public key to your Git server you need to extract it.</p> + +<p>If key was generated by <code>openssl</code> then you need to type this to extract public key:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ openssl rsa -in &lt;filename&gt; -pubout &gt; &lt;filename&gt;.pub</code></pre></div> +<p>If key was generated by <code>ssh-keygen</code> the public key content is located in <filename>.pub and there is no need to extract public key</p> + +<h4 id="configure-ssh-authentication">Configure SSH authentication</h4> + +<p>Configure seed job like:</p> + +<pre><code>apiVersion: jenkins.io/v1alpha2 +kind: Jenkins +metadata: + name: example +spec: + seedJobs: + - id: jenkins-operator-ssh + credentialType: basicSSHUserPrivateKey + credentialID: k8s-ssh + targets: &quot;cicd/jobs/*.jenkins&quot; + description: &quot;Jenkins Operator repository&quot; + repositoryBranch: master + repositoryUrl: git@github.com:jenkinsci/kubernetes-operator.git +</code></pre> + +<p>and create Kubernetes Secret(name of secret should be the same from <code>credentialID</code> field):</p> + +<pre><code>apiVersion: v1 +kind: Secret +metadata: + name: k8s-ssh +stringData: + privateKey: | + -----BEGIN RSA PRIVATE KEY----- + MIIJKAIBAAKCAgEAxxDpleJjMCN5nusfW/AtBAZhx8UVVlhhhIKXvQ+dFODQIdzO + oDXybs1zVHWOj31zqbbJnsfsVZ9Uf3p9k6xpJ3WFY9b85WasqTDN1xmSd6swD4N8 + ... + username: github_user_name +</code></pre> + +<h3 id="username-password-authentication">Username &amp; password authentication</h3> + +<p>Configure seed job like:</p> + +<pre><code>apiVersion: jenkins.io/v1alpha2 +kind: Jenkins +metadata: + name: example +spec: + seedJobs: + - id: jenkins-operator-user-pass + credentialType: usernamePassword + credentialID: k8s-user-pass + targets: &quot;cicd/jobs/*.jenkins&quot; + description: &quot;Jenkins Operator repository&quot; + repositoryBranch: master + repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git +</code></pre> + +<p>and create Kubernetes Secret(name of secret should be the same from <code>credentialID</code> field):</p> + +<pre><code>apiVersion: v1 +kind: Secret +metadata: + name: k8s-user-pass +stringData: + username: github_user_name + password: password_or_token +</code></pre> + +<h2 id="pulling-docker-images-from-private-repositories">Pulling Docker images from private repositories</h2> + +<p>To pull Docker Image from private repository you can use <code>imagePullSecrets</code>.</p> + +<p>Please follow the instructions on <a href="https://kubernetes.io/docs/concepts/containers/images/?origin_team=T42NTAGHM#creating-a-secret-with-a-docker-config" target="_blank">creating a secret with a docker config</a>.</p> + +<h3 id="docker-hub-configuration">Docker Hub Configuration</h3> + +<p>To use Docker Hub additional steps are required.</p> + +<p>Edit the previously created secret:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl -n &lt;namespace&gt; edit secret &lt;name&gt;</code></pre></div> +<p>The <code>.dockerconfigjson</code> key&rsquo;s value needs to be replaced with a modified version.</p> + +<p>After modifications it needs to be encoded as Base64 value before setting the <code>.dockerconfigjson</code> key:q.</p> + +<p>Example config file to modify and use:</p> + +<pre><code>{ + &quot;auths&quot;:{ + &quot;https://index.docker.io/v1/&quot;:{ + &quot;username&quot;:&quot;user&quot;, + &quot;password&quot;:&quot;password&quot;, + &quot;email&quot;:&quot;yourdockeremail@gmail.com&quot;, + &quot;auth&quot;:&quot;base64 of string user:password&quot; + }, + &quot;auth.docker.io&quot;:{ + &quot;username&quot;:&quot;user&quot;, + &quot;password&quot;:&quot;password&quot;, + &quot;email&quot;:&quot;yourdockeremail@gmail.com&quot;, + &quot;auth&quot;:&quot;base64 of string user:password&quot; + }, + &quot;registry.docker.io&quot;:{ + &quot;username&quot;:&quot;user&quot;, + &quot;password&quot;:&quot;password&quot;, + &quot;email&quot;:&quot;yourdockeremail@gmail.com&quot;, + &quot;auth&quot;:&quot;base64 of string user:password&quot; + }, + &quot;docker.io&quot;:{ + &quot;username&quot;:&quot;user&quot;, + &quot;password&quot;:&quot;password&quot;, + &quot;email&quot;:&quot;yourdockeremail@gmail.com&quot;, + &quot;auth&quot;:&quot;base64 of string user:password&quot; + }, + &quot;https://registry-1.docker.io/v2/&quot;: { + &quot;username&quot;:&quot;user&quot;, + &quot;password&quot;:&quot;password&quot;, + &quot;email&quot;:&quot;yourdockeremail@gmail.com&quot;, + &quot;auth&quot;:&quot;base64 of string user:password&quot; + }, + &quot;registry-1.docker.io/v2/&quot;: { + &quot;username&quot;:&quot;user&quot;, + &quot;password&quot;:&quot;password&quot;, + &quot;email&quot;:&quot;yourdockeremail@gmail.com&quot;, + &quot;auth&quot;:&quot;base64 of string user:password&quot; + }, + &quot;registry-1.docker.io&quot;: { + &quot;username&quot;:&quot;user&quot;, + &quot;password&quot;:&quot;password&quot;, + &quot;email&quot;:&quot;yourdockeremail@gmail.com&quot;, + &quot;auth&quot;:&quot;base64 of string user:password&quot; + }, + &quot;https://registry-1.docker.io&quot;: { + &quot;username&quot;:&quot;user&quot;, + &quot;password&quot;:&quot;password&quot;, + &quot;email&quot;:&quot;yourdockeremail@gmail.com&quot;, + &quot;auth&quot;:&quot;base64 of string user:password&quot; + } + } +} +</code></pre> + + + + + + Docs: Customization + /docs/getting-started/v0.1.1/customization/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.1.1/customization/ + + + + + +<p>Jenkins can be customized using groovy scripts or configuration as code plugin. All custom configuration is stored in +the <strong>jenkins-operator-user-configuration-<cr_name></strong> ConfigMap which is automatically created by <strong>jenkins-operator</strong>.</p> + +<p><strong>jenkins-operator</strong> creates <strong>jenkins-operator-user-configuration-<cr_name></strong> secret where user can store sensitive +information used for custom configuration. If you have entry in secret named <code>PASSWORD</code> then you can use it in +Configuration as Plugin as <code>adminAddress: &quot;${PASSWORD}&quot;</code>.</p> + +<pre><code>kubectl get secret jenkins-operator-user-configuration-&lt;cr_name&gt; -o yaml + +kind: Secret +apiVersion: v1 +type: Opaque +metadata: + name: jenkins-operator-user-configuration-&lt;cr_name&gt; + namespace: default +data: + SECRET_JENKINS_ADMIN_ADDRESS: YXNkZgo= + +</code></pre> + +<pre><code>kubectl get configmap jenkins-operator-user-configuration-&lt;cr_name&gt; -o yaml + +apiVersion: v1 +data: + 1-configure-theme.groovy: |2 + import jenkins.* + import jenkins.model.* + import hudson.* + import hudson.model.* + import org.jenkinsci.plugins.simpletheme.ThemeElement + import org.jenkinsci.plugins.simpletheme.CssTextThemeElement + import org.jenkinsci.plugins.simpletheme.CssUrlThemeElement + + Jenkins jenkins = Jenkins.getInstance() + + def decorator = Jenkins.instance.getDescriptorByType(org.codefirst.SimpleThemeDecorator.class) + + List&lt;ThemeElement&gt; configElements = new ArrayList&lt;&gt;(); + configElements.add(new CssTextThemeElement(&quot;DEFAULT&quot;)); + configElements.add(new CssUrlThemeElement(&quot;https://cdn.rawgit.com/afonsof/jenkins-material-theme/gh-pages/dist/material-light-green.css&quot;)); + decorator.setElements(configElements); + decorator.save(); + + jenkins.save() + 1-system-message.yaml: |2 + jenkins: + systemMessage: &quot;Configuration as Code integration works!!!&quot; + adminAddress: &quot;${SECRET_JENKINS_ADMIN_ADDRESS}&quot; +kind: ConfigMap +metadata: + name: jenkins-operator-user-configuration-&lt;cr_name&gt; + namespace: default +</code></pre> + +<p>When <strong>jenkins-operator-user-configuration-<cr_name></strong> ConfigMap is updated Jenkins automatically +runs the <strong>jenkins-operator-user-configuration</strong> Jenkins Job which executes all scripts then +runs the <strong>jenkins-operator-user-configuration-casc</strong> Jenkins Job which applies Configuration as Code configuration.</p> + +<h2 id="install-plugins">Install Plugins</h2> + +<p>Edit CR under <code>spec.master.plugins</code>:</p> + +<pre><code>apiVersion: jenkins.io/v1alpha2 +kind: Jenkins +metadata: + name: example +spec: + master: + plugins: + - name: simple-theme-plugin + version: 0.5.1 +</code></pre> + +<p>Under <code>spec.master.basePlugins</code> you can find plugins for valid <strong>jenkins-operator</strong> work:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.io/v1alpha2<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>example<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>spec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>master<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>basePlugins<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>kubernetes<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1.18.3</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-job<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;2.34&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-aggregator<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;2.6&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>git<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">3.12.0</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>job-dsl<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.76&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configuration-as-code<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.29&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configuration-as-code-support<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.19&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>kubernetes-credentials-provider<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">0.12.1</span></code></pre></div> +<p>You can change version of them.</p> + +<p>Then <strong>jenkins-operator</strong> will automatically install plugins after Jenkins master pod restart.</p> + + + + + + Docs: Customization + /docs/getting-started/v0.2.0/customization/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.2.0/customization/ + + + + + +<p>Jenkins can be customized using groovy scripts or <a href="https://github.com/jenkinsci/configuration-as-code-plugin" target="_blank">configuration as code plugin</a>. +By using <a href="https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/" target="_blank">ConfigMap</a> you can create own <strong>Jenkins</strong> customized configuration. +Then you must reference the <em>ConfigMap</em> in <strong>Jenkins</strong> pod customization file in <code>spec.groovyScripts</code> or <code>spec.configurationAsCode</code></p> + +<p>For example create <em>ConfigMap</em> with name <code>jenkins-operator-user-configuration</code>. Then, modify the <strong>Jenkins</strong> manifest to look like this:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.io/v1alpha2<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>example<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>spec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configurationAsCode<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configurations<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-operator-user-configuration<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>groovyScripts<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configurations<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-operator-user-configuration</code></pre></div> +<p>Here is example of <code>jenkins-operator-user-configuration</code>:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>v1<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>ConfigMap<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-operator-user-configuration<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>data<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1</span>-configure-theme.groovy<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic">| +</span><span style="color:#8f5902;font-style:italic"> import jenkins.*</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>import<span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.model.*<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>import<span style="color:#f8f8f8;text-decoration:underline"> </span>hudson.*<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>import<span style="color:#f8f8f8;text-decoration:underline"> </span>hudson.model.*<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>import<span style="color:#f8f8f8;text-decoration:underline"> </span>org.jenkinsci.plugins.simpletheme.ThemeElement<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>import<span style="color:#f8f8f8;text-decoration:underline"> </span>org.jenkinsci.plugins.simpletheme.CssTextThemeElement<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>import<span style="color:#f8f8f8;text-decoration:underline"> </span>org.jenkinsci.plugins.simpletheme.CssUrlThemeElement<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins<span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins<span style="color:#f8f8f8;text-decoration:underline"> </span>=<span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins.getInstance()<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>def<span style="color:#f8f8f8;text-decoration:underline"> </span>decorator<span style="color:#f8f8f8;text-decoration:underline"> </span>=<span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins.instance.getDescriptorByType(org.codefirst.SimpleThemeDecorator.class)<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>List&lt;ThemeElement&gt;<span style="color:#f8f8f8;text-decoration:underline"> </span>configElements<span style="color:#f8f8f8;text-decoration:underline"> </span>=<span style="color:#f8f8f8;text-decoration:underline"> </span>new<span style="color:#f8f8f8;text-decoration:underline"> </span>ArrayList&lt;&gt;();<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configElements.add(new<span style="color:#f8f8f8;text-decoration:underline"> </span>CssTextThemeElement(<span style="color:#4e9a06">&#34;DEFAULT&#34;</span>));<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configElements.add(new<span style="color:#f8f8f8;text-decoration:underline"> </span>CssUrlThemeElement(<span style="color:#4e9a06">&#34;https://cdn.rawgit.com/afonsof/jenkins-material-theme/gh-pages/dist/material-light-green.css&#34;</span>));<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>decorator.setElements(configElements);<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>decorator.save();<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.save()<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1</span>-system-message.yaml<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic">| +</span><span style="color:#8f5902;font-style:italic"> jenkins:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>systemMessage<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;Configuration as Code integration works!!!&#34;</span></code></pre></div> +<ul> +<li>*.groovy is Groovy script configuration</li> +<li>*.yaml is configuration as code</li> +</ul> + +<p>If you want to correct your configuration you can edit it while <strong>jenkins-operator</strong> is running. +Jenkins will reconcile and apply new configuration.</p> + +<h3 id="using-secrets-inside-groovy-script">Using secrets inside Groovy script</h3> + +<p>If you configured <code>spec.groovyScripts.secret.name</code>, then this secret is available to use inside map Groovy scripts. +The secrets are loaded to <code>secrets</code> map.</p> + +<p>Create a <a href="https://kubernetes.io/docs/concepts/configuration/secret/" target="_blank">secret</a> with for eg. <code>jenkins-conf-secrets</code> name.</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Secret<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>v1<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>type<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Opaque<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-conf-secrets<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>namespace<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>default<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>data<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>SYSTEM_MESSAGE<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>SGVsbG8gd29ybGQ=</code></pre></div> +<p>Then modify the <strong>Jenkins</strong> pod manifest by changing <code>spec.groovyScripts.secret.name</code> to <code>jenkins-conf-secrets</code>.</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.io/v1alpha2<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>example<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>spec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configurationAsCode<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configurations<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-operator-user-configuration<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>secret<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-conf-secrets<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>groovyScripts<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configurations<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-operator-user-configuration<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>secret<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-conf-secrets</code></pre></div> +<p>Now you can test that the secret is mounted by applying this ConfigMap for Groovy script:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>v1<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>ConfigMap<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-operator-user-configuration<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>data<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1</span>-system-message.groovy<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic">| +</span><span style="color:#8f5902;font-style:italic"> import jenkins.*</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>import<span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.model.*<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>import<span style="color:#f8f8f8;text-decoration:underline"> </span>hudson.*<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>import<span style="color:#f8f8f8;text-decoration:underline"> </span>hudson.model.*<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins<span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins<span style="color:#f8f8f8;text-decoration:underline"> </span>=<span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins.getInstance()<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.setSystemMessage(secrets<span style="color:#000;font-weight:bold">[</span><span style="color:#4e9a06">&#34;SYSTEM_MESSAGE&#34;</span><span style="color:#000;font-weight:bold">]</span>)<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.save()</code></pre></div> +<p>Or by applying configuration as code:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>v1<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>ConfigMap<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-operator-user-configuration<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>data<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1</span>-system-message.yaml<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic">| +</span><span style="color:#8f5902;font-style:italic"> jenkins:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>systemMessage<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>${SYSTEM_MESSAGE}</code></pre></div> +<p>After this, you should see the <code>Hello world</code> system message at <strong>Jenkins</strong> homepage.</p> + +<h2 id="install-plugins">Install Plugins</h2> + +<p>Edit CR under <code>spec.master.plugins</code>:</p> + +<pre><code>apiVersion: jenkins.io/v1alpha2 +kind: Jenkins +metadata: + name: example +spec: + master: + plugins: + - name: simple-theme-plugin + version: 0.5.1 +</code></pre> + +<p>Under <code>spec.master.basePlugins</code> you can find plugins for valid <strong>jenkins-operator</strong> work:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.io/v1alpha2<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>example<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>spec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>master<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>basePlugins<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>kubernetes<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1.18.3</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-job<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;2.34&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-aggregator<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;2.6&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>git<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">3.12.0</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>job-dsl<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.76&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configuration-as-code<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.29&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configuration-as-code-support<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.19&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>kubernetes-credentials-provider<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">0.12.1</span></code></pre></div> +<p>You can change version of them.</p> + +<p>Then <strong>jenkins-operator</strong> will automatically install plugins after Jenkins master pod restart.</p> + + + + + + Docs: AKS + /docs/getting-started/v0.1.1/aks/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.1.1/aks/ + + + + <p>Azure AKS managed Kubernetes service adds to every pod the following envs:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>KUBERNETES_PORT_443_TCP_ADDR<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>KUBERNETES_PORT<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>tcp<span style="color:#000;font-weight:bold">:</span>//<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>KUBERNETES_PORT_443_TCP<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>tcp<span style="color:#000;font-weight:bold">:</span>//<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>KUBERNETES_SERVICE_HOST<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span></code></pre></div> +<p>The operator is aware of it and omits these envs when checking if Jenkins pod envs have been changed. It prevents +restart Jenkins pod over and over again.</p> + + + + + + Docs: AKS + /docs/getting-started/v0.2.0/aks/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.2.0/aks/ + + + + <p>Azure AKS managed Kubernetes service adds to every pod the following envs:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>KUBERNETES_PORT_443_TCP_ADDR<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>KUBERNETES_PORT<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>tcp<span style="color:#000;font-weight:bold">:</span>//<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>KUBERNETES_PORT_443_TCP<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>tcp<span style="color:#000;font-weight:bold">:</span>//<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>KUBERNETES_SERVICE_HOST<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span></code></pre></div> +<p>The operator is aware of it and omits these envs when checking if Jenkins pod envs have been changed. It prevents +restart Jenkins pod over and over again.</p> + + + + + + Docs: Configure backup and restore + /docs/getting-started/v0.1.1/configure-backup-and-restore/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.1.1/configure-backup-and-restore/ + + + + + +<p>Backup and restore is done by container sidecar.</p> + +<h4 id="create-pvc">Create PVC</h4> + +<p>Save to file pvc.yaml:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>v1<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>PersistentVolumeClaim<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>&lt;pvc_name<span style="color:#8f5902;font-style:italic">&gt; +</span><span style="color:#8f5902;font-style:italic"> namespace: &lt;namesapce&gt;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>spec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>accessModes<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>ReadWriteOnce<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>resources<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>requests<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>storage<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>500Gi</code></pre></div> +<p>Run command:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ kubectl -n &lt;namesapce&gt; create -f pvc.yaml</code></pre></div> +<h4 id="configure-jenkins-cr">Configure Jenkins CR</h4> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.io/v1alpha2<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>&lt;cr_name<span style="color:#8f5902;font-style:italic">&gt; +</span><span style="color:#8f5902;font-style:italic"> namespace: &lt;namespace&gt;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>spec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>master<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>securityContext<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>runAsUser<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1000</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>fsGroup<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1000</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>containers<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-master<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>image<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins/jenkins<span style="color:#000;font-weight:bold">:</span>lts<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>backup<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># container responsible for backup and restore</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>env<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>BACKUP_DIR<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/backup<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>JENKINS_HOME<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/jenkins-home<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>BACKUP_COUNT<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;3&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># keep only the 2 most recent backups</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>image<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>virtuslab/jenkins-operator-backup-pvc<span style="color:#000;font-weight:bold">:</span>v0<span style="color:#0000cf;font-weight:bold">.0.6</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># look at backup/pvc directory</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>imagePullPolicy<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>IfNotPresent<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>volumeMounts<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>mountPath<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/jenkins-home<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># Jenkins home volume</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-home<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>mountPath<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/backup<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># backup volume</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>backup<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>volumes<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>backup<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># PVC volume where backups will be stored</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>persistentVolumeClaim<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>claimName<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>&lt;pvc_name<span style="color:#8f5902;font-style:italic">&gt; +</span><span style="color:#8f5902;font-style:italic"> backup:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>containerName<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>backup<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># container name is responsible for backup</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>action<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>exec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>command<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>/home/user/bin/backup.sh<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># this command is invoked on &#34;backup&#34; container to make backup, for example /home/user/bin/backup.sh &lt;backup_number&gt;, &lt;backup_number&gt; is passed by operator</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>interval<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">30</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># how often make backup in seconds</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>makeBackupBeforePodDeletion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#204a87;font-weight:bold">true</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># make backup before pod deletion</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>restore<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>containerName<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>backup<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># container name is responsible for restore backup</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>action<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>exec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>command<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>/home/user/bin/restore.sh<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># this command is invoked on &#34;backup&#34; container to make restore backup, for example /home/user/bin/restore.sh &lt;backup_number&gt;, &lt;backup_number&gt; is passed by operator</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic">#recoveryOnce: &lt;backup_number&gt; # if want to restore specific backup configure this field and then Jenkins will be restarted and desired backup will be restored</span></code></pre></div> + + + + + Docs: Configure backup and restore + /docs/getting-started/v0.2.0/configure-backup-and-restore/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.2.0/configure-backup-and-restore/ + + + + + +<p>Backup and restore is done by container sidecar.</p> + +<h3 id="pvc">PVC</h3> + +<h4 id="create-pvc">Create PVC</h4> + +<p>Save to file pvc.yaml:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>v1<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>PersistentVolumeClaim<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>&lt;pvc_name<span style="color:#8f5902;font-style:italic">&gt; +</span><span style="color:#8f5902;font-style:italic"> namespace: &lt;namesapce&gt;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>spec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>accessModes<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>ReadWriteOnce<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>resources<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>requests<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>storage<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>500Gi</code></pre></div> +<p>Run command:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ kubectl -n &lt;namesapce&gt; create -f pvc.yaml</code></pre></div> +<h4 id="configure-jenkins-cr">Configure Jenkins CR</h4> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.io/v1alpha2<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>&lt;cr_name<span style="color:#8f5902;font-style:italic">&gt; +</span><span style="color:#8f5902;font-style:italic"> namespace: &lt;namespace&gt;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>spec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>master<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>securityContext<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>runAsUser<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1000</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>fsGroup<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1000</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>containers<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-master<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>image<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins/jenkins<span style="color:#000;font-weight:bold">:</span>lts<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>backup<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># container responsible for backup and restore</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>env<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>BACKUP_DIR<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/backup<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>JENKINS_HOME<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/jenkins-home<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>BACKUP_COUNT<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>value<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;3&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># keep only the 2 most recent backups</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>image<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>virtuslab/jenkins-operator-backup-pvc<span style="color:#000;font-weight:bold">:</span>v0<span style="color:#0000cf;font-weight:bold">.0.6</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># look at backup/pvc directory</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>imagePullPolicy<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>IfNotPresent<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>volumeMounts<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>mountPath<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/jenkins-home<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># Jenkins home volume</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-home<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>mountPath<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/backup<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># backup volume</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>backup<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>volumes<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>backup<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># PVC volume where backups will be stored</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>persistentVolumeClaim<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>claimName<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>&lt;pvc_name<span style="color:#8f5902;font-style:italic">&gt; +</span><span style="color:#8f5902;font-style:italic"> backup:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>containerName<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>backup<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># container name is responsible for backup</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>action<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>exec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>command<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>/home/user/bin/backup.sh<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># this command is invoked on &#34;backup&#34; container to make backup, for example /home/user/bin/backup.sh &lt;backup_number&gt;, &lt;backup_number&gt; is passed by operator</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>interval<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">30</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># how often make backup in seconds</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>makeBackupBeforePodDeletion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#204a87;font-weight:bold">true</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># make backup before pod deletion</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>restore<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>containerName<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>backup<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># container name is responsible for restore backup</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>action<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>exec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>command<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>/home/user/bin/restore.sh<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># this command is invoked on &#34;backup&#34; container to make restore backup, for example /home/user/bin/restore.sh &lt;backup_number&gt;, &lt;backup_number&gt; is passed by operator</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic">#recoveryOnce: &lt;backup_number&gt; # if want to restore specific backup configure this field and then Jenkins will be restarted and desired backup will be restored</span></code></pre></div> + + + + + Docs: Jenkins Docker Images + /docs/how-it-works/jenkins-docker-images/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/how-it-works/jenkins-docker-images/ + + + + <p><strong>jenkins-operator</strong> is fully compatible with <strong>jenkins:lts</strong> docker image and does not introduce any hidden changes there. +If needed, the docker image can easily be changed in custom resource manifest as long as it supports standard Jenkins file system structure.</p> + + + + + + Docs: Migration from v0.1.1 + /docs/getting-started/v0.2.0/migration/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.2.0/migration/ + + + + + +<h3 id="added-seed-job-agent">Added seed job agent</h3> + +<p>Now seed jobs are not built by master executors, but by dedicated agent deployed into Kubernetes. We disabled master executors for security reasons.</p> + +<h3 id="apply-jenkins-configuration-via-groovy-scripts-instead-of-jenkins-jobs">Apply Jenkins configuration via Groovy scripts instead of Jenkins jobs</h3> + +<p>We have removed hardcoded configuration by <strong>Jenkins</strong> jobs.</p> + +<p>In <code>v0.1.1</code> <strong>jenkins-operator</strong> configuration was stored in <code>jenkins-operator-user-configuration-&lt;cr_name&gt;</code> +If you want to use <code>v0.2.0</code> or newer you must simply write refer to old ConfigMap by modifying CR, for example:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.io/v1alpha2<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>example<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>spec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configurationAsCode<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configurations<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-operator-user-configuration-&lt;cr_name<span style="color:#8f5902;font-style:italic">&gt; +</span><span style="color:#8f5902;font-style:italic"> groovyScripts:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configurations<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-operator-user-configuration-&lt;cr_name&gt;</code></pre></div> +<p><strong>Jenkins</strong> configuration jobs (<em>Configure Seed Jobs</em>, <em>jenkins-operator-base-configuration</em>, <em>jenkins-operator-user-configuration</em>) have been removed from <strong>Jenkins</strong>.</p> + +<p>In <code>v0.1.1</code> you can see if configuration failed or successfully updated in <strong>Jenkins</strong> UI (job build logs). +Now, when Jenkins configuration jobs are removed, you must use this command to see if configuration was failed.</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ kubectl -n logs deployment/jenkins-operator</code></pre></div> + + + + + Docs: Tools + /docs/developer-guide/tools/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/developer-guide/tools/ + + + + + + + +<div class="pageinfo pageinfo-primary"> +<p>This document explains how to install the Go tools used by the development process.</p> + +</div> + + +<h2 id="configure-environment-variables">Configure environment variables</h2> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#204a87">export</span> <span style="color:#000">GOPATH</span><span style="color:#ce5c00;font-weight:bold">=</span>/home/go <span style="color:#8f5902;font-style:italic"># example value</span> +<span style="color:#204a87">export</span> <span style="color:#000">GOROOT</span><span style="color:#ce5c00;font-weight:bold">=</span>/usr/lib/go-1.12 <span style="color:#8f5902;font-style:italic"># example value</span> +<span style="color:#204a87">export</span> <span style="color:#000">PATH</span><span style="color:#ce5c00;font-weight:bold">=</span><span style="color:#000">$GOPATH</span>/bin:<span style="color:#000">$PATH</span></code></pre></div> +<h2 id="goimports">goimports</h2> + +<pre><code>go get golang.org/x/tools/cmd/goimports +cd $GOPATH/src/golang.org/x/tools/cmd/goimports +go build +go install +</code></pre> + +<h2 id="golint">golint</h2> + +<pre><code>go get -u golang.org/x/lint/golint +cd $GOPATH/src/golang.org/x/lint/golint +go build +go install +</code></pre> + +<h2 id="checkmake">checkmake</h2> + +<pre><code>go get github.com/mrtazz/checkmake +cd $GOPATH/src/github.com/mrtazz/checkmake +go build +go install +</code></pre> + +<h2 id="staticcheck">staticcheck</h2> + +<pre><code>mkdir -p $GOPATH/src/github.com/dominikh/ +cd $GOPATH/src/github.com/dominikh/ +git clone https://github.com/dominikh/go-tools.git +cd $GOPATH/src/github.com/dominikh/go-tools/staticcheck +go build +go install +</code></pre> + + + + + + Docs: Diagnostics + /docs/getting-started/v0.1.1/diagnostics/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.1.1/diagnostics/ + + + + + +<p>Turn on debug in <strong>jenkins-operator</strong> deployment:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">sed -i <span style="color:#4e9a06">&#39;s|\(args:\).*|\1\ [&#34;--debug&#34;\]|&#39;</span> deploy/operator.yaml +kubectl apply -f deploy/operator.yaml</code></pre></div> +<p>Watch Kubernetes events:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl get events --sort-by<span style="color:#ce5c00;font-weight:bold">=</span><span style="color:#4e9a06">&#39;{.lastTimestamp}&#39;</span></code></pre></div> +<p>Verify Jenkins master logs:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl logs -f jenkins-&lt;cr_name&gt;</code></pre></div> +<p>Verify jenkins-operator logs:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl logs deployment/jenkins-operator</code></pre></div> +<h2 id="troubleshooting">Troubleshooting</h2> + +<p>Delete Jenkins master pod and wait for the new one to come up:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl delete pod jenkins-&lt;cr_name&gt;</code></pre></div> + + + + + Docs: Diagnostics + /docs/getting-started/v0.2.0/diagnostics/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.2.0/diagnostics/ + + + + + +<p>Turn on debug in <strong>jenkins-operator</strong> deployment:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">sed -i <span style="color:#4e9a06">&#39;s|\(args:\).*|\1\ [&#34;--debug&#34;\]|&#39;</span> deploy/operator.yaml +kubectl apply -f deploy/operator.yaml</code></pre></div> +<p>Watch Kubernetes events:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl get events --sort-by<span style="color:#ce5c00;font-weight:bold">=</span><span style="color:#4e9a06">&#39;{.lastTimestamp}&#39;</span></code></pre></div> +<p>Verify Jenkins master logs:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl logs -f jenkins-&lt;cr_name&gt;</code></pre></div> +<p>Verify jenkins-operator logs:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl logs deployment/jenkins-operator</code></pre></div> +<h2 id="troubleshooting">Troubleshooting</h2> + +<p>Delete Jenkins master pod and wait for the new one to come up:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl delete pod jenkins-&lt;cr_name&gt;</code></pre></div> + + + + + Docs: Scheme + /docs/getting-started/v0.1.1/scheme/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.1.1/scheme/ + + + + + +<div class="pageinfo pageinfo-primary"> +<p>This document contains API scheme for <code>jenkins-operator</code> manifest</p> + +</div> + + +<p>Packages:</p> +<ul> +<li> +<a href="#jenkins.io">jenkins.io</a> +</li> +</ul> +<h2 id="jenkins.io">jenkins.io</h2> +<p> +<p>Package v1alpha2 contains API Schema definitions for the jenkins.io v1alpha2 API group</p> +</p> +Resource Types: +<ul><li> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Jenkins">Jenkins</a> +</li></ul> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Jenkins">Jenkins +</h3> +<p> +<p>Jenkins is the Schema for the jenkins API</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>apiVersion</code></br> +string</td> +<td> +<code> +jenkins.io/v1alpha2 +</code> +</td> +</tr> +<tr> +<td> +<code>kind</code></br> +string +</td> +<td><code>Jenkins</code></td> +</tr> +<tr> +<td> +<code>metadata</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#objectmeta-v1-meta"> +Kubernetes meta/v1.ObjectMeta +</a> +</em> +</td> +<td> +Refer to the Kubernetes API documentation for the fields of the +<code>metadata</code> field. +</td> +</tr> +<tr> +<td> +<code>spec</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsSpec"> +JenkinsSpec +</a> +</em> +</td> +<td> +<p>Spec defines the desired state of the Jenkins</p> +<br/> +<br/> +<table> +<tr> +<td> +<code>master</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsMaster"> +JenkinsMaster +</a> +</em> +</td> +<td> +<p>Master represents Jenkins master pod properties and Jenkins plugins. +Every single change here requires a pod restart.</p> +</td> +</tr> +<tr> +<td> +<code>seedJobs</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>SeedJobs defines list of Jenkins Seed Job configurations +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines</a></p> +</td> +</tr> +<tr> +<td> +<code>service</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Service"> +Service +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Service is Kubernetes service of Jenkins master HTTP pod +Defaults to : +port: 8080 +type: ClusterIP</p> +</td> +</tr> +<tr> +<td> +<code>slaveService</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Service"> +Service +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Service is Kubernetes service of Jenkins slave pods +Defaults to : +port: 50000 +type: ClusterIP</p> +</td> +</tr> +<tr> +<td> +<code>backup</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Backup"> +Backup +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Backup defines configuration of Jenkins backup +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore</a></p> +</td> +</tr> +<tr> +<td> +<code>restore</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Restore"> +Restore +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Backup defines configuration of Jenkins backup restore +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore</a></p> +</td> +</tr> +</table> +</td> +</tr> +<tr> +<td> +<code>status</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsStatus"> +JenkinsStatus +</a> +</em> +</td> +<td> +<p>Status defines the observed state of Jenkins</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Backup">Backup +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsSpec">JenkinsSpec</a>) +</p> +<p> +<p>Backup defines configuration of Jenkins backup</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>containerName</code></br> +<em> +string +</em> +</td> +<td> +<p>ContainerName is the container name responsible for backup operation</p> +</td> +</tr> +<tr> +<td> +<code>action</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Handler"> +Handler +</a> +</em> +</td> +<td> +<p>Action defines action which performs backup in backup container sidecar</p> +</td> +</tr> +<tr> +<td> +<code>interval</code></br> +<em> +uint64 +</em> +</td> +<td> +<p>Interval tells how often make backup in seconds +Defaults to 30.</p> +</td> +</tr> +<tr> +<td> +<code>makeBackupBeforePodDeletion</code></br> +<em> +bool +</em> +</td> +<td> +<p>MakeBackupBeforePodDeletion tells operator to make backup before Jenkins master pod deletion</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Build">Build +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsStatus">JenkinsStatus</a>) +</p> +<p> +<p>Build defines Jenkins Build status with corresponding metadata</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>jobName</code></br> +<em> +string +</em> +</td> +<td> +<p>JobName is the Jenkins job name</p> +</td> +</tr> +<tr> +<td> +<code>hash</code></br> +<em> +string +</em> +</td> +<td> +<p>Hash is the unique data identifier used in build</p> +</td> +</tr> +<tr> +<td> +<code>number</code></br> +<em> +int64 +</em> +</td> +<td> +<p>Number is the Jenkins build number</p> +</td> +</tr> +<tr> +<td> +<code>status</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.BuildStatus"> +BuildStatus +</a> +</em> +</td> +<td> +<p>Status is the status of Jenkins build</p> +</td> +</tr> +<tr> +<td> +<code>retries</code></br> +<em> +int +</em> +</td> +<td> +<p>Retires is the amount of Jenkins job build retries</p> +</td> +</tr> +<tr> +<td> +<code>createTime</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#time-v1-meta"> +Kubernetes meta/v1.Time +</a> +</em> +</td> +<td> +<p>CreateTime is the time when the first build has been created</p> +</td> +</tr> +<tr> +<td> +<code>lastUpdateTime</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#time-v1-meta"> +Kubernetes meta/v1.Time +</a> +</em> +</td> +<td> +<p>LastUpdateTime is the last update status time</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.BuildStatus">BuildStatus +(<code>string</code> alias)</p></h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Build">Build</a>) +</p> +<p> +<p>BuildStatus defines type of Jenkins build job status</p> +</p> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Container">Container +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsMaster">JenkinsMaster</a>) +</p> +<p> +<p>Container defines Kubernetes container attributes</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>name</code></br> +<em> +string +</em> +</td> +<td> +<p>Name of the container specified as a DNS_LABEL. +Each container in a pod must have a unique name (DNS_LABEL).</p> +</td> +</tr> +<tr> +<td> +<code>image</code></br> +<em> +string +</em> +</td> +<td> +<p>Docker image name. +More info: <a href="https://kubernetes.io/docs/concepts/containers/images">https://kubernetes.io/docs/concepts/containers/images</a></p> +</td> +</tr> +<tr> +<td> +<code>imagePullPolicy</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#pullpolicy-v1-core"> +Kubernetes core/v1.PullPolicy +</a> +</em> +</td> +<td> +<p>Image pull policy. +One of Always, Never, IfNotPresent. +Defaults to Always.</p> +</td> +</tr> +<tr> +<td> +<code>resources</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#resourcerequirements-v1-core"> +Kubernetes core/v1.ResourceRequirements +</a> +</em> +</td> +<td> +<p>Compute Resources required by this container. +More info: <a href="https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/">https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/</a></p> +</td> +</tr> +<tr> +<td> +<code>command</code></br> +<em> +[]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Entrypoint array. Not executed within a shell. +The docker image&rsquo;s ENTRYPOINT is used if this is not provided. +Variable references $(VAR_NAME) are expanded using the container&rsquo;s environment. If a variable +cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax +can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, +regardless of whether the variable exists or not. +More info: <a href="https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell">https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell</a></p> +</td> +</tr> +<tr> +<td> +<code>args</code></br> +<em> +[]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Arguments to the entrypoint. +The docker image&rsquo;s CMD is used if this is not provided. +Variable references $(VAR_NAME) are expanded using the container&rsquo;s environment. If a variable +cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax +can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, +regardless of whether the variable exists or not. +More info: <a href="https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell">https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell</a></p> +</td> +</tr> +<tr> +<td> +<code>workingDir</code></br> +<em> +string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Container&rsquo;s working directory. +If not specified, the container runtime&rsquo;s default will be used, which +might be configured in the container image.</p> +</td> +</tr> +<tr> +<td> +<code>ports</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#containerport-v1-core"> +[]Kubernetes core/v1.ContainerPort +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>List of ports to expose from the container. Exposing a port here gives +the system additional information about the network connections a +container uses, but is primarily informational. Not specifying a port here +DOES NOT prevent that port from being exposed. Any port which is +listening on the default &ldquo;0.0.0.0&rdquo; address inside a container will be +accessible from the network.</p> +</td> +</tr> +<tr> +<td> +<code>envFrom</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#envfromsource-v1-core"> +[]Kubernetes core/v1.EnvFromSource +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>List of sources to populate environment variables in the container. +The keys defined within a source must be a C_IDENTIFIER. All invalid keys +will be reported as an event when the container is starting. When a key exists in multiple +sources, the value associated with the last source will take precedence. +Values defined by an Env with a duplicate key will take precedence.</p> +</td> +</tr> +<tr> +<td> +<code>env</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#envvar-v1-core"> +[]Kubernetes core/v1.EnvVar +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>List of environment variables to set in the container.</p> +</td> +</tr> +<tr> +<td> +<code>volumeMounts</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#volumemount-v1-core"> +[]Kubernetes core/v1.VolumeMount +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Pod volumes to mount into the container&rsquo;s filesystem.</p> +</td> +</tr> +<tr> +<td> +<code>livenessProbe</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#probe-v1-core"> +Kubernetes core/v1.Probe +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Periodic probe of container liveness. +Container will be restarted if the probe fails.</p> +</td> +</tr> +<tr> +<td> +<code>readinessProbe</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#probe-v1-core"> +Kubernetes core/v1.Probe +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Periodic probe of container service readiness. +Container will be removed from service endpoints if the probe fails.</p> +</td> +</tr> +<tr> +<td> +<code>lifecycle</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#lifecycle-v1-core"> +Kubernetes core/v1.Lifecycle +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Actions that the management system should take in response to container lifecycle events.</p> +</td> +</tr> +<tr> +<td> +<code>securityContext</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#securitycontext-v1-core"> +Kubernetes core/v1.SecurityContext +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Security options the pod should run with. +More info: <a href="https://kubernetes.io/docs/concepts/policy/security-context/">https://kubernetes.io/docs/concepts/policy/security-context/</a> +More info: <a href="https://kubernetes.io/docs/tasks/configure-pod-container/security-context/">https://kubernetes.io/docs/tasks/configure-pod-container/security-context/</a></p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Handler">Handler +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Backup">Backup</a>, +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Restore">Restore</a>) +</p> +<p> +<p>Handler defines a specific action that should be taken</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>exec</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#execaction-v1-core"> +Kubernetes core/v1.ExecAction +</a> +</em> +</td> +<td> +<p>Exec specifies the action to take.</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsCredentialType">JenkinsCredentialType +(<code>string</code> alias)</p></h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.SeedJob">SeedJob</a>) +</p> +<p> +<p>JenkinsCredentialType defines type of Jenkins credential used to seed job mechanism</p> +</p> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsMaster">JenkinsMaster +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsSpec">JenkinsSpec</a>) +</p> +<p> +<p>JenkinsMaster defines the Jenkins master pod attributes and plugins, +every single change requires a Jenkins master pod restart</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>masterAnnotations</code></br> +<em> +map[string]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Annotations is an unstructured key value map stored with a resource that may be +set by external tools to store and retrieve arbitrary metadata. They are not +queryable and should be preserved when modifying objects. +More info: <a href="http://kubernetes.io/docs/user-guide/annotations">http://kubernetes.io/docs/user-guide/annotations</a></p> +</td> +</tr> +<tr> +<td> +<code>nodeSelector</code></br> +<em> +map[string]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>NodeSelector is a selector which must be true for the pod to fit on a node. +Selector which must match a node&rsquo;s labels for the pod to be scheduled on that node. +More info: <a href="https://kubernetes.io/docs/concepts/configuration/assign-pod-node/">https://kubernetes.io/docs/concepts/configuration/assign-pod-node/</a></p> +</td> +</tr> +<tr> +<td> +<code>securityContext</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#podsecuritycontext-v1-core"> +Kubernetes core/v1.PodSecurityContext +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>SecurityContext that applies to all the containers of the Jenkins +Master. As per kubernetes specification, it can be overridden +for each container individually. +Defaults to: +runAsUser: 1000 +fsGroup: 1000</p> +</td> +</tr> +<tr> +<td> +<code>containers</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Container"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Container +</a> +</em> +</td> +<td> +<p>List of containers belonging to the pod. +Containers cannot currently be added or removed. +There must be at least one container in a Pod. +Defaults to: +- image: jenkins/jenkins:lts +imagePullPolicy: Always +livenessProbe: +failureThreshold: 12 +httpGet: +path: /login +port: http +scheme: HTTP +initialDelaySeconds: 80 +periodSeconds: 10 +successThreshold: 1 +timeoutSeconds: 5 +name: jenkins-master +readinessProbe: +failureThreshold: 3 +httpGet: +path: /login +port: http +scheme: HTTP +initialDelaySeconds: 30 +periodSeconds: 10 +successThreshold: 1 +timeoutSeconds: 1 +resources: +limits: +cpu: 1500m +memory: 3Gi +requests: +cpu: &ldquo;1&rdquo; +memory: 600Mi</p> +</td> +</tr> +<tr> +<td> +<code>volumes</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#volume-v1-core"> +[]Kubernetes core/v1.Volume +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>List of volumes that can be mounted by containers belonging to the pod. +More info: <a href="https://kubernetes.io/docs/concepts/storage/volumes">https://kubernetes.io/docs/concepts/storage/volumes</a></p> +</td> +</tr> +<tr> +<td> +<code>basePlugins</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin +</a> +</em> +</td> +<td> +<p>BasePlugins contains plugins required by operator +Defaults to : +- name: kubernetes +version: 1.15.7 +- name: workflow-job +version: &ldquo;2.32&rdquo; +- name: workflow-aggregator +version: &ldquo;2.6&rdquo; +- name: git +version: 3.10.0 +- name: job-dsl +version: &ldquo;1.74&rdquo; +- name: configuration-as-code +version: &ldquo;1.19&rdquo; +- name: configuration-as-code-support +version: &ldquo;1.19&rdquo; +- name: kubernetes-credentials-provider +version: 0.12.1</p> +</td> +</tr> +<tr> +<td> +<code>plugins</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Plugins contains plugins required by user</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsSpec">JenkinsSpec +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Jenkins">Jenkins</a>) +</p> +<p> +<p>JenkinsSpec defines the desired state of the Jenkins</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>master</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsMaster"> +JenkinsMaster +</a> +</em> +</td> +<td> +<p>Master represents Jenkins master pod properties and Jenkins plugins. +Every single change here requires a pod restart.</p> +</td> +</tr> +<tr> +<td> +<code>seedJobs</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>SeedJobs defines list of Jenkins Seed Job configurations +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines</a></p> +</td> +</tr> +<tr> +<td> +<code>service</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Service"> +Service +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Service is Kubernetes service of Jenkins master HTTP pod +Defaults to : +port: 8080 +type: ClusterIP</p> +</td> +</tr> +<tr> +<td> +<code>slaveService</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Service"> +Service +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Service is Kubernetes service of Jenkins slave pods +Defaults to : +port: 50000 +type: ClusterIP</p> +</td> +</tr> +<tr> +<td> +<code>backup</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Backup"> +Backup +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Backup defines configuration of Jenkins backup +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore</a></p> +</td> +</tr> +<tr> +<td> +<code>restore</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Restore"> +Restore +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Backup defines configuration of Jenkins backup restore +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore</a></p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsStatus">JenkinsStatus +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Jenkins">Jenkins</a>) +</p> +<p> +<p>JenkinsStatus defines the observed state of Jenkins</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>operatorVersion</code></br> +<em> +string +</em> +</td> +<td> +<em>(Optional)</em> +<p>OperatorVersion is the operator version which manages this CR</p> +</td> +</tr> +<tr> +<td> +<code>provisionStartTime</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#time-v1-meta"> +Kubernetes meta/v1.Time +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>ProvisionStartTime is a time when Jenkins master pod has been created</p> +</td> +</tr> +<tr> +<td> +<code>baseConfigurationCompletedTime</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#time-v1-meta"> +Kubernetes meta/v1.Time +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>BaseConfigurationCompletedTime is a time when Jenkins base configuration phase has been completed</p> +</td> +</tr> +<tr> +<td> +<code>userConfigurationCompletedTime</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#time-v1-meta"> +Kubernetes meta/v1.Time +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>UserConfigurationCompletedTime is a time when Jenkins user configuration phase has been completed</p> +</td> +</tr> +<tr> +<td> +<code>builds</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Build"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Build +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Builds contains Jenkins builds statues</p> +</td> +</tr> +<tr> +<td> +<code>restoredBackup</code></br> +<em> +uint64 +</em> +</td> +<td> +<em>(Optional)</em> +<p>RestoredBackup is the restored backup number after Jenkins master pod restart</p> +</td> +</tr> +<tr> +<td> +<code>lastBackup</code></br> +<em> +uint64 +</em> +</td> +<td> +<em>(Optional)</em> +<p>LastBackup is the latest backup number</p> +</td> +</tr> +<tr> +<td> +<code>pendingBackup</code></br> +<em> +uint64 +</em> +</td> +<td> +<em>(Optional)</em> +<p>PendingBackup is the pending backup number</p> +</td> +</tr> +<tr> +<td> +<code>backupDoneBeforePodDeletion</code></br> +<em> +bool +</em> +</td> +<td> +<em>(Optional)</em> +<p>BackupDoneBeforePodDeletion tells if backup before pod deletion has been made</p> +</td> +</tr> +<tr> +<td> +<code>userAndPasswordHash</code></br> +<em> +string +</em> +</td> +<td> +<em>(Optional)</em> +<p>UserAndPasswordHash is a SHA256 hash made from user and password</p> +</td> +</tr> +<tr> +<td> +<code>createdSeedJobs</code></br> +<em> +[]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>CreatedSeedJobs contains list of seed job id already created in Jenkins</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin">Plugin +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsMaster">JenkinsMaster</a>) +</p> +<p> +<p>Plugin defines Jenkins plugin</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>name</code></br> +<em> +string +</em> +</td> +<td> +<p>Name is the name of Jenkins plugin</p> +</td> +</tr> +<tr> +<td> +<code>version</code></br> +<em> +string +</em> +</td> +<td> +<p>Version is the version of Jenkins plugin</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Restore">Restore +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsSpec">JenkinsSpec</a>) +</p> +<p> +<p>Restore defines configuration of Jenkins backup restore operation</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>containerName</code></br> +<em> +string +</em> +</td> +<td> +<p>ContainerName is the container name responsible for restore backup operation</p> +</td> +</tr> +<tr> +<td> +<code>action</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Handler"> +Handler +</a> +</em> +</td> +<td> +<p>Action defines action which performs restore backup in restore container sidecar</p> +</td> +</tr> +<tr> +<td> +<code>recoveryOnce</code></br> +<em> +uint64 +</em> +</td> +<td> +<em>(Optional)</em> +<p>RecoveryOnce if want to restore specific backup set this field and then Jenkins will be restarted and desired backup will be restored</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob">SeedJob +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsSpec">JenkinsSpec</a>) +</p> +<p> +<p>SeedJob defines configuration for seed job +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines</a></p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>id</code></br> +<em> +string +</em> +</td> +<td> +<p>ID is the unique seed job name</p> +</td> +</tr> +<tr> +<td> +<code>credentialID</code></br> +<em> +string +</em> +</td> +<td> +<p>CredentialID is the Kubernetes secret name which stores repository access credentials</p> +</td> +</tr> +<tr> +<td> +<code>description</code></br> +<em> +string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Description is the description of the seed job</p> +</td> +</tr> +<tr> +<td> +<code>targets</code></br> +<em> +string +</em> +</td> +<td> +<p>Targets is the repository path where are seed job definitions</p> +</td> +</tr> +<tr> +<td> +<code>repositoryBranch</code></br> +<em> +string +</em> +</td> +<td> +<p>RepositoryBranch is the repository branch where are seed job definitions</p> +</td> +</tr> +<tr> +<td> +<code>repositoryUrl</code></br> +<em> +string +</em> +</td> +<td> +<p>RepositoryURL is the repository access URL. Can be SSH or HTTPS.</p> +</td> +</tr> +<tr> +<td> +<code>credentialType</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsCredentialType"> +JenkinsCredentialType +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>JenkinsCredentialType is the <a href="https://jenkinsci.github.io/kubernetes-credentials-provider-plugin/">https://jenkinsci.github.io/kubernetes-credentials-provider-plugin/</a> credential type</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Service">Service +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsSpec">JenkinsSpec</a>) +</p> +<p> +<p>Service defines Kubernetes service attributes</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>annotations</code></br> +<em> +map[string]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Annotations is an unstructured key value map stored with a resource that may be +set by external tools to store and retrieve arbitrary metadata. They are not +queryable and should be preserved when modifying objects. +More info: <a href="http://kubernetes.io/docs/user-guide/annotations">http://kubernetes.io/docs/user-guide/annotations</a></p> +</td> +</tr> +<tr> +<td> +<code>labels</code></br> +<em> +map[string]string +</em> +</td> +<td> +<p>Route service traffic to pods with label keys and values matching this +selector. If empty or not present, the service is assumed to have an +external process managing its endpoints, which Kubernetes will not +modify. Only applies to types ClusterIP, NodePort, and LoadBalancer. +Ignored if type is ExternalName. +More info: <a href="https://kubernetes.io/docs/concepts/services-networking/service/">https://kubernetes.io/docs/concepts/services-networking/service/</a></p> +</td> +</tr> +<tr> +<td> +<code>type</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#servicetype-v1-core"> +Kubernetes core/v1.ServiceType +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Type determines how the Service is exposed. Defaults to ClusterIP. Valid +options are ExternalName, ClusterIP, NodePort, and LoadBalancer. +&ldquo;ExternalName&rdquo; maps to the specified externalName. +&ldquo;ClusterIP&rdquo; allocates a cluster-internal IP address for load-balancing to +endpoints. Endpoints are determined by the selector or if that is not +specified, by manual construction of an Endpoints object. If clusterIP is +&ldquo;None&rdquo;, no virtual IP is allocated and the endpoints are published as a +set of endpoints rather than a stable IP. +&ldquo;NodePort&rdquo; builds on ClusterIP and allocates a port on every node which +routes to the clusterIP. +&ldquo;LoadBalancer&rdquo; builds on NodePort and creates an +external load-balancer (if supported in the current cloud) which routes +to the clusterIP. +More info: <a href="https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services---service-types">https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services&mdash;service-types</a></p> +</td> +</tr> +<tr> +<td> +<code>port</code></br> +<em> +int32 +</em> +</td> +<td> +<p>The port that are exposed by this service. +More info: <a href="https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies">https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies</a></p> +</td> +</tr> +<tr> +<td> +<code>nodePort</code></br> +<em> +int32 +</em> +</td> +<td> +<em>(Optional)</em> +<p>The port on each node on which this service is exposed when type=NodePort or LoadBalancer. +Usually assigned by the system. If specified, it will be allocated to the service +if unused or else creation of the service will fail. +Default is to auto-allocate a port if the ServiceType of this Service requires one. +More info: <a href="https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport">https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport</a></p> +</td> +</tr> +<tr> +<td> +<code>loadBalancerSourceRanges</code></br> +<em> +[]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>If specified and supported by the platform, this will restrict traffic through the cloud-provider +load-balancer will be restricted to the specified client IPs. This field will be ignored if the +cloud-provider does not support the feature.&rdquo; +More info: <a href="https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/">https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/</a></p> +</td> +</tr> +<tr> +<td> +<code>loadBalancerIP</code></br> +<em> +string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Only applies to Service Type: LoadBalancer +LoadBalancer will get created with the IP specified in this field. +This feature depends on whether the underlying cloud-provider supports specifying +the loadBalancerIP when a load balancer is created. +This field will be ignored if the cloud-provider does not support the feature.</p> +</td> +</tr> +</tbody> +</table> +<hr/> +<p><em> +Generated with <code>gen-crd-api-reference-docs</code> +on git commit <code>37e531a</code>. +</em></p> + + + + + + Docs: Scheme + /docs/getting-started/v0.2.0/scheme/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.2.0/scheme/ + + + + + +<div class="pageinfo pageinfo-primary"> +<p>This document contains API scheme for <code>jenkins-operator</code> manifest</p> + +</div> + + +<p>Packages:</p> +<ul> +<li> +<a href="#jenkins.io">jenkins.io</a> +</li> +</ul> +<h2 id="jenkins.io">jenkins.io</h2> +<p> +<p>Package v1alpha2 contains API Schema definitions for the jenkins.io v1alpha2 API group</p> +</p> +Resource Types: +<ul><li> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Jenkins">Jenkins</a> +</li></ul> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Jenkins">Jenkins +</h3> +<p> +<p>Jenkins is the Schema for the jenkins API</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>apiVersion</code></br> +string</td> +<td> +<code> +jenkins.io/v1alpha2 +</code> +</td> +</tr> +<tr> +<td> +<code>kind</code></br> +string +</td> +<td><code>Jenkins</code></td> +</tr> +<tr> +<td> +<code>metadata</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#objectmeta-v1-meta"> +Kubernetes meta/v1.ObjectMeta +</a> +</em> +</td> +<td> +Refer to the Kubernetes API documentation for the fields of the +<code>metadata</code> field. +</td> +</tr> +<tr> +<td> +<code>spec</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsSpec"> +JenkinsSpec +</a> +</em> +</td> +<td> +<p>Spec defines the desired state of the Jenkins</p> +<br/> +<br/> +<table> +<tr> +<td> +<code>master</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsMaster"> +JenkinsMaster +</a> +</em> +</td> +<td> +<p>Master represents Jenkins master pod properties and Jenkins plugins. +Every single change here requires a pod restart.</p> +</td> +</tr> +<tr> +<td> +<code>seedJobs</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>SeedJobs defines list of Jenkins Seed Job configurations +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines</a></p> +</td> +</tr> +<tr> +<td> +<code>service</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Service"> +Service +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Service is Kubernetes service of Jenkins master HTTP pod +Defaults to : +port: 8080 +type: ClusterIP</p> +</td> +</tr> +<tr> +<td> +<code>slaveService</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Service"> +Service +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Service is Kubernetes service of Jenkins slave pods +Defaults to : +port: 50000 +type: ClusterIP</p> +</td> +</tr> +<tr> +<td> +<code>backup</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Backup"> +Backup +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Backup defines configuration of Jenkins backup +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore</a></p> +</td> +</tr> +<tr> +<td> +<code>restore</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Restore"> +Restore +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Backup defines configuration of Jenkins backup restore +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore</a></p> +</td> +</tr> +</table> +</td> +</tr> +<tr> +<td> +<code>status</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsStatus"> +JenkinsStatus +</a> +</em> +</td> +<td> +<p>Status defines the observed state of Jenkins</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Backup">Backup +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsSpec">JenkinsSpec</a>) +</p> +<p> +<p>Backup defines configuration of Jenkins backup</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>containerName</code></br> +<em> +string +</em> +</td> +<td> +<p>ContainerName is the container name responsible for backup operation</p> +</td> +</tr> +<tr> +<td> +<code>action</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Handler"> +Handler +</a> +</em> +</td> +<td> +<p>Action defines action which performs backup in backup container sidecar</p> +</td> +</tr> +<tr> +<td> +<code>interval</code></br> +<em> +uint64 +</em> +</td> +<td> +<p>Interval tells how often make backup in seconds +Defaults to 30.</p> +</td> +</tr> +<tr> +<td> +<code>makeBackupBeforePodDeletion</code></br> +<em> +bool +</em> +</td> +<td> +<p>MakeBackupBeforePodDeletion tells operator to make backup before Jenkins master pod deletion</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Build">Build +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsStatus">JenkinsStatus</a>) +</p> +<p> +<p>Build defines Jenkins Build status with corresponding metadata</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>jobName</code></br> +<em> +string +</em> +</td> +<td> +<p>JobName is the Jenkins job name</p> +</td> +</tr> +<tr> +<td> +<code>hash</code></br> +<em> +string +</em> +</td> +<td> +<p>Hash is the unique data identifier used in build</p> +</td> +</tr> +<tr> +<td> +<code>number</code></br> +<em> +int64 +</em> +</td> +<td> +<p>Number is the Jenkins build number</p> +</td> +</tr> +<tr> +<td> +<code>status</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.BuildStatus"> +BuildStatus +</a> +</em> +</td> +<td> +<p>Status is the status of Jenkins build</p> +</td> +</tr> +<tr> +<td> +<code>retries</code></br> +<em> +int +</em> +</td> +<td> +<p>Retires is the amount of Jenkins job build retries</p> +</td> +</tr> +<tr> +<td> +<code>createTime</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#time-v1-meta"> +Kubernetes meta/v1.Time +</a> +</em> +</td> +<td> +<p>CreateTime is the time when the first build has been created</p> +</td> +</tr> +<tr> +<td> +<code>lastUpdateTime</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#time-v1-meta"> +Kubernetes meta/v1.Time +</a> +</em> +</td> +<td> +<p>LastUpdateTime is the last update status time</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.BuildStatus">BuildStatus +(<code>string</code> alias)</p></h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Build">Build</a>) +</p> +<p> +<p>BuildStatus defines type of Jenkins build job status</p> +</p> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Container">Container +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsMaster">JenkinsMaster</a>) +</p> +<p> +<p>Container defines Kubernetes container attributes</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>name</code></br> +<em> +string +</em> +</td> +<td> +<p>Name of the container specified as a DNS_LABEL. +Each container in a pod must have a unique name (DNS_LABEL).</p> +</td> +</tr> +<tr> +<td> +<code>image</code></br> +<em> +string +</em> +</td> +<td> +<p>Docker image name. +More info: <a href="https://kubernetes.io/docs/concepts/containers/images">https://kubernetes.io/docs/concepts/containers/images</a></p> +</td> +</tr> +<tr> +<td> +<code>imagePullPolicy</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#pullpolicy-v1-core"> +Kubernetes core/v1.PullPolicy +</a> +</em> +</td> +<td> +<p>Image pull policy. +One of Always, Never, IfNotPresent. +Defaults to Always.</p> +</td> +</tr> +<tr> +<td> +<code>resources</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#resourcerequirements-v1-core"> +Kubernetes core/v1.ResourceRequirements +</a> +</em> +</td> +<td> +<p>Compute Resources required by this container. +More info: <a href="https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/">https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/</a></p> +</td> +</tr> +<tr> +<td> +<code>command</code></br> +<em> +[]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Entrypoint array. Not executed within a shell. +The docker image&rsquo;s ENTRYPOINT is used if this is not provided. +Variable references $(VAR_NAME) are expanded using the container&rsquo;s environment. If a variable +cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax +can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, +regardless of whether the variable exists or not. +More info: <a href="https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell">https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell</a></p> +</td> +</tr> +<tr> +<td> +<code>args</code></br> +<em> +[]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Arguments to the entrypoint. +The docker image&rsquo;s CMD is used if this is not provided. +Variable references $(VAR_NAME) are expanded using the container&rsquo;s environment. If a variable +cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax +can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, +regardless of whether the variable exists or not. +More info: <a href="https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell">https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell</a></p> +</td> +</tr> +<tr> +<td> +<code>workingDir</code></br> +<em> +string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Container&rsquo;s working directory. +If not specified, the container runtime&rsquo;s default will be used, which +might be configured in the container image.</p> +</td> +</tr> +<tr> +<td> +<code>ports</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#containerport-v1-core"> +[]Kubernetes core/v1.ContainerPort +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>List of ports to expose from the container. Exposing a port here gives +the system additional information about the network connections a +container uses, but is primarily informational. Not specifying a port here +DOES NOT prevent that port from being exposed. Any port which is +listening on the default &ldquo;0.0.0.0&rdquo; address inside a container will be +accessible from the network.</p> +</td> +</tr> +<tr> +<td> +<code>envFrom</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#envfromsource-v1-core"> +[]Kubernetes core/v1.EnvFromSource +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>List of sources to populate environment variables in the container. +The keys defined within a source must be a C_IDENTIFIER. All invalid keys +will be reported as an event when the container is starting. When a key exists in multiple +sources, the value associated with the last source will take precedence. +Values defined by an Env with a duplicate key will take precedence.</p> +</td> +</tr> +<tr> +<td> +<code>env</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#envvar-v1-core"> +[]Kubernetes core/v1.EnvVar +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>List of environment variables to set in the container.</p> +</td> +</tr> +<tr> +<td> +<code>volumeMounts</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#volumemount-v1-core"> +[]Kubernetes core/v1.VolumeMount +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Pod volumes to mount into the container&rsquo;s filesystem.</p> +</td> +</tr> +<tr> +<td> +<code>livenessProbe</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#probe-v1-core"> +Kubernetes core/v1.Probe +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Periodic probe of container liveness. +Container will be restarted if the probe fails.</p> +</td> +</tr> +<tr> +<td> +<code>readinessProbe</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#probe-v1-core"> +Kubernetes core/v1.Probe +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Periodic probe of container service readiness. +Container will be removed from service endpoints if the probe fails.</p> +</td> +</tr> +<tr> +<td> +<code>lifecycle</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#lifecycle-v1-core"> +Kubernetes core/v1.Lifecycle +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Actions that the management system should take in response to container lifecycle events.</p> +</td> +</tr> +<tr> +<td> +<code>securityContext</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#securitycontext-v1-core"> +Kubernetes core/v1.SecurityContext +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Security options the pod should run with. +More info: <a href="https://kubernetes.io/docs/concepts/policy/security-context/">https://kubernetes.io/docs/concepts/policy/security-context/</a> +More info: <a href="https://kubernetes.io/docs/tasks/configure-pod-container/security-context/">https://kubernetes.io/docs/tasks/configure-pod-container/security-context/</a></p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Handler">Handler +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Backup">Backup</a>, +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Restore">Restore</a>) +</p> +<p> +<p>Handler defines a specific action that should be taken</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>exec</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#execaction-v1-core"> +Kubernetes core/v1.ExecAction +</a> +</em> +</td> +<td> +<p>Exec specifies the action to take.</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsCredentialType">JenkinsCredentialType +(<code>string</code> alias)</p></h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.SeedJob">SeedJob</a>) +</p> +<p> +<p>JenkinsCredentialType defines type of Jenkins credential used to seed job mechanism</p> +</p> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsMaster">JenkinsMaster +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsSpec">JenkinsSpec</a>) +</p> +<p> +<p>JenkinsMaster defines the Jenkins master pod attributes and plugins, +every single change requires a Jenkins master pod restart</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>masterAnnotations</code></br> +<em> +map[string]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Annotations is an unstructured key value map stored with a resource that may be +set by external tools to store and retrieve arbitrary metadata. They are not +queryable and should be preserved when modifying objects. +More info: <a href="http://kubernetes.io/docs/user-guide/annotations">http://kubernetes.io/docs/user-guide/annotations</a></p> +</td> +</tr> +<tr> +<td> +<code>nodeSelector</code></br> +<em> +map[string]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>NodeSelector is a selector which must be true for the pod to fit on a node. +Selector which must match a node&rsquo;s labels for the pod to be scheduled on that node. +More info: <a href="https://kubernetes.io/docs/concepts/configuration/assign-pod-node/">https://kubernetes.io/docs/concepts/configuration/assign-pod-node/</a></p> +</td> +</tr> +<tr> +<td> +<code>securityContext</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#podsecuritycontext-v1-core"> +Kubernetes core/v1.PodSecurityContext +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>SecurityContext that applies to all the containers of the Jenkins +Master. As per kubernetes specification, it can be overridden +for each container individually. +Defaults to: +runAsUser: 1000 +fsGroup: 1000</p> +</td> +</tr> +<tr> +<td> +<code>containers</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Container"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Container +</a> +</em> +</td> +<td> +<p>List of containers belonging to the pod. +Containers cannot currently be added or removed. +There must be at least one container in a Pod. +Defaults to: +- image: jenkins/jenkins:lts +imagePullPolicy: Always +livenessProbe: +failureThreshold: 12 +httpGet: +path: /login +port: http +scheme: HTTP +initialDelaySeconds: 80 +periodSeconds: 10 +successThreshold: 1 +timeoutSeconds: 5 +name: jenkins-master +readinessProbe: +failureThreshold: 3 +httpGet: +path: /login +port: http +scheme: HTTP +initialDelaySeconds: 30 +periodSeconds: 10 +successThreshold: 1 +timeoutSeconds: 1 +resources: +limits: +cpu: 1500m +memory: 3Gi +requests: +cpu: &ldquo;1&rdquo; +memory: 600Mi</p> +</td> +</tr> +<tr> +<td> +<code>volumes</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#volume-v1-core"> +[]Kubernetes core/v1.Volume +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>List of volumes that can be mounted by containers belonging to the pod. +More info: <a href="https://kubernetes.io/docs/concepts/storage/volumes">https://kubernetes.io/docs/concepts/storage/volumes</a></p> +</td> +</tr> +<tr> +<td> +<code>basePlugins</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin +</a> +</em> +</td> +<td> +<p>BasePlugins contains plugins required by operator +Defaults to : +- name: kubernetes +version: 1.15.7 +- name: workflow-job +version: &ldquo;2.32&rdquo; +- name: workflow-aggregator +version: &ldquo;2.6&rdquo; +- name: git +version: 3.10.0 +- name: job-dsl +version: &ldquo;1.74&rdquo; +- name: configuration-as-code +version: &ldquo;1.19&rdquo; +- name: configuration-as-code-support +version: &ldquo;1.19&rdquo; +- name: kubernetes-credentials-provider +version: 0.12.1</p> +</td> +</tr> +<tr> +<td> +<code>plugins</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Plugins contains plugins required by user</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsSpec">JenkinsSpec +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Jenkins">Jenkins</a>) +</p> +<p> +<p>JenkinsSpec defines the desired state of the Jenkins</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>master</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsMaster"> +JenkinsMaster +</a> +</em> +</td> +<td> +<p>Master represents Jenkins master pod properties and Jenkins plugins. +Every single change here requires a pod restart.</p> +</td> +</tr> +<tr> +<td> +<code>seedJobs</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>SeedJobs defines list of Jenkins Seed Job configurations +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines</a></p> +</td> +</tr> +<tr> +<td> +<code>service</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Service"> +Service +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Service is Kubernetes service of Jenkins master HTTP pod +Defaults to : +port: 8080 +type: ClusterIP</p> +</td> +</tr> +<tr> +<td> +<code>slaveService</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Service"> +Service +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Service is Kubernetes service of Jenkins slave pods +Defaults to : +port: 50000 +type: ClusterIP</p> +</td> +</tr> +<tr> +<td> +<code>backup</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Backup"> +Backup +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Backup defines configuration of Jenkins backup +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore</a></p> +</td> +</tr> +<tr> +<td> +<code>restore</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Restore"> +Restore +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Backup defines configuration of Jenkins backup restore +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-backup-and-restore</a></p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsStatus">JenkinsStatus +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.Jenkins">Jenkins</a>) +</p> +<p> +<p>JenkinsStatus defines the observed state of Jenkins</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>operatorVersion</code></br> +<em> +string +</em> +</td> +<td> +<em>(Optional)</em> +<p>OperatorVersion is the operator version which manages this CR</p> +</td> +</tr> +<tr> +<td> +<code>provisionStartTime</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#time-v1-meta"> +Kubernetes meta/v1.Time +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>ProvisionStartTime is a time when Jenkins master pod has been created</p> +</td> +</tr> +<tr> +<td> +<code>baseConfigurationCompletedTime</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#time-v1-meta"> +Kubernetes meta/v1.Time +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>BaseConfigurationCompletedTime is a time when Jenkins base configuration phase has been completed</p> +</td> +</tr> +<tr> +<td> +<code>userConfigurationCompletedTime</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#time-v1-meta"> +Kubernetes meta/v1.Time +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>UserConfigurationCompletedTime is a time when Jenkins user configuration phase has been completed</p> +</td> +</tr> +<tr> +<td> +<code>builds</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Build"> +[][]github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Build +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Builds contains Jenkins builds statues</p> +</td> +</tr> +<tr> +<td> +<code>restoredBackup</code></br> +<em> +uint64 +</em> +</td> +<td> +<em>(Optional)</em> +<p>RestoredBackup is the restored backup number after Jenkins master pod restart</p> +</td> +</tr> +<tr> +<td> +<code>lastBackup</code></br> +<em> +uint64 +</em> +</td> +<td> +<em>(Optional)</em> +<p>LastBackup is the latest backup number</p> +</td> +</tr> +<tr> +<td> +<code>pendingBackup</code></br> +<em> +uint64 +</em> +</td> +<td> +<em>(Optional)</em> +<p>PendingBackup is the pending backup number</p> +</td> +</tr> +<tr> +<td> +<code>backupDoneBeforePodDeletion</code></br> +<em> +bool +</em> +</td> +<td> +<em>(Optional)</em> +<p>BackupDoneBeforePodDeletion tells if backup before pod deletion has been made</p> +</td> +</tr> +<tr> +<td> +<code>userAndPasswordHash</code></br> +<em> +string +</em> +</td> +<td> +<em>(Optional)</em> +<p>UserAndPasswordHash is a SHA256 hash made from user and password</p> +</td> +</tr> +<tr> +<td> +<code>createdSeedJobs</code></br> +<em> +[]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>CreatedSeedJobs contains list of seed job id already created in Jenkins</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Plugin">Plugin +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsMaster">JenkinsMaster</a>) +</p> +<p> +<p>Plugin defines Jenkins plugin</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>name</code></br> +<em> +string +</em> +</td> +<td> +<p>Name is the name of Jenkins plugin</p> +</td> +</tr> +<tr> +<td> +<code>version</code></br> +<em> +string +</em> +</td> +<td> +<p>Version is the version of Jenkins plugin</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Restore">Restore +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsSpec">JenkinsSpec</a>) +</p> +<p> +<p>Restore defines configuration of Jenkins backup restore operation</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>containerName</code></br> +<em> +string +</em> +</td> +<td> +<p>ContainerName is the container name responsible for restore backup operation</p> +</td> +</tr> +<tr> +<td> +<code>action</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Handler"> +Handler +</a> +</em> +</td> +<td> +<p>Action defines action which performs restore backup in restore container sidecar</p> +</td> +</tr> +<tr> +<td> +<code>recoveryOnce</code></br> +<em> +uint64 +</em> +</td> +<td> +<em>(Optional)</em> +<p>RecoveryOnce if want to restore specific backup set this field and then Jenkins will be restarted and desired backup will be restored</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.SeedJob">SeedJob +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsSpec">JenkinsSpec</a>) +</p> +<p> +<p>SeedJob defines configuration for seed job +More info: <a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines">https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines</a></p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>id</code></br> +<em> +string +</em> +</td> +<td> +<p>ID is the unique seed job name</p> +</td> +</tr> +<tr> +<td> +<code>credentialID</code></br> +<em> +string +</em> +</td> +<td> +<p>CredentialID is the Kubernetes secret name which stores repository access credentials</p> +</td> +</tr> +<tr> +<td> +<code>description</code></br> +<em> +string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Description is the description of the seed job</p> +</td> +</tr> +<tr> +<td> +<code>targets</code></br> +<em> +string +</em> +</td> +<td> +<p>Targets is the repository path where are seed job definitions</p> +</td> +</tr> +<tr> +<td> +<code>repositoryBranch</code></br> +<em> +string +</em> +</td> +<td> +<p>RepositoryBranch is the repository branch where are seed job definitions</p> +</td> +</tr> +<tr> +<td> +<code>repositoryUrl</code></br> +<em> +string +</em> +</td> +<td> +<p>RepositoryURL is the repository access URL. Can be SSH or HTTPS.</p> +</td> +</tr> +<tr> +<td> +<code>credentialType</code></br> +<em> +<a href="#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.JenkinsCredentialType"> +JenkinsCredentialType +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>JenkinsCredentialType is the <a href="https://jenkinsci.github.io/kubernetes-credentials-provider-plugin/">https://jenkinsci.github.io/kubernetes-credentials-provider-plugin/</a> credential type</p> +</td> +</tr> +</tbody> +</table> +<h3 id="github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.Service">Service +</h3> +<p> +(<em>Appears on:</em> +<a href="#github.com%2fjenkinsci%2fkubernetes-operator%2fpkg%2fapis%2fjenkins%2fv1alpha2.JenkinsSpec">JenkinsSpec</a>) +</p> +<p> +<p>Service defines Kubernetes service attributes</p> +</p> +<table> +<thead> +<tr> +<th>Field</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td> +<code>annotations</code></br> +<em> +map[string]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Annotations is an unstructured key value map stored with a resource that may be +set by external tools to store and retrieve arbitrary metadata. They are not +queryable and should be preserved when modifying objects. +More info: <a href="http://kubernetes.io/docs/user-guide/annotations">http://kubernetes.io/docs/user-guide/annotations</a></p> +</td> +</tr> +<tr> +<td> +<code>labels</code></br> +<em> +map[string]string +</em> +</td> +<td> +<p>Route service traffic to pods with label keys and values matching this +selector. If empty or not present, the service is assumed to have an +external process managing its endpoints, which Kubernetes will not +modify. Only applies to types ClusterIP, NodePort, and LoadBalancer. +Ignored if type is ExternalName. +More info: <a href="https://kubernetes.io/docs/concepts/services-networking/service/">https://kubernetes.io/docs/concepts/services-networking/service/</a></p> +</td> +</tr> +<tr> +<td> +<code>type</code></br> +<em> +<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#servicetype-v1-core"> +Kubernetes core/v1.ServiceType +</a> +</em> +</td> +<td> +<em>(Optional)</em> +<p>Type determines how the Service is exposed. Defaults to ClusterIP. Valid +options are ExternalName, ClusterIP, NodePort, and LoadBalancer. +&ldquo;ExternalName&rdquo; maps to the specified externalName. +&ldquo;ClusterIP&rdquo; allocates a cluster-internal IP address for load-balancing to +endpoints. Endpoints are determined by the selector or if that is not +specified, by manual construction of an Endpoints object. If clusterIP is +&ldquo;None&rdquo;, no virtual IP is allocated and the endpoints are published as a +set of endpoints rather than a stable IP. +&ldquo;NodePort&rdquo; builds on ClusterIP and allocates a port on every node which +routes to the clusterIP. +&ldquo;LoadBalancer&rdquo; builds on NodePort and creates an +external load-balancer (if supported in the current cloud) which routes +to the clusterIP. +More info: <a href="https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services---service-types">https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services&mdash;service-types</a></p> +</td> +</tr> +<tr> +<td> +<code>port</code></br> +<em> +int32 +</em> +</td> +<td> +<p>The port that are exposed by this service. +More info: <a href="https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies">https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies</a></p> +</td> +</tr> +<tr> +<td> +<code>nodePort</code></br> +<em> +int32 +</em> +</td> +<td> +<em>(Optional)</em> +<p>The port on each node on which this service is exposed when type=NodePort or LoadBalancer. +Usually assigned by the system. If specified, it will be allocated to the service +if unused or else creation of the service will fail. +Default is to auto-allocate a port if the ServiceType of this Service requires one. +More info: <a href="https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport">https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport</a></p> +</td> +</tr> +<tr> +<td> +<code>loadBalancerSourceRanges</code></br> +<em> +[]string +</em> +</td> +<td> +<em>(Optional)</em> +<p>If specified and supported by the platform, this will restrict traffic through the cloud-provider +load-balancer will be restricted to the specified client IPs. This field will be ignored if the +cloud-provider does not support the feature.&rdquo; +More info: <a href="https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/">https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/</a></p> +</td> +</tr> +<tr> +<td> +<code>loadBalancerIP</code></br> +<em> +string +</em> +</td> +<td> +<em>(Optional)</em> +<p>Only applies to Service Type: LoadBalancer +LoadBalancer will get created with the IP specified in this field. +This feature depends on whether the underlying cloud-provider supports specifying +the loadBalancerIP when a load balancer is created. +This field will be ignored if the cloud-provider does not support the feature.</p> +</td> +</tr> +</tbody> +</table> +<hr/> +<p><em> +Generated with <code>gen-crd-api-reference-docs</code> +on git commit <code>37e531a</code>. +</em></p> + + + + + + Docs: Migration guide from v1alpha1 to v1alpha2 + /docs/getting-started/v0.1.1/migration-guide-v1alpha1-to-v1alpha2/ + Mon, 05 Aug 2019 00:00:00 +0000 + + /docs/getting-started/v0.1.1/migration-guide-v1alpha1-to-v1alpha2/ + + + + + +<p>Please not that <strong>CRD manifests are global</strong>, not namespaced, so every jenkins operator running on the cluster +will be impacted by the new CRD manifest. Multiple operator instances with different versions <em>should</em> continue to work.</p> + +<h2 id="stop-jenkins-operator-pod">Stop jenkins-operator pod</h2> + +<p>Run command:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ kubectl -n &lt;namespace&gt; scale deployment.apps/jenkins-operator --replicas<span style="color:#ce5c00;font-weight:bold">=</span><span style="color:#0000cf;font-weight:bold">0</span> +deployment.apps/jenkins-operator scaled</code></pre></div> +<p>Desired state:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ kubectl -n &lt;namespace&gt; get po +No resources found.</code></pre></div> +<h2 id="stop-jenkins-master-pod">Stop Jenkins master pod</h2> + +<p>Run command:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ kubectl -n &lt;namespace&gt; get po +NAME READY STATUS RESTARTS AGE +jenkins-operator-&lt;cr_name&gt; <span style="color:#0000cf;font-weight:bold">2</span>/2 Running <span style="color:#0000cf;font-weight:bold">0</span> 3m35s +$ kubectl -n &lt;namespace&gt; get delete po jenkins-operator-&lt;cr_name&gt; +pod <span style="color:#4e9a06">&#34;jenkins-operator-&lt;cr_name&gt;&#34;</span> deleted</code></pre></div> +<p>Desired state:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ kubectl -n &lt;namespace&gt; get po +No resources found.</code></pre></div> +<h2 id="save-jenkins-cr-to-jenkins-yaml-file">Save Jenkins CR to jenkins.yaml file</h2> + +<p>Run command:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ kubectl -n &lt;namespace&gt; get jenkins &lt;cr_name&gt; -o yaml &gt; jenkins.yaml</code></pre></div> +<h2 id="modify-jenkins-yaml-file">Modify jenkins.yaml file</h2> + +<p>Change apiVersion to <code>apiVersion: jenkins.io/v1alpha2</code></p> + +<p>New plugin format without dependent plugins:</p> + +<ul> +<li><p><code>spec.master.basePlugins</code> example:</p> + +<pre><code>spec: +master: +basePlugins: + - name: a-plugin-name + version: &quot;1.0.0&quot; + ... +</code></pre></li> + +<li><p><code>spec.master.plugins</code> example:</p> + +<pre><code> +spec: +master: +plugins: + - name: a-plugin-name + version: &quot;1.0.0&quot; +... +</code></pre></li> +</ul> + +<p>Move Jenkins <code>master</code> container properties to <code>spec.master.containers[jenkins-master]</code> (non exhaustive list): +- <code>spec.master.image</code> -&gt; <code>spec.master.containers[jenkins-master].image</code> +- <code>spec.master.imagePullPolicy</code> -&gt; <code>spec.master.containers[jenkins-master].imagePullPolicy</code> +- <code>spec.master.livenessProbe</code> -&gt; <code>spec.master.containers[jenkins-master].livenessProbe</code> +- <code>spec.master.readinessProbe</code> -&gt; <code>spec.master.containers[jenkins-master].readinessProbe</code> +- <code>spec.master.resources</code> -&gt; <code>spec.master.containers[jenkins-master].resources</code> +- <code>spec.master.env</code> -&gt; <code>spec.master.containers[jenkins-master].env</code></p> + +<pre><code>spec: + master: + containers: + - name: jenkins-master + image: jenkins/jenkins:lts + ... +</code></pre> + +<p>See also the examples bellow for more details. For even more details please look at the source code. +Code that defines the data structures can be found <a href="v0.1.1/jenkins-v1alpha2-scheme.md" target="_blank">here</a></p> + +<h3 id="examples">Examples</h3> + +<p>Old format:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.io/v1alpha1<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>&lt;cr_name<span style="color:#8f5902;font-style:italic">&gt; +</span><span style="color:#8f5902;font-style:italic"> namespace: &lt;namespace&gt;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>spec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>master<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>basePlugins<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configuration-as-code<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.17</span><span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>configuration-as-code-support<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.17</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>git<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">3.10.0</span><span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>apache-httpcomponents-client<span style="color:#0000cf;font-weight:bold">-4</span>-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">4.5.5-3.0</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>credentials<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>display-url-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.3.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>git-client<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.7.7</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>jsch<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">0.1.55</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>junit<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.28</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>mailer<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.23</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>matrix-project<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.14</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>scm-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.4.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>script-security<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.59</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>ssh-credentials<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.16</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>structs<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.34</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-scm-step<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.7</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-step-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>job-dsl<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.74</span><span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>script-security<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.59</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>structs<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>kubernetes-credentials-provider<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">0.12.1</span><span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>credentials<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>structs<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>variant<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.2</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>kubernetes<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.15.5</span><span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>apache-httpcomponents-client<span style="color:#0000cf;font-weight:bold">-4</span>-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">4.5.5-3.0</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>cloudbees-folder<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">6.8</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>credentials<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>durable-task<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.29</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>jackson2-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.9.9</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>kubernetes-credentials<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">0.4.0</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>plain-credentials<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.5</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>structs<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>variant<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.2</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-step-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-aggregator<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.6</span><span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>ace-editor<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>apache-httpcomponents-client<span style="color:#0000cf;font-weight:bold">-4</span>-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">4.5.5-3.0</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>authentication-tokens<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.3</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>branch-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.5.2</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>cloudbees-folder<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">6.8</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>credentials-binding<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.18</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>credentials<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>display-url-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.3.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>docker-commons<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.15</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>docker-workflow<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.18</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>durable-task<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.29</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>git-client<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.7.7</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>git-server<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.7</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>handlebars<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.1.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>jackson2-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.9.9</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>jquery-detached<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.2.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>jsch<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">0.1.55</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>junit<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.28</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>lockable-resources<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.5</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>mailer<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.23</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>matrix-project<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.14</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>momentjs<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.1.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-build-step<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.9</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-graph-analysis<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.10</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-input-step<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.10</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-milestone-step<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.3.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-model-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.3.8</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-model-declarative-agent<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.1.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-model-definition<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.3.8</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-model-extensions<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.3.8</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-rest-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.11</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-stage-step<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.3</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-stage-tags-metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.3.8</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>pipeline-stage-view<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.11</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>plain-credentials<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.5</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>scm-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.4.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>script-security<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.59</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>ssh-credentials<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.16</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>structs<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.34</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-basic-steps<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.16</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-cps-global-lib<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.13</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-cps<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.69</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-durable-task-step<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.30</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-job<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.32</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-multibranch<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.21</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-scm-step<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.7</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-step-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-support<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">3.3</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-job<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.32</span><span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>scm-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.4.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>script-security<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.59</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>structs<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.34</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-step-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-support<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">3.3</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>image<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins/jenkins<span style="color:#000;font-weight:bold">:</span>lts<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>imagePullPolicy<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Always<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>livenessProbe<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>failureThreshold<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">12</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>httpGet<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>path<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/login<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>port<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">8080</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>scheme<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>HTTP<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>initialDelaySeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">30</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>periodSeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">10</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>successThreshold<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>timeoutSeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">5</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>plugins<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>simple-theme-plugin<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">0.5.1</span><span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#000;font-weight:bold">[]</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>slack<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.24</span><span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-step-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>credentials<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>display-url-api<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.3.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>junit<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.28</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>plain-credentials<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.5</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>script-security<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.59</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>structs<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">1.19</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>token-macro<span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">2.8</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>readinessProbe<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>failureThreshold<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">12</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>httpGet<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>path<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/login<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>port<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">8080</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>scheme<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>HTTP<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>initialDelaySeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">30</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>periodSeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">10</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>successThreshold<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>timeoutSeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">5</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>resources<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>limits<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>cpu<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>1500m<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>memory<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>3Gi<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>requests<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>cpu<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>memory<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>500Mi</code></pre></div> +<p>New format:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">apiVersion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins.io/v1alpha2<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>kind<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Jenkins<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>metadata<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>&lt;cr_name<span style="color:#8f5902;font-style:italic">&gt; +</span><span style="color:#8f5902;font-style:italic"> namespace: &lt;namespace&gt;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"></span>spec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>master<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>basePlugins<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>kubernetes<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1.15.7</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-job<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;2.32&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-aggregator<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;2.6&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>git<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">3.10.0</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>job-dsl<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.74&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configuration-as-code<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.19&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configuration-as-code-support<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.19&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>kubernetes-credentials-provider<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">0.12.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>containers<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins-master<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>image<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>jenkins/jenkins<span style="color:#000;font-weight:bold">:</span>lts<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>imagePullPolicy<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>Always<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>livenessProbe<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>failureThreshold<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">12</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>httpGet<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>path<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/login<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>port<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>http<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>scheme<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>HTTP<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>initialDelaySeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">30</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>periodSeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">10</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>successThreshold<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>timeoutSeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">5</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>readinessProbe<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>failureThreshold<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">3</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>httpGet<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>path<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>/login<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>port<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>http<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>scheme<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>HTTP<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>initialDelaySeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">30</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>periodSeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">10</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>successThreshold<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>timeoutSeconds<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>resources<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>limits<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>cpu<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>1500m<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>memory<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>3Gi<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>requests<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>cpu<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>memory<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>500Mi<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>plugins<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>simple-theme-plugin<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">0.5.1</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>slack<span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">2.24</span></code></pre></div> +<h2 id="update-crd-to-new-version">Update CRD to new version</h2> + +<p>New version of the Custom Resource definition for the operator needs to be applied: +-<a href="https://github.com/jenkinsci/kubernetes-operator/blob/master/deploy/crds/jenkins_v1alpha2_jenkins_crd.yaml" target="_blank">Jenkins CRD v1alpha2</a></p> + +<p>To use default CRD file:</p> + +<pre><code>kubectl -n &lt;namespace&gt; apply -f https://github.com/jenkinsci/kubernetes-operator/blob/master/deploy/crds/jenkins_v1alpha2_jenkins_crd.yaml +</code></pre> + +<h2 id="update-rbac-to-new-version">Update RBAC to new version</h2> + +<p>New operator version requires updated RBAC permissions:</p> + +<p>To use default Role file:</p> + +<pre><code>$ kubectl -n &lt;namespace&gt; apply -f https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/deploy/role.yaml +</code></pre> + +<h2 id="deploy-new-operator-manifests">Deploy new operator manifests</h2> + +<p>Replace your modified operator configuration file:</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ kubectl -n &lt;namespace&gt; replace -f jenkins.yaml</code></pre></div> +<p>Update operator version in the deployment file to <code>image: virtuslab/jenkins-operator:v0.1.0</code> and scale up, +or use the default deployment manifest:</p> + +<pre><code>$ kubectl -n &lt;namespace&gt; apply -f https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/deploy/operator.yaml +</code></pre> + + + + + + \ No newline at end of file diff --git a/docs/docs/installation/index.html b/docs/docs/installation/index.html new file mode 100644 index 00000000..0d519044 --- /dev/null +++ b/docs/docs/installation/index.html @@ -0,0 +1,572 @@ + + + + + + + + + + + + + + + + + + + + + + + +Installation | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + Installation | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

Installation

+
How to install Jenkins Operator
+ + + + +
+

This document describes installation procedure for jenkins-operator. All container images can be found at virtuslab/jenkins-operator

+ +
+ + +

Requirements

+ +

To run jenkins-operator, you will need:

+ +
    +
  • running Kubernetes cluster version 1.11+

  • + +
  • kubectl version 1.11+

  • +
+ +

Configure Custom Resource Definition

+ +

Install Jenkins Custom Resource Definition:

+
kubectl apply -f https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/deploy/crds/jenkins_v1alpha2_jenkins_crd.yaml
+

Deploy jenkins-operator

+ +

Apply Service Account and RBAC roles:

+
kubectl apply -f https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/deploy/all-in-one-v1alpha2.yaml
+

Watch jenkins-operator instance being created:

+
kubectl get pods -w
+

Now jenkins-operator should be up and running in default namespace.

+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Last modified August 5, 2019 +
+
+ +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/installation/index.xml b/docs/docs/installation/index.xml new file mode 100644 index 00000000..40f12f51 --- /dev/null +++ b/docs/docs/installation/index.xml @@ -0,0 +1,23 @@ + + + Jenkins Operator – Installation + /docs/installation/ + Recent Hugo news from gohugo.io + Hugo -- gohugo.io + Mon, 05 Aug 2019 00:00:00 +0000 + + /img/hugo.png + GoHugo.io + /docs/installation/ + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/security/index.html b/docs/docs/security/index.html new file mode 100644 index 00000000..2fe6c76b --- /dev/null +++ b/docs/docs/security/index.html @@ -0,0 +1,617 @@ + + + + + + + + + + + + + + + + + + + + + + + +Security | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + Security | Jenkins Operator + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + +
+

Security

+
Jenkins security and hardening out of the box
+ + +

By default jenkins-operator performs an initial security hardening of Jenkins instance via groovy scripts to prevent any security gaps.

+ +

Jenkins Access Control

+ +

Currently jenkins-operator generates a username and random password and stores them in a Kubernetes Secret. +However any other authorization mechanisms are possible and can be done via groovy scripts or configuration as code plugin. +For more information take a look at getting-started#jenkins-customization.

+ +

Any change to Security Realm or Authorization requires that user called jenkins-operator must have admin rights +because jenkins-operator calls Jenkins API.

+ +

Jenkins Hardening

+ +

The list below describes all the default security setting configured by the jenkins-operator: +- basic settings - use Mode.EXCLUSIVE - Jobs must specify that they want to run on master node +- enable CSRF - Cross Site Request Forgery Protection is enabled +- disable usage stats - Jenkins usage stats submitting is disabled +- enable master access control - Slave To Master Access Control is enabled +- disable old JNLP protocols - JNLP3-connect, JNLP2-connect and JNLP-connect are disabled +- disable CLI - CLI access of /cli URL is disabled +- configure kubernetes-plugin - secure configuration for Kubernetes plugin

+ +

If you would like to dig a little bit into the code, take a look here.

+ +

Jenkins API

+ +

The jenkins-operator generates and configures Basic Authentication token for Jenkins go client and stores it in a Kubernetes Secret.

+ +

Kubernetes

+ +

Kubernetes API permissions are limited by the following roles: +- jenkins-operator role
+- Jenkins Master role

+ +

Since jenkins-operator must be able to grant permission for its’ deployed Jenkins masters to spawn pods (the Jenkins Master role above), +the operator itself requires permission to create RBAC resources (the jenkins-operator role above). +Deployed this way, any subject which may create a Pod (including a Jenkins job) may +assume the jenkins-operator role by using its’ ServiceAccount, create RBAC rules, and thus escape its granted permissions. +Any namespace to which the jenkins-operator is deployed must be considered to implicitly grant all +possible permissions to any subject which can create a Pod in that namespace.

+ +

To mitigate this issue jenkins-operator should be deployed in one namespace and the Jenkins CR should be created in separate namespace. +To achieve it change watch namespace in https://github.com/jenkinsci/kubernetes-operator/blob/master/deploy/operator.yaml#L25

+ +

Setup Jenkins Operator and Jenkins in separated namespaces

+ +

You need to create two namespaces, for example we’ll call them jenkins for Jenkins and jenkins-operator for Jenkins Operator.

+
$ kubectl create ns jenkins-operator
+$ kubectl create ns jenkins
+

Next, apply the RBAC manifests for jenkins-operator namespace

+
$ kubectl -n jenkins-operator apply -f deploy/service_account.yaml
+$ kubectl -n jenkins-operator apply -f deploy/role_binding.yaml
+

Create file role_binding_jenkins.yaml in deploy folder:

+
kind: RoleBinding
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+  name: jenkins-operator
+  namespace: jenkins
+subjects:
+- kind: ServiceAccount
+  name: jenkins-operator
+  namespace: jenkins-operator
+roleRef:
+  kind: Role
+  name: jenkins-operator
+  apiGroup: rbac.authorization.k8s.io
+

Then, apply RBAC rules for jenkins namespace

+
$ kubectl -n jenkins apply -f deploy/role.yaml
+$ kubectl -n jenkins apply -f role_binding_jenkins.yaml
+

Finally, you must create operator pod by:

+
$ kubectl -n jenkins -n jenkins-operator apply -f deploy/operator.yaml
+

Report a Security Vulnerability

+ +

If you find a vulnerability or any misconfiguration in Jenkins, please report it in the issues.

+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Last modified August 5, 2019 +
+
+ +
+
+
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/security/index.xml b/docs/docs/security/index.xml new file mode 100644 index 00000000..21044b52 --- /dev/null +++ b/docs/docs/security/index.xml @@ -0,0 +1,23 @@ + + + Jenkins Operator – Security + /docs/security/ + Recent Hugo news from gohugo.io + Hugo -- gohugo.io + Mon, 05 Aug 2019 00:00:00 +0000 + + /img/hugo.png + GoHugo.io + /docs/security/ + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/favicons/android-144x144.png b/docs/favicons/android-144x144.png new file mode 100755 index 00000000..8851c09a Binary files /dev/null and b/docs/favicons/android-144x144.png differ diff --git a/docs/favicons/android-192x192.png b/docs/favicons/android-192x192.png new file mode 100755 index 00000000..94b2ad2d Binary files /dev/null and b/docs/favicons/android-192x192.png differ diff --git a/docs/favicons/android-36x36.png b/docs/favicons/android-36x36.png new file mode 100755 index 00000000..7ec5cf65 Binary files /dev/null and b/docs/favicons/android-36x36.png differ diff --git a/docs/favicons/android-48x48.png b/docs/favicons/android-48x48.png new file mode 100755 index 00000000..419a445a Binary files /dev/null and b/docs/favicons/android-48x48.png differ diff --git a/docs/favicons/android-72x72.png b/docs/favicons/android-72x72.png new file mode 100755 index 00000000..230b18fd Binary files /dev/null and b/docs/favicons/android-72x72.png differ diff --git a/docs/favicons/android-96x196.png b/docs/favicons/android-96x196.png new file mode 100755 index 00000000..8cc69897 Binary files /dev/null and b/docs/favicons/android-96x196.png differ diff --git a/docs/favicons/apple-touch-icon-180x180.png b/docs/favicons/apple-touch-icon-180x180.png new file mode 100755 index 00000000..03d0b513 Binary files /dev/null and b/docs/favicons/apple-touch-icon-180x180.png differ diff --git a/docs/favicons/favicon-1024.png b/docs/favicons/favicon-1024.png new file mode 100644 index 00000000..920f1072 Binary files /dev/null and b/docs/favicons/favicon-1024.png differ diff --git a/docs/favicons/favicon-16x16.png b/docs/favicons/favicon-16x16.png new file mode 100755 index 00000000..ce918ee3 Binary files /dev/null and b/docs/favicons/favicon-16x16.png differ diff --git a/docs/favicons/favicon-256.png b/docs/favicons/favicon-256.png new file mode 100644 index 00000000..ebd3f8c9 Binary files /dev/null and b/docs/favicons/favicon-256.png differ diff --git a/docs/favicons/favicon-32x32.png b/docs/favicons/favicon-32x32.png new file mode 100755 index 00000000..e95c80ad Binary files /dev/null and b/docs/favicons/favicon-32x32.png differ diff --git a/docs/favicons/favicon.ico b/docs/favicons/favicon.ico new file mode 100644 index 00000000..87111eba Binary files /dev/null and b/docs/favicons/favicon.ico differ diff --git a/docs/favicons/pwa-192x192.png b/docs/favicons/pwa-192x192.png new file mode 100755 index 00000000..94b2ad2d Binary files /dev/null and b/docs/favicons/pwa-192x192.png differ diff --git a/docs/favicons/pwa-512x512.png b/docs/favicons/pwa-512x512.png new file mode 100755 index 00000000..89258a4e Binary files /dev/null and b/docs/favicons/pwa-512x512.png differ diff --git a/docs/favicons/tile150x150.png b/docs/favicons/tile150x150.png new file mode 100755 index 00000000..3d0c7604 Binary files /dev/null and b/docs/favicons/tile150x150.png differ diff --git a/docs/favicons/tile310x150.png b/docs/favicons/tile310x150.png new file mode 100755 index 00000000..ed890428 Binary files /dev/null and b/docs/favicons/tile310x150.png differ diff --git a/docs/favicons/tile310x310.png b/docs/favicons/tile310x310.png new file mode 100755 index 00000000..67172b30 Binary files /dev/null and b/docs/favicons/tile310x310.png differ diff --git a/docs/favicons/tile70x70.png b/docs/favicons/tile70x70.png new file mode 100755 index 00000000..31413a2b Binary files /dev/null and b/docs/favicons/tile70x70.png differ diff --git a/docs/img/jenkins-credentials.png b/docs/img/jenkins-credentials.png new file mode 100644 index 00000000..b1017bad Binary files /dev/null and b/docs/img/jenkins-credentials.png differ diff --git a/docs/img/jenkins-seed.png b/docs/img/jenkins-seed.png new file mode 100644 index 00000000..69f4f0c7 Binary files /dev/null and b/docs/img/jenkins-seed.png differ diff --git a/docs/img/jenkins.png b/docs/img/jenkins.png new file mode 100644 index 00000000..2c63caac Binary files /dev/null and b/docs/img/jenkins.png differ diff --git a/docs/img/logo.svg b/docs/img/logo.svg new file mode 100644 index 00000000..95018636 --- /dev/null +++ b/docs/img/logo.svg @@ -0,0 +1,6512 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/img/phases.png b/docs/img/phases.png new file mode 100644 index 00000000..0e12afc0 Binary files /dev/null and b/docs/img/phases.png differ diff --git a/docs/img/reconcile.png b/docs/img/reconcile.png new file mode 100644 index 00000000..e3e22257 Binary files /dev/null and b/docs/img/reconcile.png differ diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 00000000..c420d6e2 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,280 @@ + + + + + + + + + + + + + + + + + + + + + + + +Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+ + + + + + + +
+
+
+ +
+ Logo +
+
+

Manage Jenkins in Kubernetes!

+

Deploy Jenkins Operator and configure your Jenkins instances in Kubernetes +

+ +
+
+
+
+ + + + + + + +
+
+ + Jenkins operator is a Kubernetes native operator which fully manages Jenkins on Kubernetes.
It was built with immutability and declarative configuration as code in mind.
Here are solved problems. +
+
+
+ + + + + + + +
+
+
+
+
+ +
+

Volumes handling

+

AWS EBS volume attach/detach issue when using PVC

+

+ +
+ +
+
+ +
+

Better configuration as code

+

Use groovy scripts or casc to configure your Jenkins instance

+

+ +
+ +
+
+ +
+

Security and hardening out of the box

+

Enable CSRF, disable usage stats, enable master access control and more by default

+

+ +
+ +
+
+ +
+

Handle graceful shutdown properly

+

Less chance to lose data

+

+ +
+ +
+
+ +
+

Make errors more visible for end users

+

Improve user experience by informing what has been done

+

+ +
+ +
+
+ +
+

Backup and restore for jobs history

+

Prevent job history loss

+

+ +
+ +
+
+
+ + + + + + + + +
+
+
+
+
+ +
+

Contributions welcome!

+

We do a Pull Request contributions workflow on GitHub. New users are always welcome!

+

+

Read more …

+
+ +
+
+ +
+

Documentation

+

Learning the usage of Jenkins Operator will make your life easier. After that, you can easily contribute to the project.

+

+

Read more …

+
+ +
+
+ +
+

Bugs

+

Help us work on the software by reporting or fixing bugs. Make the Jenkins Operator better.

+

+

Read more …

+
+ +
+
+
+ + + + + +
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/index.xml b/docs/index.xml new file mode 100644 index 00000000..e04f5aeb --- /dev/null +++ b/docs/index.xml @@ -0,0 +1,869 @@ + + + Jenkins Operator – Jenkins Kubernetes Operator + / + Recent Hugo news from gohugo.io + Hugo -- gohugo.io + Mon, 05 Aug 2019 00:00:00 +0000 + + /img/hugo.png + GoHugo.io + / + + + + + + + + + + + Blog: Easy documentation with Docsy + /blog/2018/10/06/easy-documentation-with-docsy/ + Sat, 06 Oct 2018 00:00:00 +0000 + + /blog/2018/10/06/easy-documentation-with-docsy/ + + + + + ]]> + + + +<p><strong>This is a typical blog post that includes images.</strong></p> + +<p>The front matter specifies the date of the blog post, its title, a short description that will be displayed on the blog landing page, and its author.</p> + +<h2 id="including-images">Including images</h2> + +<p>Here&rsquo;s an image (<code>featured-sunset-get.png</code>) that includes a byline and a caption.</p> + + + + + + + + +<div class="card rounded p-2 td-post-card mb-4 mt-4" style="max-width: 610px"> + <img class="card-img-top" src="/blog/2018/10/06/easy-documentation-with-docsy/featured-sunset-get_hu69849a7cdb847c2393a7b3a7f6061c86_387442_600x300_fill_catmullrom_smart1_2.png" width="600" height="300"> + + <div class="card-body px-0 pt-2 pb-0"> + <p class="card-text"> +Fetch and scale an image in the upcoming Hugo 0.43. +<small class="text-muted"><br/>Photo: Riona MacNamara / CC-BY-CA</small></p> + </div> + +</div> + +<p>The front matter of this post specifies properties to be assigned to all image resources:</p> + +<pre><code>resources: +- src: &quot;**.{png,jpg}&quot; + title: &quot;Image #:counter&quot; + params: + byline: &quot;Photo: Riona MacNamara / CC-BY-CA&quot; +</code></pre> + +<p>To include the image in a page, specify its details like this:</p> + +<pre><code> + + + + + + +<div class="card rounded p-2 td-post-card mb-4 mt-4" style="max-width: 610px"> + <img class="card-img-top" src="/blog/2018/10/06/easy-documentation-with-docsy/featured-sunset-get_hu69849a7cdb847c2393a7b3a7f6061c86_387442_600x300_fill_catmullrom_smart1_2.png" width="600" height="300"> + + <div class="card-body px-0 pt-2 pb-0"> + <p class="card-text"> +Fetch and scale an image in the upcoming Hugo 0.43. +<small class="text-muted"><br/>Photo: Riona MacNamara / CC-BY-CA</small></p> + </div> + +</div> +</code></pre> + +<p>The image will be rendered at the size and byline specified in the front matter.</p> + + + + + + Blog: The second blog post + /blog/2018/10/06/the-second-blog-post/ + Sat, 06 Oct 2018 00:00:00 +0000 + + /blog/2018/10/06/the-second-blog-post/ + + + + + +<p>Text can be <strong>bold</strong>, <em>italic</em>, or <del>strikethrough</del>. <a href="https://github.com" target="_blank">Links</a> should be blue with no underlines (unless hovered over).</p> + +<p>There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs.</p> + +<p>There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs.</p> + +<blockquote> +<p>There should be no margin above this first sentence.</p> + +<p>Blockquotes should be a lighter gray with a border along the left side in the secondary color.</p> + +<p>There should be no margin below this final sentence.</p> +</blockquote> + +<h2 id="first-header">First Header</h2> + +<p>This is a normal paragraph following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<p>On big screens, paragraphs and headings should not take up the full container width, but we want tables, code blocks and similar to take the full width.</p> + +<p>Lorem markdownum tuta hospes stabat; idem saxum facit quaterque repetito +occumbere, oves novem gestit haerebat frena; qui. Respicit recurvam erat: +pignora hinc reppulit nos <strong>aut</strong>, aptos, ipsa.</p> + +<p>Meae optatos <em>passa est</em> Epiros utiliter <em>Talibus niveis</em>, hoc lata, edidit. +Dixi ad aestum.</p> + +<h2 id="header-2">Header 2</h2> + +<blockquote> +<p>This is a blockquote following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> +</blockquote> + +<h3 id="header-3">Header 3</h3> + +<pre><code>This is a code block following a header. +</code></pre> + +<h4 id="header-4">Header 4</h4> + +<ul> +<li>This is an unordered list following a header.</li> +<li>This is an unordered list following a header.</li> +<li>This is an unordered list following a header.</li> +</ul> + +<h5 id="header-5">Header 5</h5> + +<ol> +<li>This is an ordered list following a header.</li> +<li>This is an ordered list following a header.</li> +<li>This is an ordered list following a header.</li> +</ol> + +<h6 id="header-6">Header 6</h6> + +<table> +<thead> +<tr> +<th>What</th> +<th>Follows</th> +</tr> +</thead> + +<tbody> +<tr> +<td>A table</td> +<td>A header</td> +</tr> + +<tr> +<td>A table</td> +<td>A header</td> +</tr> + +<tr> +<td>A table</td> +<td>A header</td> +</tr> +</tbody> +</table> + +<hr /> + +<p>There&rsquo;s a horizontal rule above and below this.</p> + +<hr /> + +<p>Here is an unordered list:</p> + +<ul> +<li>Salt-n-Pepa</li> +<li>Bel Biv DeVoe</li> +<li>Kid &lsquo;N Play</li> +</ul> + +<p>And an ordered list:</p> + +<ol> +<li>Michael Jackson</li> +<li>Michael Bolton</li> +<li>Michael Bublé</li> +</ol> + +<p>And an unordered task list:</p> + +<ul class="task-list"> +<li><label><input type="checkbox" checked disabled class="task-list-item"> Create a sample markdown document</label></li> +<li><label><input type="checkbox" checked disabled class="task-list-item"> Add task lists to it</label></li> +<li><label><input type="checkbox" disabled class="task-list-item"> Take a vacation</label></li> +</ul> + +<p>And a &ldquo;mixed&rdquo; task list:</p> + +<ul class="task-list"> +<li><label><input type="checkbox" disabled class="task-list-item"> Steal underpants</label></li> +<li>?</li> +<li><label><input type="checkbox" disabled class="task-list-item"> Profit!</label></li> +</ul> + +<p>And a nested list:</p> + +<ul> +<li>Jackson 5 + +<ul> +<li>Michael</li> +<li>Tito</li> +<li>Jackie</li> +<li>Marlon</li> +<li>Jermaine</li> +</ul></li> +<li>TMNT + +<ul> +<li>Leonardo</li> +<li>Michelangelo</li> +<li>Donatello</li> +<li>Raphael</li> +</ul></li> +</ul> + +<p>Definition lists can be used with Markdown syntax. Definition terms are bold.</p> + +<dl> +<dt>Name</dt> +<dd>Godzilla</dd> +<dt>Born</dt> +<dd>1952</dd> +<dt>Birthplace</dt> +<dd>Japan</dd> +<dt>Color</dt> +<dd>Green</dd> +</dl> + +<hr /> + +<p>Tables should have bold headings and alternating shaded rows.</p> + +<table> +<thead> +<tr> +<th>Artist</th> +<th>Album</th> +<th>Year</th> +</tr> +</thead> + +<tbody> +<tr> +<td>Michael Jackson</td> +<td>Thriller</td> +<td>1982</td> +</tr> + +<tr> +<td>Prince</td> +<td>Purple Rain</td> +<td>1984</td> +</tr> + +<tr> +<td>Beastie Boys</td> +<td>License to Ill</td> +<td>1986</td> +</tr> +</tbody> +</table> + +<p>If a table is too wide, it should scroll horizontally.</p> + +<table> +<thead> +<tr> +<th>Artist</th> +<th>Album</th> +<th>Year</th> +<th>Label</th> +<th>Awards</th> +<th>Songs</th> +</tr> +</thead> + +<tbody> +<tr> +<td>Michael Jackson</td> +<td>Thriller</td> +<td>1982</td> +<td>Epic Records</td> +<td>Grammy Award for Album of the Year, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&amp;B Album, Brit Award for Best Selling Album, Grammy Award for Best Engineered Album, Non-Classical</td> +<td>Wanna Be Startin&rsquo; Somethin&rsquo;, Baby Be Mine, The Girl Is Mine, Thriller, Beat It, Billie Jean, Human Nature, P.Y.T. (Pretty Young Thing), The Lady in My Life</td> +</tr> + +<tr> +<td>Prince</td> +<td>Purple Rain</td> +<td>1984</td> +<td>Warner Brothers Records</td> +<td>Grammy Award for Best Score Soundtrack for Visual Media, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&amp;B Album, Brit Award for Best Soundtrack/Cast Recording, Grammy Award for Best Rock Performance by a Duo or Group with Vocal</td> +<td>Let&rsquo;s Go Crazy, Take Me With U, The Beautiful Ones, Computer Blue, Darling Nikki, When Doves Cry, I Would Die 4 U, Baby I&rsquo;m a Star, Purple Rain</td> +</tr> + +<tr> +<td>Beastie Boys</td> +<td>License to Ill</td> +<td>1986</td> +<td>Mercury Records</td> +<td>noawardsbutthistablecelliswide</td> +<td>Rhymin &amp; Stealin, The New Style, She&rsquo;s Crafty, Posse in Effect, Slow Ride, Girls, (You Gotta) Fight for Your Right, No Sleep Till Brooklyn, Paul Revere, Hold It Now, Hit It, Brass Monkey, Slow and Low, Time to Get Ill</td> +</tr> +</tbody> +</table> + +<hr /> + +<p>Code snippets like <code>var foo = &quot;bar&quot;;</code> can be shown inline.</p> + +<p>Also, <code>this should vertically align</code> <del><code>with this</code></del> <del>and this</del>.</p> + +<p>Code can also be shown in a block element.</p> + +<pre><code>foo := &quot;bar&quot;; +bar := &quot;foo&quot;; +</code></pre> + +<p>Code can also use syntax highlighting.</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-go" data-lang="go"><span style="color:#204a87;font-weight:bold">func</span> <span style="color:#000">main</span><span style="color:#000;font-weight:bold">()</span> <span style="color:#000;font-weight:bold">{</span> + <span style="color:#000">input</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#4e9a06">`var foo = &#34;bar&#34;;`</span> + + <span style="color:#000">lexer</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">lexers</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Get</span><span style="color:#000;font-weight:bold">(</span><span style="color:#4e9a06">&#34;javascript&#34;</span><span style="color:#000;font-weight:bold">)</span> + <span style="color:#000">iterator</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">_</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">lexer</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Tokenise</span><span style="color:#000;font-weight:bold">(</span><span style="color:#204a87;font-weight:bold">nil</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">input</span><span style="color:#000;font-weight:bold">)</span> + <span style="color:#000">style</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">styles</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Get</span><span style="color:#000;font-weight:bold">(</span><span style="color:#4e9a06">&#34;github&#34;</span><span style="color:#000;font-weight:bold">)</span> + <span style="color:#000">formatter</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">html</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">New</span><span style="color:#000;font-weight:bold">(</span><span style="color:#000">html</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">WithLineNumbers</span><span style="color:#000;font-weight:bold">())</span> + + <span style="color:#204a87;font-weight:bold">var</span> <span style="color:#000">buff</span> <span style="color:#000">bytes</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Buffer</span> + <span style="color:#000">formatter</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Format</span><span style="color:#000;font-weight:bold">(</span><span style="color:#ce5c00;font-weight:bold">&amp;</span><span style="color:#000">buff</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">style</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">iterator</span><span style="color:#000;font-weight:bold">)</span> + + <span style="color:#000">fmt</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Println</span><span style="color:#000;font-weight:bold">(</span><span style="color:#000">buff</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">String</span><span style="color:#000;font-weight:bold">())</span> +<span style="color:#000;font-weight:bold">}</span></code></pre></div> +<pre><code>Long, single-line code blocks should not wrap. They should horizontally scroll if they are too long. This line should be long enough to demonstrate this. +</code></pre> + +<p>Inline code inside table cells should still be distinguishable.</p> + +<table> +<thead> +<tr> +<th>Language</th> +<th>Code</th> +</tr> +</thead> + +<tbody> +<tr> +<td>Javascript</td> +<td><code>var foo = &quot;bar&quot;;</code></td> +</tr> + +<tr> +<td>Ruby</td> +<td><code>foo = &quot;bar&quot;{</code></td> +</tr> +</tbody> +</table> + +<hr /> + +<p>Small images should be shown at their actual size.</p> + +<p><img src="http://placekitten.com/g/300/200/" alt="" /></p> + +<p>Large images should always scale down and fit in the content container.</p> + +<p><img src="http://placekitten.com/g/1200/800/" alt="" /></p> + +<h2 id="components">Components</h2> + +<h3 id="alerts">Alerts</h3> + +<p> + +<div class="alert alert-primary" role="alert"> + +This is an alert. +</div> + + + +<div class="alert alert-primary" role="alert"> +<h4 class="alert-heading">Note:</h4> +This is an alert with a title. +</div> + + + +<div class="alert alert-primary" role="alert"> + +This is a successful alert. +</div> + + + +<div class="alert alert-primary" role="alert"> + +This is a warning! +</div> + + + +<div class="alert alert-primary" role="alert"> +<h4 class="alert-heading">Warning!</h4> +This is a warning with a title! +</div> +</p> + +<h2 id="sizing">Sizing</h2> + +<p>Add some sections here to see how the ToC looks like. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="parameters-available">Parameters available</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="using-pixels">Using pixels</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="using-rem">Using rem</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h2 id="memory">Memory</h2> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="ram-to-use">RAM to use</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="more-is-better">More is better</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="used-ram">Used RAM</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<pre><code>This is the final element on the page and there should be no margin below this. +</code></pre> + + + + + + Blog: Another Great Release + /blog/2018/01/04/another-great-release/ + Thu, 04 Jan 2018 00:00:00 +0000 + + /blog/2018/01/04/another-great-release/ + + + + + +<p>Text can be <strong>bold</strong>, <em>italic</em>, or <del>strikethrough</del>. <a href="https://github.com" target="_blank">Links</a> should be blue with no underlines (unless hovered over).</p> + +<p>There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs.</p> + +<p>There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs.</p> + +<blockquote> +<p>There should be no margin above this first sentence.</p> + +<p>Blockquotes should be a lighter gray with a border along the left side in the secondary color.</p> + +<p>There should be no margin below this final sentence.</p> +</blockquote> + +<h2 id="first-header">First Header</h2> + +<p>This is a normal paragraph following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<p>On big screens, paragraphs and headings should not take up the full container width, but we want tables, code blocks and similar to take the full width.</p> + +<p>Lorem markdownum tuta hospes stabat; idem saxum facit quaterque repetito +occumbere, oves novem gestit haerebat frena; qui. Respicit recurvam erat: +pignora hinc reppulit nos <strong>aut</strong>, aptos, ipsa.</p> + +<p>Meae optatos <em>passa est</em> Epiros utiliter <em>Talibus niveis</em>, hoc lata, edidit. +Dixi ad aestum.</p> + +<h2 id="header-2">Header 2</h2> + +<blockquote> +<p>This is a blockquote following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> +</blockquote> + +<h3 id="header-3">Header 3</h3> + +<pre><code>This is a code block following a header. +</code></pre> + +<h4 id="header-4">Header 4</h4> + +<ul> +<li>This is an unordered list following a header.</li> +<li>This is an unordered list following a header.</li> +<li>This is an unordered list following a header.</li> +</ul> + +<h5 id="header-5">Header 5</h5> + +<ol> +<li>This is an ordered list following a header.</li> +<li>This is an ordered list following a header.</li> +<li>This is an ordered list following a header.</li> +</ol> + +<h6 id="header-6">Header 6</h6> + +<table> +<thead> +<tr> +<th>What</th> +<th>Follows</th> +</tr> +</thead> + +<tbody> +<tr> +<td>A table</td> +<td>A header</td> +</tr> + +<tr> +<td>A table</td> +<td>A header</td> +</tr> + +<tr> +<td>A table</td> +<td>A header</td> +</tr> +</tbody> +</table> + +<hr /> + +<p>There&rsquo;s a horizontal rule above and below this.</p> + +<hr /> + +<p>Here is an unordered list:</p> + +<ul> +<li>Salt-n-Pepa</li> +<li>Bel Biv DeVoe</li> +<li>Kid &lsquo;N Play</li> +</ul> + +<p>And an ordered list:</p> + +<ol> +<li>Michael Jackson</li> +<li>Michael Bolton</li> +<li>Michael Bublé</li> +</ol> + +<p>And an unordered task list:</p> + +<ul class="task-list"> +<li><label><input type="checkbox" checked disabled class="task-list-item"> Create a sample markdown document</label></li> +<li><label><input type="checkbox" checked disabled class="task-list-item"> Add task lists to it</label></li> +<li><label><input type="checkbox" disabled class="task-list-item"> Take a vacation</label></li> +</ul> + +<p>And a &ldquo;mixed&rdquo; task list:</p> + +<ul class="task-list"> +<li><label><input type="checkbox" disabled class="task-list-item"> Steal underpants</label></li> +<li>?</li> +<li><label><input type="checkbox" disabled class="task-list-item"> Profit!</label></li> +</ul> + +<p>And a nested list:</p> + +<ul> +<li>Jackson 5 + +<ul> +<li>Michael</li> +<li>Tito</li> +<li>Jackie</li> +<li>Marlon</li> +<li>Jermaine</li> +</ul></li> +<li>TMNT + +<ul> +<li>Leonardo</li> +<li>Michelangelo</li> +<li>Donatello</li> +<li>Raphael</li> +</ul></li> +</ul> + +<p>Definition lists can be used with Markdown syntax. Definition terms are bold.</p> + +<dl> +<dt>Name</dt> +<dd>Godzilla</dd> +<dt>Born</dt> +<dd>1952</dd> +<dt>Birthplace</dt> +<dd>Japan</dd> +<dt>Color</dt> +<dd>Green</dd> +</dl> + +<hr /> + +<p>Tables should have bold headings and alternating shaded rows.</p> + +<table> +<thead> +<tr> +<th>Artist</th> +<th>Album</th> +<th>Year</th> +</tr> +</thead> + +<tbody> +<tr> +<td>Michael Jackson</td> +<td>Thriller</td> +<td>1982</td> +</tr> + +<tr> +<td>Prince</td> +<td>Purple Rain</td> +<td>1984</td> +</tr> + +<tr> +<td>Beastie Boys</td> +<td>License to Ill</td> +<td>1986</td> +</tr> +</tbody> +</table> + +<p>If a table is too wide, it should scroll horizontally.</p> + +<table> +<thead> +<tr> +<th>Artist</th> +<th>Album</th> +<th>Year</th> +<th>Label</th> +<th>Awards</th> +<th>Songs</th> +</tr> +</thead> + +<tbody> +<tr> +<td>Michael Jackson</td> +<td>Thriller</td> +<td>1982</td> +<td>Epic Records</td> +<td>Grammy Award for Album of the Year, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&amp;B Album, Brit Award for Best Selling Album, Grammy Award for Best Engineered Album, Non-Classical</td> +<td>Wanna Be Startin&rsquo; Somethin&rsquo;, Baby Be Mine, The Girl Is Mine, Thriller, Beat It, Billie Jean, Human Nature, P.Y.T. (Pretty Young Thing), The Lady in My Life</td> +</tr> + +<tr> +<td>Prince</td> +<td>Purple Rain</td> +<td>1984</td> +<td>Warner Brothers Records</td> +<td>Grammy Award for Best Score Soundtrack for Visual Media, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&amp;B Album, Brit Award for Best Soundtrack/Cast Recording, Grammy Award for Best Rock Performance by a Duo or Group with Vocal</td> +<td>Let&rsquo;s Go Crazy, Take Me With U, The Beautiful Ones, Computer Blue, Darling Nikki, When Doves Cry, I Would Die 4 U, Baby I&rsquo;m a Star, Purple Rain</td> +</tr> + +<tr> +<td>Beastie Boys</td> +<td>License to Ill</td> +<td>1986</td> +<td>Mercury Records</td> +<td>noawardsbutthistablecelliswide</td> +<td>Rhymin &amp; Stealin, The New Style, She&rsquo;s Crafty, Posse in Effect, Slow Ride, Girls, (You Gotta) Fight for Your Right, No Sleep Till Brooklyn, Paul Revere, Hold It Now, Hit It, Brass Monkey, Slow and Low, Time to Get Ill</td> +</tr> +</tbody> +</table> + +<hr /> + +<p>Code snippets like <code>var foo = &quot;bar&quot;;</code> can be shown inline.</p> + +<p>Also, <code>this should vertically align</code> <del><code>with this</code></del> <del>and this</del>.</p> + +<p>Code can also be shown in a block element.</p> + +<pre><code>foo := &quot;bar&quot;; +bar := &quot;foo&quot;; +</code></pre> + +<p>Code can also use syntax highlighting.</p> +<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-go" data-lang="go"><span style="color:#204a87;font-weight:bold">func</span> <span style="color:#000">main</span><span style="color:#000;font-weight:bold">()</span> <span style="color:#000;font-weight:bold">{</span> + <span style="color:#000">input</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#4e9a06">`var foo = &#34;bar&#34;;`</span> + + <span style="color:#000">lexer</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">lexers</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Get</span><span style="color:#000;font-weight:bold">(</span><span style="color:#4e9a06">&#34;javascript&#34;</span><span style="color:#000;font-weight:bold">)</span> + <span style="color:#000">iterator</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">_</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">lexer</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Tokenise</span><span style="color:#000;font-weight:bold">(</span><span style="color:#204a87;font-weight:bold">nil</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">input</span><span style="color:#000;font-weight:bold">)</span> + <span style="color:#000">style</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">styles</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Get</span><span style="color:#000;font-weight:bold">(</span><span style="color:#4e9a06">&#34;github&#34;</span><span style="color:#000;font-weight:bold">)</span> + <span style="color:#000">formatter</span> <span style="color:#ce5c00;font-weight:bold">:=</span> <span style="color:#000">html</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">New</span><span style="color:#000;font-weight:bold">(</span><span style="color:#000">html</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">WithLineNumbers</span><span style="color:#000;font-weight:bold">())</span> + + <span style="color:#204a87;font-weight:bold">var</span> <span style="color:#000">buff</span> <span style="color:#000">bytes</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Buffer</span> + <span style="color:#000">formatter</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Format</span><span style="color:#000;font-weight:bold">(</span><span style="color:#ce5c00;font-weight:bold">&amp;</span><span style="color:#000">buff</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">style</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">iterator</span><span style="color:#000;font-weight:bold">)</span> + + <span style="color:#000">fmt</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">Println</span><span style="color:#000;font-weight:bold">(</span><span style="color:#000">buff</span><span style="color:#000;font-weight:bold">.</span><span style="color:#000">String</span><span style="color:#000;font-weight:bold">())</span> +<span style="color:#000;font-weight:bold">}</span></code></pre></div> +<pre><code>Long, single-line code blocks should not wrap. They should horizontally scroll if they are too long. This line should be long enough to demonstrate this. +</code></pre> + +<p>Inline code inside table cells should still be distinguishable.</p> + +<table> +<thead> +<tr> +<th>Language</th> +<th>Code</th> +</tr> +</thead> + +<tbody> +<tr> +<td>Javascript</td> +<td><code>var foo = &quot;bar&quot;;</code></td> +</tr> + +<tr> +<td>Ruby</td> +<td><code>foo = &quot;bar&quot;{</code></td> +</tr> +</tbody> +</table> + +<hr /> + +<p>Small images should be shown at their actual size.</p> + +<p><img src="http://placekitten.com/g/300/200/" alt="" /></p> + +<p>Large images should always scale down and fit in the content container.</p> + +<p><img src="http://placekitten.com/g/1200/800/" alt="" /></p> + +<h2 id="components">Components</h2> + +<h3 id="alerts">Alerts</h3> + +<p> + +<div class="alert alert-primary" role="alert"> + +This is an alert. +</div> + + + +<div class="alert alert-primary" role="alert"> +<h4 class="alert-heading">Note:</h4> +This is an alert with a title. +</div> + + + +<div class="alert alert-primary" role="alert"> + +This is a successful alert. +</div> + + + +<div class="alert alert-primary" role="alert"> + +This is a warning! +</div> + + + +<div class="alert alert-primary" role="alert"> +<h4 class="alert-heading">Warning!</h4> +This is a warning with a title! +</div> +</p> + +<h2 id="sizing">Sizing</h2> + +<p>Add some sections here to see how the ToC looks like. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="parameters-available">Parameters available</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="using-pixels">Using pixels</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="using-rem">Using rem</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h2 id="memory">Memory</h2> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="ram-to-use">RAM to use</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="more-is-better">More is better</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<h3 id="used-ram">Used RAM</h3> + +<p>Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.</p> + +<pre><code>This is the final element on the page and there should be no margin below this. +</code></pre> + + + + + + \ No newline at end of file diff --git a/docs/js/main.min.7b50e46a4d678dead3e0004b8f665cd640085d2539954f51d57c7346b9a92d74.js b/docs/js/main.min.7b50e46a4d678dead3e0004b8f665cd640085d2539954f51d57c7346b9a92d74.js new file mode 100644 index 00000000..8746def2 --- /dev/null +++ b/docs/js/main.min.7b50e46a4d678dead3e0004b8f665cd640085d2539954f51d57c7346b9a92d74.js @@ -0,0 +1,5 @@ +(function($){'use strict';$(function(){$('[data-toggle="tooltip"]').tooltip();$('[data-toggle="popover"]').popover();$('.popover-dismiss').popover({trigger:'focus'})});function bottomPos(element){return element.offset().top+element.outerHeight();} +$(function(){var promo=$(".js-td-cover");if(!promo.length){return} +var promoOffset=bottomPos(promo);var navbarOffset=$('.js-navbar-scroll').offset().top;var threshold=Math.ceil($('.js-navbar-scroll').outerHeight());if((promoOffset-navbarOffset)code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#222}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#222}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media(min-width:576px){.container{max-width:540px}}@media(min-width:768px){.container{max-width:720px}}@media(min-width:992px){.container{max-width:960px}}@media(min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col,.col-auto,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm,.col-sm-auto,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md,.col-md-auto,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg,.col-lg-auto,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-webkit-flex:0 0 8.33333333%;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{-webkit-box-flex:0;-webkit-flex:0 0 16.66666667%;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-webkit-flex:0 0 33.33333333%;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-5{-webkit-box-flex:0;-webkit-flex:0 0 41.66666667%;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-webkit-flex:0 0 58.33333333%;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{-webkit-box-flex:0;-webkit-flex:0 0 66.66666667%;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-webkit-flex:0 0 83.33333333%;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-11{-webkit-box-flex:0;-webkit-flex:0 0 91.66666667%;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media(min-width:576px){.col-sm{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-webkit-flex:0 0 8.33333333%;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{-webkit-box-flex:0;-webkit-flex:0 0 16.66666667%;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-webkit-flex:0 0 33.33333333%;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{-webkit-box-flex:0;-webkit-flex:0 0 41.66666667%;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-webkit-flex:0 0 58.33333333%;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{-webkit-box-flex:0;-webkit-flex:0 0 66.66666667%;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-webkit-flex:0 0 83.33333333%;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{-webkit-box-flex:0;-webkit-flex:0 0 91.66666667%;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media(min-width:768px){.col-md{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-webkit-flex:0 0 8.33333333%;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{-webkit-box-flex:0;-webkit-flex:0 0 16.66666667%;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-webkit-flex:0 0 33.33333333%;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{-webkit-box-flex:0;-webkit-flex:0 0 41.66666667%;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-webkit-flex:0 0 58.33333333%;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{-webkit-box-flex:0;-webkit-flex:0 0 66.66666667%;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-webkit-flex:0 0 83.33333333%;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{-webkit-box-flex:0;-webkit-flex:0 0 91.66666667%;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media(min-width:992px){.col-lg{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-webkit-flex:0 0 8.33333333%;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{-webkit-box-flex:0;-webkit-flex:0 0 16.66666667%;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-webkit-flex:0 0 33.33333333%;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{-webkit-box-flex:0;-webkit-flex:0 0 41.66666667%;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-webkit-flex:0 0 58.33333333%;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{-webkit-box-flex:0;-webkit-flex:0 0 66.66666667%;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-webkit-flex:0 0 83.33333333%;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{-webkit-box-flex:0;-webkit-flex:0 0 91.66666667%;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media(min-width:1200px){.col-xl{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-webkit-flex:0 0 8.33333333%;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{-webkit-box-flex:0;-webkit-flex:0 0 16.66666667%;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-webkit-flex:0 0 33.33333333%;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{-webkit-box-flex:0;-webkit-flex:0 0 41.66666667%;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-webkit-flex:0 0 58.33333333%;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{-webkit-box-flex:0;-webkit-flex:0 0 66.66666667%;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-webkit-flex:0 0 83.33333333%;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{-webkit-box-flex:0;-webkit-flex:0 0 91.66666667%;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}.table,.td-box .row.section>table,.td-content>table{width:100%;margin-bottom:1rem;background-color:transparent}.table th,.td-box .row.section>table th,.td-content>table th,.table td,.td-box .row.section>table td,.td-content>table td{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th,.td-box .row.section>table thead th,.td-content>table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody,.td-box .row.section>table tbody+tbody,.td-content>table tbody+tbody{border-top:2px solid #dee2e6}.table .table,.td-box .row.section>table .table,.td-content>table .table,.table .td-box .row.section>table,.td-box .table .row.section>table,.td-box .row.section>table .row.section>table,.td-content>table .td-box .row.section>table,.td-box .td-content>table .row.section>table,.table .td-content>table,.td-box .row.section>table .td-content>table,.td-content>table .td-content>table{background-color:#fff}.table-sm th,.table-sm td{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered th,.table-bordered td{border:1px solid #dee2e6}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-borderless th,.table-borderless td,.table-borderless thead th,.table-borderless tbody+tbody{border:0}.table-striped tbody tr:nth-of-type(odd),.td-box .row.section>table tbody tr:nth-of-type(odd),.td-content>table tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>th,.table-primary>td{background-color:#c0e5cc}.table-hover .table-primary:hover{background-color:#aedebd}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#aedebd}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#ffe6c5}.table-hover .table-secondary:hover{background-color:#ffdbac}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#ffdbac}.table-success,.table-success>th,.table-success>td{background-color:#c7d8ff}.table-hover .table-success:hover{background-color:#aec6ff}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#aec6ff}.table-info,.table-info>th,.table-info>td{background-color:#edf6f6}.table-hover .table-info:hover{background-color:#dceeee}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#dceeee}.table-warning,.table-warning>th,.table-warning>td{background-color:#fad5d1}.table-hover .table-warning:hover{background-color:#f8c0ba}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#f8c0ba}.table-danger,.table-danger>th,.table-danger>td{background-color:#fad5d1}.table-hover .table-danger:hover{background-color:#f8c0ba}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f8c0ba}.table-light,.table-light>th,.table-light>td{background-color:#f3fcfa}.table-hover .table-light:hover{background-color:#dff7f2}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#dff7f2}.table-dark,.table-dark>th,.table-dark>td{background-color:#cac9cd}.table-hover .table-dark:hover{background-color:#bdbcc1}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#bdbcc1}.table-active,.table-active>th,.table-active>td{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th,.td-box .row.section>table .thead-dark th,.td-content>table .thead-dark th{color:#fff;background-color:#222;border-color:#353535}.table .thead-light th,.td-box .row.section>table .thead-light th,.td-content>table .thead-light th{color:#495057;background-color:#eee;border-color:#dee2e6}.table-dark{color:#fff;background-color:#222}.table-dark th,.table-dark td,.table-dark thead th{border-color:#353535}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd),.td-box .row.section>table.table-dark tbody tr:nth-of-type(odd),.td-content>table.table-dark tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media(max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media(max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media(max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media(max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive,.td-box .row.section>table,.td-content>table{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered,.td-box .row.section>table>.table-bordered,.td-content>table>.table-bordered{border:0}.form-control{display:block;width:100%;height:-webkit-calc(2.25rem + 2px);height:calc(2.25rem + 2px);padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border-radius:0;-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-o-transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{-webkit-transition:none;-o-transition:none;transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#5ee189;outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(30,161,73,.25);box-shadow:0 0 0 .2rem rgba(30,161,73,.25)}.form-control::-webkit-input-placeholder{color:#888;opacity:1}.form-control::-moz-placeholder{color:#888;opacity:1}.form-control:-ms-input-placeholder{color:#888;opacity:1}.form-control::placeholder{color:#888;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#eee;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:-webkit-calc(0.375rem + 1px);padding-top:calc(0.375rem + 1px);padding-bottom:-webkit-calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:-webkit-calc(0.5rem + 1px);padding-top:calc(0.5rem + 1px);padding-bottom:-webkit-calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:-webkit-calc(0.25rem + 1px);padding-top:calc(0.25rem + 1px);padding-bottom:-webkit-calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#222;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{height:-webkit-calc(1.8125rem + 2px);height:calc(1.8125rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.form-control-lg{height:-webkit-calc(2.875rem + 2px);height:calc(2.875rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5}select.form-control[size],select.form-control[multiple]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#888}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#3772ff}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(55,114,255,.9)}.was-validated .form-control:valid,.form-control.is-valid,.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#3772ff}.was-validated .form-control:valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{border-color:#3772ff;-webkit-box-shadow:0 0 0 .2rem rgba(55,114,255,.25);box-shadow:0 0 0 .2rem rgba(55,114,255,.25)}.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip{display:block}.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip,.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip{display:block}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#3772ff}.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip,.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip{display:block}.was-validated .custom-control-input:valid~.custom-control-label,.custom-control-input.is-valid~.custom-control-label{color:#3772ff}.was-validated .custom-control-input:valid~.custom-control-label::before,.custom-control-input.is-valid~.custom-control-label::before{background-color:#b7ccff}.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip,.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip{display:block}.was-validated .custom-control-input:valid:checked~.custom-control-label::before,.custom-control-input.is-valid:checked~.custom-control-label::before{background-color:#6a96ff}.was-validated .custom-control-input:valid:focus~.custom-control-label::before,.custom-control-input.is-valid:focus~.custom-control-label::before{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(55,114,255,.25);box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(55,114,255,.25)}.was-validated .custom-file-input:valid~.custom-file-label,.custom-file-input.is-valid~.custom-file-label{border-color:#3772ff}.was-validated .custom-file-input:valid~.custom-file-label::after,.custom-file-input.is-valid~.custom-file-label::after{border-color:inherit}.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip,.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip{display:block}.was-validated .custom-file-input:valid:focus~.custom-file-label,.custom-file-input.is-valid:focus~.custom-file-label{-webkit-box-shadow:0 0 0 .2rem rgba(55,114,255,.25);box-shadow:0 0 0 .2rem rgba(55,114,255,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#ed6a5a}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(237,106,90,.9)}.was-validated .form-control:invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#ed6a5a}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{border-color:#ed6a5a;-webkit-box-shadow:0 0 0 .2rem rgba(237,106,90,.25);box-shadow:0 0 0 .2rem rgba(237,106,90,.25)}.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip,.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip{display:block}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#ed6a5a}.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip,.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip{display:block}.was-validated .custom-control-input:invalid~.custom-control-label,.custom-control-input.is-invalid~.custom-control-label{color:#ed6a5a}.was-validated .custom-control-input:invalid~.custom-control-label::before,.custom-control-input.is-invalid~.custom-control-label::before{background-color:#fad2cd}.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip,.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip{display:block}.was-validated .custom-control-input:invalid:checked~.custom-control-label::before,.custom-control-input.is-invalid:checked~.custom-control-label::before{background-color:#f29488}.was-validated .custom-control-input:invalid:focus~.custom-control-label::before,.custom-control-input.is-invalid:focus~.custom-control-label::before{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(237,106,90,.25);box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(237,106,90,.25)}.was-validated .custom-file-input:invalid~.custom-file-label,.custom-file-input.is-invalid~.custom-file-label{border-color:#ed6a5a}.was-validated .custom-file-input:invalid~.custom-file-label::after,.custom-file-input.is-invalid~.custom-file-label::after{border-color:inherit}.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip,.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip{display:block}.was-validated .custom-file-input:invalid:focus~.custom-file-label,.custom-file-input.is-invalid:focus~.custom-file-label{-webkit-box-shadow:0 0 0 .2rem rgba(237,106,90,.25);box-shadow:0 0 0 .2rem rgba(237,106,90,.25)}.form-inline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media(min-width:576px){.form-inline label{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group,.form-inline .custom-select{width:auto}.form-inline .form-check{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-o-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{-webkit-transition:none;-o-transition:none;transition:none}}.btn:hover,.btn:focus{text-decoration:none}.btn:focus,.btn.focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(30,161,73,.25);box-shadow:0 0 0 .2rem rgba(30,161,73,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#1ea149;border-color:#1ea149}.btn-primary:hover{color:#fff;background-color:#18813a;border-color:#167636}.btn-primary:focus,.btn-primary.focus{-webkit-box-shadow:0 0 0 .2rem rgba(30,161,73,.5);box-shadow:0 0 0 .2rem rgba(30,161,73,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#1ea149;border-color:#1ea149}.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#167636;border-color:#146b31}.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(30,161,73,.5);box-shadow:0 0 0 .2rem rgba(30,161,73,.5)}.btn-secondary{color:#fff;background-color:#ffa630;border-color:#ffa630}.btn-secondary:hover{color:#fff;background-color:#ff960a;border-color:#fc9000}.btn-secondary:focus,.btn-secondary.focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,166,48,.5);box-shadow:0 0 0 .2rem rgba(255,166,48,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#ffa630;border-color:#ffa630}.btn-secondary:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#fc9000;border-color:#ef8800}.btn-secondary:not(:disabled):not(.disabled):active:focus,.btn-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,166,48,.5);box-shadow:0 0 0 .2rem rgba(255,166,48,.5)}.btn-success{color:#fff;background-color:#3772ff;border-color:#3772ff}.btn-success:hover{color:#fff;background-color:#1157ff;border-color:#044eff}.btn-success:focus,.btn-success.focus{-webkit-box-shadow:0 0 0 .2rem rgba(55,114,255,.5);box-shadow:0 0 0 .2rem rgba(55,114,255,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#3772ff;border-color:#3772ff}.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#044eff;border-color:#0049f6}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(55,114,255,.5);box-shadow:0 0 0 .2rem rgba(55,114,255,.5)}.btn-info{color:#222;background-color:#c0e0de;border-color:#c0e0de}.btn-info:hover{color:#fff;background-color:#a6d3d1;border-color:#9ecfcc}.btn-info:focus,.btn-info.focus{-webkit-box-shadow:0 0 0 .2rem rgba(192,224,222,.5);box-shadow:0 0 0 .2rem rgba(192,224,222,.5)}.btn-info.disabled,.btn-info:disabled{color:#222;background-color:#c0e0de;border-color:#c0e0de}.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#9ecfcc;border-color:#95cbc8}.btn-info:not(:disabled):not(.disabled):active:focus,.btn-info:not(:disabled):not(.disabled).active:focus,.show>.btn-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(192,224,222,.5);box-shadow:0 0 0 .2rem rgba(192,224,222,.5)}.btn-warning{color:#fff;background-color:#ed6a5a;border-color:#ed6a5a}.btn-warning:hover{color:#fff;background-color:#e94b38;border-color:#e8402c}.btn-warning:focus,.btn-warning.focus{-webkit-box-shadow:0 0 0 .2rem rgba(237,106,90,.5);box-shadow:0 0 0 .2rem rgba(237,106,90,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#fff;background-color:#ed6a5a;border-color:#ed6a5a}.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#e8402c;border-color:#e73621}.btn-warning:not(:disabled):not(.disabled):active:focus,.btn-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(237,106,90,.5);box-shadow:0 0 0 .2rem rgba(237,106,90,.5)}.btn-danger{color:#fff;background-color:#ed6a5a;border-color:#ed6a5a}.btn-danger:hover{color:#fff;background-color:#e94b38;border-color:#e8402c}.btn-danger:focus,.btn-danger.focus{-webkit-box-shadow:0 0 0 .2rem rgba(237,106,90,.5);box-shadow:0 0 0 .2rem rgba(237,106,90,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#ed6a5a;border-color:#ed6a5a}.btn-danger:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#e8402c;border-color:#e73621}.btn-danger:not(:disabled):not(.disabled):active:focus,.btn-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(237,106,90,.5);box-shadow:0 0 0 .2rem rgba(237,106,90,.5)}.btn-light{color:#222;background-color:#d3f3ee;border-color:#d3f3ee}.btn-light:hover{color:#222;background-color:#b5ebe2;border-color:#abe8df}.btn-light:focus,.btn-light.focus{-webkit-box-shadow:0 0 0 .2rem rgba(211,243,238,.5);box-shadow:0 0 0 .2rem rgba(211,243,238,.5)}.btn-light.disabled,.btn-light:disabled{color:#222;background-color:#d3f3ee;border-color:#d3f3ee}.btn-light:not(:disabled):not(.disabled):active,.btn-light:not(:disabled):not(.disabled).active,.show>.btn-light.dropdown-toggle{color:#222;background-color:#abe8df;border-color:#a1e5db}.btn-light:not(:disabled):not(.disabled):active:focus,.btn-light:not(:disabled):not(.disabled).active:focus,.show>.btn-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(211,243,238,.5);box-shadow:0 0 0 .2rem rgba(211,243,238,.5)}.btn-dark{color:#fff;background-color:#403f4c;border-color:#403f4c}.btn-dark:hover{color:#fff;background-color:#2e2e37;border-color:#292830}.btn-dark:focus,.btn-dark.focus{-webkit-box-shadow:0 0 0 .2rem rgba(64,63,76,.5);box-shadow:0 0 0 .2rem rgba(64,63,76,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#403f4c;border-color:#403f4c}.btn-dark:not(:disabled):not(.disabled):active,.btn-dark:not(:disabled):not(.disabled).active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#292830;border-color:#232229}.btn-dark:not(:disabled):not(.disabled):active:focus,.btn-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(64,63,76,.5);box-shadow:0 0 0 .2rem rgba(64,63,76,.5)}.btn-outline-primary{color:#1ea149;background-color:transparent;background-image:none;border-color:#1ea149}.btn-outline-primary:hover{color:#fff;background-color:#1ea149;border-color:#1ea149}.btn-outline-primary:focus,.btn-outline-primary.focus{-webkit-box-shadow:0 0 0 .2rem rgba(30,161,73,.5);box-shadow:0 0 0 .2rem rgba(30,161,73,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#1ea149;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled):active,.btn-outline-primary:not(:disabled):not(.disabled).active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#1ea149;border-color:#1ea149}.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(30,161,73,.5);box-shadow:0 0 0 .2rem rgba(30,161,73,.5)}.btn-outline-secondary{color:#ffa630;background-color:transparent;background-image:none;border-color:#ffa630}.btn-outline-secondary:hover{color:#fff;background-color:#ffa630;border-color:#ffa630}.btn-outline-secondary:focus,.btn-outline-secondary.focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,166,48,.5);box-shadow:0 0 0 .2rem rgba(255,166,48,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#ffa630;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled):active,.btn-outline-secondary:not(:disabled):not(.disabled).active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#ffa630;border-color:#ffa630}.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,166,48,.5);box-shadow:0 0 0 .2rem rgba(255,166,48,.5)}.btn-outline-success{color:#3772ff;background-color:transparent;background-image:none;border-color:#3772ff}.btn-outline-success:hover{color:#fff;background-color:#3772ff;border-color:#3772ff}.btn-outline-success:focus,.btn-outline-success.focus{-webkit-box-shadow:0 0 0 .2rem rgba(55,114,255,.5);box-shadow:0 0 0 .2rem rgba(55,114,255,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#3772ff;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled):active,.btn-outline-success:not(:disabled):not(.disabled).active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#3772ff;border-color:#3772ff}.btn-outline-success:not(:disabled):not(.disabled):active:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(55,114,255,.5);box-shadow:0 0 0 .2rem rgba(55,114,255,.5)}.btn-outline-info{color:#c0e0de;background-color:transparent;background-image:none;border-color:#c0e0de}.btn-outline-info:hover{color:#222;background-color:#c0e0de;border-color:#c0e0de}.btn-outline-info:focus,.btn-outline-info.focus{-webkit-box-shadow:0 0 0 .2rem rgba(192,224,222,.5);box-shadow:0 0 0 .2rem rgba(192,224,222,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#c0e0de;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled):active,.btn-outline-info:not(:disabled):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle{color:#222;background-color:#c0e0de;border-color:#c0e0de}.btn-outline-info:not(:disabled):not(.disabled):active:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(192,224,222,.5);box-shadow:0 0 0 .2rem rgba(192,224,222,.5)}.btn-outline-warning{color:#ed6a5a;background-color:transparent;background-image:none;border-color:#ed6a5a}.btn-outline-warning:hover{color:#fff;background-color:#ed6a5a;border-color:#ed6a5a}.btn-outline-warning:focus,.btn-outline-warning.focus{-webkit-box-shadow:0 0 0 .2rem rgba(237,106,90,.5);box-shadow:0 0 0 .2rem rgba(237,106,90,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ed6a5a;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled):active,.btn-outline-warning:not(:disabled):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#ed6a5a;border-color:#ed6a5a}.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(237,106,90,.5);box-shadow:0 0 0 .2rem rgba(237,106,90,.5)}.btn-outline-danger{color:#ed6a5a;background-color:transparent;background-image:none;border-color:#ed6a5a}.btn-outline-danger:hover{color:#fff;background-color:#ed6a5a;border-color:#ed6a5a}.btn-outline-danger:focus,.btn-outline-danger.focus{-webkit-box-shadow:0 0 0 .2rem rgba(237,106,90,.5);box-shadow:0 0 0 .2rem rgba(237,106,90,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#ed6a5a;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled):active,.btn-outline-danger:not(:disabled):not(.disabled).active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#ed6a5a;border-color:#ed6a5a}.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(237,106,90,.5);box-shadow:0 0 0 .2rem rgba(237,106,90,.5)}.btn-outline-light{color:#d3f3ee;background-color:transparent;background-image:none;border-color:#d3f3ee}.btn-outline-light:hover{color:#222;background-color:#d3f3ee;border-color:#d3f3ee}.btn-outline-light:focus,.btn-outline-light.focus{-webkit-box-shadow:0 0 0 .2rem rgba(211,243,238,.5);box-shadow:0 0 0 .2rem rgba(211,243,238,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#d3f3ee;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled):active,.btn-outline-light:not(:disabled):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle{color:#222;background-color:#d3f3ee;border-color:#d3f3ee}.btn-outline-light:not(:disabled):not(.disabled):active:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(211,243,238,.5);box-shadow:0 0 0 .2rem rgba(211,243,238,.5)}.btn-outline-dark{color:#403f4c;background-color:transparent;background-image:none;border-color:#403f4c}.btn-outline-dark:hover{color:#fff;background-color:#403f4c;border-color:#403f4c}.btn-outline-dark:focus,.btn-outline-dark.focus{-webkit-box-shadow:0 0 0 .2rem rgba(64,63,76,.5);box-shadow:0 0 0 .2rem rgba(64,63,76,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#403f4c;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled):active,.btn-outline-dark:not(:disabled):not(.disabled).active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#403f4c;border-color:#403f4c}.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(64,63,76,.5);box-shadow:0 0 0 .2rem rgba(64,63,76,.5)}.btn-link{font-weight:400;color:#eaaa2c;background-color:transparent}.btn-link:hover{color:#fec555;text-decoration:none;background-color:transparent;border-color:transparent}.btn-link:focus,.btn-link.focus{text-decoration:none;border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link:disabled,.btn-link.disabled{color:#888;pointer-events:none}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:0}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:0}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{-webkit-transition:none;-o-transition:none;transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{-webkit-transition:none;-o-transition:none;transition:none}}.dropup,.dropright,.dropdown,.dropleft{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#222;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15)}.dropdown-menu-right{right:0;left:auto}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=top],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #eee}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#222;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#151515;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#1ea149}.dropdown-item.disabled,.dropdown-item:disabled{color:#888;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#888;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#222}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover{z-index:1}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.custom-select,.input-group>.custom-file{position:relative;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.form-control+.form-control,.input-group>.form-control+.custom-select,.input-group>.form-control+.custom-file,.input-group>.custom-select+.form-control,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.custom-file,.input-group>.custom-file+.form-control,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.custom-file{margin-left:-1px}.input-group>.form-control:focus,.input-group>.custom-select:focus,.input-group>.custom-file .custom-file-input:focus~.custom-file-label{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-file{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.input-group-prepend,.input-group-append{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.input-group-prepend .btn,.input-group-append .btn{position:relative;z-index:2}.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.input-group-text,.input-group-append .input-group-text+.btn{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#eee;border:1px solid #ccc}.input-group-text input[type=radio],.input-group-text input[type=checkbox]{margin-top:0}.input-group-lg>.form-control,.input-group-lg>.input-group-prepend>.input-group-text,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-append>.btn{height:-webkit-calc(2.875rem + 2px);height:calc(2.875rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5}.input-group-sm>.form-control,.input-group-sm>.input-group-prepend>.input-group-text,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-append>.btn{height:-webkit-calc(1.8125rem + 2px);height:calc(1.8125rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#1ea149}.custom-control-input:focus~.custom-control-label::before{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(30,161,73,.25);box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(30,161,73,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#89e9a8}.custom-control-input:disabled~.custom-control-label{color:#888}.custom-control-input:disabled~.custom-control-label::before{background-color:#eee}.custom-control-label{position:relative;margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:50%;-webkit-background-size:50% 50%;background-size:50% 50%}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#1ea149}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4IDgiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik02LjU2NC43NWwtMy41OSAzLjYxMi0xLjUzOC0xLjU1TDAgNC4yNiAyLjk3NCA3LjI1IDggMi4xOTN6Ii8+PC9zdmc+)}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#1ea149}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0IDQiPjxwYXRoIHN0cm9rZT0iI2ZmZiIgZD0iTTAgMmg0Ii8+PC9zdmc+)}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(30,161,73,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(30,161,73,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#1ea149}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9Ii00IC00IDggOCI+PGNpcmNsZSByPSIzIiBmaWxsPSIjZmZmIi8+PC9zdmc+)}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(30,161,73,.5)}.custom-select{display:inline-block;width:100%;height:-webkit-calc(2.25rem + 2px);height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0IDUiPjxwYXRoIGZpbGw9IiMzMzMiIGQ9Ik0yIDAgMCAyaDR6bTAgNUwwIDNoNHoiLz48L3N2Zz4=) no-repeat 100% .75rem 50%;-webkit-background-size:8px 10px;background-size:8px 10px;border:1px solid #ccc;border-radius:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#5ee189;outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(94,225,137,.5);box-shadow:0 0 0 .2rem rgba(94,225,137,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#888;background-color:#eee}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:-webkit-calc(1.8125rem + 2px);height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:-webkit-calc(2.875rem + 2px);height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:-webkit-calc(2.25rem + 2px);height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:-webkit-calc(2.25rem + 2px);height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#5ee189;-webkit-box-shadow:0 0 0 .2rem rgba(30,161,73,.25);box-shadow:0 0 0 .2rem rgba(30,161,73,.25)}.custom-file-input:focus~.custom-file-label::after{border-color:#5ee189}.custom-file-input:disabled~.custom-file-label{background-color:#eee}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:-webkit-calc(2.25rem + 2px);height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ccc}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:2.25rem;padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#eee;border-left:1px solid #ccc}.custom-range{width:100%;padding-left:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:none}.custom-range:focus::-webkit-slider-thumb{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(30,161,73,.25);box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(30,161,73,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(30,161,73,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(30,161,73,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#1ea149;border:0;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-o-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;-o-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#89e9a8}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#1ea149;border:0;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-o-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-webkit-transition:none;-o-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#89e9a8}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#1ea149;border:0;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-o-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-webkit-transition:none;-o-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#89e9a8}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6}.custom-control-label::before,.custom-file-label,.custom-select{-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-o-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{-webkit-transition:none;-o-transition:none;transition:none}}.nav{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:hover,.nav-link:focus{text-decoration:none}.nav-link.disabled{color:#888}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#eee #eee #dee2e6}.nav-tabs .nav-link.disabled{color:#888;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#1ea149}.nav-fill .nav-item{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-nav{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent}.navbar-toggler:hover,.navbar-toggler:focus{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat 50%;-webkit-background-size:100% 100%;background-size:100% 100%}@media(max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media(min-width:576px){.navbar-expand-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important;-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media(max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media(min-width:768px){.navbar-expand-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important;-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media(max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media(min-width:992px){.navbar-expand-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important;-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media(max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media(min-width:1200px){.navbar-expand-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important;-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important;-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMzAgMzAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggc3Ryb2tlPSJyZ2JhKDAsIDAsIDAsIDAuNSkiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIGQ9Ik00IDdoMjJNNCAxNWgyMk00IDIzaDIyIi8+PC9zdmc+)}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:#fff}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:#fff;border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMzAgMzAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBkPSJNNCA3aDIyTTQgMTVoMjJNNCAyM2gyMiIvPjwvc3ZnPg==)}.navbar-dark .navbar-text{color:#fff}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card,.td-content .highlight{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125)}.card>hr,.td-content .highlight>hr{margin-right:0;margin-left:0}.card-body{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%}.card-img-top{width:100%}.card-img-bottom{width:100%}.card-deck{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.card-deck .card,.card-deck .td-content .highlight,.td-content .card-deck .highlight{margin-bottom:15px}@media(min-width:576px){.card-deck{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card,.card-deck .td-content .highlight,.td-content .card-deck .highlight{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1 0 0%;-ms-flex:1 0 0%;flex:1 0 0%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.card-group>.card,.td-content .card-group>.highlight{margin-bottom:15px}@media(min-width:576px){.card-group{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card,.td-content .card-group>.highlight{-webkit-box-flex:1;-webkit-flex:1 0 0%;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card,.td-content .card-group>.highlight+.card,.td-content .card-group>.card+.highlight,.td-content .card-group>.highlight+.highlight{margin-left:0;border-left:0}}.card-columns .card,.card-columns .td-content .highlight,.td-content .card-columns .highlight{margin-bottom:.75rem}@media(min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card,.card-columns .td-content .highlight,.td-content .card-columns .highlight{display:inline-block;width:100%}}.accordion .card:not(:first-of-type):not(:last-of-type),.accordion .td-content .highlight:not(:first-of-type):not(:last-of-type),.td-content .accordion .highlight:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:not(:first-of-type) .card-header:first-child,.accordion .td-content .highlight:not(:first-of-type) .card-header:first-child,.td-content .accordion .highlight:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:first-of-type,.accordion .td-content .highlight:first-of-type,.td-content .accordion .highlight:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type,.accordion .td-content .highlight:last-of-type,.td-content .accordion .highlight:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.breadcrumb{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#eee}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#888;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#888}.pagination{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#888;background-color:#fff;border:1px solid rgba(0,0,0,.1)}.page-link:hover{z-index:2;color:#fec555;text-decoration:none;background-color:#eee;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(30,161,73,.25);box-shadow:0 0 0 .2rem rgba(30,161,73,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0}.page-item.active .page-link{z-index:1;color:#fff;background-color:#1ea149;border-color:#1a8c3f}.page-item.disabled .page-link{color:#dee2e6;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em}.badge-primary{color:#fff;background-color:#1ea149}.badge-primary[href]:hover,.badge-primary[href]:focus{color:#fff;text-decoration:none;background-color:#167636}.badge-secondary{color:#fff;background-color:#ffa630}.badge-secondary[href]:hover,.badge-secondary[href]:focus{color:#fff;text-decoration:none;background-color:#fc9000}.badge-success{color:#fff;background-color:#3772ff}.badge-success[href]:hover,.badge-success[href]:focus{color:#fff;text-decoration:none;background-color:#044eff}.badge-info{color:#222;background-color:#c0e0de}.badge-info[href]:hover,.badge-info[href]:focus{color:#222;text-decoration:none;background-color:#9ecfcc}.badge-warning{color:#fff;background-color:#ed6a5a}.badge-warning[href]:hover,.badge-warning[href]:focus{color:#fff;text-decoration:none;background-color:#e8402c}.badge-danger{color:#fff;background-color:#ed6a5a}.badge-danger[href]:hover,.badge-danger[href]:focus{color:#fff;text-decoration:none;background-color:#e8402c}.badge-light{color:#222;background-color:#d3f3ee}.badge-light[href]:hover,.badge-light[href]:focus{color:#222;text-decoration:none;background-color:#abe8df}.badge-dark{color:#fff;background-color:#403f4c}.badge-dark[href]:hover,.badge-dark[href]:focus{color:#fff;text-decoration:none;background-color:#292830}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#eee}@media(min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#105426;background-color:#d2ecdb;border-color:#c0e5cc}.alert-primary hr{border-top-color:#aedebd}.alert-primary .alert-link{color:#082913}.alert-secondary{color:#855619;background-color:#ffedd6;border-color:#ffe6c5}.alert-secondary hr{border-top-color:#ffdbac}.alert-secondary .alert-link{color:#5a3a11}.alert-success{color:#1d3b85;background-color:#d7e3ff;border-color:#c7d8ff}.alert-success hr{border-top-color:#aec6ff}.alert-success .alert-link{color:#14285b}.alert-info{color:#647473;background-color:#f2f9f8;border-color:#edf6f6}.alert-info hr{border-top-color:#dceeee}.alert-info .alert-link{color:#4c5958}.alert-warning{color:#7b372f;background-color:#fbe1de;border-color:#fad5d1}.alert-warning hr{border-top-color:#f8c0ba}.alert-warning .alert-link{color:#562721}.alert-danger{color:#7b372f;background-color:#fbe1de;border-color:#fad5d1}.alert-danger hr{border-top-color:#f8c0ba}.alert-danger .alert-link{color:#562721}.alert-light{color:#6e7e7c;background-color:#f6fdfc;border-color:#f3fcfa}.alert-light hr{border-top-color:#dff7f2}.alert-light .alert-link{color:#566361}.alert-dark{color:#212128;background-color:#d9d9db;border-color:#cac9cd}.alert-dark hr{border-top-color:#bdbcc1}.alert-dark .alert-link{color:#0a0a0c}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#eee}.progress-bar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#1ea149;-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{-webkit-transition:none;-o-transition:none;transition:none}}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:1rem 1rem;background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;-o-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#222;background-color:#eee}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:last-child{margin-bottom:0}.list-group-item:hover,.list-group-item:focus{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#888;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#1ea149;border-color:#1ea149}.list-group-flush .list-group-item{border-right:0;border-left:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#105426;background-color:#c0e5cc}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#105426;background-color:#aedebd}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#105426;border-color:#105426}.list-group-item-secondary{color:#855619;background-color:#ffe6c5}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#855619;background-color:#ffdbac}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#855619;border-color:#855619}.list-group-item-success{color:#1d3b85;background-color:#c7d8ff}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#1d3b85;background-color:#aec6ff}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#1d3b85;border-color:#1d3b85}.list-group-item-info{color:#647473;background-color:#edf6f6}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#647473;background-color:#dceeee}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#647473;border-color:#647473}.list-group-item-warning{color:#7b372f;background-color:#fad5d1}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#7b372f;background-color:#f8c0ba}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#7b372f;border-color:#7b372f}.list-group-item-danger{color:#7b372f;background-color:#fad5d1}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#7b372f;background-color:#f8c0ba}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#7b372f;border-color:#7b372f}.list-group-item-light{color:#6e7e7c;background-color:#f3fcfa}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#6e7e7c;background-color:#dff7f2}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#6e7e7c;border-color:#6e7e7c}.list-group-item-dark{color:#212128;background-color:#cac9cd}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#212128;background-color:#bdbcc1}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#212128;border-color:#212128}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:not(:disabled):not(.disabled){cursor:pointer}.close:not(:disabled):not(.disabled):hover,.close:not(:disabled):not(.disabled):focus{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out,-o-transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{-webkit-transition:none;-o-transition:none;transition:none}}.modal.show .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;min-height:-webkit-calc(100% - (0.5rem * 2));min-height:calc(100% - (0.5rem * 2))}.modal-dialog-centered::before{display:block;height:-webkit-calc(100vh - (0.5rem * 2));height:calc(100vh - (0.5rem * 2));content:""}.modal-content{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #eee}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #eee}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media(min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:-webkit-calc(100% - (1.75rem * 2));min-height:calc(100% - (1.75rem * 2))}.modal-dialog-centered::before{height:-webkit-calc(100vh - (1.75rem * 2));height:calc(100vh - (1.75rem * 2))}.modal-sm{max-width:300px}}@media(min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:open sans,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[x-placement^=top]{padding:.4rem 0}.bs-tooltip-top .arrow,.bs-tooltip-auto[x-placement^=top] .arrow{bottom:0}.bs-tooltip-top .arrow::before,.bs-tooltip-auto[x-placement^=top] .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-right,.bs-tooltip-auto[x-placement^=right]{padding:0 .4rem}.bs-tooltip-right .arrow,.bs-tooltip-auto[x-placement^=right] .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-right .arrow::before,.bs-tooltip-auto[x-placement^=right] .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[x-placement^=bottom]{padding:.4rem 0}.bs-tooltip-bottom .arrow,.bs-tooltip-auto[x-placement^=bottom] .arrow{top:0}.bs-tooltip-bottom .arrow::before,.bs-tooltip-auto[x-placement^=bottom] .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-left,.bs-tooltip-auto[x-placement^=left]{padding:0 .4rem}.bs-tooltip-left .arrow,.bs-tooltip-auto[x-placement^=left] .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-left .arrow::before,.bs-tooltip-auto[x-placement^=left] .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:open sans,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2)}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::before,.popover .arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-top,.bs-popover-auto[x-placement^=top]{margin-bottom:.5rem}.bs-popover-top .arrow,.bs-popover-auto[x-placement^=top] .arrow{bottom:-webkit-calc((0.5rem + 1px) * -1);bottom:calc((0.5rem + 1px) * -1)}.bs-popover-top .arrow::before,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::after{border-width:.5rem .5rem 0}.bs-popover-top .arrow::before,.bs-popover-auto[x-placement^=top] .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-top .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-right,.bs-popover-auto[x-placement^=right]{margin-left:.5rem}.bs-popover-right .arrow,.bs-popover-auto[x-placement^=right] .arrow{left:-webkit-calc((0.5rem + 1px) * -1);left:calc((0.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-right .arrow::before,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::after{border-width:.5rem .5rem .5rem 0}.bs-popover-right .arrow::before,.bs-popover-auto[x-placement^=right] .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-right .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::after{left:1px;border-right-color:#fff}.bs-popover-bottom,.bs-popover-auto[x-placement^=bottom]{margin-top:.5rem}.bs-popover-bottom .arrow,.bs-popover-auto[x-placement^=bottom] .arrow{top:-webkit-calc((0.5rem + 1px) * -1);top:calc((0.5rem + 1px) * -1)}.bs-popover-bottom .arrow::before,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::after{border-width:0 .5rem .5rem}.bs-popover-bottom .arrow::before,.bs-popover-auto[x-placement^=bottom] .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-bottom .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[x-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-left,.bs-popover-auto[x-placement^=left]{margin-right:.5rem}.bs-popover-left .arrow,.bs-popover-auto[x-placement^=left] .arrow{right:-webkit-calc((0.5rem + 1px) * -1);right:calc((0.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-left .arrow::before,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::after{border-width:.5rem 0 .5rem .5rem}.bs-popover-left .arrow::before,.bs-popover-auto[x-placement^=left] .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-left .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#222}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;width:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block;-webkit-transition:-webkit-transform .6s ease;transition:-webkit-transform .6s ease;-o-transition:-o-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease,-o-transform .6s ease}@media screen and (prefers-reduced-motion:reduce){.carousel-item.active,.carousel-item-next,.carousel-item-prev{-webkit-transition:none;-o-transition:none;transition:none}}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}@supports((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-item-next,.active.carousel-item-right{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}@supports((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next,.active.carousel-item-right{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.carousel-item-prev,.active.carousel-item-left{-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}@supports((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-prev,.active.carousel-item-left{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-fade .carousel-item{opacity:0;-webkit-transition-duration:.6s;-o-transition-duration:.6s;transition-duration:.6s;-webkit-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active,.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev{-webkit-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}@supports((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active,.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat 50%;-webkit-background-size:100% 100%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiNmZmYiIHZpZXdCb3g9IjAgMCA4IDgiPjxwYXRoIGQ9Ik01LjI1LjBsLTQgNCA0IDQgMS41LTEuNUw0LjI1IDRsMi41LTIuNUw1LjI1LjB6Ii8+PC9zdmc+)}.carousel-control-next-icon{background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiNmZmYiIHZpZXdCb3g9IjAgMCA4IDgiPjxwYXRoIGQ9Ik0yLjc1LjBsLTEuNSAxLjVMMy43NSA0bC0yLjUgMi41TDIuNzUgOGw0LTQtNC00eiIvPjwvc3ZnPg==)}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#1ea149!important}a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus{background-color:#167636!important}.bg-secondary{background-color:#ffa630!important}a.bg-secondary:hover,a.bg-secondary:focus,button.bg-secondary:hover,button.bg-secondary:focus{background-color:#fc9000!important}.bg-success{background-color:#3772ff!important}a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus{background-color:#044eff!important}.bg-info{background-color:#c0e0de!important}a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus{background-color:#9ecfcc!important}.bg-warning{background-color:#ed6a5a!important}a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus{background-color:#e8402c!important}.bg-danger{background-color:#ed6a5a!important}a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus{background-color:#e8402c!important}.bg-light{background-color:#d3f3ee!important}a.bg-light:hover,a.bg-light:focus,button.bg-light:hover,button.bg-light:focus{background-color:#abe8df!important}.bg-dark{background-color:#403f4c!important}a.bg-dark:hover,a.bg-dark:focus,button.bg-dark:hover,button.bg-dark:focus{background-color:#292830!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#1ea149!important}.border-secondary{border-color:#ffa630!important}.border-success{border-color:#3772ff!important}.border-info{border-color:#c0e0de!important}.border-warning{border-color:#ed6a5a!important}.border-danger{border-color:#ed6a5a!important}.border-light{border-color:#d3f3ee!important}.border-dark{border-color:#403f4c!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media(min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media(min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media(min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media(min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.85714286%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-webkit-box-flex:1!important;-webkit-flex:1 1 auto!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-webkit-box-flex:0!important;-webkit-flex-grow:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-webkit-box-flex:1!important;-webkit-flex-grow:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-webkit-flex-shrink:0!important;-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-webkit-flex-shrink:1!important;-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;align-self:stretch!important}@media(min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-webkit-box-flex:1!important;-webkit-flex:1 1 auto!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-webkit-box-flex:0!important;-webkit-flex-grow:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-webkit-box-flex:1!important;-webkit-flex-grow:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-webkit-flex-shrink:0!important;-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-webkit-flex-shrink:1!important;-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media(min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-webkit-box-flex:1!important;-webkit-flex:1 1 auto!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-webkit-box-flex:0!important;-webkit-flex-grow:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-webkit-box-flex:1!important;-webkit-flex-grow:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-webkit-flex-shrink:0!important;-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-webkit-flex-shrink:1!important;-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media(min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-webkit-box-flex:1!important;-webkit-flex:1 1 auto!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-webkit-box-flex:0!important;-webkit-flex-grow:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-webkit-box-flex:1!important;-webkit-flex-grow:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-webkit-flex-shrink:0!important;-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-webkit-flex-shrink:1!important;-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media(min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-webkit-box-flex:1!important;-webkit-flex:1 1 auto!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-webkit-box-flex:0!important;-webkit-flex-grow:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-webkit-box-flex:1!important;-webkit-flex-grow:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-webkit-flex-shrink:0!important;-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-webkit-flex-shrink:1!important;-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media(min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media(min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media(min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media(min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{-webkit-box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important;box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{-webkit-box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important;box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{-webkit-box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important;box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{-webkit-box-shadow:none!important;box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media(min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media(min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media(min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media(min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,liberation mono,courier new,monospace}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media(min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media(min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media(min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media(min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#1ea149!important}a.text-primary:hover,a.text-primary:focus{color:#167636!important}.text-secondary{color:#ffa630!important}a.text-secondary:hover,a.text-secondary:focus{color:#fc9000!important}.text-success{color:#3772ff!important}a.text-success:hover,a.text-success:focus{color:#044eff!important}.text-info{color:#c0e0de!important}a.text-info:hover,a.text-info:focus{color:#9ecfcc!important}.text-warning{color:#ed6a5a!important}a.text-warning:hover,a.text-warning:focus{color:#e8402c!important}.text-danger{color:#ed6a5a!important}a.text-danger:hover,a.text-danger:focus{color:#e8402c!important}.text-light{color:#d3f3ee!important}a.text-light:hover,a.text-light:focus{color:#abe8df!important}.text-dark{color:#403f4c!important}a.text-dark:hover,a.text-dark:focus{color:#292830!important}.text-body{color:#222!important}.text-muted{color:#888!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,*::before,*::after{text-shadow:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}pre,blockquote{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table,.td-box .row.section>table,.td-content>table{border-collapse:collapse!important}.table td,.td-box .row.section>table td,.td-content>table td,.table th,.td-box .row.section>table th,.td-content>table th{background-color:#fff!important}.table-bordered th,.table-bordered td{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#dee2e6}.table .thead-dark th,.td-box .row.section>table .thead-dark th,.td-content>table .thead-dark th{color:inherit;border-color:#dee2e6}}/*!* Font Awesome Free 5.1.1 by @fontawesome - https://fontawesome.com +* License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)*/.fa,.fas,.far,.fal,.fab{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:solid .08em #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fas.fa-pull-left,.far.fa-pull-left,.fal.fa-pull-left,.fab.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fas.fa-pull-right,.far.fa-pull-right,.fal.fa-pull-right,.fab.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;-o-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);-o-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-o-keyframes fa-spin{0%{-o-transform:rotate(0deg);transform:rotate(0deg)}100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);-o-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}.fa-flip-horizontal.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(-1,-1);-ms-transform:scale(-1,-1);-o-transform:scale(-1,-1);transform:scale(-1,-1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-open:before{content:"\f518"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-concierge-bell:before{content:"\f562"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-diagnoses:before{content:"\f470"}.fa-dice:before{content:"\f522"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-old-republic:before{content:"\f510"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poo:before{content:"\f2fe"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-r-project:before{content:"\f4f7"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skull:before{content:"\f54c"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toolbox:before{content:"\f552"}.fa-tooth:before{content:"\f5c9"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-moving:before{content:"\f4df"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}/*!* Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com +* License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)*/@font-face{font-family:'font awesome 5 free';font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:'font awesome 5 free';font-weight:900}/*!* Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com +* License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)*/@font-face{font-family:'font awesome 5 brands';font-style:normal;font-weight:400;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:'font awesome 5 brands'}.td-border-top{border:none;border-top:1px solid #eee}.td-border-none{border:none}.td-block-padding,.td-default main section{padding-top:4rem;padding-bottom:4rem}@media(min-width:768px){.td-block-padding,.td-default main section{padding-top:5rem;padding-bottom:5rem}}.td-overlay{position:relative}.td-overlay::after{content:"";position:absolute;top:0;right:0;bottom:0;left:0}.td-overlay--dark::after{background-color:rgba(64,63,76,.3)}.td-overlay--light::after{background-color:rgba(211,243,238,.3)}.td-overlay__inner{position:relative;z-index:1}@media(min-width:992px){.td-max-width-on-larger-screens,.td-content>pre,.td-content>.highlight,.td-content>.lead,.td-content>h1,.td-content>h2,.td-content>ul,.td-content>ol,.td-content>p,.td-content>blockquote,.td-content>dl dd,.td-content .footnotes,.td-content>.alert{max-width:80%}}.-bg-blue{color:#fff;background-color:#72a1e5}.-bg-blue p>a{color:#a0c0ee}.-bg-blue p>a:hover,.-bg-blue p>a:focus{color:#fec555}.-text-blue{color:#72a1e5}.-bg-indigo{color:#fff;background-color:#6610f2}.-bg-indigo p>a{color:#b8cff2}.-bg-indigo p>a:hover,.-bg-indigo p>a:focus{color:#fec555}.-text-indigo{color:#6610f2}.-bg-purple{color:#fff;background-color:#6f42c1}.-bg-purple p>a{color:#b7cff2}.-bg-purple p>a:hover,.-bg-purple p>a:focus{color:#fec555}.-text-purple{color:#6f42c1}.-bg-pink{color:#fff;background-color:#e83e8c}.-bg-pink p>a{color:#aec9f0}.-bg-pink p>a:hover,.-bg-pink p>a:focus{color:#fec555}.-text-pink{color:#e83e8c}.-bg-red{color:#fff;background-color:#dc3545}.-bg-red p>a{color:#b4cdf1}.-bg-red p>a:hover,.-bg-red p>a:focus{color:#fec555}.-text-red{color:#dc3545}.-bg-orange{color:#fff;background-color:#eaaa2c}.-bg-orange p>a{color:#b2ccf1}.-bg-orange p>a:hover,.-bg-orange p>a:focus{color:#fec555}.-text-orange{color:#eaaa2c}.-bg-yellow{color:#fff;background-color:#ffc107}.-bg-yellow p>a{color:#b7cff2}.-bg-yellow p>a:hover,.-bg-yellow p>a:focus{color:#fec555}.-text-yellow{color:#ffc107}.-bg-green{color:#fff;background-color:#28a745}.-bg-green p>a{color:#c6d9f4}.-bg-green p>a:hover,.-bg-green p>a:focus{color:#fec555}.-text-green{color:#28a745}.-bg-teal{color:#fff;background-color:#20c997}.-bg-teal p>a{color:#bfd4f3}.-bg-teal p>a:hover,.-bg-teal p>a:focus{color:#fec555}.-text-teal{color:#20c997}.-bg-cyan{color:#fff;background-color:#17a2b8}.-bg-cyan p>a{color:#c6d9f4}.-bg-cyan p>a:hover,.-bg-cyan p>a:focus{color:#fec555}.-text-cyan{color:#17a2b8}.-bg-white{color:#222;background-color:#fff}.-bg-white p>a{color:#72a1e5}.-bg-white p>a:hover,.-bg-white p>a:focus{color:#fec555}.-text-white{color:#fff}.-bg-gray{color:#fff;background-color:#888}.-bg-gray p>a{color:#b4cdf1}.-bg-gray p>a:hover,.-bg-gray p>a:focus{color:#fec555}.-text-gray{color:#888}.-bg-gray-dark{color:#fff;background-color:#333}.-bg-gray-dark p>a{color:#e3ecfa}.-bg-gray-dark p>a:hover,.-bg-gray-dark p>a:focus{color:#fec555}.-text-gray-dark{color:#333}.-bg-primary{color:#fff;background-color:#1ea149}.-bg-primary p>a{color:#cadcf5}.-bg-primary p>a:hover,.-bg-primary p>a:focus{color:#fec555}.-text-primary{color:#1ea149}.-bg-secondary{color:#fff;background-color:#ffa630}.-bg-secondary p>a{color:#abc7f0}.-bg-secondary p>a:hover,.-bg-secondary p>a:focus{color:#fec555}.-text-secondary{color:#ffa630}.-bg-success{color:#fff;background-color:#3772ff}.-bg-success p>a{color:#a9c6ef}.-bg-success p>a:hover,.-bg-success p>a:focus{color:#fec555}.-text-success{color:#3772ff}.-bg-info{color:#222;background-color:#c0e0de}.-bg-info p>a{color:#638ac1}.-bg-info p>a:hover,.-bg-info p>a:focus{color:#fec555}.-text-info{color:#c0e0de}.-bg-warning{color:#fff;background-color:#ed6a5a}.-bg-warning p>a{color:#a5c3ee}.-bg-warning p>a:hover,.-bg-warning p>a:focus{color:#fec555}.-text-warning{color:#ed6a5a}.-bg-danger{color:#fff;background-color:#ed6a5a}.-bg-danger p>a{color:#a5c3ee}.-bg-danger p>a:hover,.-bg-danger p>a:focus{color:#fec555}.-text-danger{color:#ed6a5a}.-bg-light{color:#222;background-color:#d3f3ee}.-bg-light p>a{color:#6993d0}.-bg-light p>a:hover,.-bg-light p>a:focus{color:#fec555}.-text-light{color:#d3f3ee}.-bg-dark{color:#fff;background-color:#403f4c}.-bg-dark p>a{color:#d9e5f8}.-bg-dark p>a:hover,.-bg-dark p>a:focus{color:#fec555}.-text-dark{color:#403f4c}.-bg-100{color:#222;background-color:#f8f9fa}.-bg-100 p>a{color:#709ee0}.-bg-100 p>a:hover,.-bg-100 p>a:focus{color:#fec555}.-text-100{color:#f8f9fa}.-bg-200{color:#222;background-color:#eee}.-bg-200 p>a{color:#6d99d8}.-bg-200 p>a:hover,.-bg-200 p>a:focus{color:#fec555}.-text-200{color:#eee}.-bg-300{color:#222;background-color:#dee2e6}.-bg-300 p>a{color:#6993cf}.-bg-300 p>a:hover,.-bg-300 p>a:focus{color:#fec555}.-text-300{color:#dee2e6}.-bg-400{color:#222;background-color:#ccc}.-bg-400 p>a{color:#6288be}.-bg-400 p>a:hover,.-bg-400 p>a:focus{color:#fec555}.-text-400{color:#ccc}.-bg-500{color:#fff;background-color:#adb5bd}.-bg-500 p>a{color:#9bbced}.-bg-500 p>a:hover,.-bg-500 p>a:focus{color:#fec555}.-text-500{color:#adb5bd}.-bg-600{color:#fff;background-color:#888}.-bg-600 p>a{color:#b4cdf1}.-bg-600 p>a:hover,.-bg-600 p>a:focus{color:#fec555}.-text-600{color:#888}.-bg-700{color:#fff;background-color:#495057}.-bg-700 p>a{color:#d3e2f7}.-bg-700 p>a:hover,.-bg-700 p>a:focus{color:#fec555}.-text-700{color:#495057}.-bg-800{color:#fff;background-color:#333}.-bg-800 p>a{color:#e3ecfa}.-bg-800 p>a:hover,.-bg-800 p>a:focus{color:#fec555}.-text-800{color:#333}.-bg-900{color:#fff;background-color:#222}.-bg-900 p>a{color:#ecf2fc}.-bg-900 p>a:hover,.-bg-900 p>a:focus{color:#fec555}.-text-900{color:#222}.-bg-0{color:#fff;background-color:#ffa630}.-bg-0 p>a{color:#abc7f0}.-bg-0 p>a:hover,.-bg-0 p>a:focus{color:#fec555}.-text-0{color:#ffa630}.td-box--height-min{min-height:300px}.td-box--height-med{min-height:400px}.td-box--height-max{min-height:500px}.td-box--height-full{min-height:100vh}@media(min-width:768px){.td-box--height-min{min-height:450px}.td-box--height-med{min-height:500px}.td-box--height-max{min-height:650px}}.td-box .row.section{padding-left:5rem;padding-right:5rem;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.td-box .row{padding-left:5rem;padding-right:5rem;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.td-box.linkbox{padding:5rem}.td-box--0{color:#fff;background-color:#ffa630}.td-box--0 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ffa630 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--0 p>a{color:#abc7f0}.td-box--0 p>a:hover,.td-box--0 p>a:focus{color:#fec555}.td-box--blue{color:#fff;background-color:#72a1e5}.td-box--blue .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#72a1e5 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--blue p>a{color:#a0c0ee}.td-box--blue p>a:hover,.td-box--blue p>a:focus{color:#fec555}.td-box--indigo{color:#fff;background-color:#6610f2}.td-box--indigo .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#6610f2 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--indigo p>a{color:#b8cff2}.td-box--indigo p>a:hover,.td-box--indigo p>a:focus{color:#fec555}.td-box--purple{color:#fff;background-color:#6f42c1}.td-box--purple .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#6f42c1 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--purple p>a{color:#b7cff2}.td-box--purple p>a:hover,.td-box--purple p>a:focus{color:#fec555}.td-box--pink{color:#fff;background-color:#e83e8c}.td-box--pink .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#e83e8c transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--pink p>a{color:#aec9f0}.td-box--pink p>a:hover,.td-box--pink p>a:focus{color:#fec555}.td-box--red{color:#fff;background-color:#dc3545}.td-box--red .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#dc3545 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--red p>a{color:#b4cdf1}.td-box--red p>a:hover,.td-box--red p>a:focus{color:#fec555}.td-box--orange{color:#fff;background-color:#eaaa2c}.td-box--orange .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#eaaa2c transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--orange p>a{color:#b2ccf1}.td-box--orange p>a:hover,.td-box--orange p>a:focus{color:#fec555}.td-box--yellow{color:#fff;background-color:#ffc107}.td-box--yellow .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ffc107 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--yellow p>a{color:#b7cff2}.td-box--yellow p>a:hover,.td-box--yellow p>a:focus{color:#fec555}.td-box--green{color:#fff;background-color:#28a745}.td-box--green .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#28a745 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--green p>a{color:#c6d9f4}.td-box--green p>a:hover,.td-box--green p>a:focus{color:#fec555}.td-box--teal{color:#fff;background-color:#20c997}.td-box--teal .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#20c997 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--teal p>a{color:#bfd4f3}.td-box--teal p>a:hover,.td-box--teal p>a:focus{color:#fec555}.td-box--cyan{color:#fff;background-color:#17a2b8}.td-box--cyan .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#17a2b8 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--cyan p>a{color:#c6d9f4}.td-box--cyan p>a:hover,.td-box--cyan p>a:focus{color:#fec555}.td-box--white{color:#222;background-color:#fff}.td-box--white .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#fff transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--white p>a{color:#72a1e5}.td-box--white p>a:hover,.td-box--white p>a:focus{color:#fec555}.td-box--gray{color:#fff;background-color:#888}.td-box--gray .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#888 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--gray p>a{color:#b4cdf1}.td-box--gray p>a:hover,.td-box--gray p>a:focus{color:#fec555}.td-box--gray-dark{color:#fff;background-color:#333}.td-box--gray-dark .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#333 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--gray-dark p>a{color:#e3ecfa}.td-box--gray-dark p>a:hover,.td-box--gray-dark p>a:focus{color:#fec555}.td-box--primary{color:#fff;background-color:#1ea149}.td-box--primary .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#1ea149 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--primary p>a{color:#cadcf5}.td-box--primary p>a:hover,.td-box--primary p>a:focus{color:#fec555}.td-box--secondary{color:#fff;background-color:#ffa630}.td-box--secondary .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ffa630 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--secondary p>a{color:#abc7f0}.td-box--secondary p>a:hover,.td-box--secondary p>a:focus{color:#fec555}.td-box--success{color:#fff;background-color:#3772ff}.td-box--success .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#3772ff transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--success p>a{color:#a9c6ef}.td-box--success p>a:hover,.td-box--success p>a:focus{color:#fec555}.td-box--info{color:#222;background-color:#c0e0de}.td-box--info .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#c0e0de transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--info p>a{color:#638ac1}.td-box--info p>a:hover,.td-box--info p>a:focus{color:#fec555}.td-box--warning{color:#fff;background-color:#ed6a5a}.td-box--warning .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ed6a5a transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--warning p>a{color:#a5c3ee}.td-box--warning p>a:hover,.td-box--warning p>a:focus{color:#fec555}.td-box--danger{color:#fff;background-color:#ed6a5a}.td-box--danger .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ed6a5a transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--danger p>a{color:#a5c3ee}.td-box--danger p>a:hover,.td-box--danger p>a:focus{color:#fec555}.td-box--light{color:#222;background-color:#d3f3ee}.td-box--light .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#d3f3ee transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--light p>a{color:#6993d0}.td-box--light p>a:hover,.td-box--light p>a:focus{color:#fec555}.td-box--dark{color:#fff;background-color:#403f4c}.td-box--dark .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#403f4c transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--dark p>a{color:#d9e5f8}.td-box--dark p>a:hover,.td-box--dark p>a:focus{color:#fec555}.td-box--100{color:#222;background-color:#f8f9fa}.td-box--100 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#f8f9fa transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--100 p>a{color:#709ee0}.td-box--100 p>a:hover,.td-box--100 p>a:focus{color:#fec555}.td-box--200{color:#222;background-color:#eee}.td-box--200 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#eee transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--200 p>a{color:#6d99d8}.td-box--200 p>a:hover,.td-box--200 p>a:focus{color:#fec555}.td-box--300{color:#222;background-color:#dee2e6}.td-box--300 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#dee2e6 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--300 p>a{color:#6993cf}.td-box--300 p>a:hover,.td-box--300 p>a:focus{color:#fec555}.td-box--400{color:#222;background-color:#ccc}.td-box--400 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ccc transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--400 p>a{color:#6288be}.td-box--400 p>a:hover,.td-box--400 p>a:focus{color:#fec555}.td-box--500{color:#fff;background-color:#adb5bd}.td-box--500 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#adb5bd transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--500 p>a{color:#9bbced}.td-box--500 p>a:hover,.td-box--500 p>a:focus{color:#fec555}.td-box--600{color:#fff;background-color:#888}.td-box--600 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#888 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--600 p>a{color:#b4cdf1}.td-box--600 p>a:hover,.td-box--600 p>a:focus{color:#fec555}.td-box--700{color:#fff;background-color:#495057}.td-box--700 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#495057 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--700 p>a{color:#d3e2f7}.td-box--700 p>a:hover,.td-box--700 p>a:focus{color:#fec555}.td-box--800{color:#fff;background-color:#333}.td-box--800 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#333 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--800 p>a{color:#e3ecfa}.td-box--800 p>a:hover,.td-box--800 p>a:focus{color:#fec555}.td-box--900{color:#fff;background-color:#222}.td-box--900 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#222 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--900 p>a{color:#ecf2fc}.td-box--900 p>a:hover,.td-box--900 p>a:focus{color:#fec555}.td-blog .td-rss-button{position:absolute;top:5.5rem;right:1rem;z-index:22}.td-content .highlight{margin:2rem 0;padding:1rem;background-color:#f8f9fa}.td-content .highlight pre,.td-content .highlight div{background-color:inherit!important}.td-content .highlight pre{margin:0;padding:0}.td-content p code,.td-content li>code,.td-content table code{color:inherit;padding:.2em .4em;margin:0;font-size:85%;word-break:normal;background-color:rgba(0,0,0,.05);border-radius:.25rem}.td-content p code br,.td-content li>code br,.td-content table code br{display:none}.td-content pre{word-wrap:normal;background-color:#f8f9fa;padding:1rem}.td-content pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;border:0}.td-navbar-cover{background:#1ea149}@media(min-width:768px){.td-navbar-cover{background:transparent!important}.td-navbar-cover .nav-link{text-shadow:1px 1px 2px #403f4c}}.td-navbar-cover.navbar-bg-onscroll .nav-link{text-shadow:none}.navbar-bg-onscroll{background:#1ea149!important;opacity:inherit}.td-navbar{background:#1ea149;min-height:4rem;margin:0;z-index:32}@media(min-width:768px){.td-navbar{position:fixed;top:0;width:100%}}.td-navbar .navbar-brand{text-transform:none;text-align:middle}.td-navbar .navbar-brand .nav-link{display:inline-block;margin-right:-30px}.td-navbar .navbar-brand svg{display:inline-block;margin:0 10px;height:30px}.td-navbar .nav-link{text-transform:none;font-weight:700}.td-navbar .td-search-input{border:none}.td-navbar .td-search-input::-webkit-input-placeholder{color:#fff}.td-navbar .td-search-input:-moz-placeholder{color:#fff}.td-navbar .td-search-input::-moz-placeholder{color:#fff}.td-navbar .td-search-input:-ms-input-placeholder{color:#fff}.td-navbar .dropdown{min-width:100px}@media(max-width:991.98px){.td-navbar{padding-right:.5rem;padding-left:.75rem}.td-navbar .td-navbar-nav-scroll{max-width:100%;height:2.5rem;margin-top:.25rem;overflow:hidden;font-size:.875rem}.td-navbar .td-navbar-nav-scroll .nav-link{padding-right:.25rem;padding-left:0}.td-navbar .td-navbar-nav-scroll .navbar-nav{padding-bottom:2rem;overflow-x:auto;white-space:nowrap;-webkit-overflow-scrolling:touch}}.td-sidebar-nav{padding-right:.5rem;margin-right:-15px;margin-left:-15px}@media(min-width:768px){@supports((position:-webkit-sticky) or (position:sticky)){.td-sidebar-nav{max-height:-webkit-calc(100vh - 10rem);max-height:calc(100vh - 10rem);overflow-y:auto}}}@media(min-width:768px){.td-sidebar-nav{display:block!important}}.td-sidebar-nav__section{padding-left:0}.td-sidebar-nav__section li{list-style:none}.td-sidebar-nav__section ul{padding:0;margin:0}@media(min-width:768px){.td-sidebar-nav__section>ul{padding-left:.5rem}}.td-sidebar-nav__section-title{display:block;font-weight:500}.td-sidebar-nav__section-title .active{font-weight:700}.td-sidebar-nav__section-title a{color:#222}.td-sidebar-nav .td-sidebar-link{display:block;padding-bottom:.375rem}.td-sidebar-nav .td-sidebar-link__page{color:#495057;font-weight:300}.td-sidebar-nav a:hover{color:#72a1e5;text-decoration:none}.td-sidebar-nav a.active{font-weight:700}.td-sidebar-nav .dropdown a{color:#495057}.td-sidebar-nav .dropdown .nav-link{padding:0 0 1rem}.td-sidebar{padding-bottom:1rem}@media(min-width:768px){.td-sidebar{padding-top:4rem;background-color:rgba(30,161,73,.03);padding-right:1rem;border-right:1px solid #dee2e6}}.td-sidebar__toggle{line-height:1;color:#222;margin:1rem}.td-sidebar__search{padding:1rem 15px;margin-right:-15px;margin-left:-15px}.td-sidebar__inner{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}@media(min-width:768px){@supports((position:-webkit-sticky) or (position:sticky)){.td-sidebar__inner{position:-webkit-sticky;position:sticky;top:4rem;z-index:10;height:-webkit-calc(100vh - 6rem);height:calc(100vh - 6rem)}}}@media(min-width:1200px){.td-sidebar__inner{-webkit-box-flex:0;-webkit-flex:0 1 320px;-ms-flex:0 1 320px;flex:0 1 320px}}.td-sidebar__inner .td-search-box{width:100%}.td-toc{border-left:1px solid #dee2e6;-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2;padding-top:.75rem;padding-bottom:1.5rem;vertical-align:top}@supports((position:-webkit-sticky) or (position:sticky)){.td-toc{position:-webkit-sticky;position:sticky;top:4rem;height:-webkit-calc(100vh - 10rem);height:calc(100vh - 10rem);overflow-y:auto}}.td-toc a{display:block;font-weight:300;padding-bottom:.25rem}.td-toc li{list-style:none;display:block}.td-toc li li{margin-left:.5rem}.td-toc .td-page-meta a{font-weight:500}.td-toc #TableOfContents a{color:#888}.td-toc #TableOfContents a:hover{color:#72a1e5;text-decoration:none}.td-toc ul{padding-left:0}.breadcrumb{background:0 0;padding-left:0;padding-top:0}.alert{font-weight:500;background:#fff;color:inherit;border-radius:0}.alert-primary{border-style:solid;border-color:#1ea149;border-width:0 0 0 4px}.alert-primary .alert-heading{color:#1ea149}.alert-secondary{border-style:solid;border-color:#ffa630;border-width:0 0 0 4px}.alert-secondary .alert-heading{color:#ffa630}.alert-success{border-style:solid;border-color:#3772ff;border-width:0 0 0 4px}.alert-success .alert-heading{color:#3772ff}.alert-info{border-style:solid;border-color:#c0e0de;border-width:0 0 0 4px}.alert-info .alert-heading{color:#c0e0de}.alert-warning{border-style:solid;border-color:#ed6a5a;border-width:0 0 0 4px}.alert-warning .alert-heading{color:#ed6a5a}.alert-danger{border-style:solid;border-color:#ed6a5a;border-width:0 0 0 4px}.alert-danger .alert-heading{color:#ed6a5a}.alert-light{border-style:solid;border-color:#d3f3ee;border-width:0 0 0 4px}.alert-light .alert-heading{color:#d3f3ee}.alert-dark{border-style:solid;border-color:#403f4c;border-width:0 0 0 4px}.alert-dark .alert-heading{color:#403f4c}.td-content{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.td-content p,.td-content li,.td-content td{font-weight:400}.td-content>h1{font-weight:700;margin-bottom:1rem}.td-content>h2{margin-bottom:1rem}.td-content>h2:not(:first-child){margin-top:3rem}.td-content>h2+h3{margin-top:1rem}.td-content>h3,.td-content>h4,.td-content>h5,.td-content>h6{margin-bottom:1rem;margin-top:2rem}.td-content>blockquote{padding:0 0 0 1rem;margin-bottom:1rem;color:#888;border-left:6px solid #ffa630}.td-content>ul li,.td-content>ol li{margin-bottom:.25rem}.td-content strong{font-weight:700}.td-content .alert:not(:first-child){margin-top:2rem;margin-bottom:2rem}.td-content .lead{margin-bottom:1.5rem}.td-title{margin-top:1rem;margin-bottom:.5rem}@media(min-width:576px){.td-title{font-size:3rem}}.td-search-input{background:transparent;font-family:"font awesome 5 free",open sans,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol}.td-search-input.form-control:focus{border-color:#f4fdf7;-webkit-box-shadow:0 0 0 2px #73e598;box-shadow:0 0 0 2px #73e598}.td-outer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100vh}@media(min-width:768px){.td-default main section:first-of-type{padding-top:8rem}}.td-main{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.td-main main{padding-bottom:2rem}@media(min-width:768px){.td-main main{padding-top:5.5rem}}.td-cover-block--height-min{min-height:300px}.td-cover-block--height-med{min-height:400px}.td-cover-block--height-max{min-height:500px}.td-cover-block--height-full{min-height:100vh}@media(min-width:768px){.td-cover-block--height-min{min-height:450px}.td-cover-block--height-med{min-height:500px}.td-cover-block--height-max{min-height:650px}}.td-cover-logo{margin-right:.5em}.td-cover-block{position:relative;padding-top:5rem;padding-bottom:5rem;background-repeat:no-repeat;background-position:50% 0;-webkit-background-size:cover;background-size:cover}.td-bg-arrow-wrapper{position:relative}.section-index .entry{padding:.75rem}.section-index h5{margin-bottom:0}.section-index h5 a{font-weight:700}.section-index p{margin-top:0}.pageinfo{font-weight:500;background:#f8f9fa;color:inherit;border-radius:0;margin:2rem;padding:1.5rem;padding-bottom:.5rem;width:77.5%}.pageinfo-primary{border-style:solid;border-color:#1ea149}.pageinfo-secondary{border-style:solid;border-color:#ffa630}.pageinfo-success{border-style:solid;border-color:#3772ff}.pageinfo-info{border-style:solid;border-color:#c0e0de}.pageinfo-warning{border-style:solid;border-color:#ed6a5a}.pageinfo-danger{border-style:solid;border-color:#ed6a5a}.pageinfo-light{border-style:solid;border-color:#d3f3ee}.pageinfo-dark{border-style:solid;border-color:#403f4c}footer{min-height:150px}@media(max-width:991.98px){footer{min-height:200px}}@media(min-width:768px){.td-offset-anchor:target{display:block;position:relative;top:-4rem;visibility:hidden}h2[id]:before,h3[id]:before,h4[id]:before,h5[id]:before{display:block;content:" ";margin-top:-5rem;height:5rem;visibility:hidden}} \ No newline at end of file diff --git a/docs/search/index.html b/docs/search/index.html new file mode 100644 index 00000000..c33925b0 --- /dev/null +++ b/docs/search/index.html @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + +Search Results | Jenkins Operator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+ +
+
+

Search Results

+ + + + +
+
+ + +
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/sitemap.xml b/docs/sitemap.xml new file mode 100644 index 00000000..cbeff0e9 --- /dev/null +++ b/docs/sitemap.xml @@ -0,0 +1,186 @@ + + + + + /docs/how-it-works/architecture-and-design/ + 2019-08-05T00:00:00+00:00 + + + + /docs/getting-started/v0.1.1/deploy-jenkins/ + 2019-08-05T00:00:00+00:00 + + + + /docs/getting-started/v0.2.0/deploy-jenkins/ + 2019-08-05T00:00:00+00:00 + + + + /docs/installation/ + 2019-08-05T00:00:00+00:00 + + + + /docs/getting-started/v0.1.1/configuration/ + 2019-08-05T00:00:00+00:00 + + + + /docs/getting-started/v0.2.0/configuration/ + 2019-08-05T00:00:00+00:00 + + + + /docs/getting-started/v0.1.1/customization/ + 2019-08-05T00:00:00+00:00 + + + + /docs/getting-started/v0.2.0/customization/ + 2019-08-05T00:00:00+00:00 + + + + /docs/how-it-works/ + 2019-08-05T00:00:00+00:00 + + + + /docs/getting-started/v0.1.1/aks/ + 2019-08-05T00:00:00+00:00 + + + + /docs/getting-started/v0.2.0/aks/ + 2019-08-05T00:00:00+00:00 + + + + /docs/getting-started/v0.1.1/configure-backup-and-restore/ + 2019-08-05T00:00:00+00:00 + + + + /docs/getting-started/v0.2.0/configure-backup-and-restore/ + 2019-08-05T00:00:00+00:00 + + + + /docs/getting-started/ + 2019-08-05T00:00:00+00:00 + + + + /docs/how-it-works/jenkins-docker-images/ + 2019-08-05T00:00:00+00:00 + + + + /docs/getting-started/v0.2.0/migration/ + 2019-08-05T00:00:00+00:00 + + + + /docs/getting-started/v0.1.1/ + 2019-08-05T00:00:00+00:00 + + + + /docs/getting-started/v0.2.0/ + 2019-08-05T00:00:00+00:00 + + + + /docs/ + 2019-09-03T00:00:00+00:00 + + + + /blog/news/ + 2018-10-06T00:00:00+00:00 + + + + /blog/releases/ + 2018-01-04T00:00:00+00:00 + + + + /docs/developer-guide/tools/ + 2019-08-05T00:00:00+00:00 + + + + /docs/getting-started/v0.1.1/diagnostics/ + 2019-08-05T00:00:00+00:00 + + + + /docs/getting-started/v0.2.0/diagnostics/ + 2019-08-05T00:00:00+00:00 + + + + /docs/getting-started/v0.1.1/scheme/ + 2019-08-05T00:00:00+00:00 + + + + /docs/getting-started/v0.2.0/scheme/ + 2019-08-05T00:00:00+00:00 + + + + /docs/getting-started/v0.1.1/migration-guide-v1alpha1-to-v1alpha2/ + 2019-08-05T00:00:00+00:00 + + + + /docs/security/ + 2019-08-05T00:00:00+00:00 + + + + /docs/developer-guide/ + 2019-08-05T00:00:00+00:00 + + + + / + 2019-08-05T00:00:00+00:00 + + + + /blog/2018/10/06/easy-documentation-with-docsy/ + 2018-10-06T00:00:00+00:00 + + + + /blog/2018/10/06/the-second-blog-post/ + 2018-10-06T00:00:00+00:00 + + + + /blog/2018/01/04/another-great-release/ + 2018-01-04T00:00:00+00:00 + + + + /blog/ + + + + /community/ + + + + /search/ + + + + /about/ + + + \ No newline at end of file diff --git a/docs/webfonts/fa-brands-400.eot b/docs/webfonts/fa-brands-400.eot new file mode 100644 index 00000000..9c3f23f7 Binary files /dev/null and b/docs/webfonts/fa-brands-400.eot differ diff --git a/docs/webfonts/fa-brands-400.svg b/docs/webfonts/fa-brands-400.svg new file mode 100644 index 00000000..94bf39be --- /dev/null +++ b/docs/webfonts/fa-brands-400.svg @@ -0,0 +1,1131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/webfonts/fa-brands-400.ttf b/docs/webfonts/fa-brands-400.ttf new file mode 100644 index 00000000..397a4216 Binary files /dev/null and b/docs/webfonts/fa-brands-400.ttf differ diff --git a/docs/webfonts/fa-brands-400.woff b/docs/webfonts/fa-brands-400.woff new file mode 100644 index 00000000..201203d4 Binary files /dev/null and b/docs/webfonts/fa-brands-400.woff differ diff --git a/docs/webfonts/fa-brands-400.woff2 b/docs/webfonts/fa-brands-400.woff2 new file mode 100644 index 00000000..aa1a3361 Binary files /dev/null and b/docs/webfonts/fa-brands-400.woff2 differ diff --git a/docs/webfonts/fa-regular-400.eot b/docs/webfonts/fa-regular-400.eot new file mode 100644 index 00000000..18733ca5 Binary files /dev/null and b/docs/webfonts/fa-regular-400.eot differ diff --git a/docs/webfonts/fa-regular-400.svg b/docs/webfonts/fa-regular-400.svg new file mode 100644 index 00000000..155e263b --- /dev/null +++ b/docs/webfonts/fa-regular-400.svg @@ -0,0 +1,471 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/webfonts/fa-regular-400.ttf b/docs/webfonts/fa-regular-400.ttf new file mode 100644 index 00000000..9ed2581b Binary files /dev/null and b/docs/webfonts/fa-regular-400.ttf differ diff --git a/docs/webfonts/fa-regular-400.woff b/docs/webfonts/fa-regular-400.woff new file mode 100644 index 00000000..2e2a00f0 Binary files /dev/null and b/docs/webfonts/fa-regular-400.woff differ diff --git a/docs/webfonts/fa-regular-400.woff2 b/docs/webfonts/fa-regular-400.woff2 new file mode 100644 index 00000000..5657c1a0 Binary files /dev/null and b/docs/webfonts/fa-regular-400.woff2 differ diff --git a/docs/webfonts/fa-solid-900.eot b/docs/webfonts/fa-solid-900.eot new file mode 100644 index 00000000..58c85e19 Binary files /dev/null and b/docs/webfonts/fa-solid-900.eot differ diff --git a/docs/webfonts/fa-solid-900.svg b/docs/webfonts/fa-solid-900.svg new file mode 100644 index 00000000..281ab15c --- /dev/null +++ b/docs/webfonts/fa-solid-900.svg @@ -0,0 +1,2235 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/webfonts/fa-solid-900.ttf b/docs/webfonts/fa-solid-900.ttf new file mode 100644 index 00000000..ed714085 Binary files /dev/null and b/docs/webfonts/fa-solid-900.ttf differ diff --git a/docs/webfonts/fa-solid-900.woff b/docs/webfonts/fa-solid-900.woff new file mode 100644 index 00000000..f58c4458 Binary files /dev/null and b/docs/webfonts/fa-solid-900.woff differ diff --git a/docs/webfonts/fa-solid-900.woff2 b/docs/webfonts/fa-solid-900.woff2 new file mode 100644 index 00000000..8670c4ed Binary files /dev/null and b/docs/webfonts/fa-solid-900.woff2 differ