Deploying Jenkins X in Linode Kubernetes Engine

Updated by Linode Contributed by Daniele Polencic

Contribute on GitHub

Report an Issue | View File | Edit File

Marquee image for How to Deploy Jenkins X in Linode Kubernetes Engine

What is Jenkins X?

Jenkins X is CI/CD tool that automates the management of development environments and the promotion of new versions of applications between environments. This guide illustrates how to install Jenkins X on Linode Kubernetes Engine.

Before You Begin

  1. You will need a personal GitHub account. If you don’t have one, you can register here.
  2. You need a GitHub account for your bot. This bot automates actions like triaging issues, merging Pull Requests, etc. You can register your bot account here.
  3. You will need an account on DockerHub. If you don’t have one, you can register here.

Create an LKE Cluster

Follow the instructions in Deploying and Managing a Cluster with Linode Kubernetes Engine Tutorial to create and connect to an LKE cluster.

We recommend using three 16GB Linodes to start with.

Creating a Kubernetes cluster on Linode

You can verify that the installation is successful with:

kubectl get nodes

The output should similar to:

  
NAME                        STATUS   ROLES    AGE   VERSION
lke7189-9006-5f05145fc9a3   Ready       8h    v1.17.3
lke7189-9006-5f051460a1e2   Ready       8h    v1.17.3
lke7189-9006-5f0514617a87   Ready       8h    v1.17.3

Install jx

To install Jenkins X, you need the jx command-line tool. You can find the instruction on how to install jx on the official documentation.

You can verify that the installation is successful with:

jx version

The output should be similar to:

  
Version        2.1.80
Commit         b2bd447
Build date     2020-06-23T15:34:17Z
Go version     1.13.8
Git tree state clean

Bootstrap Jenkins X

Note
If you used the export command with the KUBECONFIG variable so that you can use kubectl to connect to your cluster, you will need to perform the following steps in the same terminal terminal window where you executed that command in order for jx to also be able to connect to your cluster.
  1. Create a new folder, navigate to the new folder, and execute the jx boot command to start a new project:

    mkdir jenkins-x
    cd jenkins-x
    jx boot
    

    The command prompts the following message:

      
    Creating boot config with defaults, as not in an existing boot directory with a git repository.
    No Jenkins X pipeline file jenkins-x.yml or no jx boot requirements file jx-requirements.yml found. You are not running this command from inside a Jenkins X Boot git clone
    To continue we will clone https://github.com/jenkins-x/jenkins-x-boot-config.git @ master to jenkins-x-boot-config
    ? Do you want to clone the Jenkins X Boot Git repository? [? for help] (Y/n)
    
    

    Yes is the default answer, so you can press enter and continue to the next step.

  2. In the next step, the CLI clones the Jenkins X configuration repo and validates your configuration.

    The command-line tool expects the cluster name to be in the format <project id>_<zone>_<cluster name> — which is the default if you want to use Google Kubernetes Engine. Since Linode Kubernetes Engine doesn’t follow the same naming pattern, the validation fails:

      
    Cloning https://github.com/jenkins-x/jenkins-x-boot-config.git @ master to jenkins-x-boot-config
    Attempting to resolve version for boot config https://github.com/jenkins-x/jenkins-x-boot-config.git from https://github.com/jenkins-x/jenkins-x-versions.git
    Booting Jenkins X
    
    STEP: validate-git command: /bin/sh -c jx step git validate in dir: /tmp/jenkinsx/jenkins-x-boot-config/env
    
    STEP: verify-preinstall command: /bin/sh -c jx step verify preinstall --provider-values-dir="kubeProviders" in dir: /tmp/jenkinsx/jenkins-x-boot-config
    
    error: : unable to parse lke7389 as <project id>_<zone>_<cluster name>
    error: failed to interpret pipeline file /tmp/jenkinsx/jenkins-x-boot-config/jenkins-x.yml: failed to run '/bin/sh -c jx step verify preinstall --provider-values-dir="kubeProviders"' command in directory '/tmp/jenkinsx/jenkins-x-boot-config', output: ''
    
    

    But don’t worry, this error can be fixed. If you inspect the current folder, you should notice that jx created a jenkins-x-boot-config folder. In that folder, there’s a jx-requirements.yml file with the details of your cluster.

    Open that with your favourite editor and identify the line that starts with: provider: gke. You should change that to provider: kubernetes.

    jx-requirements.yml
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    autoUpdate:
      enabled: false
      schedule: ""
    bootConfigURL: https://github.com/jenkins-x/jenkins-x-boot-config.git
    cluster:
      gitKind: github
      gitName: github
      gitServer: https://github.com
      namespace: jx
      provider: gke # <- you should change this line to "kubernetes"!
  3. It’s time to run the jx boot command again, but this time from within the jenkins-x-boot-config folder:

    cd jenkins-x-boot-config
    jx boot
    

    This time, the command stops at a different step, which has you confirm you’d like to run jx on a service that is not GKE or EKS:

      
    Attempting to resolve version for boot config https://github.com/jenkins-x/jenkins-x-boot-config from https://github.com/jenkins-x/jenkins-x-versions.git
    Booting Jenkins X
    
    STEP: validate-git command: /bin/sh -c jx step git validate in dir: /tmp/jenkinsx/jenkins-x-boot-config/env
    
    STEP: verify-preinstall command: /bin/sh -c jx step verify preinstall --provider-values-dir="kubeProviders" in dir: /tmp/jenkinsx/jenkins-x-boot-config
    
    jx boot has only been validated on GKE and EKS, we'd love feedback and contributions for other Kubernetes providers
    ? Continue execution anyway? (Y/n)
    
    

    Yes is the default answer, so press enter and continue executing.

  4. The next question is the cluster name:

      
    ? Cluster name
    
    

    Enter jenkins-x-lke.

  5. Next, make yourself the Git Owner.

      
    ? Git Owner name for environment repositories
    
    

    Type in your GitHub username, and press enter.

  6. In the next step, name the users you wish to associate as an approver. This should include your username and the names of any other members of your team which you wish to grant this ability, and the input should be a comma separated list.

      
    Environment repos will be private, if you want to create public environment repos, please set environmentGitPublic to true in jx-requirements.yml
    ? Comma-separated git provider usernames of approvers for development environment repository
    
    
  7. Pay attention to the next question, which describes that the webhooks will be called over HTTP, not HTTPS:

      
    Locking version stream https://github.com/jenkins-x/jenkins-x-versions.git to release v1.0.529. Jenkins X will use this release rather than master to resolve all versions from now on.
    writing the following to the OWNERS file for the development environment repository:
    approvers:
    - <your_GitHub_username>
    reviewers:
    - <your_GitHub_username>
    WARNING: TLS is not enabled so your webhooks will be called using HTTP. This means your webhook secret will be sent to your cluster in the clear. See https://jenkins-x.io/docs/getting-started/setup/boot/#ingress for more information
    ? Do you wish to continue? [? for help] (y/N)
    
    

    Notice how No is the default answer. However, you should answer Yes and move on to the next question.

  8. In the next steps, jx configures several components in your cluster. It might take a while before you’re requested to interact with the terminal. When you do, the next questions are about the Jenkins X admin:

      
    ? Jenkins X Admin Username (admin)
    ? Jenkins X Admin Password
    
    

    You should choose a name and a password for the admin user.

  9. Next, you enter in the info about your Jenkins X Bot.

    The bot will help you triage issues, Pull Requests and execute chores. In this part, you should enter the details for your bot (the GitHub account that you created in advance):

      
    ? Pipeline bot Git username
    ? Pipeline bot Git email address
    ? Pipeline bot Git token
    
    

    You can create a token for your bot by visiting this URL.

    Note
    Please note that you should create the token with the Bot’s account and not yours.

    Creating an API token on GitHub

  10. You can use the same token for the next question (and just press enter):

      
    ? HMAC token, used to validate incoming webhooks. Press enter to use the generated token
    
    
  11. The next question is crucial, as it concerns how Jenkins X will interact with the docker registry:

      
    ? Do you want to configure non default Docker Registry? (y/N)
    
    

    Linode does not offer a container registry at the moment, so you will use Docker Hub as your container registry. You should answer Yes which is NOT the default option. Answer the following questions accordingly:

      
    ? Do you want to configure non default Docker Registry? Yes
    ? Docker Registry Url <accept-the-default-value>
    ? Docker Registry username <enter-your-dockerhub-username>
    ? Docker Registry password <enter-your-dockerhub-password>
    ? Docker Registry email <enter-your-dockerhub-email>
    
    

The installation should complete with the following output:

  
Verifying the git config
Verifying username <bot-name> at git server github at https://github.com
Found 1 organisation in git server https://github.com: learnk8s
Validated pipeline user <bot-name> on git server https://github.com
Git tokens seem to be setup correctly
Installation is currently looking: GOOD
Using namespace 'jx' from context named 'lke7411-ctx' on server 'https://c50d6328-b182-4fe9-9746-7f6e2b2e1b4d.ap-south-1.linodelke.net:443'.

Jenkins X is installed!

If you inspect your GitHub profile, you might have noticed that there are three new private repositories:

  • environment-jenkins-x-lke-dev
  • environment-jenkins-x-lke-staging
  • environment-jenkins-x-lke-prod

The repositories hold the configuration for each environment.

Your First Project

In this part, you will set up a CI/CD pipeline for a Java (Spring Boot) application. The same steps are valid for any other language or framework.

  1. You should fork the Jenkins X Demo repository from LearnK8s.

  2. Next, clone the repository locally and change your current directory, being sure to add your GitHub username to the cloned repository’s address:

    git clone [email protected]:your-github-username/jenkins-x-demo
    cd jenkins-x-demo
    
  3. You can import the project in Jenkins X with the following command:

    jx import
    

    You will see a similar output to this:

      
    PipelineActivity for <your-gh-username>-jenkins-x-demo-master-1
    upserted PipelineResource meta-<your-gh-username>-jenkins-x-dlncr for the git repository https://github.com/<your-gh-username>/jenkins-x-demo.git
    upserted Task meta-<your-gh-username>-jenkins-x-dlncr-meta-pipeline-1
    upserted Pipeline meta-<your-gh-username>-jenkins-x-dlncr-1
    created PipelineRun meta-<your-gh-username>-jenkins-x-dlncr-1
    created PipelineStructure meta-<your-gh-username>-jenkins-x-dlncr-1
    
    Watch pipeline activity via:    jx get activity -f jenkins-x-demo -w
    Browse the pipeline log via:    jx get build logs <your-gh-username>/jenkins-x-demo/master
    You can list the pipelines via: jx get pipelines
    When the pipeline is complete:  jx get applications
    
    For more help on available commands see: https://jenkins-x.io/developing/browsing/
    
    
  4. You can now run the following command to follow the pipeline output:

    jx get build logs <yourgithubuser>/jenkins-x-demo/master
    

    The pipeline will take around three or four minutes to complete, as it has to:

    • Compile the project.
    • Create tags in the repository.
    • Build and push the container image to Docker Hub.
    • Package the Helm chart for the application.
  5. In the last step of the pipeline, Jenkins X raises a Pull Request to the repository that holds the configuration of your staging environment (created by default during installation).

    At the end of the pipeline you will see the following output:

      
    Created Pull Request: https://github.com//environment-jenkins-x-lke-staging/pull/1
    
    

    The Pull Request is an automatic promotion to the staging environment. If you merge the Pull Request, the application is automatically promoted to the staging environment.

    You can merge the Pull Request to see the pipeline applying the changes in the staging environment.

    If the promotion is successful, you can inspect the app with:

    jx get applications
    
      
    APPLICATION      STAGING PODS URL
    jenkins-x-demo   0.0.10       http://jenkins-x-staging.178.79.175.247.nip.io
    
    

It might take some time for your application to start. However, when it’s started, you can visit the app at the URL provided and see it running.

More Information

You may wish to consult the following resources for additional information on this topic. While these are provided in the hope that they will be useful, please note that we cannot vouch for the accuracy or timeliness of externally hosted materials.

Join our Community

Find answers, ask questions, and help others.

comments powered by Disqus

This guide is published under a CC BY-ND 4.0 license.