この記事では、サーバーに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コンテナを実行できます。
次のコマンドを使用して、パブリックリポジトリから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を実行している実際の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関連の記事を確認することをお勧めします。
この記事がお役に立てば幸いです。はいの場合は、それを世界に広めるのを手伝ってください!