GNU/Linux >> Belajar Linux >  >> Ubuntu

Cara Instal Jenkins di Ubuntu Terbaru dalam 5 Menit

Artikel ini membahas berbagai cara menerapkan Jenkins di server Anda. Gunakan panduan terbaru kami untuk instalasi manual atau meluncurkan Jenkins di wadah Docker. Sebagai bonus, kami akan menunjukkan cara menerapkan Jenkins menggunakan CloudFormation. Terapkan Jenkins di server Anda dalam 5 menit menggunakan panduan kami.

Apa itu Jenkins

Jenkins adalah server otomatisasi gratis paling populer. Anda dapat menggunakan Jenkins untuk mengotomatisasi hampir semua proses di perusahaan Anda. Namun pasar tradisional untuk Jenkins adalah otomatisasi proses pengembangan perangkat lunak.

Manfaat Jenkins:

  • Ditulis dalam Java, sehingga Anda dapat menjalankannya di semua platform
  • Memiliki banyak plugin, yang dapat membantu Anda memecahkan hampir semua masalah yang dapat Anda bayangkan.
  • Membantu pengembang untuk mengintegrasikan perubahan kode dan selalu menghasilkan pembuatan perangkat lunak yang stabil

Instal Jenkins Secara Manual

Proses instalasi sederhana dan mudah. Ini terdiri dari beberapa langkah mudah:

  • Instalasi Java.
  • Menambahkan repositori resmi Jenkins ke pengelola paket Anda.
  • Penginstalan paket.
  • Konfigurasi firewall.
  • Konfigurasi Jenkins awal.

Mari kita lakukan satu per satu.

Instalasi Java

Untuk dapat menjalankan Jenkins, Anda harus menginstal Java terlebih dahulu.

Pertama, perbarui indeks paket apt menggunakan ini:

$ sudo apt update

Selanjutnya, instal paket Java OpenJDK default menggunakan ini:

$ sudo apt install openjdk-8-jre

Verifikasi instalasi menggunakan perintah ini:

$ java -version

Berikut output setelah instalasi berhasil:

Penting :Anda akan melihat bahwa Java memiliki versi 1.8.

Pada saat penulisan artikel ini, Jenkins menggunakan versi Java 8. Jika Anda melihat versi lain, alihkan ke versi yang benar:

$ sudo update-alternatives --config java

Tambahkan repositori Jenkins

Secara default, Jenkins tidak disertakan dalam repositori Ubuntu, dan Anda perlu menambahkannya.

Pertama, kita perlu mengimpor kunci repositori:

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

Langkah selanjutnya adalah menambahkan alamat repositori ke daftar repositori server:

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

Setelah selesai, kita perlu memperbarui informasi tentang perangkat lunak, yang dapat kita gunakan dari repositori baru:

$ sudo apt-get update

Instalasi Paket Jenkins

Karena kita memiliki repositori yang terbaru, mari kita jalankan perintah berikut:

$ sudo apt-get -y install jenkins

Menjalankan perintah ini akan meminta Anda untuk mengonfirmasi unduhan dan pemasangan.

Secara default, Jenkins dimulai setelah proses instalasi. Jika tidak, gunakan perintah berikut untuk melakukannya secara manual:

$ sudo systemctl start jenkins

Mari periksa apakah status layanan Jenkins:

$ sudo systemctl status jenkins

Pada eksekusi yang berhasil dari perintah di atas, Anda akan mendapatkan output seperti itu:

Konfigurasi Firewall

Secara default, Jenkins berjalan pada port 8080 , jadi mari kita buka untuk mengizinkan Jenkins berkomunikasi.

Jalankan perintah berikut jika Anda menjalankan firewall UFW default:

$ sudo ufw allow 8080

Gunakan perintah berikut untuk memeriksa bahwa lalu lintas sekarang diizinkan:

$ sudo ufw status

Output dari perintah di atas akan terlihat seperti ini:

Jika ufw tidak aktif dan Anda ingin mengaktifkannya, berikut adalah perintahnya:

$ sudo systemctl enable ufw

$ sudo systemctl start ufw

$ sudo ufw enable

Sekarang, Anda dapat mengakses Jenkins di http://localhost:8080 .

Kata sandi awal tersedia di sini:

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

Luncurkan Jenkins Di Wadah Docker

Untuk meluncurkan Jenkins dalam wadah Docker, Anda harus menginstal Docker. Proses penginstalan lengkap dijelaskan dalam dokumentasi resmi Docker, jadi kami akan memberikan perintah yang diperlukan di sini:

$ 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

Setelah Docker berhasil diinstal, Anda dapat menjalankan container Docker.

Tarik Gambar Jenkins Docker

Tarik Jenkins dari repo publik menggunakan perintah berikut:

$ sudo docker pull jenkins/jenkins

Untuk meluncurkan wadah Jenkins Docker, jalankan perintah berikut:

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

Jika Anda mendapatkan pesan kesalahan berikut:

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

Itu berarti Anda mencoba meluncurkan Jenkins di container Docker di port yang sama dengan yang digunakan Jenkins di seluruh sistem.

Cukup luncurkan di port 8082 :

$ sudo docker rm jenkins-master

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

Perintah ini menghasilkan pembukaan wadah buruh pelabuhan Jenkins pada port 8082 :

Konfigurasi Jenkins Awal

Untuk mengonfigurasi Jenkins, buka browser dan navigasikan ke alamat IP atau nama domain sebenarnya yang Anda jalankan Jenkins:http://ip_address_or_domain:8080 .

Kata Sandi Jenkins

Anda akan melihat halaman yang menunjukkan lokasi kata sandi Jenkins awal:

Ini dia:

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

Plugin Jenkins

Pada layar berikutnya, Anda akan diminta untuk memilih plugin untuk instalasi awal. Jika Anda belum tahu plugin mana yang harus disiapkan, gunakan "Instal plugin yang disarankan " pilihan.

Pengguna Admin Jenkins

Setelah instalasi selesai, Anda akan diminta untuk membuat pengguna admin Jenkins pertama.

Setelah berhasil memasukkan detail pengguna, Anda akan diarahkan ke halaman konfigurasi instance untuk mengonfirmasi URL untuk instance Jenkins.

Untuk mengakses dasbor utama Jenkins, klik tombol “Mulai menggunakan Jenkins " tombol. Tindakan ini akan membawa Anda ke antarmuka Jenkins utama:

Instal Jenkins menggunakan CloudFormation

Artikel “Tutorial CloudFormation – Cara Mengotomatiskan Instans EC2 Dalam 5 Menit” menjelaskan cara menggunakan CloudFormation dan metadata cloud-init untuk mengotomatiskan penginstalan perangkat lunak dalam instans EC2.

Di sini kami akan menyediakan template, yang akan menerapkan server Jenkins di belakang server proxy Nginx.

Perhatian :template CloudFormation berikut akan membuat server Jenkins di subnet VPC publik, yang memiliki akses tak terbatas ke Akun AWS Anda. Jika Anda ingin membatasi akses Jenkins, harap ubah JenkinsPolicy atau profil instance jarak jauh dari server Jenkins.

Berikut template CloudFormation (sumber 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

Template CloudFormation ini untuk menerapkan Jenkins di belakang proxy Nginx di infrastruktur AWS Anda.

Template ini memiliki beberapa fitur berikut:

  • Anda menggulung untuk mendapatkan sandi awal Jenkins: curl http://ec2-host/password.txt .
  • Anda dapat menggunakan LetsEncrypt untuk membuat sertifikat SSL: sudo certbot --nginx -d jenkins.example.com .

Ringkasan

Dalam artikel ini, kami membahas berbagai cara menerapkan Jenkins di server Anda. Sekarang Anda siap untuk penginstalan manual Jenkins, meluncurkan Jenkins di wadah Docker, atau menerapkan Jenkins menggunakan template CloudFormation.

Tolong beri tahu kami di bagian komentar di bawah jika Anda memiliki pertanyaan. Selain itu, kami menyarankan Anda untuk memeriksa artikel terkait Linux lainnya di blog kami.

Kami harap Anda menemukan artikel ini bermanfaat! Jika ya, tolong bantu kami untuk menyebarkannya ke seluruh dunia!


Ubuntu
  1. Cara Menginstal Rilis Kodi Terbaru di Ubuntu

  2. Cara Memasang PipeWire Terbaru melalui PPA di Ubuntu 20.04, 21.04

  3. Cara Menginstal KeePassXC 2.7.0 Terbaru di Ubuntu 22.04 melalui PPA

  1. Cara Memasang Handbrake Versi Terbaru di Ubuntu

  2. Cara Menginstal Pengembangan GIMP 2.9 Terbaru di Ubuntu

  3. Cara Menginstal Jenkins di Ubuntu 18.04

  1. Cara Menginstal Jenkins di Ubuntu 20.04 / Ubuntu 18.04

  2. Cara menginstal Zoom terbaru di Ubuntu 20.04 LTS

  3. Cara Instal MySQL 8 Terbaru di Ubuntu