Ubuntu 22.04 – Complete Guide
Version 1.0 | November 2025
Author: Cynthia Vázquez
Status: Production Ready
- Introduction
- Prerequisites
- Jenkins X CLI Installation
- Environment Configuration
- Cluster Installation
- Troubleshooting
- Credentials and Access
- Dashboard Configuration
- Verification
- Quick Command Reference
- References
Jenkins X is a Kubernetes-native CI/CD automation platform designed to streamline development, build, and deployment workflows. This manual provides a complete installation and configuration guide for deploying Jenkins X on a K3s Kubernetes cluster.
- Automated pipelines
- Preview environments
- Automatic promotion between environments
- GitOps integration
- Native GitHub support
- K3s cluster: 1 master + 2 worker nodes
- kubectl: Configured and working
- GitHub account: With admin rights
- Resources: Minimum 4GB RAM, 20GB disk space
- Network: Internet connectivity
Create a Personal Access Token with these permissions:
repo(full access)admin:repo_hook(webhooks)admin:org_hook(if using organization)user(profile access)
Go to: GitHub → Settings → Developer settings → Personal access tokens → Generate new token
# Download and install
curl -L https://github.com/jenkins-x/jx/releases/latest/download/jx-linux-amd64.tar.gz | tar xzv
sudo mv jx /usr/local/bin/
# Verify installation
jx version# Install with Homebrew
brew install jenkins-x/jx/jx
# Verify installation
jx versionexport GIT_USERNAME="your_github_username"
export GIT_TOKEN="your_personal_access_token"
export GIT_SERVER="https://github.com"
export GIT_KIND="github"
export GIT_ORGANISATION="your_organization_or_username"echo 'export GIT_USERNAME="your_github_username"' >> ~/.bashrc
echo 'export GIT_TOKEN="your_token"' >> ~/.bashrc
echo 'export GIT_SERVER="https://github.com"' >> ~/.bashrc
echo 'export GIT_KIND="github"' >> ~/.bashrc
echo 'export GIT_ORGANISATION="your_org"' >> ~/.bashrc
# Apply changes
source ~/.bashrcecho $GIT_USERNAME
echo $GIT_ORGANISATION
# Don't echo $GIT_TOKEN for securityjx install --provider=kubernetesjx install --provider=kubernetes --domain=your-domain.comjx install --provider=kubernetes \
--ingress-service=LoadBalancer \
--no-default-environments=false# Watch pods in real-time
watch kubectl get pods -n jx
# View specific pod logs
kubectl logs -f <pod-name> -n jxSymptoms:
- Pod stays in "Pending" state
- Installation hangs
- Endpoints not recognized
Diagnosis:
kubectl get pods -n ingress-nginx
kubectl describe pod <ingress-pod> -n ingress-nginx
kubectl get events -n ingress-nginx --sort-by='.lastTimestamp'Solutions:
Check Resources:
kubectl top nodes
# If saturated: increase resources or add nodesCheck LoadBalancer:
kubectl get svc -n ingress-nginx
# If EXTERNAL-IP is <pending>, use Traefik instead (K3s default)
kubectl get pods -n kube-system | grep traefikSymptoms:
- Webhook/controller pods fail to start
- Dashboard not accessible
Solution:
# Identify problematic pods
kubectl get pods -n jx | grep -E 'webhook|controller'
# Delete them (they'll auto-recreate)
kubectl delete pod <webhook-pod-name> -n jx
kubectl delete pod <controller-pod-name> -n jx
# Monitor recreation
watch kubectl get pods -n jx
# Check new pod logs
kubectl logs -f <new-pod> -n jx# View all resources
kubectl get all -n jx
# Check ingress status
kubectl get ingress -n jx
kubectl get svc -n jx
# Verify ingress has address
kubectl get ingress -n jx jx-pipelines-visualizerkubectl get secret -n jx jx-basic-auth-user-password -o yamlGet Username:
kubectl get secret -n jx jx-basic-auth-user-password \
-o jsonpath='{.data.username}' | base64 -d
echo ""Get Password:
kubectl get secret -n jx jx-basic-auth-user-password \
-o jsonpath='{.data.password}' | base64 -d
echo ""# Define credentials
USERNAME="admin"
PASSWORD="SecurePassword123!" # Use a strong password
# Create secret
kubectl create secret generic jx-basic-auth-user-password \
-n jx \
--from-literal=username=$USERNAME \
--from-literal=password=$PASSWORD
# Verify
kubectl get secret -n jx jx-basic-auth-user-password# Delete existing secret
kubectl delete secret jx-basic-auth-user-password -n jx
# Create new one
USERNAME="new_admin"
PASSWORD="NewSecurePassword456!"
kubectl create secret generic jx-basic-auth-user-password \
-n jx \
--from-literal=username=$USERNAME \
--from-literal=password=$PASSWORD# Using jx command
jx get urls -n jx
# Or directly from ingress
kubectl get ingress -n jx jx-pipelines-visualizer \
-o jsonpath='{.spec.rules[0].host}'
echo ""# Forward service to local port
kubectl port-forward -n jx svc/jx-pipelines-visualizer 8080:80
# Access at: http://localhost:8080# Full configuration
kubectl get ingress -n jx jx-pipelines-visualizer -o yaml
# View annotations
kubectl get ingress -n jx jx-pipelines-visualizer -o yaml \
| grep -A 5 annotationskubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.0/cert-manager.yamlcat <<EOF | kubectl apply -f -
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: your-email@example.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
EOF# Check auth annotations
kubectl get ingress -n jx jx-pipelines-visualizer -o yaml | grep -i auth
# Edit if needed
kubectl edit ingress jx-pipelines-visualizer -n jx
# Required annotations:
# nginx.ingress.kubernetes.io/auth-type: "basic"
# nginx.ingress.kubernetes.io/auth-secret: "jx-basic-auth-user-password"
# nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"kubectl get pods -n jx
# Expected output (all Running):
# NAME READY STATUS RESTARTS AGE
# jx-pipelines-visualizer-xxx 1/1 Running 0 10m
# jx-build-controller-xxx 1/1 Running 0 10m
# lighthouse-webhooks-xxx 1/1 Running 0 10m
# lighthouse-keeper-xxx 1/1 Running 0 10m- Get URL:
jx get urls -n jx - Open in browser
- Enter credentials
- Verify you can see pipelines and repositories
# Create a quickstart project
jx create quickstart
# Follow wizard:
# - Select language (e.g., golang-http)
# - Enter project name
# - Confirm GitHub organization
# Monitor pipeline
jx get activity -w
# View build logs
jx get build logsjx version # Check version
jx get urls -n jx # Get service URLs
jx get activity # View pipeline activity
jx get build logs # View build logs
jx get applications # View deployed apps
jx import # Import existing project
jx create quickstart # Create new projectkubectl get nodes # Check cluster nodes
kubectl get pods -n jx # Check Jenkins X pods
kubectl get svc -n jx # Check services
kubectl get ingress -n jx # Check ingress
kubectl logs -f <pod-name> -n jx # View pod logs
jx get git # Check Git config
jx diagnose # Run diagnosticsjx uninstall # Remove Jenkins X
kubectl delete namespace jx # Delete namespace
kubectl delete secret -n jx --all # Delete all secrets- Store credentials securely
- Use strong passwords in production
- Configure HTTPS for public-facing dashboards
- Regular backups of configuration
- Monitor cluster resource usage
- Configure your first pipeline
- Set up GitHub webhooks
- Create staging and production environments
- Implement deployment strategies (blue-green, canary)
- Configure monitoring and alerts