GNU/Linux >> Linux Esercitazione >  >> Ubuntu

Come installare Jenkins sull'ultimo Ubuntu in 5 minuti

Questo articolo illustra vari modi per distribuire Jenkins sul tuo server. Utilizza la nostra guida aggiornata per l'installazione manuale o l'avvio di Jenkins nei container Docker. Come bonus, mostreremo come distribuire Jenkins utilizzando CloudFormation. Distribuisci Jenkins sul tuo server in 5 minuti utilizzando la nostra guida.

Cos'è Jenkins

Jenkins è il server di automazione gratuito più popolare. Puoi utilizzare Jenkins per automatizzare quasi tutti i processi della tua azienda. Ma il mercato tradizionale per Jenkins è l'automazione dei processi di sviluppo del software.

Vantaggi di Jenkins:

  • Scritto in Java, quindi puoi eseguirlo su tutte le piattaforme
  • Ha molti plug-in che possono aiutarti a risolvere quasi tutti i problemi che puoi immaginare.
  • Aiuta gli sviluppatori a integrare le modifiche al codice e a produrre sempre build software stabili

Installa Jenkins manualmente

Il processo di installazione è semplice e diretto. Si compone di diversi semplici passaggi:

  • Installazione Java.
  • Aggiunta di repository Jenkins ufficiali al tuo gestore di pacchetti.
  • Installazione del pacchetto.
  • Configurazione firewall.
  • Configurazione iniziale di Jenkins.

Facciamoli uno per uno.

Installazione Java

Per poter eseguire Jenkins, devi prima installare Java.

Innanzitutto, aggiorna l'indice del pacchetto apt usando questo:

$ sudo apt update

Quindi, installa il pacchetto Java OpenJDK predefinito usando questo:

$ sudo apt install openjdk-8-jre

Verifica l'installazione usando questo comando:

$ java -version

Ecco l'output dopo una corretta installazione:

Importante :dovresti vedere che Java ha la versione 1.8.

Al momento della stesura di questo articolo, Jenkins utilizza la versione Java 8. Se vedi un'altra versione, passa a quella corretta:

$ sudo update-alternatives --config java

Aggiungi repository Jenkins

Per impostazione predefinita, Jenkins non è incluso nei repository di Ubuntu e devi aggiungerlo.

Per prima cosa, dobbiamo importare la chiave del repository:

$ wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -

Il passaggio successivo consiste nell'aggiungere l'indirizzo del repository all'elenco dei repository del server:

$ sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > \
    /etc/apt/sources.list.d/jenkins.list'

Una volta fatto, dobbiamo aggiornare le informazioni sul software, che possiamo utilizzare dal nuovo repository:

$ sudo apt-get update

Installazione del pacchetto Jenkins

Dato che abbiamo il repository aggiornato, eseguiamo il seguente comando:

$ sudo apt-get -y install jenkins

L'esecuzione di questo comando ti chiederà di confermare il download e l'installazione.

Per impostazione predefinita, Jenkins si avvia dopo il processo di installazione. In caso contrario, utilizzare il comando seguente per farlo manualmente:

$ sudo systemctl start jenkins

Controlliamo se lo stato del servizio Jenkins:

$ sudo systemctl status jenkins

Dopo aver eseguito correttamente il comando precedente, dovresti ottenere un tale output:

Configurazione firewall

Per impostazione predefinita, Jenkins viene eseguito sulla porta 8080 , quindi apriamolo per consentire a Jenkins di comunicare.

Esegui il comando seguente se stai utilizzando il firewall UFW predefinito:

$ sudo ufw allow 8080

Utilizza il comando seguente per verificare che il traffico sia ora consentito:

$ sudo ufw status

L'output del comando precedente dovrebbe essere simile a questo:

Se ufw è inattivo e vuoi abilitarlo, ecco i comandi:

$ sudo systemctl enable ufw

$ sudo systemctl start ufw

$ sudo ufw enable

Ora puoi accedere a Jenkins all'indirizzo http://localhost:8080 .

La password iniziale è disponibile qui:

$ sudo cat /var/lib/jenkins/secrets/initialAdminPassword

Avvia Jenkins nel contenitore Docker

Per avviare Jenkins in un container Docker, devi avere Docker installato. Il processo di installazione completo è descritto nella documentazione ufficiale di Docker, quindi forniremo i comandi necessari qui:

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common


$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
$ sudo apt-get update

$ sudo apt-get install docker-ce docker-ce-cli containerd.io

Una volta che Docker è stato installato correttamente, puoi eseguire il contenitore Docker.

Tira immagine Docker Jenkins

Estrarre Jenkins dal repository pubblico utilizzando il seguente comando:

$ sudo docker pull jenkins/jenkins

Per avviare il contenitore Jenkins Docker, esegui il comando seguente:

$ sudo docker run -p 8080:8080 -d --name=jenkins-master jenkins/jenkins

Se ricevi il seguente messaggio di errore:

docker: Error response from daemon: driver failed programming external connectivity on endpoint jenkins-master
(627574f0c75a8e4598abf0acfc2700caf53775a9dc34073fdbfb69cd408a9a36):
Error starting userland proxy: listen tcp 0.0.0.0:8080: bind: address already in use.
ERRO[0000] error waiting for container: context canceled

Ciò significa che stai tentando di avviare Jenkins nel contenitore Docker sulla stessa porta utilizzata da Jenkins a livello di sistema.

Basta avviarlo sulla porta 8082 :

$ sudo docker rm jenkins-master

$ sudo docker run -p 8082:8080 -d --name=jenkins-master jenkins/jenkins

Questo comando comporta l'apertura del contenitore Docker Jenkins sulla porta 8082 :

Configurazione iniziale di Jenkins

Per configurare Jenkins, apri un browser e vai all'indirizzo IP effettivo o al nome di dominio che stai utilizzando Jenkins:http://ip_address_or_domain:8080 .

Password Jenkins

Vedrai la pagina che mostra la posizione della password Jenkins iniziale:

Eccolo:

$ sudo cat /var/lib/jenkins/secrets/initialAdminPassword

Plugin Jenkins

Nella schermata successiva, ti verrà richiesto di scegliere i plug-in per l'installazione iniziale. Se non sai ancora quali plug-in impostare, utilizza "Installa plug-in suggeriti " opzione.

Utente amministratore Jenkins

Una volta completata l'installazione, ti verrà chiesto di creare il primo utente amministratore Jenkins.

Dopo aver inserito correttamente i dettagli utente, verrai indirizzato alla pagina di configurazione dell'istanza per confermare l'URL dell'istanza Jenkins.

Per accedere alla dashboard principale di Jenkins, fai clic su "Inizia a utilizzare Jenkins pulsante ". Questa azione ti porterà all'interfaccia principale di Jenkins:

Installa Jenkins utilizzando CloudFormation

L'articolo "Esercitazione su CloudFormation:come automatizzare l'istanza EC2 in 5 minuti" descrive come utilizzare CloudFormation e i metadati cloud-init per automatizzare l'installazione del software nelle istanze EC2.

Qui forniremo un modello, che distribuirà il server Jenkins dietro il server proxy Nginx.

Attenzione :il seguente modello CloudFormation creerà un server Jenkins in una sottorete VPC pubblica, che ha accesso illimitato al tuo account AWS. Se desideri limitare l'accesso di Jenkins, modifica JenkinsPolicy o il profilo dell'istanza remota dal server Jenkins.

Ecco il modello CloudFormation (fonti GitHub):

AWSTemplateFormatVersion: 2010-09-09
Description: >-
    This CloudFormation stack will deploy Jenkins on Ubuntu 20.04
    in us-east-1 region.    
Parameters:
    JenkinsInstanceType:
        Description: EC2 instance type for Jenkins EC2 instance
        Type: String
        Default: t2.small
        ConstraintDescription: must be a valid Jenkins EC2 instance type.
    KeyName:
        Description: >-
                        The EC2 Key Pair to allow SSH access to Jenkins EC2 instance
        Type: 'AWS::EC2::KeyPair::KeyName'
        ConstraintDescription: must be the name of an existing EC2 KeyPair.
    VpcId:
        Description: The VPC Id where the Jenkins EC2 instance will be launched.
        Type: 'AWS::EC2::VPC::Id'
        ConstraintDescription: must be the ID of an existing VPC.
    YourIPRange:
        Description: >-
            CIDR block of the network from where you will connect to the Jenkins
            server using HTTP, HTTPS and SSH            
        Type: String
        MinLength: '9'
        MaxLength: '18'
        AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
        Default: 0.0.0.0/0
        ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
    PublicSubnet1:
        Description: >-
                        The public subnet where the Jenkins Jenkins EC2 instance will be launched.
        Type: 'AWS::EC2::Subnet::Id'
        ConstraintDescription: Must be a valid Public VPC Subnet.
    JenkinsInstanceAMI:
        Description: Ubuntu 20.04 EC2 instance AMI
        Type: String
        Default: ami-0885b1f6bd170450c

Resources:
    JenkinsAddress:
        Type: AWS::EC2::EIP
        Properties:
            Domain: vpc
    JenkinsAddressAssociaation:
        Type: AWS::EC2::EIPAssociation
        Properties:
            AllocationId: !GetAtt JenkinsAddress.AllocationId
            NetworkInterfaceId: !Ref JenkinsInterface
    JenkinsInterface:
        Type: AWS::EC2::NetworkInterface
        Properties:
            SubnetId: !Ref PublicSubnet1
            Description: Interface for controlling traffic such as Web
            GroupSet: 
                - !Ref JenkinsSecurityGroup
            SourceDestCheck: true
            Tags:
                -
                    Key: Network
                    Value: Web
    JenkinsServer:
        Type: 'AWS::EC2::Instance'
        CreationPolicy:
           ResourceSignal:
               Timeout: PT15M
        Metadata:
            Comment: 'Install Jenkins, nginx and the Jenkins CodeDeploy plugin'
            'AWS::CloudFormation::Init':
                configSets:
                    install_all:
                        - install_base
                        - install_nginx
                        - install_jenkins_repo
                        - install_jenkins
                        - jenkins_post_install
                install_base:
                    packages:
                        apt:
                            git: []
                            python3-pip: []
                            awscli: []
                    files:
                        /etc/cfn/cfn-hup.conf:
                            content:
                                !Sub |
                                    [main]
                                    stack=${AWS::StackName}
                                    region=${AWS::Region}
                            mode: "000400"
                            owner: "root"
                            group: "root"
                        /etc/cfn/hooks.d/cfn-auto-reloader.conf:
                            content:
                                !Sub |
                                    [cfn-auto-reloader-hook]
                                    triggers=post.update
                                    path=Resources.LaunchConfig.Metadata.AWS::CloudFormation::Init
                                    action=/opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource JenkinsServer --configsets install_all --region ${AWS::Region}
                                    runas=root
                            mode: "000400"
                            owner: "root"
                            group: "root"
                        /lib/systemd/system/cfn-hup.service:
                            content:
                                !Sub |
                                    [Unit]
                                    Description=cfn-hup daemon

                                    [Service]
                                    Type=simple
                                    ExecStart=/opt/aws/bin/cfn-hup
                                    Restart=always

                                    [Install]
                                    WantedBy=multi-user.target
                            mode: "000400"
                            owner: "root"
                            group: "root"
                    commands:
                        01_enable_cfn_hup:
                            command: systemctl enable cfn-hup.service > /dev/null 2>&1
                        02_start_cfn_hup:
                            command: systemctl start cfn-hup.service > /dev/null 2>&1

                install_nginx:
                    packages:
                        apt:
                            nginx: []
                            certbot: []
                            python3-certbot-nginx: []
                    files:
                        /etc/nginx/nginx.conf:
                            content:
                                !Sub |
                                    user  www-data;
                                    worker_processes  1;

                                    error_log  /var/log/nginx/error.log;
                                    pid        /var/run/nginx.pid;

                                    events {
                                        worker_connections  1024;
                                    }

                                    http {
                                        include       /etc/nginx/mime.types;
                                        default_type  application/octet-stream;
                                        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                                                            '$status $body_bytes_sent "$http_referer" '
                                                            '"$http_user_agent" "$http_x_forwarded_for"';

                                        access_log  /var/log/nginx/access.log  main;
                                        sendfile        on;
                                        keepalive_timeout  65;
                                        include /etc/nginx/conf.d/*.conf;
                                        index   index.html index.htm;

                                        server {
                                            listen       80;
                                            server_name  _;
                                            location / {
                                                proxy_pass              http://127.0.0.1:8080;
                                                proxy_set_header        Host $host;
                                                proxy_set_header        X-Real-IP $remote_addr;
                                                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                                                proxy_connect_timeout   150;
                                                proxy_send_timeout      100;
                                                proxy_read_timeout      100;
                                                proxy_buffers           4 32k;
                                                client_max_body_size    8m;
                                                client_body_buffer_size 128k;
                                            }
                                            location /password.txt {
                                                alias              /web/initalpass.html;
                                            }
                                        }
                                    }
                            mode: '000644'
                            owner: root
                            group: root

                    services:
                        sysvinit:
                            nginx:
                                enabled: 'true'
                                ensureRunning: 'true'
                                files:
                                    - /etc/nginx/nginx.conf

                install_jenkins_repo:
                    commands:
                        01_download_repo_file:
                            command: echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list
                        02_import_repo_file:
                            command: wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | apt-key add - > /dev/null 2>&1
                        03_update_pkg_mngr:
                            command: apt-get update -y > /dev/null 2>&1

                install_jenkins:
                    packages:
                        apt:
                            jenkins: []
                    services:
                        sysvinit:
                            jenkins:
                                enabled: 'true'
                                ensureRunning: 'true'

                jenkins_post_install:
                    commands:
                        01_web_folder:
                            command: mkdir -p /web
                        02_import_repo_file:
                            command: while [ ! -f /var/lib/jenkins/secrets/initialAdminPassword ]; do sleep 10; done
                        03_copy_jenkins_password:
                            command: cp -Rf /var/lib/jenkins/secrets/initialAdminPassword /web/initalpass.html && chown www-data:www-data /web/initalpass.html
        Properties:
            KeyName: !Ref KeyName
            ImageId: !Ref JenkinsInstanceAMI
            NetworkInterfaces:
                -
                    NetworkInterfaceId: !Ref JenkinsInterface
                    DeviceIndex: '0'
            InstanceType: !Ref JenkinsInstanceType
            IamInstanceProfile: !Ref JenkinsInstanceProfile
            UserData:
                Fn::Base64:
                    !Sub |
                        #!/bin/bash -xe

                        apt-get update -y
                        apt-get install -y python-setuptools openjdk-8-jre
                        mkdir -p /opt/aws/bin
                        wget https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz
                        python2 -m easy_install --script-dir /opt/aws/bin aws-cfn-bootstrap-latest.tar.gz

                        echo "Executing config-sets"

                        /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} \
                            --resource JenkinsServer \
                            --configsets install_all \
                            --region ${AWS::Region}

                        /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} \
                            --resource JenkinsServer \
                            --region ${AWS::Region}
            Tags:
                -
                    Key: Name
                    Value: Jenkins Server

    JenkinsSecurityGroup:
        Type: 'AWS::EC2::SecurityGroup'
        Properties:
            GroupDescription: Enable SSH and HTTP access from specific CIDR block
            VpcId: !Ref VpcId
            SecurityGroupIngress:
                    -
                        IpProtocol: tcp
                        FromPort: 22
                        ToPort: 22
                        CidrIp: !Ref YourIPRange
                    -
                        IpProtocol: tcp
                        FromPort: 80
                        ToPort: 80
                        CidrIp: !Ref YourIPRange
                    -
                        IpProtocol: tcp
                        FromPort: 443
                        ToPort: 443
                        CidrIp: !Ref YourIPRange
            SecurityGroupEgress:
                    -
                        IpProtocol: tcp
                        FromPort: 0
                        ToPort: 65535
                        CidrIp: 0.0.0.0/0

    JenkinsRole:
        Type: 'AWS::IAM::Role'
        Properties:
            Path: /
            AssumeRolePolicyDocument:
                Statement:
                    -
                        Effect: Allow
                        Principal:
                            Service:
                                - ec2.amazonaws.com
                        Action:
                            - 'sts:AssumeRole'

    JenkinsInstanceProfile:
        Type: 'AWS::IAM::InstanceProfile'
        Properties:
            Path: /
            Roles:
                - !Ref JenkinsRole

    JenkinsPolicy:
        Type: 'AWS::IAM::Policy'
        Properties:
            PolicyName: JenkinsPolicy
            PolicyDocument:
                Version: 2012-10-17
                Statement:
                    -
                        Effect: Allow
                        Action:
                            - '*'
                        Resource: '*'
            Roles:
                - !Ref JenkinsRole

Outputs:
    JenkinsServerDNSName:
        Description: DNS Name of Jenkins Server
        Value: !GetAtt
            - JenkinsServer
            - PublicDnsName

Questo modello CloudFormation serve per distribuire Jenkins dietro il proxy Nginx nella tua infrastruttura AWS.

Questo modello ha le seguenti caratteristiche:

  • Ti arriccia per ottenere la password iniziale di Jenkins: curva http://ec2-host/password.txt .
  • Puoi utilizzare LetsEncrypt per creare certificati SSL: sudo certbot --nginx -d jenkins.example.com .

Riepilogo

In questo articolo, abbiamo trattato vari modi per distribuire Jenkins sul tuo server. Ora sei pronto per l'installazione manuale di Jenkins, l'avvio di Jenkins nel container Docker o la distribuzione di Jenkins utilizzando il modello CloudFormation.

Per favore, fateci sapere nella sezione commenti qui sotto se avete domande. Inoltre, ti consigliamo di controllare altri articoli relativi a Linux nel nostro blog.

Ci auguriamo che questo articolo ti sia utile! Se sì, per favore, aiutaci a diffonderlo nel mondo!


Ubuntu
  1. Come installare l'ultima versione di Kodi su Ubuntu

  2. Come installare l'ultima versione di Handbrake su Ubuntu

  3. Come installare l'ultima build di sviluppo GIMP 2.9 su Ubuntu

  4. Come installare l'ultimo PipeWire tramite PPA in Ubuntu 20.04, 21.04

  5. Come installare l'ultimo KeePassXC 2.7.0 in Ubuntu 22.04 tramite PPA

Come installare l'ultimo WildFly su Ubuntu 20.04

Come installare l'ultimo MySQL 8 su Ubuntu 20.04

Come installare l'ultima versione di GCC su Ubuntu 20.04?

Come installare l'ultimo PHPMyAdmin su Ubuntu 18.04

Come installare Jenkins su Ubuntu 14.04

Come installare l'ultima ImageMagick su Ubuntu 22.04