From 6373d9b1516027be4edad97c0d22155450b82977 Mon Sep 17 00:00:00 2001 From: Inaki Fernandez Date: Wed, 3 Jun 2020 16:26:04 +0200 Subject: [PATCH] update --- docs/chef.md | 3 + docs/demos.md | 7 +++ docs/devops.md | 6 ++ docs/devsecops.md | 4 ++ docs/git.md | 5 ++ docs/images/realworld-pipeline-flow.png | Bin 0 -> 101141 bytes docs/index.md | 3 +- .../java-and-java-performance-optimization.md | 44 +++++++++++++- docs/jenkins-alternatives.md | 7 +-- docs/jenkins.md | 57 +++++++++++++++--- docs/kubernetes.md | 40 ++++++++---- docs/linux.md | 1 + docs/message-queue.md | 7 +++ docs/openshift-pipelines.md | 4 ++ docs/openshift.md | 1 + docs/web-servers.md | 30 +++++++-- docs/workfromhome.md | 3 + mkdocs-readthedocs.yml | 3 +- mkdocs.yml | 3 +- requirements-readthedocs.txt | 2 +- 20 files changed, 195 insertions(+), 35 deletions(-) create mode 100644 docs/chef.md create mode 100644 docs/images/realworld-pipeline-flow.png diff --git a/docs/chef.md b/docs/chef.md new file mode 100644 index 00000000..546aa59f --- /dev/null +++ b/docs/chef.md @@ -0,0 +1,3 @@ +# Chef +- [chef.io](https://www.chef.io/) +- [learn.chef.io](https://learn.chef.io/) \ No newline at end of file diff --git a/docs/demos.md b/docs/demos.md index 7dc26042..f8e15b8a 100644 --- a/docs/demos.md +++ b/docs/demos.md @@ -111,6 +111,7 @@ - [openshift-pipelines-workshop](https://redhat-developer-demos.github.io/openshift-pipelines-workshop/) Workshop to demonstrate OpenShift Pipelines (featuring Tekton) - [Build a Go application using OpenShift Pipelines](https://developers.redhat.com/blog/2020/05/26/build-a-go-application-using-openshift-pipelines/) - [OpenShift Pipelines Catalog](https://github.com/openshift/pipelines-catalog) +- [systemcraftsman/lab-tekton-pipelines: OpenShift Pipelines workshop](https://github.com/systemcraftsman/lab-tekton-pipelines) ## Jenkins Demos * [kublr.com: cicd pipeline with jenkins nexus kubernetes](https://kublr.com/blog/cicd-pipeline-with-jenkins-nexus-kubernetes/) @@ -132,6 +133,7 @@ - [github.com/siamaksade/jenkins-blueocean](https://github.com/siamaksade/jenkins-blueocean) Jenkins Blue Ocean for OpenShift Jenkins S2I ### Jenkins Configuration as Code on Kubernetes +* [Demo of Jenkins Configuration-As-Code with Docker and Groovy Hook Scripts (java11-support branch) 🌟🌟](https://github.com/oleg-nenashev/demo-jenkins-config-as-code/tree/java11-support) * [Configuration as Code of Jenkins (for Kubernetes) 🌟🌟](https://github.com/figaw/configuration-as-code-jenkins-k8s) * [Jenkins Configuration as Code on Kubernetes 🌟](https://github.com/redhatspain/jenkins-CasC-kubernetes-demo) A Codecentric/Jenkins Helm 3 Sample Chart on Digital Ocean Kubernetes with Spring Petclinic Demo Pipeline @@ -148,6 +150,11 @@ * [Slides 🌟🌟🌟](https://github.com/figaw/freestyle-to-pipeline-jenkins/blob/master/from-freestyle-jobs-to-pipeline-with-jobdsl.pdf) * [Demo repository 🌟🌟🌟](https://github.com/figaw/freestyle-to-pipeline-jenkins) * Links of interest provided in the event: + * [Continuation Passing Style (CPS)](https://github.com/cloudbees/groovy-cps/blob/master/doc/cps-basics.md) is a style of programming in which the remainder of the program is passed explicitly as a parameter, as opposed to that being handled implicitly represented as call stack. + * [Jenkins Pipeline execution engine based on Continuation Passing Style (CPS) transformation of Groovy scripts. DSL Methods:](https://jenkinsci.github.io/job-dsl-plugin/#plugin/workflow-cps): + * [cps](https://jenkinsci.github.io/job-dsl-plugin/#method/javaposse.jobdsl.dsl.helpers.workflow.WorkflowDefinitionContext.cps): WorkflowDefinitionContext + * [cpsScm](https://jenkinsci.github.io/job-dsl-plugin/#method/javaposse.jobdsl.dsl.helpers.workflow.WorkflowDefinitionContext.cpsScm): WorkflowDefinitionContext + * [Defines a Groovy CPS DSL definition: pipelineJob definition cps script](https://jenkinsci.github.io/job-dsl-plugin/#path/pipelineJob-definition-cps-script) * [Jenkins CLI](https://www.jenkins.io/doc/book/managing/cli/) * [How to create initial "seed" job](https://github.com/jenkinsci/configuration-as-code-plugin/blob/master/docs/seed-jobs.md) * [Jenkinsfile Runner Test Framework](https://github.com/jenkinsci/jenkinsfile-runner-test-framework) diff --git a/docs/devops.md b/docs/devops.md index 52491f59..96f14868 100644 --- a/docs/devops.md +++ b/docs/devops.md @@ -1,5 +1,6 @@ # DevOps - [Introduction to Digital Business Transformation](#introduction-to-digital-business-transformation) +- [Configuration Drift](#configuration-drift) - [DevOps](#devops) - [DevOps as a Service (DaaS)](#devops-as-a-service-daas) - [Blogs](#blogs) @@ -13,6 +14,10 @@ ## Introduction to Digital Business Transformation * [What Is AIOps, BizDevOps, CloudOps, DevOps, ITOps, NoOps? A Gentle Introduction to Digital Business Transformation 🌟](https://stxnext.com/blog/2019/04/25/aiops-bizdevops-cloudops-devops-itops-noops-introduction-digital-business-transformation/) +## Configuration Drift +- [Dzone: Configuration Drift 🌟](https://dzone.com/articles/configuration-drift) Configuration Drift is the phenomenon where running servers in an infrastructure become more and more different as time goes on, due to manual ad-hoc changes and updates, and general entropy. +- [What is Configuration Drift?](https://www.continuitysoftware.com/blog/it-resilience/what-is-configuration-drift/) Configuration drift is a data center environment term. At a high level, configuration drift happens when production or primary hardware and software infrastructure configurations β€œdrift” or become different in some way from a recovery or secondary configuration or visa versa. Production or primary and recovery or secondary configurations are designed to be identical in certain aspects is order for business resumption should there be a disaster or major failure in production. When these infrastructure configurations drift from another, they leave a gap between them which commonly called a configuration gap. + ## DevOps * [Wikipedia: DevOps](https://en.wikipedia.org/wiki/DevOps) * [DevOps Toolbox: Jenkins, Ansible, Chef, Puppet, Vagrant, & SaltStack](https://hostadvice.com/blog/devops-toolbox-jenkins-ansible-chef-puppet-vagrant-saltstack/) @@ -29,6 +34,7 @@ * [smartsheet.com: The Way of DevOps: A Primer on DevOps Principles and Practices](https://www.smartsheet.com/devops) * [dzone: Are You Stuck in the New DevOps Matrix From Hell? 🌟](https://dzone.com/articles/are-you-stuck-in-the-new-devops-matrix-from-hell) See how Docker solved the matrix-from-hell problem, and how DevOps techniques can help avoid the config sprawl that comes with microservices. * [kenmugrage.com 🌟](https://kenmugrage.com/2017/05/05/my-new-definition-of-devops/#more-4) DevOps: A culture where people, regardless of title or background, work together to imagine, develop, deploy and operate a system. +* [opensource.com: 10 tips for maintaining a DevOps mindset for distributed teams](https://opensource.com/article/20/6/devops-mindset) You can do DevOps while working from home; it's all about the right approach.
[![OCP 4 Pland and Deploy](images/ocp_plan_deploy.png)](https://www.openshift.com/blog/openshift-end-to-end-plan-and-deploy) diff --git a/docs/devsecops.md b/docs/devsecops.md index feddbe96..26b139e3 100644 --- a/docs/devsecops.md +++ b/docs/devsecops.md @@ -2,6 +2,7 @@ - [Introduction](#introduction) - [Multi-Level Security (MLS) vs Multi-Category Security (MCS). Make Secure Pipelines with Podman and Containers](#multi-level-security-mls-vs-multi-category-security-mcs-make-secure-pipelines-with-podman-and-containers) - [Project Calico](#project-calico) +- [keycloak](#keycloak) - [Security Patterns for Microservice Architectures](#security-patterns-for-microservice-architectures) - [Anchore Container Security Solutions for DevSecOps](#anchore-container-security-solutions-for-devsecops) - [Secure Container Based CI/CD Workflows](#secure-container-based-cicd-workflows) @@ -19,6 +20,9 @@ ## Project Calico * [Project Calico](https://www.projectcalico.org/) Secure networking for the cloud native era +## keycloak +- [keycloak.org](https://www.keycloak.org/) Open Source Identity and Access Management For Modern Applications and Services + ## Security Patterns for Microservice Architectures - [Security Patterns for Microservice Architectures](https://developer.okta.com/blog/2020/03/23/microservice-security-patterns) diff --git a/docs/git.md b/docs/git.md index ef93cd6c..14152e62 100644 --- a/docs/git.md +++ b/docs/git.md @@ -72,6 +72,11 @@ It prescribes that software designers should define formal, precise and verifiab * [martinfowler.com: Patterns for Managing Source Code Branches](https://martinfowler.com/articles/branching-patterns.html) * [Release Branch Pattern:](https://martinfowler.com/articles/branching-patterns.html#release-branch) A branch that only accepts commits accepted to stabilize a version of the product ready for release. * [medium: Which Git branching model should I select for my project?](https://medium.com/aventude/which-git-branching-model-should-i-select-73aafc503b5f) +* [speakerdeck.com: 10 Git Anti Patterns You Should be Aware of 🌟](https://speakerdeck.com/lemiorhan/10-git-anti-patterns-you-should-be-aware-of) + +
+ +
### Git Workflows * ```git help workflows``` diff --git a/docs/images/realworld-pipeline-flow.png b/docs/images/realworld-pipeline-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..c73d72c89e9476176ee6317c488b06b326669e0b GIT binary patch literal 101141 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

g9?{Dux)7io$y9+@%w@E7~mEy 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 F{|`muoh<+W literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md index c678b67a..859094bf 100644 --- a/docs/index.md +++ b/docs/index.md @@ -73,7 +73,7 @@ A curated list of awesome references collected since 2018. Microservices archite - [Maven & Gradle](maven-gradle.md) - [SonarQube](sonarqube.md) - [Nexus & JFrog Artifactory](nexus-jfrog.md) - - [Web Servers: Apache, HAProxy & Nginx](web-servers.md) + - [Web Servers & Reverse Proxies: Apache, Nginx, HAProxy, Traefik and more](web-servers.md) - [Payara App Server](payara.md) - [Embedded Servlet Containers in SpringBoot: Jetty, Tomcat, Undertow and more](embedded-servlet-containers.md) - [Selenium, Appium & Zephyr Jira plugin](selenium-appium-zephyr.md) @@ -85,6 +85,7 @@ A curated list of awesome references collected since 2018. Microservices archite 14. [Monitoring and Performance. Prometheus, Grafana, APMs and more 🌟](monitoring.md) 15. Configuration Management - [Ansible](ansible.md) + - [Chef](chef.md) - [Liquibase](liquibase.md) - [Terraform & Packer](terraform.md) 16. Databases on Kubernetes diff --git a/docs/java-and-java-performance-optimization.md b/docs/java-and-java-performance-optimization.md index 3790d350..be20ebbf 100644 --- a/docs/java-and-java-performance-optimization.md +++ b/docs/java-and-java-performance-optimization.md @@ -1,6 +1,11 @@ -# Java Memory Management +# Java and Memory Management - [Java](#java) + - [Existing Java Implementations](#existing-java-implementations) + - [Use Java 11](#use-java-11) + - [Java Frameworks](#java-frameworks) - [Java Performance Optimization](#java-performance-optimization) + - [Relevant JVM Metrics](#relevant-jvm-metrics) + - [Common JVM Errors](#common-jvm-errors) - [Tuning Jenkins GC](#tuning-jenkins-gc) - [Tuning Java Containers](#tuning-java-containers) - [Debugging java applications on OpenShift and Kubernetes](#debugging-java-applications-on-openshift-and-kubernetes) @@ -18,6 +23,29 @@ * [redhat.com: The history and future of OpenJDK](https://www.redhat.com/en/blog/history-and-future-openjdk) * [javarevisited.blogspot.com: The 2020 Java Developer RoadMap 🌟](https://javarevisited.blogspot.com/2019/10/the-java-developer-roadmap.html) +### Existing Java Implementations +- [Oracle Java](https://www.oracle.com/technetwork/java/javase/overview/index.html) +- [Oracle OpenJDK](https://jdk.java.net/11/) +- [IBM JDK](https://developer.ibm.com/javasdk/) (based on [Eclipse OpenJ9](https://www.eclipse.org/openj9/)) +- [Red Hat OpenJDK](https://developers.redhat.com/products/openjdk/download) +- [AdoptOpenJDk](https://adoptopenjdk.net/) (based on [Eclipse OpenJ9](https://www.eclipse.org/openj9/)) + +### Use Java 11 +- [It’s time! Migrating to Java 11 🌟](https://medium.com/criciumadev/its-time-migrating-to-java-11-5eb3868354f9) +- [Oracle's Java 11 trap - Use OpenJDK instead! 🌟](https://blog.joda.org/2018/09/do-not-fall-into-oracles-java-11-trap.html) +- [**AdoptOpenJDK 11** Is the New Default 🌟](https://blog.adoptopenjdk.net/2020/06/adoptopenjdk-11-new-default/) +- [All You Need To Know For Migrating To Java 11](https://blog.codefx.org/java/java-11-migration-guide/) + +### Java Frameworks + +Framework / Java Ecosystem|Technology|Cloud Native|Platform +:----|:---|:---|:--- +[Java EE](https://en.wikipedia.org/wiki/Java_Platform,_Enterprise_Edition)
[Java EE at a Glance](https://www.oracle.com/java/technologies/java-ee-glance.html)|Frontend + Backend
Java EE Monoliths|No|Java EE Middleware Servers (WAS, WebLogic, JBoss EAP, etc) +[Jakarta EE (Java EE renamed)](https://jakarta.ee/)|Frontend + Backend|Yes|OpenShift, Kubernetes, etc +[SpringBoot (Spring)](https://spring.io/projects/spring-boot)|Backend (RESTful)|Yes|OpenShift, Kubernetes, etc +[Spring Cloud (Spring)](https://spring.io/projects/spring-cloud)|Backend (RESTful)|Yes|OpenShift, Kubernetes, etc +[Quarkus](https://quarkus.io/)|Backend (RESTful)|Yes|OpenShift, Kubernetes, etc + ## Java Performance Optimization * [DZone refcard: java performance optimization 🌟](https://dzone.com/refcardz/java-performance-optimization) Tools and Techniques for Turbocharged Apps - [DZone: String Concatenation's Effect on Performance](https://dzone.com/articles/string-concatentions-effect-on-performance) Don’t use the string concatenation operator to combine more than a few strings unless performance is irrelevant. Use StringBuilder’s append method instead. @@ -27,8 +55,22 @@ - [DZone refcard: Java Caching](https://dzone.com/refcardz/java-caching) * [Dzone: 7 JVM Arguments of Highly Effective Applications 🌟🌟🌟](https://dzone.com/articles/7-jvm-arguments-of-highly-effective-applications-1) How to use 7 JVM arguments to help increase your application's performance and avoid common memory pitfalls. +### Relevant JVM Metrics +Metric|Details / Reference +:---|:--- +GC Throughput|**Repeated Full GC happens way before OutOfMemoryError**
[ref1](https://dzone.com/articles/7-jvm-arguments-of-highly-effective-applications-1)
[ref2](https://blog.gceasy.io/2019/03/13/micrometrics-to-forecast-application-performance) +etc| + +### Common JVM Errors +JVM Error|Details / Reference +:----|:---- +OutOfMemoryError|**Repeated Full GC happens way before OutOfMemoryError**
[ref1](https://dzone.com/articles/7-jvm-arguments-of-highly-effective-applications-1)
[ref2](https://blog.gceasy.io/2019/03/13/micrometrics-to-forecast-application-performance) +StackOverflowError|[ref](https://blog.fastthread.io/2018/09/24/stackoverflowerror/) +etc| + ### Tuning Jenkins GC * [jenkins.io - Tuning Jenkins GC For Responsiveness and Stability with Large Instances 🌟](https://jenkins.io/blog/2016/11/21/gc-tuning/) +* [Running Jenkins on Java 11 🌟](https://www.jenkins.io/doc/administration/requirements/jenkins-on-java-11/#:~:text=The%20easiest%20way%20to%20run,images%2C%20use%20the%20jdk11%20tag.) ### Tuning Java Containers * [blog.openshift.com: Scaling Java Containers 🌟](https://blog.openshift.com/scaling-java-containers/) diff --git a/docs/jenkins-alternatives.md b/docs/jenkins-alternatives.md index 625bb730..5c3e70e8 100644 --- a/docs/jenkins-alternatives.md +++ b/docs/jenkins-alternatives.md @@ -55,10 +55,9 @@ ## Integration with other CI/CD engines * [CloudBees Integrates Software Delivery Management Platform With Google Cloud Build and Tekton to Break Down Development Silos](https://www.previous.cloudbees.com/press/cloudbees-integrates-software-delivery-management-platform-google-cloud-build-and-tekton-break) -

-[![gitlab](images/gitlab.jpg)](https://gitlab.com/) -
- +---
+ +[![gitlab](images/gitlab.jpg)](https://gitlab.com/)
\ No newline at end of file diff --git a/docs/jenkins.md b/docs/jenkins.md index 20a966cb..43371b0b 100644 --- a/docs/jenkins.md +++ b/docs/jenkins.md @@ -3,6 +3,8 @@ - [Groovy](#groovy) - [Awesome Jenkins](#awesome-jenkins) - [Jenkins Cheat Sheet](#jenkins-cheat-sheet) +- [Jenkins Special Interest Groups (SIG)](#jenkins-special-interest-groups-sig) +- [Running Jenkins on Java 11. Use OpenJDK 11](#running-jenkins-on-java-11-use-openjdk-11) - [Online Learning](#online-learning) - [Jenkins Configuration as Code Solutions. 3 available DSLs](#jenkins-configuration-as-code-solutions-3-available-dsls) - [DSL 1. Job DSL Plugin. From Freestyle jobs to Declarative Pipeline](#dsl-1-job-dsl-plugin-from-freestyle-jobs-to-declarative-pipeline) @@ -10,8 +12,9 @@ - [Jenkins Pipeline Syntax. Scripted Syntax (Groovy DSL syntax) VS Declarative Syntax](#jenkins-pipeline-syntax-scripted-syntax-groovy-dsl-syntax-vs-declarative-syntax) - [Extending with Shared Libraries](#extending-with-shared-libraries) - [Automating Service Level Indicators/Service Level Objectives based build validation with Keptn and Jenkins](#automating-service-level-indicatorsservice-level-objectives-based-build-validation-with-keptn-and-jenkins) + - [Jenkinsfile Runner. Serverless / function-as-a-service build execution](#jenkinsfile-runner-serverless--function-as-a-service-build-execution) - [DSL 3. Jenkins Configuration as Code (JCasC)](#dsl-3-jenkins-configuration-as-code-jcasc) - - [Read-only Jenkins Configuration](#read-only-jenkins-configuration) + - [Read-only Jenkins Configuration](#read-only-jenkins-configuration) - [Jenkins Architecture. Performance and Scalability](#jenkins-architecture-performance-and-scalability) - [Ansible and Jenkins. Running Ansible Playbooks From Jenkins](#ansible-and-jenkins-running-ansible-playbooks-from-jenkins) - [Jenkins Tools](#jenkins-tools) @@ -30,7 +33,7 @@ - [Feature Flags in CloudBees Enterprise On-Premise](#feature-flags-in-cloudbees-enterprise-on-premise) - [CloudBees Accelerator](#cloudbees-accelerator) - [Jervis: Jenkins as a service](#jervis-jenkins-as-a-service) -- [Jenkins X](#jenkins-x) +- [Jenkins X (Serverless)](#jenkins-x-serverless) ## Jenkins * [CloudBees](https://www.cloudbees.com/) @@ -49,6 +52,7 @@ * [jenkins.io 2020-05-06: Slave to Agent renaming. Renaming of the official Docker images for Jenkins agents](https://www.jenkins.io/blog/2020/05/06/docker-agent-image-renaming/) We would like to announce the renaming of the official Docker images for Jenkins agents. The **"slave" term is widely considered inappropriate in open source communities**. It has been **officially deprecated in Jenkins 2.0 in 2016**, but there are remaining usages in some Jenkins components. * [Windows Docker Agent Images: General Availability 🌟](https://www.jenkins.io/blog/2020/05/11/docker-windows-agents/) * [jenkinsistheway.io: Jenkins Is The Way 🌟](https://jenkinsistheway.io/) Jenkins Is The Way is a collection of experiences from all around the world showcasing how users are building, deploying, and automating great stuff with Jenkins. +* [Jenkins: Shifting Gears 🌟🌟](https://www.jenkins.io/blog/2018/08/31/shifting-gears/) **Evolutionary line from the current Jenkins 2, but with breaking changes in order to gain higher development speed.** This document lays out the key directions and approaches in a broad stroke, which I discussed with a number of you in the past. Hopefully, this gives you the big picture of how I envision where to move Jenkins forward, not just as the creator of Jenkins but as the CTO of CloudBees, who employs a number of key contributors to the Jenkins project.
[![Jenkins Is The Way](images/Jenkins-is-the-Way.png)](https://jenkinsistheway.io) @@ -66,6 +70,15 @@ ## Jenkins Cheat Sheet * [Jenkins Cheat Sheets](cheatsheets.md) +## Jenkins Special Interest Groups (SIG) +* [Jenkins SIG Platform 🌟](https://www.jenkins.io/sigs/platform/) This special interest group offers a venue for all kinds of platform support discussions: Java, Operating Systems, Architectures, Docker, Packaging, Web Containers, etc. The SIG works on defining platform support policies, coordinating platform support efforts with contributors and external communities, and reviewing proposals in the area. +* [Jenkins SIG Cloud Native 🌟](https://www.jenkins.io/sigs/cloud-native/) + +## Running Jenkins on Java 11. Use OpenJDK 11 +- [Running Jenkins on Java 11 🌟](https://www.jenkins.io/doc/administration/requirements/jenkins-on-java-11/#:~:text=The%20easiest%20way%20to%20run,images%2C%20use%20the%20jdk11%20tag.) +- [Oracle's Java 11 trap - Use OpenJDK instead! 🌟](https://blog.joda.org/2018/09/do-not-fall-into-oracles-java-11-trap.html) +- [It’s time! Migrating to Java 11 🌟](https://medium.com/criciumadev/its-time-migrating-to-java-11-5eb3868354f9) + ## Online Learning * [udemy.com: Master Jenkins CI For DevOps and Developers](https://www.udemy.com/the-complete-jenkins-course-for-developers-and-devops/) * [udemy.com: Learn DevOps: CI/CD with Jenkins using Pipelines and Docker](https://www.udemy.com/learn-devops-ci-cd-with-jenkins-using-pipelines-and-docker/) Use Jenkins the DevOps way. Automate your Jenkins jobs by using Jenkins Pipelines, Docker, and the Jenkins Job DSL @@ -83,9 +96,14 @@ * Jenkins Job DSL API used in jenkins declarative pipelines. * [Job DSL Plugin 🌟](https://plugins.jenkins.io/job-dsl/) * [github.com/jenkinsci/job-dsl-plugin](https://github.com/jenkinsci/job-dsl-plugin/wiki) - * [Jenkins Job DSL Plugin documentation](https://github.com/jenkinsci/job-dsl-plugin#documentation) A Groovy DSL for Jenkins Jobs - Sweeeeet! -* [Jenkins Job DSL API 🌟](http://jenkinsci.github.io/job-dsl-plugin/) + * [Jenkins Job DSL Plugin documentation 🌟](https://github.com/jenkinsci/job-dsl-plugin#documentation) A Groovy DSL for Jenkins Jobs - Sweeeeet! +* [Jenkins Job DSL API 🌟](https://jenkinsci.github.io/job-dsl-plugin/) * [mavenJob](https://jenkinsci.github.io/job-dsl-plugin/#path/mavenJob) + * [Continuation Passing Style (CPS)](https://github.com/cloudbees/groovy-cps/blob/master/doc/cps-basics.md) is a style of programming in which the remainder of the program is passed explicitly as a parameter, as opposed to that being handled implicitly represented as call stack. + * [Jenkins Pipeline execution engine based on Continuation Passing Style (CPS) transformation of Groovy scripts. DSL Methods:](https://jenkinsci.github.io/job-dsl-plugin/#plugin/workflow-cps): + * [cps](https://jenkinsci.github.io/job-dsl-plugin/#method/javaposse.jobdsl.dsl.helpers.workflow.WorkflowDefinitionContext.cps): WorkflowDefinitionContext + * [cpsScm](https://jenkinsci.github.io/job-dsl-plugin/#method/javaposse.jobdsl.dsl.helpers.workflow.WorkflowDefinitionContext.cpsScm): WorkflowDefinitionContext + * [Defines a Groovy CPS DSL definition: pipelineJob definition cps script](https://jenkinsci.github.io/job-dsl-plugin/#path/pipelineJob-definition-cps-script) * [Example of a pipeline with parameters](https://github.com/polarpoint-io/groovy-jenkins-pipelines/blob/master/jobs/parameterisedPipelines.groovy) * [job-dsl **Gradle** Example](https://github.com/sheehan/job-dsl-gradle-example) * [Jenkins DSL for **Nexus**](https://accenture.github.io/adop-cartridges-cookbook/docs/recipes/archiving-artefact-to-nexus/) @@ -93,9 +111,16 @@ * [ref 1](https://jenkinsci.github.io/job-dsl-plugin/#method/javaposse.jobdsl.dsl.helpers.step.StepContext.maven) * [ref 2](https://deors.wordpress.com/2019/04/25/jenkins-ci-pipeline-java-spring-boot-maven-docker/) * [Pipeline Global Library for ci.jenkins.io](https://github.com/jenkins-infra/pipeline-library) Collection of custom steps and variables for our Jenkins instance(s) +* [medium: Jenkins Jobs as Code with Groovy DSL (Job DSL plugin) 🌟](https://tech.gogoair.com/jenkins-jobs-as-code-with-groovy-dsl-c8143837593a) ### DSL 2. Jenkins Pipeline. Pipeline as Code with Jenkins * [Pipeline as Code with Jenkins 🌟](https://www.jenkins.io/solutions/pipeline/) + * [**Why Pipeline?**](https://www.jenkins.io/doc/book/pipeline/#why) Jenkins is, fundamentally, an automation engine which supports a number of automation patterns. Pipeline adds a powerful set of automation tools onto Jenkins, supporting use cases that span from simple continuous integration to comprehensive CD pipelines. By modeling a series of related tasks, users can take advantage of the many features of Pipeline: + * **Code**: Pipelines are implemented in code and typically checked into source control, giving teams the ability to edit, review, and iterate upon their delivery pipeline. + * **Durable**: Pipelines can survive both planned and unplanned restarts of the Jenkins master. + * **Pausable**: Pipelines can optionally stop and wait for human input or approval before continuing the Pipeline run. + * **Versatile**: Pipelines support complex real-world CD requirements, including the ability to fork/join, loop, and perform work in parallel. + * **Extensible**: The Pipeline plugin supports custom extensions to its [DSL](https://en.wikipedia.org/wiki/Domain-specific_language) and multiple options for integration with other plugins. * [jenkins.io - doc/book/pipeline 🌟](https://jenkins.io/doc/book/pipeline/) * [jenkins.io - **Jenkinsfile** 🌟](https://jenkins.io/doc/book/pipeline/jenkinsfile/) With **version 2** of the Jenkins Continuous Integration/Continuous Delivery (CI/CD) server, **a new job definition file has been introduced, called Jenkinsfile**. The initial Jenkinsfile format was based on Groovy. As groovy knowledge is not that widespread, a new and more straight forward was published in spring 2017. **This format is called Declarative Pipeline**. [This visual studio code extension](https://marketplace.visualstudio.com/items?itemName=jmMeessen.jenkins-declarative-support) is aimed at making the manipulation of this file type easier. * [Dzone refcard: **Continuous Delivery with Jenkins Workflow** 🌟](https://dzone.com/refcardz/continuous-delivery-with-jenkins-workflow) @@ -116,6 +141,10 @@ * [opensource.com - Introduction to writing pipelines-as-code and implementing DevOps with Jenkins 2](https://opensource.com/article/18/8/devops-jenkins-2) * [thoughtworks.com: Modernizing your build pipelines 🌟](https://www.thoughtworks.com/es/insights/blog/modernizing-your-build-pipelines) +
+[![real world pipeline flow](images/realworld-pipeline-flow.png)](https://www.jenkins.io/solutions/pipeline/) +
+ #### Jenkins Pipeline Syntax. Scripted Syntax (Groovy DSL syntax) VS Declarative Syntax * [Jenkins Pipeline Syntax: Scripted Syntax (Groovy DSL syntax) & Declarative Syntax 🌟](https://www.jenkins.io/doc/book/pipeline/syntax/): * **Version 2.5 of the "Pipeline plugin" released in 2016/05/16 introduces support for Declarative Pipeline syntax**. @@ -137,6 +166,16 @@ - In this session you learn the basics of picking good **SLIs & SLOs** and how to extract them from your monitoring tools. After this session you will be able to start implementing this integration yourself with Jenkins. To give you a jump start you will be introduced to the open source project [Keptn](https://www.keptn.sh) which provides **automated SLI/SLO-based quality gates**. Then we'll talk about [Keptn Jenkins Shared Library](https://github.com/keptn-sandbox/keptn-jenkins-library) which **integrates Jenkins and Keptn** with just a couple of function calls. - [youtube: Level-Up your Jenkins-based Delivery with Keptn](https://www.youtube.com/watch?v=VYRdirdjOAg&t=5s) +#### Jenkinsfile Runner. Serverless / function-as-a-service build execution +- [Jenkinsfile Runner](https://github.com/jenkinsci/jenkinsfile-runner) Jenkinsfile Runner is an experiment to package Jenkins pipeline execution as a command line tool. The intend use cases include: + - Use Jenkins in Function-as-a-Service context + - Assist editing Jenkinsfile locally + - Integration test shared libraries + +
+ +
+ ### DSL 3. Jenkins Configuration as Code (JCasC) * [Jenkins Configuration as Code Plugin](https://www.jenkins.io/projects/jcasc/) * [plugins.jenkins.io/configuration-as-code](https://plugins.jenkins.io/configuration-as-code/) @@ -152,7 +191,7 @@ * [Example of Configuration as Code of Jenkins (for Kubernetes) 🌟](https://github.com/figaw/configuration-as-code-jenkins-k8s) * [JEP-224: System Read permission: Improve experience of Jenkins Configuration-as-Code users](https://www.jenkins.io/events/online-hackfest/2020-uiux/) It improves the modifying Web UI configuration controls to support the read-only mode. -### Read-only Jenkins Configuration +#### Read-only Jenkins Configuration - [Read-only Jenkins Configuration 🌟](https://www.jenkins.io/blog/2020/05/25/read-only-jenkins-announcement/) This feature allows restricting configuration UIs and APIs while providing access to essential Jenkins system configuration, diagnostics, and self-monitoring tools through Web UI. Such mode is critical for instances managed as code, e.g. with Jenkins [Configuration-as-Code plugin](https://plugins.jenkins.io/configuration-as-code). It is delivered as a part of the [JEP-224: Read-only system configuration](https://github.com/jenkinsci/jep/blob/master/jep/224/README.adoc) effort. ## Jenkins Architecture. Performance and Scalability @@ -315,10 +354,12 @@ * [Jervis](https://github.com/samrocketman/jervis/wiki) is [Sam Gleske](https://github.com/samrocketman)'s vision of a good way to roll out Jenkins as a service in very large organizations. * [SCM Filter Jervis YAML Plugin](https://plugins.jenkins.io/scm-filter-jervis/) This plugin is intended for Jenkins infrastructure relying on [jervis](https://github.com/samrocketman/jervis/wiki) to deliver software in a self-service manner. This plugin can also be used for Travis CI YAML. -## Jenkins X -[**Jenkins X**](https://jenkins-x.io) is a specialized Jenkins for Kubernetes: This is how it works from a bird eye the CI/CD: a developer creates a branch, then Jenkins X creates a ephemeral namespace with that branch. The developer tests it and once it is ok, a PR is created, then, the branch is deployed in staging. When I merge it, it goes to QA, and with a manual command "jx promote" it goes to production. Jenkins X deletes automatically after N hours the branch namespace. +## Jenkins X (Serverless) +[Jenkins X](https://jenkins-x.io) is a specialized Jenkins for Kubernetes: This is how it works from a bird eye the CI/CD: a developer creates a branch, then Jenkins X creates a ephemeral namespace with that branch. The developer tests it and once it is ok, a PR is created, then, the branch is deployed in staging. When I merge it, it goes to QA, and with a manual command "jx promote" it goes to production. Jenkins X deletes automatically after N hours the branch namespace. -* [**jenkins-x.io**](https://jenkins-x.io/) +[Why Do We Need Jenkins X To Be Serverless?](https://jenkins-x.io/blog/2019/07/23/serverless-deployments/#:~:text=Initially%2C%20Jenkins%20X%20had%20a,a%20modern%20Kubernetes%2Dbased%20solution.) Initially, Jenkins X had a stripped-down version of Jenkins but, since the release 2, not a single line of the traditional Jenkins is left in Jenkins X. **Now it is fully serverless thanks to Tekton** and a lot of custom code written from scratch to support the need for a modern Kubernetes-based solution. + +* [jenkins-x.io](https://jenkins-x.io/) * [itnext.io/tagged/jenkins-x](https://itnext.io/tagged/jenkins-x) * [itnext.io: Jenkins X β€” Managing Jenkins](https://itnext.io/jenkins-x-managing-jenkins-926f0e0f8bcf) * Video Tutorials: diff --git a/docs/kubernetes.md b/docs/kubernetes.md index 07fea5e8..599ba16a 100644 --- a/docs/kubernetes.md +++ b/docs/kubernetes.md @@ -31,11 +31,14 @@ - [Cluster Autoscaler and DockerHub](#cluster-autoscaler-and-dockerhub) - [Cluster Autoscaler in GKE, EKS, AKS and DOKS](#cluster-autoscaler-in-gke-eks-aks-and-doks) - [Cluster Autoscaler in OpenShift](#cluster-autoscaler-in-openshift) -- [Kubernetes Special Interest Groups (SIGs). Kubernetes Community](#kubernetes-special-interest-groups-sigs-kubernetes-community) - - [Kubectl Plugins](#kubectl-plugins) - - [Kubectl Plugins and Tools](#kubectl-plugins-and-tools) +- [Kubernetes Community](#kubernetes-community) + - [Community Forums](#community-forums) + - [Kubernetes Special Interest Groups (SIGs)](#kubernetes-special-interest-groups-sigs) + - [Kubectl Plugins](#kubectl-plugins) + - [Kubectl Plugins and Tools](#kubectl-plugins-and-tools) - [Kubernetes Troubleshooting](#kubernetes-troubleshooting) - [Kubernetes Tutorials](#kubernetes-tutorials) + - [Online Training](#online-training) - [Famous Kubernetes resources of 2019](#famous-kubernetes-resources-of-2019) - [Famous Kubernetes resources of 2020](#famous-kubernetes-resources-of-2020) - [Kubernetes Patterns](#kubernetes-patterns) @@ -91,6 +94,7 @@ - [Ubuntu Charmed Kubernetes](#ubuntu-charmed-kubernetes) - [VMware Kubernetes Tanzu and Project Pacific](#vmware-kubernetes-tanzu-and-project-pacific) - [Rancher: Enterprise management for Kubernetes](#rancher-enterprise-management-for-kubernetes) + - [Rancher Academy (online training)](#rancher-academy-online-training) - [Rancher 2](#rancher-2) - [Rancher 2 RKE](#rancher-2-rke) - [K3S](#k3s) @@ -345,12 +349,16 @@ kubectl get secret --namespace=β€Š-o yaml | sed β€˜s/names * [OpenShift 3.11: Configuring the cluster auto-scaler in AWS](https://docs.openshift.com/container-platform/3.11/admin_guide/cluster-autoscaler.html) * [OpenShift 4.4: Applying autoscaling to an OpenShift Container Platform cluster](https://docs.openshift.com/container-platform/4.4/machine_management/applying-autoscaling.html) -## Kubernetes Special Interest Groups (SIGs). Kubernetes Community +## Kubernetes Community +### Community Forums +- [Community Forums 🌟🌟](https://discuss.kubernetes.io/) + +### Kubernetes Special Interest Groups (SIGs) - [Kubernetes Special Interest Groups (SIGs)](https://github.com/kubernetes/community/blob/master/README.md#special-interest-groups-sig) have been around to support the community of developers and operators since around the 1.0 release. People organized around networking, storage, scaling and other operational areas. - [SIG Apps: build apps for and operate them in Kubernetes](https://kubernetes.io/blog/2016/08/sig-apps-running-apps-in-kubernetes/) - [Kubernetes SIGs 🌟](https://github.com/kubernetes-sigs) -### Kubectl Plugins +#### Kubectl Plugins * [Available kubectl plugins 🌟](https://github.com/kubernetes-sigs/krew-index/blob/master/plugins.md) * [Extend kubectl with plugins](https://kubernetes.io/docs/tasks/extend-kubectl/kubectl-plugins/) * [youtube: Welcome to the world of kubectl plugins](https://www.youtube.com/watch?v=_W2qZvQT6XY) @@ -360,7 +368,7 @@ kubectl get secret --namespace=β€Š-o yaml | sed β€˜s/names

-#### Kubectl Plugins and Tools +##### Kubectl Plugins and Tools * [ramitsurana/awesome-kubernetes: Tools 🌟](https://github.com/ramitsurana/awesome-kubernetes#configuration) * [VMware octant](https://github.com/vmware/octant) A web-based, highly extensible platform for developers to better understand the complexity of Kubernetes clusters. * [octant.dev](https://octant.dev/) Visualize your Kubernetes workloads. Octant is an open source developer-centric web interface for Kubernetes that lets you inspect a Kubernetes cluster and its applications. @@ -411,9 +419,6 @@ kubectl get secret --namespace=β€Š-o yaml | sed β€˜s/names * [managedkube.com: Troubleshooting a Kubernetes ingress](https://managedkube.com/kubernetes/trace/ingress/service/port/not/matching/pod/k8sbot/2019/02/13/trace-ingress.html) ## Kubernetes Tutorials -* [katacoda.com 🌟](https://www.katacoda.com/) Interactive Learning and Training Platform for Software Engineers -* [kubernetesbyexample.com 🌟](http://kubernetesbyexample.com/) -* [Play with Kubernetes 🌟](https://labs.play-with-k8s.com/) A simple, interactive and fun playground to learn Kubernetes * [devopscube.com: Kubernetes Tutorials For Beginners: Getting Started Guide 🌟](https://devopscube.com/kubernetes-tutorials-beginners/) * [Intoduction to Kubernetes (slides, beginners and advanced) 🌟](https://docs.google.com/presentation/d/1zrfVlE5r61ZNQrmXKx5gJmBcXnoa_WerHEnTxu5SMco) * [medium.com: Kubernetes 101: Pods, Nodes, Containers, and Clusters](https://medium.com/google-cloud/kubernetes-101-pods-nodes-containers-and-clusters-c1509e409e16) @@ -428,15 +433,20 @@ kubectl get secret --namespace=β€Š-o yaml | sed β€˜s/names * [apkplz.net: Learn Kubernetes 1 APK](https://apkplz.net/app/com.LearningSolution.LearnKubernetes) * [Google Play Search](https://play.google.com/store/search?q=learn+kubernetes) * [Dzone refcard: Getting Started with Kubernetes](https://dzone.com/refcardz/kubernetes-essentials) -* [udemy.com: Learn DevOps: The Complete Kubernetes Course 🌟](https://www.udemy.com/learn-devops-the-complete-kubernetes-course) -* [udemy.com: Learn DevOps: Advanced Kubernetes Usage 🌟](https://www.udemy.com/learn-devops-advanced-kubernetes-usage) -* [wardviaene/kubernetes-course 🌟](https://github.com/wardviaene/kubernetes-course) -* [wardviaene/advanced-kubernetes-course 🌟](https://github.com/wardviaene/advanced-kubernetes-course) * [dzone: The complete kubernetes collection tutorials and tools 🌟](https://dzone.com/articles/the-complete-kubernetes-collection-tutorials-and-tools) * [dzone: kubernetes in 10 minutes a complete guide to look](https://dzone.com/articles/kubernetes-in-10-minutes-a-complete-guide-to-look) * [magalix.com: The Best Kubernetes Tutorials 🌟](https://www.magalix.com/blog/the-best-kubernetes-tutorials) * [35 Advanced Tutorials to Learn Kubernetes 🌟](https://medium.com/faun/35-advanced-tutorials-to-learn-kubernetes-dae5695b1f18) +### Online Training +* [katacoda.com 🌟](https://www.katacoda.com/) Interactive Learning and Training Platform for Software Engineers +* [kubernetesbyexample.com 🌟](http://kubernetesbyexample.com/) +* [Play with Kubernetes 🌟](https://labs.play-with-k8s.com/) A simple, interactive and fun playground to learn Kubernetes +* [udemy.com: Learn DevOps: The Complete Kubernetes Course 🌟](https://www.udemy.com/learn-devops-the-complete-kubernetes-course) + * [wardviaene/kubernetes-course 🌟](https://github.com/wardviaene/kubernetes-course) +* [udemy.com: Learn DevOps: Advanced Kubernetes Usage 🌟](https://www.udemy.com/learn-devops-advanced-kubernetes-usage) + * [wardviaene/advanced-kubernetes-course 🌟](https://github.com/wardviaene/advanced-kubernetes-course) + ### Famous Kubernetes resources of 2019 * [Kubernetes for developers](https://www.udemy.com/course/kubernetes-for-developers/) * [Kubernetes for the Absolute Beginners](https://www.udemy.com/course/learn-kubernetes/) @@ -757,6 +767,10 @@ $ sudo mv kops-linux-amd64 /usr/local/bin/kops

+##### Rancher Academy (online training) +- [Rancher Academy 🌟](https://academy.rancher.com/) +- [Rancher Labs launches free training course to meet surging demand for Kubernetes skills](https://www.computing.co.uk/news/4015423/rancher-labs-launches-free-training-course-meet-surging-demand-kubernetes) Five-week course covers how to deploy Rancher and manage Kubernetes + ##### Rancher 2 - [**Rancher 2**](https://rancher.com/docs/rancher/v2.x/en/) diff --git a/docs/linux.md b/docs/linux.md index b302a025..1017c945 100644 --- a/docs/linux.md +++ b/docs/linux.md @@ -60,6 +60,7 @@ - [**watchman command**: A File and Directory Watching Tool for Changes](https://www.tecmint.com/watchman-monitor-file-changes-in-linux/) - [**ip command**: How to use IP Command in Linux with Examples](https://linoxide.com/linux-command/use-ip-command-linux/) - [**curl command**: Understanding the Hidden Powers of curl](https://nordicapis.com/understanding-the-hidden-powers-of-curl/) +- [How To Use grep Command In Linux / UNIX 🌟](https://www.cyberciti.biz/faq/howto-use-grep-command-in-linux-unix/) ### Systemd - [Start using systemd as a troubleshooting tool](https://opensource.com/article/20/5/systemd-troubleshooting-tool) While systemd is not really a troubleshooting tool, the information in its output points the way toward solving problems. diff --git a/docs/message-queue.md b/docs/message-queue.md index d936e78d..0bad810a 100644 --- a/docs/message-queue.md +++ b/docs/message-queue.md @@ -120,8 +120,11 @@ - [Understanding Red Hat AMQ Streams components for OpenShift and Kubernetes 🌟](https://developers.redhat.com/blog/2019/12/04/understanding-red-hat-amq-streams-components-for-openshift-and-kubernetes-part-1/) - [Red Hat **AMQ streams** (kafka): Simplify Apache Kafka on Red Hat OpenShift](https://www.redhat.com/en/resources/amq-streams-datasheet) - [Set up **Red Hat AMQ Streams** custom certificates on OpenShift](https://developers.redhat.com/blog/2020/04/01/set-up-red-hat-amq-streams-custom-certificates-on-openshift-update/) +- [speakerdeck.com: Apache Kafka with Red Hat AMQ Streams 🌟](https://speakerdeck.com/mabulgu/apache-kafka-with-red-hat-amq-streams) +
[![AMQ in a nutshell](images/AMQ.png)](https://developers.redhat.com/products/amq/overview) +
Product|Also Known As|Components|URL :------|:----|:--------|:---- @@ -130,6 +133,10 @@ Red Hat AMQ 7|JBoss AMQ 7 (Broker) or Red Hat AMQ 7 Suite|AMQ Broker + AMQ Strea Red Hat AMQ 7|JBoss AMQ 7 (Broker) or Red Hat AMQ 7 Suite|JBoss AMQ 7 (Broker) + Apache Kafka|[Ref](https://access.redhat.com/documentation/en-us/red_hat_amq/6.3/) Red Hat AMQ 7|JBoss AMQ 7 (Broker) or Red Hat AMQ 7 Suite|Apache ActiveMQ Artemis + Apache Kafka|[Ref](https://access.redhat.com/documentation/en-us/red_hat_amq/6.3/) +
+ +
+ ## eBooks - [O'Really: Streaming data](http://streamingsystems.net/) diff --git a/docs/openshift-pipelines.md b/docs/openshift-pipelines.md index fc1958d4..c67857d1 100644 --- a/docs/openshift-pipelines.md +++ b/docs/openshift-pipelines.md @@ -128,4 +128,8 @@ + + + + \ No newline at end of file diff --git a/docs/openshift.md b/docs/openshift.md index b6802eb5..38148b92 100644 --- a/docs/openshift.md +++ b/docs/openshift.md @@ -730,6 +730,7 @@ oc login * [udemy.com: Red Hat OpenShift With Jenkins: DevOps For Beginners](https://www.udemy.com/red-hat-openshift) * [udemy.com: OpenShift Enterprise v3.2 Installation and Configuration](https://www.udemy.com/openshift-enterprise-installation-and-configuration/learn/v4/overview) * [udemy.com: Ultimate Openshift (2018) Bootcamp by School of Devops 🌟](https://www.udemy.com/ultimate-openshift-bootcamp-by-school-of-devops/) With Openshift Origin 3.10 / OKD 2018, Kubernetes, Jenkins Pipelines, Prometheus, Istio, Micro Services, PaaS +* [Udemy: OpenShift 4 desde cero 🌟](https://www.udemy.com/course/openshift-4-desde-cero) ## Local Installers * [developers.redhat.com: **Red Hat Container Development Kit**](https://developers.redhat.com/products/cdk/overview/) diff --git a/docs/web-servers.md b/docs/web-servers.md index 13143480..43eae13e 100644 --- a/docs/web-servers.md +++ b/docs/web-servers.md @@ -1,24 +1,44 @@ -# Web Servers +# Web Servers & Reverse Proxies: Apache, Nginx, HAProxy, Traefik and more +- [Introduction](#introduction) - [Apache](#apache) - [Apache Configuration Samples](#apache-configuration-samples) -- [HAProxy](#haproxy) - [Nginx](#nginx) +- [HAProxy](#haproxy) +- [Traefik](#traefik) + +## Introduction +- [Reverse Proxy: What, When, How](https://dzone.com/articles/reverse-proxy-what-when-how) Look at a tutorial that explains reverse proxies. ## Apache +- [Apache](https://httpd.apache.org/) +- [Dzone Refcard: Essential Apache HTTP Server](https://dzone.com/refcardz/essential-apache-http-server) - [nixCraft: How to secure Apache with Let’s Encrypt Certificates on RHEL 8](https://www.cyberciti.biz/faq/how-to-secure-apache-with-lets-encrypt-certificates-on-rhel-8/) +- [Apache Reverse Proxy Guide](https://httpd.apache.org/docs/2.4/howto/reverse_proxy.html) + ### Apache Configuration Samples - [Apache Reverse Proxy for Jenkins](https://github.com/redhatspain/apache-reverse-proxy-jenkins) Reverse Proxy configuration with HTTPS for Jenkins, Sonarqube and Nexus. Based on RHEL 7 Apache config. +## Nginx +- [Nginx](https://www.nginx.com/) +- [Dzone: NGINX: Load Balancing Your Application Made Easy](https://dzone.com/articles/nginx-load-balancing-your-application-made-easy-1) +- [Dzone: Nginx Reverse Proxy Ubuntu 18.04](https://dzone.com/articles/nginx-reverse-proxy-ubuntu-1804) In this post, we will show you how to install Nginx Web Server and configure it as a reverse proxy on Ubuntu Server 18.04 +- [Dzone: DevOps 101: Set Up Nginx in Front of Your Spring Boot Application [Video]](https://dzone.com/articles/devops-101-setup-nginx-in-front-of-your-spring-boo) + +
+ +
+ ## HAProxy -* [https://en.wikipedia.org/wiki/HAProxy](https://en.wikipedia.org/wiki/HAProxy) +* [Wikipedia: HAProxy](https://en.wikipedia.org/wiki/HAProxy) * [haproxy.org](http://www.haproxy.org/) * [dzone.com: How to Configure HAProxy as a Proxy and Load Balancer](https://dzone.com/articles/how-to-configure-ha-proxy-as-a-proxy-and-loadbalan) * [tecmint.com: How to Setup High-Availability Load Balancer with β€˜HAProxy’ to Control Web Server Traffic](https://www.tecmint.com/install-haproxy-load-balancer-in-linux/) * [Tecmint.com: How to Setup HAProxy as Load Balancer for Nginx on CentOS 8](https://www.tecmint.com/setup-nginx-haproxy-load-balancer-in-centos-8/) * [nixCraft: 9 Awesome Open Source Web Performance Software For Linux and Unix-like Systems](https://www.cyberciti.biz/open-source/http-web-performance-proxy-load-balancer-accelerator-software/) -## Nginx -- [Nginx](https://www.nginx.com/) +## Traefik +- [Traefik](http://traefik.io/) +- [Dzone: How to Use the Open Source Tool Traefik to Direct Kubernetes Traffic](https://dzone.com/articles/how-to-use-the-open-source-tool-traefik-to-direct) diff --git a/docs/workfromhome.md b/docs/workfromhome.md index 214cf436..6ee6b366 100644 --- a/docs/workfromhome.md +++ b/docs/workfromhome.md @@ -13,3 +13,6 @@ - [Google meet](https://meet.google.com/) Alternative to Zoom - [Rocket Chat](https://rocket.chat/) Alternative to Slack - [Microsoft Teams](https://www.microsoft.com/microsoft-365/microsoft-teams/group-chat-software) + +## Tips +* [opensource.com: 10 tips for maintaining a DevOps mindset for distributed teams](https://opensource.com/article/20/6/devops-mindset) You can do DevOps while working from home; it's all about the right approach. diff --git a/mkdocs-readthedocs.yml b/mkdocs-readthedocs.yml index a74f2ff9..5ada0f58 100644 --- a/mkdocs-readthedocs.yml +++ b/mkdocs-readthedocs.yml @@ -67,7 +67,7 @@ nav: - Maven & Gradle: maven-gradle.md - SonarQube: sonarqube.md - Nexus & JFrog Artifactory: nexus-jfrog.md - - Web Servers - Apache, HAProxy & Nginx: web-servers.md + - Web Servers & Reverse Proxies: Apache, Nginx, HAProxy, Traefik and more: web-servers.md - Payara App Server: payara.md - Embedded Servlet Containers in SpringBoot: embedded-servlet-containers.md - Selenium, Appium & Zephyr Jira plugin: selenium-appium-zephyr.md @@ -80,6 +80,7 @@ nav: - Monitoring and Performance. Prometheus, Grafana, APMs and more: monitoring.md - Configuration Management: - Ansible: ansible.md + - Chef: chef.md - Liquibase: liquibase.md - Terraform & Packer: terraform.md - Databases on Kubernetes: diff --git a/mkdocs.yml b/mkdocs.yml index 9dd84b27..417a27cf 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -67,7 +67,7 @@ nav: - Maven & Gradle: maven-gradle.md - SonarQube: sonarqube.md - Nexus & JFrog Artifactory: nexus-jfrog.md - - Web Servers - Apache, HAProxy & Nginx: web-servers.md + - Web Servers & Reverse Proxies: Apache, Nginx, HAProxy, Traefik and more: web-servers.md - Payara App Server: payara.md - Embedded Servlet Containers in SpringBoot: embedded-servlet-containers.md - Selenium, Appium & Zephyr Jira plugin: selenium-appium-zephyr.md @@ -80,6 +80,7 @@ nav: - Monitoring and Performance. Prometheus, Grafana, APMs and more: monitoring.md - Configuration Management: - Ansible: ansible.md + - Chef: chef.md - Liquibase: liquibase.md - Terraform & Packer: terraform.md - Databases on Kubernetes: diff --git a/requirements-readthedocs.txt b/requirements-readthedocs.txt index 0a4f5e3f..6d2f0772 100644 --- a/requirements-readthedocs.txt +++ b/requirements-readthedocs.txt @@ -1,2 +1,2 @@ mkdocs==1.1.2 - +sphinx-rtd-theme==0.4.3