GNU/Linux >> Linux の 問題 >  >> Ubuntu

5分で最新のUbuntuにJenkinsをインストールする方法

この記事では、サーバーにJenkinsをデプロイするさまざまな方法について説明します。 DockerコンテナでのJenkinsの手動インストールまたは起動については、最新のガイドを使用してください。ボーナスとして、CloudFormationを使用してJenkinsをデプロイする方法を紹介します。ガイダンスを使用して、5分でサーバーにJenkinsをデプロイします。

ジェンキンスとは

Jenkinsは、最も人気のある無料の自動化サーバーです。 Jenkinsを使用して、社内のほぼすべてのプロセスを自動化できます。しかし、Jenkinsの従来の市場は、ソフトウェア開発プロセスの自動化です。

Jenkinsのメリット:

  • Javaで記述されているため、すべてのプラットフォームで実行できます
  • プラグインがたくさんあり、想像できるほとんどすべての問題を解決するのに役立ちます。
  • 開発者がコードの変更を統合し、常に安定したソフトウェアビルドを作成するのに役立ちます

Jenkinsを手動でインストールする

インストールプロセスはシンプルで簡単です。いくつかの簡単な手順で構成されています:

  • Javaのインストール。
  • パッケージマネージャーに公式のJenkinsリポジトリを追加します。
  • パッケージのインストール。
  • ファイアウォールの構成。
  • Jenkinsの初期構成。

1つずつやってみましょう。

Javaのインストール

Jenkinsを実行できるようにするには、最初にJavaをインストールする必要があります。

まず、これを使用してaptパッケージインデックスを更新します:

$ sudo apt update

次に、これを使用してデフォルトのJavaOpenJDKパッケージをインストールします。

$ sudo apt install openjdk-8-jre

次のコマンドを使用してインストールを確認します:

$ java -version

インストールが成功した後の出力は次のとおりです。

重要 :Javaのバージョンが1.8であることがわかります。

この記事の執筆時点では、JenkinsはJava8バージョンを使用しています。別のバージョンが表示された場合は、正しいバージョンに切り替えてください:

$ sudo update-alternatives --config java

Jenkinsリポジトリを追加

デフォルトでは、JenkinsはUbuntuリポジトリに含まれていないため、追加する必要があります。

まず、リポジトリキーをインポートする必要があります:

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

次のステップは、リポジトリアドレスをサーバーのリポジトリリストに追加することです。

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

それが完了したら、新しいリポジトリから使用できるソフトウェアに関する情報を更新する必要があります。

$ sudo apt-get update

Jenkinsパッケージのインストール

リポジトリは最新のものなので、次のコマンドを実行してみましょう。

$ sudo apt-get -y install jenkins

このコマンドを実行すると、ダウンロードとインストールの確認を求めるプロンプトが表示されます。

デフォルトでは、Jenkinsはインストールプロセスの後に起動します。そうでない場合は、次のコマンドを使用して手動で実行します。

$ sudo systemctl start jenkins

Jenkinsのサービスステータスを確認しましょう:

$ sudo systemctl status jenkins

上記のコマンドを正常に実行すると、次のような出力が得られます。

ファイアウォールの構成

デフォルトでは、Jenkinsはポート 8080で実行されます 、それでは、Jenkinsが通信できるように開きましょう。

デフォルトのUFWファイアウォールで実行している場合は、次のコマンドを実行します。

$ sudo ufw allow 8080

次のコマンドを使用して、トラフィックが許可されていることを確認します。

$ sudo ufw status

上記のコマンドの出力は次のようになります。

ufwが非アクティブで、それを有効にしたい場合は、次のコマンドを使用します。

$ sudo systemctl enable ufw

$ sudo systemctl start ufw

$ sudo ufw enable

これで、 http:// localhost:8080でJenkinsにアクセスできます。 。

初期パスワードはこちらから入手できます:

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

DockerコンテナでJenkinsを起動

DockerコンテナーでJenkinsを起動するには、Dockerをインストールする必要があります。完全なインストールプロセスはDockerの公式ドキュメントに記載されているため、ここで必要なコマンドを提供します:

$ 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

Dockerが正常にインストールされると、Dockerコンテナを実行できます。

プルジェンキンスDockerイメージ

次のコマンドを使用して、パブリックリポジトリからJenkinsをプルします。

$ sudo docker pull jenkins/jenkins

Jenkins Dockerコンテナを起動するには、次のコマンドを実行します。

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

次のエラーメッセージが表示された場合:

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

つまり、システム全体のJenkinsが使用しているのと同じポートのDockerコンテナでJenkinsを起動しようとしているということです。

ポート8082で起動するだけです :

$ sudo docker rm jenkins-master

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

このコマンドを実行すると、ポート 8082でJenkinsDockerコンテナが開きます。 :

初期のJenkins構成

Jenkinsを設定するには、ブラウザを開いて、Jenkinsを実行している実際のIPアドレスまたはドメイン名に移動します: http:// ip_address_or_domain:8080

Jenkinsパスワード

Jenkinsの初期パスワードの場所を示すページが表示されます。

ここにあります:

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

Jenkinsプラグイン

次の画面で、初期インストール用のプラグインを選択する必要があります。設定するプラグインがまだわからない場合は、「推奨プラグインをインストールする」を使用してください " オプション。

Jenkins管理者ユーザー

インストールが完了すると、最初のJenkins管理者ユーザーを作成するように求められます。

ユーザーの詳細を正常に入力すると、インスタンス構成ページに移動して、JenkinsインスタンスのURLを確認します。

Jenkinsのメインダッシュボードにアクセスするには、[Jenkinsの使用を開始する]をクリックします " ボタン。このアクションにより、Jenkinsのメインインターフェイスが表示されます。

CloudFormationを使用してJenkinsをインストールする

記事「CloudFormationチュートリアル– EC2インスタンスを5分で自動化する方法」では、CloudFormationとcloud-initメタデータを使用してEC2インスタンスへのソフトウェアインストールを自動化する方法について説明しました。

ここでは、Nginxプロキシサーバーの背後にJenkinsサーバーをデプロイするテンプレートを提供します。

注意 :次のCloudFormationテンプレートは、パブリックVPCサブネットにJenkinsサーバーを作成します。これにより、AWSアカウントに無制限にアクセスできます。 Jenkinsアクセスを制限する場合は、JenkinsPolicyまたはJenkinsサーバーからのリモートインスタンスプロファイルを変更してください。

CloudFormationテンプレート(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

このCloudFormationテンプレートは、AWSインフラストラクチャのNginxプロキシの背後にJenkinsをデプロイするためのものです。

このテンプレートには次の機能があります。

  • カールしてJenkinsの初期パスワードを取得します:カール http://ec2-host/password.txt
  • LetsEncryptを使用してSSL証明書を作成できます:sudo certbot --nginx -d jenkins.example.com
概要

この記事では、サーバーにJenkinsをデプロイするさまざまな方法について説明しました。これで、Jenkinsの手動インストール、DockerコンテナでのJenkinsの起動、またはCloudFormationテンプレートを使用したJenkinsのデプロイの準備が整いました。

ご不明な点がございましたら、下のコメント欄でお知らせください。さらに、ブログで他のLinux関連の記事を確認することをお勧めします。

この記事がお役に立てば幸いです。はいの場合は、それを世界に広めるのを手伝ってください!


Ubuntu
  1. Ubuntuに最新のKodiリリースをインストールする方法

  2. Ubuntu 20.04、21.04でPPAを介して最新のPipeWireをインストールする方法

  3. PPAを介してUbuntu22.04に最新のKeePassXC2.7.0をインストールする方法

  1. Ubuntuに最新バージョンのHandbrakeをインストールする方法

  2. Ubuntuに最新のGIMP2.9開発ビルドをインストールする方法

  3. Ubuntu18.04にJenkinsをインストールする方法

  1. Ubuntu 20.04 /Ubuntu18.04にJenkinsをインストールする方法

  2. Ubuntu20.04LTSに最新のZoomをインストールする方法

  3. Ubuntuに最新のMySQL8をインストールする方法