Add website template

This commit is contained in:
Tomasz Sęk 2019-09-04 16:01:25 +02:00
parent 43be3501fd
commit d110a92f6e
No known key found for this signature in database
GPG Key ID: DC356D23F6A644D0
238 changed files with 43014 additions and 0 deletions

6
website/.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
public/
resources/
node_modules/
tech-doc-hugo

4
website/.gitmodules vendored Normal file
View File

@ -0,0 +1,4 @@
[submodule "themes/docsy"]
path = themes/docsy
url = https://github.com/google/docsy

28
website/CONTRIBUTING.md Normal file
View File

@ -0,0 +1,28 @@
# How to Contribute
We'd love to accept your patches and contributions to this project. There are
just a few small guidelines you need to follow.
## Contributor License Agreement
Contributions to this project must be accompanied by a Contributor License
Agreement. You (or your employer) retain the copyright to your contribution;
this simply gives us permission to use and redistribute your contributions as
part of the project. Head over to <https://cla.developers.google.com/> to see
your current agreements on file or to sign a new one.
You generally only need to submit a CLA once, so if you've already submitted one
(even if it was for a different project), you probably don't need to do it
again.
## Code reviews
All submissions, including submissions by project members, require review. We
use GitHub pull requests for this purpose. Consult
[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
information on using pull requests.
## Community Guidelines
This project follows
[Google's Open Source Community Guidelines](https://opensource.google.com/conduct/).

201
website/LICENSE Normal file
View File

@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

56
website/README.md Normal file
View File

@ -0,0 +1,56 @@
[Docsy](https://github.com/google/docsy) is a Hugo theme for technical documentation sites, providing easy site navigation, structure, and more. This **Docsy Example Project** uses the Docsy theme, as well as providing a skeleton documentation structure for you to use. You can either copy this project and edit it with your own content, or use the theme in your projects like any other [Hugo theme](https://gohugo.io/themes/installing-and-using-themes/).
This Docsy Example Project is hosted at [https://goldydocs.netlify.com/](https://goldydocs.netlify.com/).
You can find detailed theme instructions in the Docsy user guide: https://docsydocs.netlify.com/docs/
This is not an officially supported Google product. This project is currently maintained.
## Cloning the Docsy Example Project
The following will give you a project that is set up and ready to use (don't forget to use `--recurse-submodules` or you won't pull down some of the code you need to generate a working site). The `hugo server` command builds and serves the site. If you just want to build the site, run `hugo` instead.
```bash
git clone --recurse-submodules --depth 1 https://github.com/google/docsy-example.git
cd docsy-example
hugo server
```
The theme is included as a Git submodule:
```bash
▶ git submodule
a053131a4ebf6a59e4e8834a42368e248d98c01d themes/docsy (heads/master)
```
If you want to do SCSS edits and want to publish these, you need to install `PostCSS` (not needed for `hugo server`):
```bash
npm install
```
<!--### Cloning the Example from the Theme Project
```bash
git clone --recurse-submodules --depth 1 https://github.com/docsy.git
cd tech-doc-hugo-theme/exampleSite
HUGO_THEMESDIR="../.." hugo server
```
Note that the Hugo Theme Site requires the `exampleSite` to live in a subfolder of the theme itself. To avoid recursive duplication, the example site is added as a Git subtree:
```bash
git subtree add --prefix exampleSite https://github.com/google/docsy.git master --squash
```
To pull in changes, see `pull-deps.sh` script in the theme.-->
## Running the website locally
Once you've cloned the site repo, from the repo root folder, run:
```
hugo server
```

6988
website/assets/icons/lg.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 473 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 880 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 387 KiB

View File

@ -0,0 +1,20 @@
.pageinfo {
font-weight: $font-weight-medium;
background: $gray-100;
color: inherit;
border-radius: 0;
margin: 2rem;
padding: 1.5rem;
padding-bottom: 0.5rem;
@each $color, $value in $theme-colors {
&-#{$color} {
border-style: solid;
border-color: $value;
}
}
width: 77.5%;
}

View File

@ -0,0 +1,131 @@
/*
Bootstrap variables overrides for theme.
See https://github.com/twbs/bootstrap/pull/23260
*/
@fa-font-path : "../webfonts";
// Bootstrap flags. For more, see https://getbootstrap.com/docs/4.0/getting-started/theming/
$enable-gradients: false;
$enable-rounded: false;
$enable-shadows: false;
// Theme flags.
$td-enable-google-fonts: true;
// Theme colors
$primary: #30638E !default;
$primary-light: lighten($primary, 75%) !default;
$secondary: #FFA630 !default;
$success: #3772FF !default;
$info: #C0E0DE !default;
$warning: #ED6A5A !default;
$danger: #ED6A5A !default;
$white: #fff !default;
$light: #D3F3EE !default;
$dark: #403F4C !default;
$blue: #72A1E5 !default;
$orange: #BA5A31 !default;
$gray-100: #f8f9fa !default;
$gray-200: #eee !default;
$gray-300: #dee2e6 !default;
$gray-400: #ccc !default;
$gray-500: #adb5bd !default;
$gray-600: #888 !default;
$gray-700: #495057 !default;
$gray-800: #333 !default;
$gray-900: #222 !default;
$black: #000 !default;
$code-color: darken($secondary, 20%) !default;
// UI element colors
$border-color: $gray-300 !default;
$td-sidebar-bg-color: rgba($primary, 0.03) !default;
$td-sidebar-border-color: $border-color !default;
// Background colors for the sections on home page etc. It is a paint by number system, starting at 0, where the number is taken from the shortcode's ordinal
// if not provided by the user.
// These colors are all part of the theme palette, but the mix is fairly random to create variation. This can be overridden by the project if needed.
$td-box-colors: $secondary;
$link-color: darken($blue, 15%) !default;
$link-decoration: none !default;
$link-hover-color: darken($link-color, 15%) !default;
$link-hover-decoration: none !default;
// Fonts
$google_font_name: "Open Sans" !default;
$google_font_family: "Open+Sans:300,300i,400,400i,700,700i" !default;
$web-font-path: "https://fonts.googleapis.com/css?family=#{$google_font_family}";
$td-fonts-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
@if $td-enable-google-fonts {
$td-fonts-serif: prepend($td-fonts-serif, "#{$google_font_name}");
}
$font-family-sans-serif: $td-fonts-serif !default;
$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default;
$font-family-base: $font-family-sans-serif !default;
$font-size-base: 1rem !default;
// Font weights
$font-weight-light: 300 !default;
$font-weight-normal: 400 !default;
$font-weight-medium: 500 !default;
$font-weight-bold: 700 !default;
$font-weight-body-text: $font-weight-normal !default;
$headings-font-weight: $font-weight-medium !default;
// Heading sizes
$h1-font-size: $font-size-base * 2.25 !default;
$h2-font-size: $font-size-base * 2 !default;
$h3-font-size: $font-size-base * 1.5 !default;
$h4-font-size: $font-size-base * 1.35 !default;
$h5-font-size: $font-size-base * 1.15 !default;
$h6-font-size: $font-size-base !default;
// Display styles
$display1-weight: $font-weight-bold !default;
$display2-weight: $font-weight-bold !default;
$display3-weight: $font-weight-bold !default;
$display4-weight: $font-weight-bold !default;
$display1-size: 3rem !default;
$display2-size: 2.5rem !default;
$display3-size: 2rem !default;
$display4-size: 1.75rem !default;
// Space
$spacer: 1rem;
$td-block-space-top-base: 4 * $spacer;
$td-block-space-bottom-base: 4 * $spacer;
// Pagination
$pagination-color: $gray-600 !default;
$pagination-border-color: rgba($black, 0.1) !default;
$pagination-active-border-color: darken($primary, 5%) !default;
$pagination-disabled-color: $gray-300 !default;
// Navbar
$navbar-dark-color: rgba($white, 0.75) !default;
$navbar-dark-hover-color: rgba($white, 0.5) !default;
$navbar-dark-active-color: $white !default;
$navbar-dark-disabled-color: rgba($white, 0.25) !default;
// The yiq lightness value that determines when the lightness of color changes from "dark" to "light".
$yiq-contrasted-threshold: 200 !default;

View File

@ -0,0 +1,36 @@
/*
Bootstrap variables overrides for theme.
See https://github.com/twbs/bootstrap/pull/23260
*/
@fa-font-path : "../webfonts";
// Bootstrap flags. For more, see https://getbootstrap.com/docs/4.0/getting-started/theming/
$enable-gradients: false;
$enable-rounded: false;
$enable-shadows: false;
$primary: #1EA149 !default;
$primary-light: #F6D2A5;
$secondary: #FFA630 !default;
$success: #3772FF !default;
$info: #C0E0DE !default;
$warning: #ED6A5A !default;
$danger: #ED6A5A !default;
$white: #fff !default;
$light: #D3F3EE !default;
$dark: #403F4C !default;
$blue: #72A1E5 !default;
$orange: #EAAA2C;
$link-color: #EAAA2C;
$link-decoration: none !default;
$link-hover-color: #FEC555 !default;
$link-hover-decoration: none !default;
$navbar-dark-color: $white !default;
// $spacer: 20rem;
$td-box-colors: $dark;

134
website/config.toml Normal file
View File

@ -0,0 +1,134 @@
baseURL = "/"
title = "Jenkins Operator"
enableRobotsTXT = true
# Hugo allows theme composition (and inheritance). The precedence is from left to right.
theme = ["docsy"]
# Will give values to .Lastmod etc.
enableGitInfo = false
# Language settings
contentDir = "content/en"
defaultContentLanguage = "en"
defaultContentLanguageInSubdir = false
# Useful when translating.
enableMissingTranslationPlaceholders = true
disableKinds = ["taxonomy", "taxonomyTerm"]
# Highlighting config
pygmentsCodeFences = true
pygmentsUseClasses = false
# Use the new Chroma Go highlighter in Hugo.
pygmentsUseClassic = false
#pygmentsOptions = "linenos=table"
# See https://help.farbox.com/pygments.html
pygmentsStyle = "tango"
# First one is picked as the Twitter card image if not set on page.
#images = ["images/project-illustration.png"]
# Configure how URLs look like per section.
[permalinks]
blog = "/:section/:year/:month/:day/:slug/"
## Configuration for BlackFriday markdown parser: https://github.com/russross/blackfriday
[blackfriday]
plainIDAnchors = true
hrefTargetBlank = true
angledQuotes = false
latexDashes = true
# Image processing configuration.
[imaging]
resampleFilter = "CatmullRom"
quality = 75
anchor = "smart"
[services]
[services.googleAnalytics]
# Comment out the next line to disable GA tracking. Also disables the feature described in [params.ui.feedback].
id = "UA-00000000-0"
# Language configuration
[languages]
[languages.en]
title = "Jenkins Operator"
description = "A native operator for Kubernetes to manage Jenkins"
languageName ="English"
# Weight used for sorting.
weight = 1
# Everything below this are Site Params
[params]
copyright = "VirtusLab"
#privacy_policy = "https://policies.google.com/privacy"
# Menu title if your navbar has a versions selector to access old versions of your site.
# This menu appears only if you have at least one [params.versions] set.
version_menu = "Releases"
# Repository configuration (URLs for in-page links to opening issues and suggesting changes)
github_repo = "https://github.com/jenkinsci/kubernetes-operator"
# An optional link to a related project repo. For example, the sibling repository where your product code lives.
github_project_repo = "https://github.com/jenkinsci/kubernetes-operator"
# Specify a value here if your content directory is not in your repo's root directory
# github_subdir = ""
# Google Custom Search Engine ID. Remove or comment out to disable search.
gcs_engine_id = "011737558837375720776:fsdu1nryfng"
# User interface configuration
[params.ui]
# Enable to show the side bar menu in its compact state.
sidebar_menu_compact = false
# Set to true to disable breadcrumb navigation.
breadcrumb_disable = false
# Set to true to hide the sidebar search box (the top nav search box will still be displayed if search is enabled)
sidebar_search_disable = false
# Set to false if you don't want to display a logo (/assets/icons/logo.svg) in the top nav bar
navbar_logo = true
[params.blog]
enable = false
# Adds a H2 section titled "Feedback" to the bottom of each doc. The responses are sent to Google Analytics as events.
# This feature depends on [services.googleAnalytics] and will be disabled if "services.googleAnalytics.id" is not set.
# If you want this feature, but occasionally need to remove the "Feedback" section from a single page,
# add "hide_feedback: true" to the page's front matter.
[params.ui.feedback]
enable = false
# The responses that the user sees after clicking "yes" (the page was helpful) or "no" (the page was not helpful).
yes = 'Glad to hear it! Please <a href="https://github.com/USERNAME/REPOSITORY/issues/new">tell us how we can improve</a>.'
no = 'Sorry to hear that. Please <a href="https://github.com/USERNAME/REPOSITORY/issues/new">tell us how we can improve</a>.'
[params.links]
# End user relevant links. These will show up on left side of footer and in the community page if you have one.
#[[params.links.user]]
# name = "User mailing list"
# url = "https://example.org/mail"
# icon = "fa fa-envelope"
# desc = "Discussion and help from your fellow users"
#[[params.links.user]]
# name ="Twitter"
# url = "https://example.org/twitter"
# icon = "fab fa-twitter"
# desc = "Follow us on Twitter to get the latest news!"
#[[params.links.user]]
# name = "Stack Overflow"
# url = "https://example.org/stack"
# icon = "fab fa-stack-overflow"
# desc = "Practical questions and curated answers"
# Developer relevant links. These will show up on right side of footer and in the community page if you have one.
#[[params.links.developer]]
# name = "GitHub"
# url = "https://github.com/google/docsy"
# icon = "fab fa-github"
# desc = "Development takes place here!"

View File

@ -0,0 +1,78 @@
+++
title = "Jenkins Kubernetes Operator"
linkTitle = "Jenkins Kubernetes Operator"
+++
{{< blocks/section color="dark" >}}
<div class="col-md-1 order-md-1 hidden-xs hidden-sm hidden-md"></div>
<div class="col-md-2 col-lg-1 order-xs-first order-sm-first order-md-last text-center ">
<img src="/img/logo.svg" style="height: 110%; margin-left: -75%; margin-top: -20%; position:relative;" alt="Logo"/>
</div>
<div class="col-md-3 col-lg-8 order-xs-2 order-sm-2 order-md-2">
<h1>Manage Jenkins in Kubernetes!</h1>
<p class="lead mt-2">Deploy Jenkins Operator and configure your Jenkins instances in Kubernetes
</p>
<div class="mx-auto mt-5">
<a class="btn btn-lg btn-primary mr-3 mb-4" href="{{< relref "/docs" >}}">
Learn More <i class="fas fa-arrow-alt-circle-right ml-2"></i>
</a>
<a class="btn btn-lg btn-secondary mr-3 mb-4" href="https://github.com/jenkinsci/kubernetes-operator">
View Repository <i class="fab fa-github ml-2 "></i>
</a>
</div>
</div>
{{% /blocks/section %}}
{{% blocks/lead color="primary" %}}
Jenkins operator is a Kubernetes native operator which fully manages Jenkins on Kubernetes.<br /> It was built with immutability and declarative configuration as code in mind.<br /> Here are solved problems.
{{% /blocks/lead %}}
{{< blocks/section color="dark" >}}
{{% blocks/feature icon="fa-hdd" title="Volumes handling" %}}
AWS EBS volume attach/detach issue when using PVC
{{% /blocks/feature %}}
{{% blocks/feature icon="fas fa-cogs" title="Better configuration as code" %}}
Use groovy scripts or casc to configure your Jenkins instance
{{% /blocks/feature %}}
{{% blocks/feature icon="fas fa-shield-alt" title="Security and hardening out of the box" %}}
Enable CSRF, disable usage stats, enable master access control and more by default
{{% /blocks/feature %}}
{{% blocks/feature icon="fas fa-plug" title="Handle graceful shutdown properly" %}}
Less chance to lose data
{{% /blocks/feature %}}
{{% blocks/feature icon="fas fa-exclamation-circle" title="Make errors more visible for end users" %}}
Improve user experience by informing what has been done
{{% /blocks/feature %}}
{{% blocks/feature icon="fas fa-file-archive" title="Backup and restore for jobs history" %}}
Prevent job history loss
{{% /blocks/feature %}}
{{< /blocks/section >}}
{{< blocks/section >}}
{{% blocks/feature icon="fab fa-github" title="Contributions welcome!" url="https://github.com/jenkinsci/kubernetes-operator" %}}
We do a [Pull Request](https://github.com/jenkinsci/kubernetes-operator/pulls) contributions workflow on **GitHub**. New users are always welcome!
{{% /blocks/feature %}}
{{% blocks/feature icon="fas fa-folder-open" title="Documentation" url="/docs/" %}}
Learning the usage of Jenkins Operator will make your life easier. After that, you can easily contribute to the project.
{{% /blocks/feature %}}
{{% blocks/feature icon="fas fa-bug" title="Bugs" url="https://github.com/jenkinsci/kubernetes-operator/issues" %}}
Help us work on the software by reporting or fixing bugs. Make the Jenkins Operator better.
{{% /blocks/feature %}}
{{< /blocks/section >}}

View File

@ -0,0 +1,43 @@
---
title: What's the Jenkins Operator?
linkTitle: What's the Jenkins Operator?
menu:
main:
weight: 10
---
{{% blocks/lead color="primary" %}}
<div style="font-size: 110%;" class="col-12">
jenkins-operator is a Kubernetes native operator which fully manages Jenkins on Kubernetes. <br />It was built with immutability and declarative configuration as code in mind.
</div>
{{% /blocks/lead %}}
{{< blocks/section >}}
<div class="col-md-1 order-md-1 hidden-xs hidden-sm hidden-md"></div>
<div class="col-md-3 col-lg-1 order-xs-first order-sm-first order-md-last text-center ">
<img src="/img/logo.svg" style="height: 75%; margin-left: -75%; margin-top: 50%;" alt="Logo"/>
</div>
<div class="col-md-4 col-lg-8 order-xs-2 order-sm-2 order-md-2">
<h1>The main reason why we decided to write the <b>jenkins-operator</b> 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.</h1>
<p class="lead mt-2">
<br />
Some of the problems we want to solve:
<ul>
<li>Volumes handling (AWS EBS volume attach/detach issue when using PVC)</li>
<li>Installing plugins with incompatible versions or security vulnerabilities</li>
<li>Better configuration as code</li>
<li>Lack of end to end tests</li>
<li>Handle graceful shutdown properly</li>
<li>Security and hardening out of the box</li>
<li>Orphaned jobs with no jnlp connection</li>
<li>Make errors more visible for end users</li>
<li>Backup and restore for jobs history</li>
</ul>
</p>
</div>
{{< /blocks/section >}}

View File

@ -0,0 +1,13 @@
---
title: "Docsy Blog"
linkTitle: "Blog"
menu:
main:
weight: 30
---
This is the **blog** section. It has two categories: News and Releases.
Files in these directories will be listed in reverse chronological order.

View File

@ -0,0 +1,8 @@
---
title: "News About Docsy"
linkTitle: "News"
weight: 20
---

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 KiB

View File

@ -0,0 +1,46 @@
---
date: 2018-10-06
title: "Easy documentation with Docsy"
linkTitle: "Announcing Docsy"
description: "The Docsy Hugo theme lets project maintainers and contributors focus on content, not on reinventing a website infrastructure from scratch"
author: Riona MacNamara ([@rionam](https://twitter.com/bepsays))
resources:
- src: "**.{png,jpg}"
title: "Image #:counter"
params:
byline: "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 (`featured-sunset-get.png`) that includes a byline and a caption.
{{< imgproc sunset Fill "600x300" >}}
Fetch and scale an image in the upcoming Hugo 0.43.
{{< /imgproc >}}
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:
```
{{< imgproc sunset Fill "600x300" >}}
Fetch and scale an image in the upcoming Hugo 0.43.
{{< /imgproc >}}
```
The image will be rendered at the size and byline specified in the front matter.

View File

@ -0,0 +1,245 @@
---
title: "The second blog post"
linkTitle: "Second blog post"
date: 2018-10-06
description: >
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](https://github.com) 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. This is an ordered list following a header.
3. This is an ordered list following a header.
###### Header 6
| What | Follows |
|-----------|-----------------|
| A table | A header |
| A table | A header |
| A table | A 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. Michael Bolton
3. Michael Bublé
And an unordered task list:
- [x] Create a sample markdown document
- [x] Add task lists to it
- [ ] Take a vacation
And a "mixed" task list:
- [ ] Steal underpants
- ?
- [ ] Profit!
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.
| Artist | Album | Year |
|-------------------|-----------------|------|
| Michael Jackson | Thriller | 1982 |
| Prince | Purple Rain | 1984 |
| Beastie Boys | License to Ill | 1986 |
If a table is too wide, it should scroll horizontally.
| Artist | Album | Year | Label | Awards | Songs |
|-------------------|-----------------|------|-------------|----------|-----------|
| Michael Jackson | Thriller | 1982 | Epic Records | Grammy 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-Classical | Wanna 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 |
| Prince | Purple Rain | 1984 | Warner Brothers Records | Grammy 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 Vocal | Let'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 Boys | License to Ill | 1986 | Mercury Records | noawardsbutthistablecelliswide | Rhymin & 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.
```go
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.
| Language | Code |
|-------------|--------------------|
| Javascript | `var foo = "bar";` |
| Ruby | `foo = "bar"{` |
----------------
Small images should be shown at their actual size.
![](http://placekitten.com/g/300/200/)
Large images should always scale down and fit in the content container.
![](http://placekitten.com/g/1200/800/)
## Components
### Alerts
{{< alert >}}This is an alert.{{< /alert >}}
{{< alert title="Note:" >}}This is an alert with a title.{{< /alert >}}
{{< alert type="success" >}}This is a successful alert.{{< /alert >}}
{{< alert type="warning" >}}This is a warning!{{< /alert >}}
{{< alert type="warning" title="Warning!" >}}This is a warning with a title!{{< /alert >}}
## 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.
```

View File

@ -0,0 +1,8 @@
---
title: "New Releases"
linkTitle: "Releases"
weight: 20
---

View File

@ -0,0 +1,245 @@
---
title: "Another Great Release"
linkTitle: "Release New Features"
date: 2018-01-04
description: >
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](https://github.com) 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. This is an ordered list following a header.
3. This is an ordered list following a header.
###### Header 6
| What | Follows |
|-----------|-----------------|
| A table | A header |
| A table | A header |
| A table | A 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. Michael Bolton
3. Michael Bublé
And an unordered task list:
- [x] Create a sample markdown document
- [x] Add task lists to it
- [ ] Take a vacation
And a "mixed" task list:
- [ ] Steal underpants
- ?
- [ ] Profit!
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.
| Artist | Album | Year |
|-------------------|-----------------|------|
| Michael Jackson | Thriller | 1982 |
| Prince | Purple Rain | 1984 |
| Beastie Boys | License to Ill | 1986 |
If a table is too wide, it should scroll horizontally.
| Artist | Album | Year | Label | Awards | Songs |
|-------------------|-----------------|------|-------------|----------|-----------|
| Michael Jackson | Thriller | 1982 | Epic Records | Grammy 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-Classical | Wanna 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 |
| Prince | Purple Rain | 1984 | Warner Brothers Records | Grammy 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 Vocal | Let'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 Boys | License to Ill | 1986 | Mercury Records | noawardsbutthistablecelliswide | Rhymin & 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.
```go
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.
| Language | Code |
|-------------|--------------------|
| Javascript | `var foo = "bar";` |
| Ruby | `foo = "bar"{` |
----------------
Small images should be shown at their actual size.
![](http://placekitten.com/g/300/200/)
Large images should always scale down and fit in the content container.
![](http://placekitten.com/g/1200/800/)
## Components
### Alerts
{{< alert >}}This is an alert.{{< /alert >}}
{{< alert title="Note:" >}}This is an alert with a title.{{< /alert >}}
{{< alert type="success" >}}This is a successful alert.{{< /alert >}}
{{< alert type="warning" >}}This is a warning!{{< /alert >}}
{{< alert type="warning" title="Warning!" >}}This is a warning with a title!{{< /alert >}}
## 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.
```

View File

@ -0,0 +1,8 @@
---
title: Community
menu:
main:
weight: 40
---
<!--add blocks of content here to add more sections to the community page -->

View File

@ -0,0 +1,151 @@
---
title: "Developer Guide"
linkTitle: "Developer Guide"
weight: 60
date: 2019-08-05
description: >
Jenkins Operator for developers
---
{{% pageinfo %}}
This document explains how to setup your development environment.
{{% /pageinfo %}}
## Prerequisites
- [operator_sdk][operator_sdk] version v0.8.1
- [git][git_tool]
- [go][go_tool] version v1.12+
- [goimports, golint, checkmake and staticcheck][install_dev_tools]
- [minikube][minikube] version v1.1.0+ (preferred Hypervisor - [virtualbox][virtualbox])
- [docker][docker_tool] version 17.03+
## Clone repository and download dependencies
```bash
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:
```bash
make minikube-run EXTRA_ARGS='--minikube --local'
```
Once minikube and **jenkins-operator** are up and running, apply Jenkins custom resource:
```bash
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.
```bash
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:
```bash
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:
```bash
make test
```
### Running E2E tests on Linux
Run e2e tests with minikube:
```bash
make minikube-start
eval $(minikube docker-env)
make build e2e
```
Run the specific e2e test:
```bash
make build e2e E2E_TEST_SELECTOR='^TestConfiguration$'
```
### Running E2E tests on macOS
At first, you need to start minikube:
```bash
$ make minikube-start
$ eval $(minikube docker-env)
```
Build Docker image inside provided Linux container by:
```bash
$ make indocker
```
Build **jenkins-operator** inside container using:
```bash
$ 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:
```bash
eval $(minikube docker-env)
```
### When `pkg/apis/jenkinsio/*/jenkins_types.go` has changed
Run:
```bash
make deepcopy-gen
```
### Getting Jenkins URL and basic credentials
```bash
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
```
[dep_tool]:https://golang.github.io/dep/docs/installation.html
[git_tool]:https://git-scm.com/downloads
[go_tool]:https://golang.org/dl/
[operator_sdk]:https://github.com/operator-framework/operator-sdk
[fork_guide]:https://help.github.com/articles/fork-a-repo/
[docker_tool]:https://docs.docker.com/install/
[kubectl_tool]:https://kubernetes.io/docs/tasks/tools/install-kubectl/
[minikube]:https://kubernetes.io/docs/tasks/tools/install-minikube/
[virtualbox]:https://www.virtualbox.org/wiki/Downloads
[jenkins-operator]:../README.md
[install_dev_tools]:install_dev_tools.md

View File

@ -0,0 +1,57 @@
---
title: "Tools"
linkTitle: "Tools"
weight: 30
date: 2019-08-05
description: >
Required tools for building and running Jenkins Operator
---
{{% pageinfo %}}
This document explains how to install the Go tools used by the development process.
{{% /pageinfo %}}
## Configure environment variables
```bash
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
```

View File

@ -0,0 +1,17 @@
---
title: "Getting Started"
linkTitle: "Getting Started"
weight: 10
date: 2019-08-05
description: >
How to work with jenkins-operator
---
{{% pageinfo %}}
This document describes a getting started guide for **jenkins-operator**
{{% /pageinfo %}}
## 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](/docs/installation/) guide.

View File

@ -0,0 +1,17 @@
---
title: "v0.1.1"
linkTitle: "v0.1.1"
weight: 10
date: 2019-08-05
description: >
How to work with jenkins-operator legacy version. We recommend migration to v0.2.0 version
---
{{% pageinfo %}}
This document describes a getting started guide for **jenkins-operator** `v0.1.1` and an additional configuration.
{{% /pageinfo %}}
## 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](/docs/installation/) guide.

View File

@ -0,0 +1,24 @@
---
title: "AKS"
linkTitle: "AKS"
weight: 10
date: 2019-08-05
description: >
Additional configuration for Azure Kubernetes Service
---
Azure AKS managed Kubernetes service adds to every pod the following envs:
```yaml
- 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.

View File

@ -0,0 +1,278 @@
---
title: "Configuration"
linkTitle: "Configuration"
weight: 2
date: 2019-08-05
description: >
How to configure Jenkins with Operator
---
Jenkins operator uses [job-dsl][job-dsl] and [kubernetes-credentials-provider][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](/img/jenkins-credentials.png)
You can verify if your pipelines were successfully configured in Jenkins Seed Job console output.
![jenkins](/img/jenkins-seed.png)
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:
```bash
$ openssl genrsa -out <filename> 2048
```
or
```bash
$ 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:
```bash
$ openssl rsa -in <filename> -pubout > <filename>.pub
```
If key was generated by `ssh-keygen` the public key content is located in <filename>.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:
```yaml
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:
```yaml
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:
```yaml
command:
- bash
- -c
- /var/jenkins/scripts/init.sh && <custom-code-here> && /sbin/tini -s -- /usr/local/bin/jenkins.sh
```
[job-dsl]:https://github.com/jenkinsci/job-dsl-plugin
[kubernetes-credentials-provider]:https://jenkinsci.github.io/kubernetes-credentials-provider-plugin/

View File

@ -0,0 +1,84 @@
---
title: "Configure backup and restore"
linkTitle: "Configure backup and restore"
weight: 10
date: 2019-08-05
description: >
Prevent job history loss
---
Backup and restore is done by container sidecar.
#### Create PVC
Save to file pvc.yaml:
```yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: <pvc_name>
namespace: <namesapce>
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Gi
```
Run command:
```bash
$ kubectl -n <namesapce> create -f pvc.yaml
```
#### Configure Jenkins CR
```yaml
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
```

View File

@ -0,0 +1,116 @@
---
title: "Customization"
linkTitle: "Customization"
weight: 3
date: 2019-08-05
description: >
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-<cr_name>** ConfigMap which is automatically created by **jenkins-operator**.
**jenkins-operator** creates **jenkins-operator-user-configuration-<cr_name>** 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-<cr_name>** 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:
```yaml
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.

View File

@ -0,0 +1,91 @@
---
title: "Deploy Jenkins"
linkTitle: "Deploy Jenkins"
weight: 1
date: 2019-08-05
description: >
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.
```bash
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:
```bash
kubectl create -f jenkins_instance.yaml
```
Watch Jenkins instance being created:
```bash
kubectl get pods -w
```
Get Jenkins credentials:
```bash
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):
```bash
minikube service jenkins-operator-http-<cr_name> --url
```
Connect to Jenkins (actual Kubernetes cluster):
```bash
kubectl port-forward jenkins-<cr_name> 8080:8080
```
Then open browser with address `http://localhost:8080`.
![jenkins](/img/jenkins.png)

View File

@ -0,0 +1,42 @@
---
title: "Diagnostics"
linkTitle: "Diagnostics"
weight: 40
date: 2019-08-05
description: >
How to deal with jenkins-operator problems
---
Turn on debug in **jenkins-operator** deployment:
```bash
sed -i 's|\(args:\).*|\1\ ["--debug"\]|' deploy/operator.yaml
kubectl apply -f deploy/operator.yaml
```
Watch Kubernetes events:
```bash
kubectl get events --sort-by='{.lastTimestamp}'
```
Verify Jenkins master logs:
```bash
kubectl logs -f jenkins-<cr_name>
```
Verify jenkins-operator logs:
```bash
kubectl logs deployment/jenkins-operator
```
## Troubleshooting
Delete Jenkins master pod and wait for the new one to come up:
```bash
kubectl delete pod jenkins-<cr_name>
```

View File

@ -0,0 +1,338 @@
---
title: "Migration guide from v1alpha1 to v1alpha2"
linkTitle: "Migration guide from v1alpha1 to v1alpha2"
weight: 50
date: 2019-08-05
description: >
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:
```bash
$ kubectl -n <namespace> scale deployment.apps/jenkins-operator --replicas=0
deployment.apps/jenkins-operator scaled
```
Desired state:
```bash
$ kubectl -n <namespace> get po
No resources found.
```
## Stop Jenkins master pod
Run command:
```bash
$ 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:
```bash
$ kubectl -n <namespace> get po
No resources found.
```
## Save Jenkins CR to jenkins.yaml file
Run command:
```bash
$ 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](v0.1.1/jenkins-v1alpha2-scheme.md)
### Examples
Old format:
```yaml
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:
```yaml
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](https://github.com/jenkinsci/kubernetes-operator/blob/master/deploy/crds/jenkins_v1alpha2_jenkins_crd.yaml)
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:
```bash
$ 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
```

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,17 @@
---
title: "v0.2.0"
linkTitle: "v0.2.0"
weight: 10
date: 2019-08-05
description: >
How to work with jenkins-operator latest version
---
{{% pageinfo %}}
This document describes a getting started guide for **jenkins-operator** `v0.2.0` and an additional configuration.
{{% /pageinfo %}}
## 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](/docs/installation/) guide.

View File

@ -0,0 +1,24 @@
---
title: "AKS"
linkTitle: "AKS"
weight: 10
date: 2019-08-05
description: >
Additional configuration for Azure Kubernetes Service
---
Azure AKS managed Kubernetes service adds to every pod the following envs:
```yaml
- 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.

View File

@ -0,0 +1,308 @@
---
title: "Configuration"
linkTitle: "Configuration"
weight: 2
date: 2019-08-05
description: >
How to configure Jenkins with Operator
---
## Configure Seed Jobs and Pipelines
Jenkins operator uses [job-dsl][job-dsl] and [kubernetes-credentials-provider][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](/img/jenkins-credentials.png)
You can verify if your pipelines were successfully configured in Jenkins Seed Job console output.
![jenkins](/img/jenkins-seed.png)
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:
```bash
$ openssl genrsa -out <filename> 2048
```
or
```bash
$ 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:
```bash
$ openssl rsa -in <filename> -pubout > <filename>.pub
```
If key was generated by `ssh-keygen` the public key content is located in <filename>.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](https://kubernetes.io/docs/concepts/containers/images/?origin_team=T42NTAGHM#creating-a-secret-with-a-docker-config).
### Docker Hub Configuration
To use Docker Hub additional steps are required.
Edit the previously created secret:
```bash
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"
}
}
}
```
[job-dsl]:https://github.com/jenkinsci/job-dsl-plugin
[kubernetes-credentials-provider]:https://jenkinsci.github.io/kubernetes-credentials-provider-plugin/

View File

@ -0,0 +1,86 @@
---
title: "Configure backup and restore"
linkTitle: "Configure backup and restore"
weight: 10
date: 2019-08-05
description: >
Prevent job history loss
---
Backup and restore is done by container sidecar.
### PVC
#### Create PVC
Save to file pvc.yaml:
```yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: <pvc_name>
namespace: <namesapce>
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Gi
```
Run command:
```bash
$ kubectl -n <namesapce> create -f pvc.yaml
```
#### Configure Jenkins CR
```yaml
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
```

View File

@ -0,0 +1,186 @@
---
title: "Customization"
linkTitle: "Customization"
weight: 3
date: 2019-08-05
description: >
How to customize Jenkins
---
Jenkins can be customized using groovy scripts or [configuration as code plugin](https://github.com/jenkinsci/configuration-as-code-plugin).
By using [ConfigMap](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-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:
```yaml
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`:
```yaml
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](https://kubernetes.io/docs/concepts/configuration/secret/) with for eg. `jenkins-conf-secrets` name.
```yaml
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`.
```yaml
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:
```yaml
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:
```yaml
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:
```yaml
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.

View File

@ -0,0 +1,89 @@
---
title: "Deploy Jenkins"
linkTitle: "Deploy Jenkins"
weight: 1
date: 2019-08-05
description: >
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.
```bash
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:
```bash
kubectl create -f jenkins_instance.yaml
```
Watch Jenkins instance being created:
```bash
kubectl get pods -w
```
Get Jenkins credentials:
```bash
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):
```bash
minikube service jenkins-operator-http-<cr_name> --url
```
Connect to Jenkins (actual Kubernetes cluster):
```bash
kubectl port-forward jenkins-<cr_name> 8080:8080
```
Then open browser with address `http://localhost:8080`.
![jenkins](/img/jenkins.png)

View File

@ -0,0 +1,42 @@
---
title: "Diagnostics"
linkTitle: "Diagnostics"
weight: 40
date: 2019-08-05
description: >
How to deal with jenkins-operator problems
---
Turn on debug in **jenkins-operator** deployment:
```bash
sed -i 's|\(args:\).*|\1\ ["--debug"\]|' deploy/operator.yaml
kubectl apply -f deploy/operator.yaml
```
Watch Kubernetes events:
```bash
kubectl get events --sort-by='{.lastTimestamp}'
```
Verify Jenkins master logs:
```bash
kubectl logs -f jenkins-<cr_name>
```
Verify jenkins-operator logs:
```bash
kubectl logs deployment/jenkins-operator
```
## Troubleshooting
Delete Jenkins master pod and wait for the new one to come up:
```bash
kubectl delete pod jenkins-<cr_name>
```

View File

@ -0,0 +1,39 @@
---
title: "Migration from v0.1.1"
linkTitle: "Migration from v0.1.1"
weight: 10
date: 2019-08-05
description: >
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:
```yaml
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.
```bash
$ kubectl -n logs deployment/jenkins-operator
```

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,13 @@
---
title: "How it works"
linkTitle: "How it works"
weight: 8
date: 2019-08-05
description: >
How Jenkins Operator works
---
{{% pageinfo %}}
This document describes a high level overview how jenkins-operator works.
{{% /pageinfo %}}

View File

@ -0,0 +1,33 @@
---
title: "Architecture and design"
linkTitle: "Architecture and design"
weight: 1
date: 2019-08-05
description: >
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](/img/reconcile.png)
**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](/img/phases.png)
## 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.

View File

@ -0,0 +1,11 @@
---
title: "Jenkins Docker Images"
linkTitle: "Jenkins Docker Images"
weight: 10
date: 2019-08-05
description: >
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.

View File

@ -0,0 +1,44 @@
---
title: "Installation"
linkTitle: "Installation"
weight: 1
date: 2019-08-05
description: >
How to install Jenkins Operator
---
{{% pageinfo %}}
This document describes installation procedure for jenkins-operator. All container images can be found at virtuslab/jenkins-operator
{{% /pageinfo %}}
## 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:
```bash
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:
```bash
kubectl apply -f https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/deploy/all-in-one-v1alpha2.yaml
```
Watch **jenkins-operator** instance being created:
```bash
kubectl get pods -w
```
Now **jenkins-operator** should be up and running in `default` namespace.

View File

@ -0,0 +1,99 @@
---
title: "Security"
linkTitle: "Security"
weight: 50
date: 2019-08-05
description: >
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](v0.1.1/getting-started.md#jenkins-customisation).
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](../pkg/controller/jenkins/configuration/base/resources/base_configuration_configmap.go).
## 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](../deploy/role.yaml)
- [Jenkins Master role](../pkg/controller/jenkins/configuration/base/resources/rbac.go)
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.
```bash
$ kubectl create ns jenkins-operator
$ kubectl create ns jenkins
```
Next, apply the RBAC manifests for **jenkins-operator** namespace
```bash
$ 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:
```yaml
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
```bash
$ kubectl -n jenkins apply -f deploy/role.yaml
$ kubectl -n jenkins apply -f role_binding_jenkins.yaml
```
Finally, you must create operator pod by:
```bash
$ 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](https://github.com/jenkinsci/kubernetes-operator/issues).

View File

@ -0,0 +1,14 @@
---
title: "Documentation"
linkTitle: "Documentation"
weight: 20
date: 2019-09-03
menu:
main:
weight: 20
---
{{% pageinfo %}}
This project was originally developed by [VirtusLab](https://virtuslab.com) and the following [CONTRIBUTORS](https://github.com/jenkinsci/kubernetes-operator/graphs/contributors).
{{% /pageinfo %}}

View File

@ -0,0 +1,6 @@
---
title: Search Results
layout: search
---

17
website/deploy.sh Executable file
View File

@ -0,0 +1,17 @@
#Copyright 2018 Google LLC
#
#Licensed under the Apache License, Version 2.0 (the "License");
#you may not use this file except in compliance with the License.
#You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
#Unless required by applicable law or agreed to in writing, software
#distributed under the License is distributed on an "AS IS" BASIS,
#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#See the License for the specific language governing permissions and
#limitations under the License.
#
rm -rf public/
HUGO_ENV="production" hugo --gc || exit 1
s3deploy -source=public/ -region=eu-west-1 -bucket=bep.is -distribution-id=E8OKNT7W9ZYZ2 -path temp/td

10
website/layouts/404.html Normal file
View File

@ -0,0 +1,10 @@
{{ define "main"}}
<main id="main">
<div>
<h1 id="title">Not found</h1>
<p>Oops! This page doesn't exist. Try going back to our <a href="{{ "/" | relURL }}">home page</a>.</p>
<p>You can learn how to make a 404 page like this in <a href="https://gohugo.io/templates/404/">Custom 404 Pages</a>.</p>
</div>
</main>
{{ end }}

View File

@ -0,0 +1,27 @@
<!doctype html>
<html lang="{{ .Site.Language.Lang }}" class="no-js">
<head>
{{ partial "head.html" . }}
<title>{{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{ . }} | {{ end }}{{ .Site.Title }}{{ end }}</title>
</head>
<body class="td-{{ .Kind }}">
<header>
{{ partial "navbar.html" . }}
</header>
<div class="container-fluid td-outer">
<div class="td-main">
<div class="row flex-xl-nowrap">
<div class="col-12 col-md-3 col-xl-2 td-sidebar d-print-none">
{{ partial "sidebar.html" . }}
</div>
<main class="col-12 col-md-9 col-xl-10 pl-md-5" role="main">
{{ if not .Site.Params.ui.breadcrumb_disable }}{{ partial "breadcrumb.html" . }}{{ end }}
{{ block "main" . }}{{ end }}
</main>
</div>
</div>
{{ partial "footer.html" . }}
</div>
{{ partial "scripts.html" . }}
</body>
</html>

View File

@ -0,0 +1,22 @@
{{ $cover := .HasShortcode "blocks/cover" }}
<nav class="js-navbar-scroll navbar navbar-expand navbar-dark {{ if $cover}} td-navbar-cover {{ end }}flex-column flex-md-row td-navbar">
<a class="navbar-brand" href="{{ .Site.Home.RelPermalink }}">
<img style="width: 32px; height: 32px; margin-right: 7.5px;" src="/img/logo.svg"></img><span class="text-uppercase font-weight-bold">{{ .Site.Title }}</span>
</a>
<div class="td-navbar-nav-scroll ml-md-auto" id="main_navbar">
<ul class="navbar-nav mt-2 mt-lg-0">
<li class="nav-item mr-4 mb-2 mb-lg-0">
<a class="nav-link" href="/about/"><span>What's Jenkins Operator?</span></a>
</li>
<li class="nav-item mr-4 mb-2 mb-lg-0">
<a class="nav-link" href="/docs/"><span>Documentation</span></a>
</li>
{{ if (gt (len .Site.Home.Translations) 0) }}
<li class="nav-item dropdown d-none d-lg-block">
{{ partial "navbar-lang-selector.html" . }}
</li>
{{ end }}
</ul>
</div>
<div class="navbar-nav d-none d-lg-block">{{ partial "search-input.html" . }}</div>
</nav>

2802
website/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

24
website/package.json Normal file
View File

@ -0,0 +1,24 @@
{
"name": "tech-doc-hugo",
"version": "0.0.1",
"description": "Hugo theme for technical documentation.",
"main": "none.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/bep/tech-doc-hugo.git"
},
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/bep/tech-doc-hugo/issues"
},
"homepage": "https://github.com/bep/tech-doc-hugo#readme",
"dependencies": {},
"devDependencies": {
"autoprefixer": "^9.4.6",
"postcss-cli": "^5.0.1"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

6512
website/static/img/logo.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 880 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

6
website/themes/docsy/.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
public/
resources/
node_modules/
tech-doc-hugo

6
website/themes/docsy/.gitmodules vendored Normal file
View File

@ -0,0 +1,6 @@
[submodule "assets/vendor/bootstrap"]
path = assets/vendor/bootstrap
url = https://github.com/twbs/bootstrap.git
[submodule "assets/vendor/Font-Awesome"]
path = assets/vendor/Font-Awesome
url = https://github.com/FortAwesome/Font-Awesome.git

View File

@ -0,0 +1,14 @@
routes:
- route: "^.+\\.(js|css|svg|ttf)$"
# cache static assets for 20 years
headers:
Cache-Control: "max-age=630720000, no-transform, public"
gzip: true
- route: "^.+\\.(png|jpg)$"
headers:
Cache-Control: "max-age=630720000, no-transform, public"
gzip: true
- route: "^.+\\.(html|xml|json)$"
gzip: true

View File

@ -0,0 +1,28 @@
# How to Contribute
We'd love to accept your patches and contributions to this project. There are
just a few small guidelines you need to follow.
## Contributor License Agreement
Contributions to this project must be accompanied by a Contributor License
Agreement. You (or your employer) retain the copyright to your contribution;
this simply gives us permission to use and redistribute your contributions as
part of the project. Head over to <https://cla.developers.google.com/> to see
your current agreements on file or to sign a new one.
You generally only need to submit a CLA once, so if you've already submitted one
(even if it was for a different project), you probably don't need to do it
again.
## Code reviews
All submissions, including submissions by project members, require review. We
use GitHub pull requests for this purpose. Consult
[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
information on using pull requests.
## Community Guidelines
This project follows
[Google's Open Source Community Guidelines](https://opensource.google.com/conduct/).

View File

@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -0,0 +1,34 @@
# Docsy
Docsy is a Hugo theme for technical documentation sets, providing simple navigation, site structure, and more.
You can find an example project that uses Docsy in the [Docsy Example Project repo](https://github.com/google/docsy-example). The Docsy Example Project is hosted at [https://testydocsy.netlify.com/](https://testydocsy.netlify.com/), where you can find detailed theme instructions under **Documentation -> Getting Started**.
To use the Docsy theme, you can either:
* Copy and edit the example sites repo, which will also give you a skeleton structure for your top-level and documentation sections, or
* Specify the Docsy theme like any other [Hugo theme](https://gohugo.io/themes/installing-and-using-themes/)
when creating or updating your site. This gives you all the theme-y goodness but youll need to specify your own site structure.
This is not an officially supported Google product. This project is currently maintained.
## Installation and prerequisites
You need a recent version of Hugo to build sites using this theme (preferably 0.45+). If you install from the [release page](https://github.com/gohugoio/hugo/releases), make sure to get the `extended` Hugo version which supports SCSS. Alternatively, on macOS you can install Hugo via Brew.
If you want to do stylesheet changes, you will also need `PostCSS` to create the final assets. You can also install it locally with:
```
npm install
````
To use a local version of the theme files, clone the repo using:
```
git clone --recurse-submodules --depth 1 https://github.com/google/docsy.git
```
## Theme documentation
Detailed documentation for this theme is in the Docsy Example Project under **Documentation -> Getting Started**.
The Docsy Example Project is on [GitHub](https://github.com/google/docsy-example) and is hosted at [https://testydocsy.netlify.com/](https://testydocsy.netlify.com/).

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

View File

@ -0,0 +1,237 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 500 500" style="enable-background:new 0 0 500 500;" xml:space="preserve">
<g>
<path style="fill:#FFFFFF;" d="M116.8525,421.9722c-5.7041,0-10.3442-4.3127-10.3442-9.6129V88.183
c0-5.3002,4.6401-9.6117,10.3442-9.6117H320.858c3.0347,0,9.3959,0.5498,11.7506,2.6302l0.3545,0.3442l58.905,63.2912
c2.3101,2.491,2.9202,8.4928,2.9202,11.3184v256.2039c0,5.3002-4.6407,9.6129-10.3436,9.6129H116.8525z"/>
<g>
<g>
<g>
<path style="fill:#767676;" d="M384.4445,423.2066H116.852c-6.3839,0-11.5786-4.8658-11.5786-10.8474V88.1831
c0-5.9804,5.1947-10.8461,11.5786-10.8461h204.0062c0.377,0,9.2786,0.0329,12.568,2.9389l0.3947,0.3833l58.9508,63.337
c3.2135,3.4652,3.2514,11.7924,3.2514,12.1593v256.2036C396.0231,418.3408,390.8284,423.2066,384.4445,423.2066z
M116.5079,411.9189c0.0848,0.0278,0.1999,0.0531,0.3441,0.0531h267.5925c0.1442,0,0.2581-0.0253,0.3441-0.0531V156.1556
c-0.0076-0.9033-0.3593-3.7347-0.7034-5.0037l-57.6527-61.9416c-1.4651-0.3176-4.4533-0.6389-5.5742-0.6389H116.852
c-0.143,0-0.2594,0.024-0.3441,0.0531V411.9189z M383.9612,150.7699L383.9612,150.7699L383.9612,150.7699z M327.0321,89.371
v0.0013V89.371z"/>
</g>
</g>
</g>
<g>
<g>
<path style="fill:#5B7FC0;" d="M189.0874,210.1754l0.0012-0.0012c7.7751,0.0012,15.0295,4.1862,18.932,10.9234
c1.9177,3.3159,2.9305,7.1011,2.9293,10.9378c0,5.8394-2.2733,11.3304-6.4032,15.4604
c-4.1288,4.1288-9.6186,6.4032-15.458,6.4032c-5.8394,0-11.328-2.2733-15.458-6.4032s-6.4032-9.6186-6.4056-15.4628
c0.0012-6.025,2.454-11.4897,6.4116-15.4473C177.5953,212.627,183.0601,210.1742,189.0874,210.1754z M197.0804,232.033
c0.0012-1.4042-0.3687-2.7868-1.063-3.9887c-1.4293-2.4684-4.0833-3.9995-6.9299-4.0019c-4.4077,0.0024-7.993,3.5877-7.993,7.993
c0,2.1356,0.832,4.1431,2.3427,5.6539c1.5083,1.5083,3.5159,2.3403,5.6503,2.3415c2.1356,0,4.1443-0.8308,5.6539-2.3403
S197.0816,234.1722,197.0804,232.033z"/>
<path style="opacity:0.3;fill:#FFFFFF;" d="M189.0898,210.176c7.7763,0,15.0283,4.1826,18.926,10.9151
c1.9201,3.3136,2.9377,7.0988,2.9353,10.9462c0.0024,12.0643-9.8065,21.8636-21.8613,21.8613
c-12.0547,0.0024-21.8636-9.8066-21.8612-21.8613c0-6.0285,2.4516-11.4921,6.4116-15.452
C177.5977,212.6276,183.0612,210.176,189.0898,210.176z M197.0839,232.0372c0-1.4078-0.3711-2.7892-1.0702-3.9959
c-1.4269-2.466-4.0797-3.9983-6.924-3.9983c-4.4005-0.0048-7.9918,3.5817-7.9942,7.9942
c0.0024,4.4077,3.5865,7.9918,7.9942,7.9942c2.2027,0,4.2018-0.8978,5.6479-2.3439
C196.1861,236.239,197.0839,234.2399,197.0839,232.0372z"/>
<g>
<defs>
<path id="SVGID_1_" d="M194.7376,237.6875c-1.4461,1.4461-3.4452,2.3439-5.6479,2.3439
c-4.4077-0.0024-7.9918-3.5865-7.9942-7.9942c0.0024-4.4125,3.5937-7.999,7.9942-7.9942c2.8443,0,5.497,1.5323,6.924,3.9983
c0.6991,1.2067,1.0702,2.5881,1.0702,3.9959C197.0839,234.2399,196.1861,236.239,194.7376,237.6875z"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<path style="clip-path:url(#SVGID_2_);fill:#FFFFFF;" d="M190.0704,225.0237c-4.4005-0.0048-7.9918,3.5817-7.9942,7.9942
c0.0011,1.9546,0.7088,3.7452,1.8782,5.1354c-1.7447-1.4674-2.8575-3.663-2.8588-6.116
c0.0024-4.4125,3.5936-7.999,7.9942-7.9942c2.3802-0.0001,4.616,1.0833,6.1218,2.8788
C193.7885,225.7247,191.9774,225.0237,190.0704,225.0237z"/>
<path style="opacity:0.13;clip-path:url(#SVGID_2_);fill:#020202;" d="M190.0704,225.0237
c-4.4005-0.0048-7.9918,3.5817-7.9942,7.9942c0.0011,1.9546,0.7088,3.7452,1.8782,5.1354
c-1.7447-1.4674-2.8575-3.663-2.8588-6.116c0.0024-4.4125,3.5936-7.999,7.9942-7.9942c2.3802-0.0001,4.616,1.0833,6.1218,2.8788
C193.7885,225.7247,191.9774,225.0237,190.0704,225.0237z"/>
</g>
<g>
<defs>
<path id="SVGID_3_" d="M189.0898,210.176c7.7763,0,15.0283,4.1826,18.926,10.9151c1.9201,3.3136,2.9377,7.0988,2.9353,10.9462
c0.0024,12.0643-9.8065,21.8636-21.8613,21.8613c-12.0547,0.0024-21.8636-9.8066-21.8612-21.8613
c0-6.0285,2.4516-11.4921,6.4116-15.452C177.5977,212.6276,183.0612,210.176,189.0898,210.176z M197.0839,232.0372
c0-1.4078-0.3711-2.7892-1.0702-3.9959c-1.4269-2.466-4.0797-3.9983-6.924-3.9983c-4.4005-0.0048-7.9918,3.5817-7.9942,7.9942
c0.0024,4.4077,3.5865,7.9918,7.9942,7.9942c2.2027,0,4.2018-0.8978,5.6479-2.3439
C196.1861,236.239,197.0839,234.2399,197.0839,232.0372z"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<path style="clip-path:url(#SVGID_4_);fill:#5B7FC0;" d="M172.6595,215.6045c-3.96,3.96-6.4116,9.4235-6.4116,15.452
c-0.0024,12.0547,9.8066,21.8636,21.8613,21.8612c12.0547,0.0024,21.8636-9.797,21.8613-21.8612
c0.0024-3.8475-1.0151-7.6326-2.9353-10.9462c-3.8977-6.7324-11.1497-10.9151-18.926-10.9151
C182.0806,209.1953,176.6171,211.647,172.6595,215.6045z"/>
</g>
</g>
<rect x="198.8952" y="225.1043" style="fill:#5B7FC0;" width="122.6266" height="13.8671"/>
</g>
<g>
<path style="fill:#D95140;" d="M189.0874,155.7611l0.0012-0.0012c7.7751,0.0012,15.0295,4.1862,18.932,10.9234
c1.9177,3.3159,2.9305,7.1011,2.9293,10.9378c0,5.8394-2.2733,11.3304-6.4032,15.4604c-4.1288,4.1288-9.6186,6.4032-15.458,6.4032
c-5.8394,0-11.328-2.2733-15.458-6.4032s-6.4032-9.6186-6.4056-15.4628c0.0012-6.0249,2.454-11.4897,6.4116-15.4473
C177.5953,158.2128,183.0601,155.7599,189.0874,155.7611z M197.0804,177.6188c0.0012-1.4042-0.3687-2.7868-1.063-3.9887
c-1.4293-2.4684-4.0833-3.9995-6.9299-4.0019c-4.4077,0.0024-7.993,3.5877-7.993,7.993c0,2.1356,0.832,4.1431,2.3427,5.6539
c1.5083,1.5083,3.5159,2.3403,5.6503,2.3415c2.1356,0,4.1443-0.8308,5.6539-2.3403
C196.2508,181.7667,197.0816,179.758,197.0804,177.6188z"/>
<path style="opacity:0.3;fill:#FFFFFF;" d="M189.0898,155.7617c7.7763,0,15.0283,4.1826,18.926,10.9151
c1.9201,3.3135,2.9377,7.0987,2.9353,10.9462c0.0024,12.0643-9.8065,21.8636-21.8613,21.8613
c-12.0547,0.0024-21.8636-9.8066-21.8612-21.8613c0-6.0285,2.4516-11.4921,6.4116-15.452
C177.5977,158.2134,183.0612,155.7617,189.0898,155.7617z M197.0839,177.623c0-1.4078-0.3711-2.7892-1.0702-3.9959
c-1.4269-2.466-4.0797-3.9983-6.924-3.9983c-4.4005-0.0048-7.9918,3.5817-7.9942,7.9942
c0.0024,4.4077,3.5865,7.9918,7.9942,7.9942c2.2027,0,4.2018-0.8978,5.6479-2.3439
C196.1861,181.8248,197.0839,179.8256,197.0839,177.623z"/>
<g>
<defs>
<path id="SVGID_5_" d="M194.7376,183.2733c-1.4461,1.4461-3.4452,2.3439-5.6479,2.3439
c-4.4077-0.0024-7.9918-3.5865-7.9942-7.9942c0.0024-4.4125,3.5937-7.9989,7.9942-7.9942c2.8443,0,5.497,1.5323,6.924,3.9983
c0.6991,1.2067,1.0702,2.5881,1.0702,3.9959C197.0839,179.8256,196.1861,181.8248,194.7376,183.2733z"/>
</defs>
<clipPath id="SVGID_6_">
<use xlink:href="#SVGID_5_" style="overflow:visible;"/>
</clipPath>
<path style="clip-path:url(#SVGID_6_);fill:#FFFFFF;" d="M190.0704,170.6095c-4.4005-0.0048-7.9918,3.5817-7.9942,7.9942
c0.0011,1.9546,0.7088,3.7452,1.8782,5.1354c-1.7447-1.4674-2.8575-3.663-2.8588-6.116c0.0024-4.4125,3.5936-7.999,7.9942-7.9942
c2.3802-0.0001,4.616,1.0833,6.1218,2.8788C193.7885,171.3104,191.9774,170.6095,190.0704,170.6095z"/>
<path style="opacity:0.13;clip-path:url(#SVGID_6_);fill:#020202;" d="M190.0704,170.6095
c-4.4005-0.0048-7.9918,3.5817-7.9942,7.9942c0.0011,1.9546,0.7088,3.7452,1.8782,5.1354
c-1.7447-1.4674-2.8575-3.663-2.8588-6.116c0.0024-4.4125,3.5936-7.999,7.9942-7.9942c2.3802-0.0001,4.616,1.0833,6.1218,2.8788
C193.7885,171.3104,191.9774,170.6095,190.0704,170.6095z"/>
</g>
<g>
<defs>
<path id="SVGID_7_" d="M189.0898,155.7617c7.7763,0,15.0283,4.1826,18.926,10.9151c1.9201,3.3135,2.9377,7.0987,2.9353,10.9462
c0.0024,12.0643-9.8065,21.8636-21.8613,21.8613c-12.0547,0.0024-21.8636-9.8066-21.8612-21.8613
c0-6.0285,2.4516-11.4921,6.4116-15.452C177.5977,158.2134,183.0612,155.7617,189.0898,155.7617z M197.0839,177.623
c0-1.4078-0.3711-2.7892-1.0702-3.9959c-1.4269-2.466-4.0797-3.9983-6.924-3.9983c-4.4005-0.0048-7.9918,3.5817-7.9942,7.9942
c0.0024,4.4077,3.5865,7.9918,7.9942,7.9942c2.2027,0,4.2018-0.8978,5.6479-2.3439
C196.1861,181.8248,197.0839,179.8256,197.0839,177.623z"/>
</defs>
<clipPath id="SVGID_8_">
<use xlink:href="#SVGID_7_" style="overflow:visible;"/>
</clipPath>
<path style="clip-path:url(#SVGID_8_);fill:#D95140;" d="M172.6595,161.1903c-3.96,3.96-6.4116,9.4235-6.4116,15.452
c-0.0024,12.0547,9.8066,21.8636,21.8613,21.8613c12.0547,0.0024,21.8636-9.797,21.8613-21.8613
c0.0024-3.8474-1.0151-7.6326-2.9353-10.9462c-3.8977-6.7324-11.1497-10.9151-18.926-10.9151
C182.0806,154.7811,176.6171,157.2327,172.6595,161.1903z"/>
</g>
<rect x="198.8952" y="170.69" style="fill:#D95140;" width="122.6266" height="13.8671"/>
</g>
<g>
<g>
<path style="fill:#56A55C;" d="M189.5379,264.6147l0.0012-0.0012c7.7751,0.0012,15.0294,4.1862,18.932,10.9235
c1.9177,3.3159,2.9305,7.1011,2.9293,10.9378c0,5.8394-2.2733,11.3304-6.4032,15.4604
c-4.1288,4.1288-9.6186,6.4032-15.458,6.4032c-5.8394,0-11.3281-2.2733-15.458-6.4032c-4.13-4.13-6.4032-9.6186-6.4056-15.4628
c0.0012-6.0249,2.454-11.4897,6.4116-15.4472C178.0458,267.0663,183.5105,264.6135,189.5379,264.6147z M197.5309,286.4723
c0.0012-1.4042-0.3687-2.7868-1.063-3.9887c-1.4293-2.4684-4.0833-3.9995-6.9299-4.0019c-4.4077,0.0024-7.993,3.5877-7.993,7.993
c0,2.1356,0.832,4.1431,2.3427,5.6538c1.5083,1.5083,3.5159,2.3403,5.6503,2.3415c2.1356,0,4.1443-0.8308,5.6539-2.3403
C196.7013,290.6202,197.5321,288.6115,197.5309,286.4723z"/>
<path style="opacity:0.3;fill:#FFFFFF;" d="M189.5403,264.6153c7.7763,0,15.0283,4.1826,18.926,10.9151
c1.9201,3.3135,2.9377,7.0987,2.9353,10.9462c0.0024,12.0643-9.8065,21.8636-21.8613,21.8613
c-12.0547,0.0024-21.8636-9.8065-21.8612-21.8613c0-6.0285,2.4516-11.492,6.4116-15.452
C178.0482,267.0669,183.5117,264.6153,189.5403,264.6153z M197.5344,286.4765c0-1.4078-0.3711-2.7892-1.0702-3.9959
c-1.4269-2.466-4.0797-3.9983-6.924-3.9983c-4.4005-0.0048-7.9918,3.5817-7.9942,7.9941
c0.0024,4.4077,3.5865,7.9918,7.9942,7.9942c2.2027,0,4.2018-0.8978,5.6479-2.3439
C196.6366,290.6783,197.5344,288.6792,197.5344,286.4765z"/>
<g>
<defs>
<path id="SVGID_9_" d="M195.1881,292.1268c-1.4461,1.4461-3.4452,2.3439-5.6479,2.3439
c-4.4077-0.0024-7.9918-3.5865-7.9942-7.9942c0.0024-4.4125,3.5937-7.9989,7.9942-7.9941c2.8443,0,5.497,1.5323,6.924,3.9983
c0.6991,1.2067,1.0702,2.5881,1.0702,3.9959C197.5344,288.6792,196.6366,290.6783,195.1881,292.1268z"/>
</defs>
<clipPath id="SVGID_10_">
<use xlink:href="#SVGID_9_" style="overflow:visible;"/>
</clipPath>
<path style="clip-path:url(#SVGID_10_);fill:#FFFFFF;" d="M190.5209,279.463c-4.4005-0.0048-7.9918,3.5817-7.9942,7.9941
c0.0011,1.9547,0.7088,3.7452,1.8782,5.1354c-1.7446-1.4674-2.8575-3.6631-2.8588-6.1161
c0.0024-4.4125,3.5936-7.999,7.9942-7.9941c2.3802-0.0001,4.616,1.0833,6.1218,2.8788
C194.239,280.164,192.4279,279.463,190.5209,279.463z"/>
<path style="opacity:0.13;clip-path:url(#SVGID_10_);fill:#020202;" d="M190.5209,279.463
c-4.4005-0.0048-7.9918,3.5817-7.9942,7.9941c0.0011,1.9547,0.7088,3.7452,1.8782,5.1354
c-1.7446-1.4674-2.8575-3.6631-2.8588-6.1161c0.0024-4.4125,3.5936-7.999,7.9942-7.9941
c2.3802-0.0001,4.616,1.0833,6.1218,2.8788C194.239,280.164,192.4279,279.463,190.5209,279.463z"/>
</g>
<g>
<defs>
<path id="SVGID_11_" d="M189.5403,264.6153c7.7763,0,15.0283,4.1826,18.926,10.9151
c1.9201,3.3135,2.9377,7.0987,2.9353,10.9462c0.0024,12.0643-9.8065,21.8636-21.8613,21.8613
c-12.0547,0.0024-21.8636-9.8065-21.8612-21.8613c0-6.0285,2.4516-11.492,6.4116-15.452
C178.0482,267.0669,183.5117,264.6153,189.5403,264.6153z M197.5344,286.4765c0-1.4078-0.3711-2.7892-1.0702-3.9959
c-1.4269-2.466-4.0797-3.9983-6.924-3.9983c-4.4005-0.0048-7.9918,3.5817-7.9942,7.9941
c0.0024,4.4077,3.5865,7.9918,7.9942,7.9942c2.2027,0,4.2018-0.8978,5.6479-2.3439
C196.6366,290.6783,197.5344,288.6792,197.5344,286.4765z"/>
</defs>
<clipPath id="SVGID_12_">
<use xlink:href="#SVGID_11_" style="overflow:visible;"/>
</clipPath>
<path style="clip-path:url(#SVGID_12_);fill:#56A55C;" d="M173.11,270.0439c-3.96,3.96-6.4116,9.4235-6.4116,15.452
c-0.0024,12.0547,9.8066,21.8636,21.8613,21.8613c12.0547,0.0024,21.8636-9.797,21.8613-21.8613
c0.0024-3.8474-1.0151-7.6326-2.9353-10.9462c-3.8977-6.7325-11.1497-10.9151-18.926-10.9151
C182.5311,263.6346,177.0676,266.0863,173.11,270.0439z"/>
</g>
</g>
<rect x="199.3456" y="279.5436" style="fill:#56A55C;" width="122.6266" height="13.8671"/>
</g>
<g>
<g>
<path style="fill:#F1BC42;" d="M189.0874,318.7208l0.0012-0.0012c7.7751,0.0012,15.0295,4.1862,18.932,10.9234
c1.9177,3.3159,2.9305,7.1011,2.9293,10.9378c0,5.8394-2.2733,11.3305-6.4032,15.4604
c-4.1288,4.1288-9.6186,6.4032-15.458,6.4032c-5.8394,0-11.328-2.2733-15.458-6.4032c-4.13-4.1299-6.4032-9.6186-6.4056-15.4628
c0.0012-6.025,2.454-11.4897,6.4116-15.4472C177.5953,321.1724,183.0601,318.7196,189.0874,318.7208z M197.0804,340.5784
c0.0012-1.4042-0.3687-2.7868-1.063-3.9887c-1.4293-2.4684-4.0833-3.9995-6.9299-4.0019c-4.4077,0.0024-7.993,3.5877-7.993,7.993
c0,2.1356,0.832,4.1431,2.3427,5.6539c1.5083,1.5083,3.5159,2.3403,5.6503,2.3415c2.1356,0,4.1443-0.8308,5.6539-2.3403
S197.0816,342.7176,197.0804,340.5784z"/>
<path style="opacity:0.3;fill:#FFFFFF;" d="M189.0898,318.7214c7.7763,0,15.0283,4.1826,18.926,10.915
c1.9201,3.3136,2.9377,7.0988,2.9353,10.9462c0.0024,12.0643-9.8065,21.8636-21.8613,21.8612
c-12.0547,0.0024-21.8636-9.8065-21.8612-21.8612c0-6.0285,2.4516-11.4921,6.4116-15.452
C177.5977,321.173,183.0612,318.7214,189.0898,318.7214z M197.0839,340.5826c0-1.4078-0.3711-2.7892-1.0702-3.9959
c-1.4269-2.466-4.0797-3.9983-6.924-3.9983c-4.4005-0.0048-7.9918,3.5817-7.9942,7.9942
c0.0024,4.4077,3.5865,7.9918,7.9942,7.9942c2.2027,0,4.2018-0.8978,5.6479-2.3439
C196.1861,344.7844,197.0839,342.7853,197.0839,340.5826z"/>
<g>
<defs>
<path id="SVGID_13_" d="M194.7376,346.2329c-1.4461,1.4461-3.4452,2.3439-5.6479,2.3439
c-4.4077-0.0024-7.9918-3.5865-7.9942-7.9942c0.0024-4.4125,3.5937-7.999,7.9942-7.9942c2.8443,0,5.497,1.5323,6.924,3.9983
c0.6991,1.2067,1.0702,2.5881,1.0702,3.9959C197.0839,342.7853,196.1861,344.7844,194.7376,346.2329z"/>
</defs>
<clipPath id="SVGID_14_">
<use xlink:href="#SVGID_13_" style="overflow:visible;"/>
</clipPath>
<path style="clip-path:url(#SVGID_14_);fill:#FFFFFF;" d="M190.0704,333.5691c-4.4005-0.0048-7.9918,3.5817-7.9942,7.9942
c0.0011,1.9547,0.7088,3.7452,1.8782,5.1354c-1.7447-1.4674-2.8575-3.6631-2.8588-6.1161
c0.0024-4.4125,3.5936-7.999,7.9942-7.9942c2.3802-0.0001,4.616,1.0834,6.1218,2.8788
C193.7885,334.2701,191.9774,333.5691,190.0704,333.5691z"/>
<path style="opacity:0.13;clip-path:url(#SVGID_14_);fill:#020202;" d="M190.0704,333.5691
c-4.4005-0.0048-7.9918,3.5817-7.9942,7.9942c0.0011,1.9547,0.7088,3.7452,1.8782,5.1354
c-1.7447-1.4674-2.8575-3.6631-2.8588-6.1161c0.0024-4.4125,3.5936-7.999,7.9942-7.9942
c2.3802-0.0001,4.616,1.0834,6.1218,2.8788C193.7885,334.2701,191.9774,333.5691,190.0704,333.5691z"/>
</g>
<g>
<defs>
<path id="SVGID_15_" d="M189.0898,318.7214c7.7763,0,15.0283,4.1826,18.926,10.915c1.9201,3.3136,2.9377,7.0988,2.9353,10.9462
c0.0024,12.0643-9.8065,21.8636-21.8613,21.8612c-12.0547,0.0024-21.8636-9.8065-21.8612-21.8612
c0-6.0285,2.4516-11.4921,6.4116-15.452C177.5977,321.173,183.0612,318.7214,189.0898,318.7214z M197.0839,340.5826
c0-1.4078-0.3711-2.7892-1.0702-3.9959c-1.4269-2.466-4.0797-3.9983-6.924-3.9983c-4.4005-0.0048-7.9918,3.5817-7.9942,7.9942
c0.0024,4.4077,3.5865,7.9918,7.9942,7.9942c2.2027,0,4.2018-0.8978,5.6479-2.3439
C196.1861,344.7844,197.0839,342.7853,197.0839,340.5826z"/>
</defs>
<clipPath id="SVGID_16_">
<use xlink:href="#SVGID_15_" style="overflow:visible;"/>
</clipPath>
<path style="clip-path:url(#SVGID_16_);fill:#F1BC42;" d="M172.6595,324.15c-3.96,3.96-6.4116,9.4235-6.4116,15.452
c-0.0024,12.0547,9.8066,21.8636,21.8613,21.8612c12.0547,0.0024,21.8636-9.797,21.8613-21.8612
c0.0024-3.8474-1.0151-7.6327-2.9353-10.9462c-3.8977-6.7324-11.1497-10.9151-18.926-10.9151
C182.0806,317.7407,176.6171,320.1924,172.6595,324.15z"/>
</g>
</g>
<rect x="198.8952" y="333.6497" style="fill:#F1BC42;" width="122.6266" height="13.8671"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -0,0 +1,65 @@
/*
* Copyright 2018 Google LLC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
(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();
}
// Bootstrap Fixed Header
$(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) < threshold) {
$('.js-navbar-scroll').addClass('navbar-bg-onscroll');
}
$(window).on('scroll', function() {
var navtop = $('.js-navbar-scroll').offset().top - $(window).scrollTop();
var promoOffset = bottomPos($('.js-td-cover'));
var navbarOffset = $('.js-navbar-scroll').offset().top;
if ((promoOffset - navbarOffset) < threshold) {
$('.js-navbar-scroll').addClass('navbar-bg-onscroll');
} else {
$('.js-navbar-scroll').removeClass('navbar-bg-onscroll');
$('.js-navbar-scroll').addClass('navbar-bg-onscroll--fade');
}
});
});
}(jQuery));

View File

@ -0,0 +1,43 @@
/*
Copyright 2018 Google LLC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
(function($) {
'use strict';
var Search = {
init: function() {
$(document).ready(function() {
$(document).on('keypress', '.td-search-input', function(e) {
if (e.keyCode !== 13) {
return
}
var query = $(this).val();
var searchPage = "{{ "search/" | absURL }}?q=" + query;
document.location = searchPage;
return false;
});
});
},
};
Search.init();
}(jQuery));

View File

@ -0,0 +1,20 @@
// Style alert boxes.
.alert {
font-weight: $font-weight-medium;
background: $white;
color: inherit;
border-radius: 0;
@each $color, $value in $theme-colors {
&-#{$color} {
& .alert-heading {
color: $value;
}
border-style: solid;
border-color: $value;
border-width: 0 0 0 4px;
}
}
}

View File

@ -0,0 +1,10 @@
// Blog related styles.
.td-blog {
.td-rss-button {
position: absolute;
top: 5.5rem;
right: 1rem;
z-index: 22;
}
}

View File

@ -0,0 +1,127 @@
// Boxes on the home page and similar.
.td-box {}
// box-variant creates the main style for a colored section used on the site.
@mixin box-variant($parent, $color-name, $color-value) {
$text-color: color-yiq($color-value);
$link-color: mix($blue, $text-color, lightness($color-value));
$link-hover-color: rgba($link-color, 0.5) !default;
#{$parent} {
&--#{$color-name} {
color: $text-color;
background-color: #{$color-value};
.td-arrow-down {
&::before {
left: 50%;
margin-left: -30px;
bottom: -25px;
border: {
style: solid;
width: 25px 30px 0 30px;
color: #{$color-value} transparent transparent transparent;
};
z-index: 3;
position: absolute;
content: "";
}
}
}
}
// Improve contrast for the links in paragraphs.
@include link-variant("#{$parent}--#{$color-name} p > a", $link-color, $link-hover-color, false);
@if $enable-gradients {
@include bg-gradient-variant("#{$parent}--1#{$color-name}#{$parent}--gradient", $color-value);
}
}
// Common min-height modifiers used for boxes.
@mixin td-box-height-modifiers($parent) {
#{$parent} {
&--height-auto {}
&--height-min {
min-height: 300px;
}
&--height-med {
min-height: 400px;
}
&--height-max {
min-height: 500px;
}
&--height-full {
min-height: 100vh;
}
@include media-breakpoint-up(md) {
&--height-min {
min-height: 450px;
}
&--height-med {
min-height: 500px;
}
&--height-max {
min-height: 650px;
}
}
}
}
@include td-box-height-modifiers(".td-box");
// Styling for section boxes
.td-box {
.row.section {
padding-left: 5rem;
padding-right: 5rem;
flex-direction: column;
> table {
@extend .table-striped;
@extend .table-responsive;
@extend .table;
}
}
.row {
padding-left: 5rem;
padding-right: 5rem;
flex-direction: row;
}
}
// Styling for community page link boxes
.td-box.linkbox {
padding: 5rem;
}
// This allows "painting by numbers"
@for $i from 1 through length($td-box-colors) {
$c: nth($td-box-colors, $i);
$name: $i - 1;
@include box-variant(".td-box", $name, $c);
}
// Same as above with all the theme color names.
@each $color, $value in $colors {
@include box-variant(".td-box", $color, $value);
}
@each $color, $value in $theme-colors {
@include box-variant(".td-box", $color, $value);
}
@each $color, $value in $grays {
@include box-variant(".td-box", $color, $value);
}

View File

@ -0,0 +1,7 @@
// Breadcrumb
.breadcrumb {
background: none;
padding-left: 0;
padding-top: 0;
}

View File

@ -0,0 +1,15 @@
// Buttons
@if $enable-rounded {
.btn {
border-radius: 1rem;
&-lg {
border-radius: 2rem;
}
&-sm {
border-radius: 1rem;
}
}
}

View File

@ -0,0 +1,54 @@
// Code formatting.
.td-content {
// Highlighted code.
.highlight {
@extend .card;
margin: 2rem 0;
padding: 1rem;
background-color: $gray-100;
pre, div {
background-color: inherit !important;
}
pre {
margin: 0;
padding: 0;
}
}
// Inline code
p code, li > code, table code {
color: inherit;
padding: 0.2em 0.4em;
margin: 0;
font-size: 85%;
word-break: normal;
background-color: rgba($black, 0.05);
border-radius: $border-radius;
br {
display: none;
}
}
// Code blocks
pre {
word-wrap: normal;
background-color: $gray-100;
padding: $spacer;
> code {
padding: 0;
margin: 0;
font-size: 100%;
word-break: normal;
white-space: pre;
border: 0;
}
}
}

View File

@ -0,0 +1,41 @@
// Add some local palette classes so you can do -bg-warning -text-warning etc. Even -bg-1 if you want to paint by numbers.
@mixin palette-variant($color-name, $color-value) {
$text-color: color-yiq($color-value);
$link-color: mix($blue, $text-color, lightness($color-value));
$link-hover-color: rgba($link-color, .5) !default;
.-bg-#{$color-name} {
color: $text-color;
background-color: $color-value;
}
// Make links in paragraphs stand out more.
@include link-variant(".-bg-#{$color-name} p > a", $link-color, $link-hover-color, false);
.-text-#{$color-name} {
color: $color-value;
}
}
@each $color, $value in $colors {
@include palette-variant($color, $value);
}
@each $color, $value in $theme-colors {
@include palette-variant($color, $value);
}
@each $color, $value in $grays {
@include palette-variant($color, $value);
}
// This allows "painting by numbers", i.e. picking colors by a shortcode Ordianal.
@for $i from 1 through length($td-box-colors) {
$value: nth($td-box-colors, $i);
$name: $i - 1;
$text-color: color-yiq($value);
@include palette-variant($name, $value);
}

View File

@ -0,0 +1,82 @@
//
// Style Markdown content
//
.td-content {
order: 1;
p, li, td {
font-weight: $font-weight-body-text;
}
> h1 {
font-weight: $font-weight-bold;
margin-bottom: 1rem;
}
> h2 {
margin-bottom: 1rem;
}
> h2:not(:first-child) {
margin-top: 3rem;
}
> h2 + h3 {
margin-top: 1rem;
}
> h3, > h4, > h5, > h6 {
margin-bottom: 1rem;
margin-top: 2rem;
}
img {
@extend .img-fluid;
}
> table {
@extend .table-striped;
@extend .table-responsive;
@extend .table;
}
> blockquote {
padding: 0 0 0 1rem;
margin-bottom: $spacer;
color: $gray-600;
border-left: 6px solid $secondary;
}
> ul li, > ol li {
margin-bottom: .25rem;
}
strong {
font-weight: $font-weight-bold;
}
> pre, > .highlight, > .lead, > h1, > h2, > ul, > ol, > p, > blockquote, > dl dd, .footnotes, > .alert {
@extend .td-max-width-on-larger-screens;
}
.alert:not(:first-child) {
margin-top: 2 * $spacer;
margin-bottom: 2 * $spacer;
}
.lead {
margin-bottom: 1.5rem;
}
}
.td-title {
margin-top: 1rem;
margin-bottom: .5rem;
@include media-breakpoint-up(sm) {
font-size: 3rem;
}
}

View File

@ -0,0 +1,34 @@
// The outer page container i.e. common styles for any page.
.td-outer {
display: flex;
flex-direction: column;
height: 100vh;
}
// The outer page container for the default base template.
.td-default {
main {
section:first-of-type {
@include media-breakpoint-up(md) {
padding-top: 8rem;
}
}
section {
@extend .td-block-padding;
}
}
}
.td-main {
flex-grow: 1;
main {
@include media-breakpoint-up(md) {
padding-top: 5.5rem;
}
padding-bottom: 2rem;
}
}

View File

@ -0,0 +1,98 @@
//
// Main navbar
//
.td-navbar-cover {
background: $primary;
@include media-breakpoint-up(md) {
background: transparent !important;
.nav-link {
text-shadow: 1px 1px 2px $dark;
}
}
&.navbar-bg-onscroll .nav-link {
text-shadow: none;
}
}
.navbar-bg-onscroll {
background: $primary !important;
opacity: inherit;
}
.td-navbar {
background: $primary;
min-height: 4rem;
margin: 0;
z-index: 32;
@include media-breakpoint-up(md) {
position: fixed;
top: 0;
width: 100%;
}
.navbar-brand {
text-transform: none;
text-align: middle;
.nav-link {
display: inline-block;
margin-right: -30px;
}
svg {
display: inline-block;
margin: 0 10px;
height: 30px;
}
}
.nav-link {
text-transform: none;
font-weight: $font-weight-bold;
}
.td-search-input {
border: none;
@include placeholder {
color: $navbar-dark-color;
}
}
.dropdown {
min-width: 100px;
}
@include media-breakpoint-down(md) {
padding-right: .5rem;
padding-left: .75rem;
.td-navbar-nav-scroll {
max-width: 100%;
height: 2.5rem;
margin-top: .25rem;
overflow: hidden;
font-size: .875rem;
.nav-link {
padding-right: .25rem;
padding-left: 0;
}
.navbar-nav {
padding-bottom: 2rem;
overflow-x: auto;
white-space: nowrap;
-webkit-overflow-scrolling: touch;
}
}
}
}

View File

@ -0,0 +1,18 @@
.pageinfo {
font-weight: $font-weight-medium;
background: $gray-100;
color: inherit;
border-radius: 0;
margin: 2rem;
padding: 1.5rem;
padding-bottom: 0.5rem;
@each $color, $value in $theme-colors {
&-#{$color} {
border-style: solid;
border-color: $value;
}
}
}

View File

@ -0,0 +1,16 @@
// Search
.td-search-input {
background: transparent;
&.form-control:focus {
border-color: lighten($primary, 60%);
box-shadow: 0 0 0 2px lighten($primary, 30%);
}
@if $enable-rounded {
border-radius: 1rem;
}
font-family: "Font Awesome 5 Free", $font-family-base;
}

View File

@ -0,0 +1,57 @@
//
// Right side toc
//
.td-toc {
border-left: 1px solid $border-color;
@supports (position: sticky) {
position: sticky;
top: 4rem;
height: calc(100vh - 10rem);
overflow-y: auto;
}
order: 2;
padding-top: 0.75rem;
padding-bottom: 1.5rem;
vertical-align: top;
a {
display: block;
font-weight: $font-weight-light;
padding-bottom: .25rem;
}
li {
list-style: none;
display: block;
}
li li {
margin-left: 0.5rem;
}
.td-page-meta {
a {
font-weight: $font-weight-medium;
}
}
#TableOfContents {
// Hugo's ToC is a mouthful, this can be used to style the top level h2 entries.
> ul > li > ul > li > a {}
a {
color: $gray-600;
&:hover {
color: $blue;
text-decoration: none;
}
}
}
ul {
padding-left: 0;
}
}

View File

@ -0,0 +1,132 @@
//
// Left side navigation
//
.td-sidebar-nav {
padding-right: 0.5rem;
margin-right: -15px;
margin-left: -15px;
@include media-breakpoint-up(md) {
@supports (position: sticky) {
max-height: calc(100vh - 10rem);
overflow-y: auto;
}
}
@include media-breakpoint-up(md) {
display: block !important;
}
&__section {
li {
list-style: none;
}
ul {
padding: 0;
margin: 0;
}
@include media-breakpoint-up(md) {
& > ul {
padding-left: .5rem;
}
}
padding-left: 0;
}
&__section-title {
display: block;
font-weight: $font-weight-medium;
.active {
font-weight: $font-weight-bold;
}
a {
color: $gray-900;
}
}
.td-sidebar-link {
display: block;
padding-bottom: 0.375rem;
&__page {
color: $gray-700;
font-weight: $font-weight-light;
}
}
a {
&:hover {
color: $blue;
text-decoration: none;
}
&.active {
font-weight: $font-weight-bold;
}
}
.dropdown {
a {
color: $gray-700;
}
.nav-link {
padding: 0 0 1rem;
}
}
}
.td-sidebar {
@include media-breakpoint-up(md) {
padding-top: 4rem;
background-color: $td-sidebar-bg-color;
padding-right: 1rem;
border-right: 1px solid $td-sidebar-border-color;
}
padding-bottom: 1rem;
&__toggle {
line-height: 1;
color: $gray-900;
margin: 1rem;
}
&__search {
padding: 1rem 15px;
margin-right: -15px;
margin-left: -15px;
}
&__inner {
order: 0;
@include media-breakpoint-up(md) {
@supports (position: sticky) {
position: sticky;
top: 4rem;
z-index: 10;
height: calc(100vh - 6rem);
}
}
@include media-breakpoint-up(xl) {
flex: 0 1 320px;
}
.td-search-box {
width: 100%;
}
}
}

View File

@ -0,0 +1,7 @@
/*
Nothing defined here. The Hugo project that uses this theme can override Bootstrap by adding a file to:
assets/scss/_styles_project.scss
*/

View File

@ -0,0 +1,131 @@
/*
Bootstrap variables overrides for theme.
See https://github.com/twbs/bootstrap/pull/23260
*/
@fa-font-path : "../webfonts";
// Bootstrap flags. For more, see https://getbootstrap.com/docs/4.0/getting-started/theming/
$enable-gradients: true;
$enable-rounded: true;
$enable-shadows: true;
// Theme flags.
$td-enable-google-fonts: true;
// Theme colors
$primary: #30638E !default;
$primary-light: lighten($primary, 75%) !default;
$secondary: #FFA630 !default;
$success: #3772FF !default;
$info: #C0E0DE !default;
$warning: #ED6A5A !default;
$danger: #ED6A5A !default;
$white: #fff !default;
$light: #D3F3EE !default;
$dark: #403F4C !default;
$blue: #72A1E5 !default;
$orange: #BA5A31 !default;
$gray-100: #f8f9fa !default;
$gray-200: #eee !default;
$gray-300: #dee2e6 !default;
$gray-400: #ccc !default;
$gray-500: #adb5bd !default;
$gray-600: #888 !default;
$gray-700: #495057 !default;
$gray-800: #333 !default;
$gray-900: #222 !default;
$black: #000 !default;
$code-color: darken($secondary, 20%) !default;
// UI element colors
$border-color: $gray-300 !default;
$td-sidebar-bg-color: rgba($primary, 0.03) !default;
$td-sidebar-border-color: $border-color !default;
// Background colors for the sections on home page etc. It is a paint by number system, starting at 0, where the number is taken from the shortcode's ordinal
// if not provided by the user.
// These colors are all part of the theme palette, but the mix is fairly random to create variation. This can be overridden by the project if needed.
$td-box-colors: $dark, $primary, $secondary, $info, $primary-light, $gray-600, $success, $warning, $dark, $danger, $primary, $secondary, $primary-light, $info;
$link-color: darken($blue, 15%) !default;
$link-decoration: none !default;
$link-hover-color: darken($link-color, 15%) !default;
$link-hover-decoration: none !default;
// Fonts
$google_font_name: "Open Sans" !default;
$google_font_family: "Open+Sans:300,300i,400,400i,700,700i" !default;
$web-font-path: "https://fonts.googleapis.com/css?family=#{$google_font_family}";
$td-fonts-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
@if $td-enable-google-fonts {
$td-fonts-serif: prepend($td-fonts-serif, "#{$google_font_name}");
}
$font-family-sans-serif: $td-fonts-serif !default;
$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default;
$font-family-base: $font-family-sans-serif !default;
$font-size-base: 1rem !default;
// Font weights
$font-weight-light: 300 !default;
$font-weight-normal: 400 !default;
$font-weight-medium: 500 !default;
$font-weight-bold: 700 !default;
$font-weight-body-text: $font-weight-normal !default;
$headings-font-weight: $font-weight-medium !default;
// Heading sizes
$h1-font-size: $font-size-base * 2.25 !default;
$h2-font-size: $font-size-base * 2 !default;
$h3-font-size: $font-size-base * 1.5 !default;
$h4-font-size: $font-size-base * 1.35 !default;
$h5-font-size: $font-size-base * 1.15 !default;
$h6-font-size: $font-size-base !default;
// Display styles
$display1-weight: $font-weight-bold !default;
$display2-weight: $font-weight-bold !default;
$display3-weight: $font-weight-bold !default;
$display4-weight: $font-weight-bold !default;
$display1-size: 3rem !default;
$display2-size: 2.5rem !default;
$display3-size: 2rem !default;
$display4-size: 1.75rem !default;
// Space
$spacer: 1rem;
$td-block-space-top-base: 4 * $spacer;
$td-block-space-bottom-base: 4 * $spacer;
// Pagination
$pagination-color: $gray-600 !default;
$pagination-border-color: rgba($black, 0.1) !default;
$pagination-active-border-color: darken($primary, 5%) !default;
$pagination-disabled-color: $gray-300 !default;
// Navbar
$navbar-dark-color: rgba($white, 0.75) !default;
$navbar-dark-hover-color: rgba($white, 0.5) !default;
$navbar-dark-active-color: $white !default;
$navbar-dark-disabled-color: rgba($white, 0.25) !default;
// The yiq lightness value that determines when the lightness of color changes from "dark" to "light".
$yiq-contrasted-threshold: 200 !default;

View File

@ -0,0 +1,7 @@
/*
Nothing defined here. The Hugo project that uses this theme can override theme variables by adding a file to:
assets/scss/_variables_project.scss
*/

View File

@ -0,0 +1,7 @@
@import "cover";
.td-bg-arrow {
&-wrapper {
position: relative;
}
}

View File

@ -0,0 +1,19 @@
// A cover block is a full size cover with a fixed background for smaller screens.
@include td-box-height-modifiers(".td-cover-block");
.td-cover-logo {
margin-right: 0.5em;
}
.td-cover-block {
position: relative;
padding-top: 5rem;
padding-bottom: 5rem;
background: {
repeat: no-repeat;
position: 50% 0;
size: cover;
};
}

View File

@ -0,0 +1,60 @@
@import "support/functions";
@import "variables_project";
@import "variables";
@import "support/mixins";
@import "../vendor/bootstrap/scss/bootstrap";
@import "../vendor/Font-Awesome//web-fonts-with-css/scss/fontawesome.scss";
@import "../vendor/Font-Awesome//web-fonts-with-css/scss/fa-solid.scss";
@import "../vendor/Font-Awesome//web-fonts-with-css/scss/fa-brands.scss";
@import "support/utilities";
@import "colors";
@import "boxes";
@import "blog";
@import "code";
@import "nav";
@import "sidebar-tree";
@import "sidebar-toc";
@import "buttons";
@import "breadcrumb";
@import "alerts";
@import "content";
@import "search";
@import "main-container";
@import "blocks/blocks";
@import "section-index";
@import "pageinfo";
@if $td-enable-google-fonts {
@import url($web-font-path);
}
footer {
min-height: 150px;
@include media-breakpoint-down(md) {
min-height: 200px;
}
}
// Adjust anchors vs the fixed menu.
@include media-breakpoint-up(md) {
.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;
}
}
@import "styles_project";

View File

@ -0,0 +1,18 @@
.section-index {
.entry {
padding: .75rem;
}
h5 {
margin-bottom: 0;
a {
font-weight: 700;
}
}
p {
margin-top: 0;
}
}

View File

@ -0,0 +1,21 @@
// Common functions.
@function prepend($list, $value) {
@return join($value, $list);
}
// See https://www.sitepoint.com/using-sass-build-color-palettes/
@function color-diff($a, $b) {
$sat: saturation($a) - saturation($b);
$lig: lightness($a) - lightness($b);
$fn-sat: if($sat > 0, 'desaturate', 'saturate');
$fn-lig: if($lig > 0, 'darken', 'lighten');
@return (
adjust-hue: -(hue($a) - hue($b)),
#{$fn-sat}: abs($sat),
#{$fn-lig}: abs($lig)
);
}

View File

@ -0,0 +1,49 @@
// Some simple mixins.
@mixin bg-gradient-variant($parent, $color) {
#{$parent} {
background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important;
}
}
@mixin link-variant($parent, $color, $hover-color, $underline: false) {
#{$parent} {
color: $color;
@if $underline {
text-decoration: underline;
}
@include hover-focus {
color: $hover-color;
}
}
}
@mixin optional-at-root($sel) {
@at-root #{if(not &, $sel, selector-append(&, $sel))} {
@content;
}
}
// placeholder allows styling of the placeholder used in search input etc.
@mixin placeholder {
@include optional-at-root("::-webkit-input-placeholder") {
@content;
}
@include optional-at-root(":-moz-placeholder") {
@content;
}
@include optional-at-root("::-moz-placeholder") {
@content;
}
@include optional-at-root(":-ms-input-placeholder") {
@content;
}
}

View File

@ -0,0 +1,82 @@
// Mixins
@mixin optional-at-root($sel) {
@at-root #{if(not &, $sel, selector-append(&, $sel))} {
@content;
}
}
@mixin placeholder {
@include optional-at-root("::-webkit-input-placeholder") {
@content;
}
@include optional-at-root(":-moz-placeholder") {
@content;
}
@include optional-at-root("::-moz-placeholder") {
@content;
}
@include optional-at-root(":-ms-input-placeholder") {
@content;
}
}
// Common util classes.
.td-border-top {
border: none;
border-top: 1px solid #eee;
}
.td-border-none {
border: none;
}
.td-block-padding {
padding-top: $td-block-space-top-base ;
padding-bottom: $td-block-space-bottom-base;
@include media-breakpoint-up(md) {
padding-top: $td-block-space-top-base * 1.25;
padding-bottom: $td-block-space-bottom-base * 1.25;
}
}
.td-overlay {
position: relative;
&::after {
content: "";
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
&--dark::after {
background-color: rgba($dark, 0.3);
}
&--light::after {
background-color: rgba($light, 0.3);
}
&__inner {
position: relative;
z-index: 1;
}
}
.td-max-width-on-larger-screens {
@include media-breakpoint-up(lg) {
max-width: 80%;
}
}

View File

@ -0,0 +1,13 @@
# This the theme configuration.
# Allowed configuration in a theme is (currently):
# params (global and per language)
# menu (global and per language)
# outputformats and mediatypes
[params]
time_format_blog = "Monday, January 02, 2006"
time_format_default = "January 2, 2006"
# Sections to publish in the main RSS feed.
rss_sections = ["blog"]

View File

@ -0,0 +1,43 @@
# UI strings. Buttons and similar.
[ui_pager_prev]
other = "Previous"
[ui_pager_next]
other = "Next"
[ui_read_more]
other = "Read more"
[ui_search]
other = "Search this site…"
# Used in sentences such as "Posted in News"
[ui_in]
other = "in"
# Footer text
[footer_all_rights_reserved]
other = "All Rights Reserved"
[footer_privacy_policy]
other = "Privacy Policy"
# Post (blog, articles etc.)
[post_byline_by]
other = "By"
[post_created]
other = "Created"
[post_last_mod]
other = "Last modified"
[post_edit_this]
other = "Edit this page"
[post_create_issue]
other = "Create documentation issue"
[post_create_project_issue]
other = "Create project issue"
[post_posts_in]
other = "Posts in"

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