Jenkins+Docker+Gitをベースにした簡単なCI処理実践(前編)
今日のインターネット時代では、ソフトウェア開発の複雑さが増し続けているため、ソフトウェア開発とリリース管理の重要性がますます高まっています。現在、一連の標準プロセスが形成されており、その最も重要なコンポーネントは継続的インテグレーション、継続的デリバリー、およびデプロイメントです。ここでは、簡単なケースを使用して、JD Cloud 上で CI プロセスを実践します。
1. 関連する概念とツールの紹介
1.1 CI/CD
継続的インテグレーション(CI) は、開発者向けの自動プロセスです。CI が成功すると、アプリケーション コードに対する新しい変更が定期的に構築、テストされ、共有リポジトリにマージされることを意味します。このソリューションは、1 つの開発内にアプリケーション ブランチが多すぎて競合が発生するという問題を解決できます。
継続的デリバリー(CD)。通常、開発者によるアプリケーションへの変更は自動的にエラー テストされ、リポジトリ (GitHub やコンテナ レジストリなど) にアップロードされ、その後運用チームによってライブ運用環境にデプロイされます。これは、開発チームと運用チーム間の可視性とコミュニケーションの悪さに対処することを目的としています。したがって、継続的デリバリーの目的は、新しいコードのデプロイに必要な労力をできるだけ少なくすることです。
継続的デプロイメント(CD) は、別のタイプの「CD」であり、開発者の変更をリポジトリから本番環境に自動的にリリースして、顧客が利用できるようにすることを指します。これは主に、アプリケーションの配信を遅らせる手動プロセスによる運用チームの過負荷の問題に対処することを目的としています。
1.2 ジェンキンス
Jenkinsは、オープン ソース ソフトウェア プロジェクトです。Javaに基づいて開発された継続的統合ツール
1.3 ドッカー
Dockerは、開発者がアプリケーションと依存関係をポータブル コンテナにパッケージ化し、それを一般的な Linux マシンに公開できるオープン ソースのアプリケーション コンテナ エンジンであり、仮想化も実装できます。コンテナーは完全にサンドボックス メカニズムを使用しており、コンテナー間にインターフェイスはありません。
1.4 Git
Git は、小規模から非常に大規模なプロジェクトのバージョン管理を効果的かつ迅速に処理できるコード リポジトリを提供するオープン ソースの分散バージョン管理システムです。Git はLinus Torvalds です Linus\ TorvaldsLin u s T or val ds は、Linuxカーネル開発の 管理を支援するために開発されたオープン ソースのバージョン管理ソフトウェアです。
2. 事前準備
2.1 CIプロセス設計図
2.2 ワークフロー
- 開発者はコードを Git リポジトリに送信します。
- Jenkins は手動/タイミングでプロジェクトのビルドをトリガーします。
- Jenkins はコードをプルし、コードをコンパイルし、イメージをパッケージ化して、ミラー ウェアハウスにプッシュします。
- Jenkins は Docker ホスト上にコンテナを作成し、公開します。
2.3 ホスト環境の計画
ホスト名 | 導入 | パブリックネット | イントラネット |
---|---|---|---|
docker-jenkins |
プロジェクトの構築: プル コード、コード コンパイル、パッケージ ミラー、ミラー ウェアハウスへのミラーのプッシュ | 116.196.85.174 | 10.0.0.20 |
docker-git |
コードリポジトリ | 116.196.86.207 | 10.0.0.22 |
docker-harbor |
私設鏡倉庫 | 116.196.88.91 | 10.0.0.21 |
buildimage |
Docker イメージをビルドする | 116.196.89.139 | 10.0.0.4 |
3. ホストの作成
JD Cloud コンソールで 4 つのクラウド ホストを作成します。アドレス: https://console.jdcloud.com/
構成は以下の通りで、購入時に数量を直接選択します4 44.購入が完了したら、名前をそれぞれ変更します:docker-jenkins
、docker-git
、docker-harbor
、buildimage
。
名前を作成して変更した後、次のようにします。
4. 環境構築
4.1 クラウド ホスト docker-git
(1) ホスト名を次のように変更します。docker-git
[root@112 ~]# hostnamectl set-hostname docker-git
[root@112 ~]# hostname docker-git
[root@112 ~]# logout
[root@docker-git ~]#
Ctrl+D
有効にするには、ログアウト後に再ログインしてください。
(2) Gitコードバージョンウェアハウスのデプロイ
インストール:
[root@docker-git ~]# yum install git -y
ユーザーを設定しますgit
:
[root@docker-git ~]# useradd git
[root@docker-git ~]# passwd git
ライブラリを作成します。
[root@docker-git ~]# su git
[git@docker-git root]$ cd
[git@docker-git ~]$ mkdir tomcat-java-demo.git
[git@docker-git ~]$ cd tomcat-java-demo.git/
[git@docker-git tomcat-java-demo.git]$ git --bare init
Initialized empty Git repository in /home/git/tomcat-java-demo.git/
[git@docker-git tomcat-java-demo.git]$ ls
branches config description HEAD hooks info objects refs
[git@docker-git tomcat-java-demo.git]$
4.2 クラウド ホスト docker-jenkins
(1) ホスト名を次のように変更します。docker-jenkins
[root@113 ~]# hostnamectl set-hostname docker-jenkins
[root@113 ~]# hostname docker-jenkins
[root@113 ~]# logout
[root@docker-jenkins ~]#
Ctrl+D
有効にするには、ログアウト後に再ログインしてください。
(2) Jenkins環境の導入
導入jdk
環境とmaven
:
[root@docker-jenkins tomcat-java-demo]# cd
[root@docker-jenkins ~]# mkdir tools
[root@docker-jenkins ~]# cd tools
[root@docker-jenkins tools]# wget https://pocenv-hcc.oss.cn-north-1.jcloudcs.com/jdk-8u191-linux-x64.tar.gz;tar zxf jdk-8u191-linux-x64.tar.gz;mv jdk1.8.0_191/ /usr/local/;ln -s /usr/local/jdk1.8.0_191/ /usr/local/jdk;
[root@docker-jenkins tools]# vim /etc/profile
######## JDK #######
JAVA_HOME=/usr/local/jdk1.8.0_191
JAVA_BIN=/usr/local/jdk1.8.0_191/bin
PATH=$PATH:$JAVA_BIN
CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
[root@docker-jenkins tools]# source /etc/profile
[root@docker-jenkins tools]# java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
[root@docker-jenkins tools]# wget https://pocenv-hcc.oss.cn-north-1.jcloudcs.com/apache-maven-3.5.0-bin.tar.gz;tar zxf apache-maven-3.5.0-bin.tar.gz;mv apache-maven-3.5.0 /usr/local/maven
[root@docker-jenkins tools]#
をインストールしJenkins
、Tomcat
バイナリ パッケージをダウンロードして、war
パッケージを に移動しますwebapps
。
[root@docker-jenkins tools]# wget https://pocenv-hcc.oss.cn-north-1.jcloudcs.com/jenkins.war
[root@docker-jenkins tools]# wget https://pocenv-hcc.oss.cn-north-1.jcloudcs.com/apache-tomcat-8.5.38.tar.gz
[root@docker-jenkins tools]# tar zxf apache-tomcat-8.5.38.tar.gz
[root@docker-jenkins tools]# ls
apache-maven-3.5.0-bin.tar.gz apache-tomcat-8.5.38 apache-tomcat-8.5.38.tar.gz jdk-8u191-linux-x64.tar.gz jenkins.war
[root@docker-jenkins tools]# mv apache-tomcat-8.5.38 /usr/local/tomcat-jenkins
[root@docker-jenkins tools]# ls /usr/local/tomcat-jenkins/webapps/
docs examples host-manager manager ROOT
[root@docker-jenkins tools]# rm -rf /usr/local/tomcat-jenkins/webapps/*
[root@docker-jenkins tools]# mv jenkins.war /usr/local/tomcat-jenkins/webapps/ROOT.war
[root@docker-jenkins tools]# ll /usr/local/tomcat-jenkins/webapps/
total 75520
-rw-r--r--. 1 root root 77330344 Mar 15 00:55 ROOT.war
[root@docker-jenkins tools]# cd /usr/local/tomcat-jenkins/bin/
[root@docker-jenkins bin]# ./startup.sh
Using CATALINA_BASE: /usr/local/tomcat-jenkins
Using CATALINA_HOME: /usr/local/tomcat-jenkins
Using CATALINA_TMPDIR: /usr/local/tomcat-jenkins/temp
Using JRE_HOME: /usr/local/jdk1.8
Using CLASSPATH: /usr/local/tomcat-jenkins/bin/bootstrap.jar:/usr/local/tomcat-jenkins/bin/tomcat-juli.jar
Tomcat started.
[root@docker-jenkins bin]#
起動後、ブラウザから ( docker-jenkins
):にアクセスしhttp://Jenkins主机公网IP:8080/
、画面の指示に従ってパスワードを入力してログインします。
ファイル内の/root/.jenkins/secrets/initialAdminPassword
パスワードを確認して入力します。
必要に応じてプラグインをインストールしてください。
管理者を設定します。
始めましょうJenkins
。
(3) DOCKER CE(Dockerのコミュニティ版)をインストールする
必要なパッケージをインストールします。
yum install -y yum-utils device-mapper-persistent-data lvm2 -y
安定したリポジトリをセットアップします。
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo -y
インストールDOCKER CE
(このステップは時間がかかるので、気長に待ちます!):
yum install docker-ce docker-ce-cli containerd.io -y
開始Docker
:
systemctl start docker
4.3 クラウドホスト docker-harbor
(1) ホスト名を次のように変更します。docker-harbor
[root@c-dfjgjesgqe ~]# hostnamectl set-hostname docker-harbor
[root@c-dfjgjesgqe ~]# hostname docker-harbor
Ctrl+D
有効にするには、ログアウト後に再ログインしてください。
(2) エンタープライズレベルのHarbor
ミラーウェアハウス展開
Habor は、VMWare によるオープンソースのコンテナ ミラー ウェアハウスです。実際、Habor は Docker Registry に対応するエンタープライズ レベルの拡張機能を作成し、より幅広いアプリケーションを獲得しました。これらの新しいエンタープライズ レベルの機能には、管理ユーザー インターフェイス、ロールベースのアクセス制御、AD/LDAP 統合および監査ログなどが含まれます。基本的なビジネスニーズを満たします。
Harbor の各コンポーネントの紹介:
コンポーネント | 関数 |
---|---|
harbor-adminserver |
構成管理センター |
harbor-db |
MySQLデータベース |
harbor-jobservice |
ミラーリングを担当する |
harbor-log |
操作ログを記録する |
harbor-ui |
Web管理ページとAPI |
nginx |
フロントエンド プロキシ。フロントエンド ページとミラーのアップロード/ダウンロード転送を担当します。 |
redis |
会話 |
registry |
ミラーストレージ |
3 3で設置されたハーバー3つの方法
- オンライン インストール: Docker Hub から Harbor 関連のイメージをダウンロードするため、インストール パッケージは非常に小さくなります。
- オフライン インストール: インストール パッケージには展開に関連するイメージが含まれているため、インストール パッケージは比較的大きくなります。
- OVA インストーラー: ユーザーが vCenter 環境を持っている場合、OVA のデプロイ後にこのインストーラーを使用して Harb を起動します。
ここでは、2 番目のオフライン インストール方法を使用して、https
アクセス ベースのharbor
ミラー ウェアハウスを構築します。
1) オフライン インストール パッケージをダウンロードして解凍します。
harbor
オフラインパッケージのダウンロードアドレス: https://github.com/goharbor/harbor/releases
ダウンロードの便宜のために、JD Cloud Object Storage にもコピーを保存しました。これは、次のように直接保存できますwget
。https://pocenv-hcc.oss.cn-north-1.jcloudcs.com/harbor-offline-installer-v1.7.4.tgz
[root@docker-harbor ~]# yum install vim wget openssl -y
[root@docker-harbor ~]# wget https://pocenv-hcc.oss.cn-north-1.jcloudcs.com/harbor-offline-installer-v1.7.4.tgz
[root@docker-harbor ~]# tar zxf harbor-offline-installer-v1.7.4.tgz
[root@docker-harbor ~]# cd harbor
[root@docker-harbor harbor]# ll
total 570744
drwxr-xr-x 3 root root 23 Apr 1 15:05 common
-rw-r--r-- 1 root root 939 Mar 4 15:33 docker-compose.chartmuseum.yml
-rw-r--r-- 1 root root 975 Mar 4 15:33 docker-compose.clair.yml
-rw-r--r-- 1 root root 1434 Mar 4 15:33 docker-compose.notary.yml
-rw-r--r-- 1 root root 5608 Mar 4 15:33 docker-compose.yml
-rw-r--r-- 1 root root 8033 Mar 4 15:33 harbor.cfg
-rw-r--r-- 1 root root 583086399 Mar 4 15:33 harbor.v1.7.4.tar.gz
-rwxr-xr-x 1 root root 5739 Mar 4 15:33 install.sh
-rw-r--r-- 1 root root 11347 Mar 4 15:33 LICENSE
-rw-r--r-- 1 root root 1263409 Mar 4 15:33 open_source_license
-rwxr-xr-x 1 root root 36337 Mar 4 15:33 prepare
2) 自己署名 http 証明書
権威ある認証証明書を取得します。
[root@docker-harbor harbor]# mkdir ssl
[root@docker-harbor harbor]# cd ssl
[root@docker-harbor ssl]# openssl genrsa -out ca.key 4096
Generating RSA private key, 4096 bit long modulus
...................................++
.....................................................................................................................................++
e is 65537 (0x10001)
[root@docker-harbor ssl]# openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=ZH/ST=ShangHai/L=ShangHai/O=example/OU=Personal/CN=reg.marin.com" -key ca.key -out ca.crt
[root@docker-harbor ssl]# ll
total 8
-rw-r--r-- 1 root root 2037 Apr 4 18:41 ca.crt
-rw-r--r-- 1 root root 3243 Apr 4 18:41 ca.key
サーバー証明書を取得します。
1.Create your own Private Key:
[root@docker-harbor ssl]# openssl genrsa -out reg.marin.com.key 4096
Generating RSA private key, 4096 bit long modulus
.............................................++
............................................................................................................................................................................................................................++
e is 65537 (0x10001)
[root@docker-harbor ssl]# openssl req -sha512 -new -subj "/C=ZH/ST=ShangHai/L=ShangHai/O=example/OU=Personal/CN=reg.marin.com" -key reg.marin.com.key -out reg.marin.com.csr
[root@docker-harbor ssl]# ll
total 16
-rw-r--r-- 1 root root 2037 Apr 4 18:41 ca.crt
-rw-r--r-- 1 root root 3243 Apr 4 18:41 ca.key
-rw-r--r-- 1 root root 1708 Apr 4 18:42 reg.marin.com.csr
-rw-r--r-- 1 root root 3243 Apr 4 18:42 reg.marin.com.key
[root@docker-harbor ssl]# cat > v3.ext <<-EOF
> authorityKeyIdentifier=keyid,issuer
> basicConstraints=CA:FALSE
> keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
> extendedKeyUsage = serverAuth
> subjectAltName = @alt_names
>
> [alt_names]
> DNS.1=reg.marin.com
> DNS.2=reg.marin
> DNS.3=marin
> EOF
[root@docker-harbor ssl]# openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in reg.marin.com.csr -out reg.marin.com.crt
Signature ok
subject=/C=ZH/ST=ShangHai/L=ShangHai/O=example/OU=Personal/CN=reg.marin.com
Getting CA Private Key
[root@docker-harbor ssl]# ll
total 28
-rw-r--r-- 1 root root 2037 Apr 4 18:41 ca.crt
-rw-r--r-- 1 root root 3243 Apr 4 18:41 ca.key
-rw-r--r-- 1 root root 17 Apr 4 18:44 ca.srl
-rw-r--r-- 1 root root 2098 Apr 4 18:44 reg.marin.com.crt
-rw-r--r-- 1 root root 1708 Apr 4 18:42 reg.marin.com.csr
-rw-r--r-- 1 root root 3243 Apr 4 18:42 reg.marin.com.key
-rw-r--r-- 1 root root 260 Apr 4 18:43 v3.ext
harbor
構成を変更し、およびDocker
のサーバー証明書を構成します。key
CA
[root@docker-harbor ssl]# cd ..
[root@docker-harbor harbor]# vim harbor.cfg
......
hostname = reg.marin.com
ui_url_protocol = https
ssl_cert = ./ssl/reg.marin.com.crt
ssl_cert_key = ./ssl/reg.marin.com.key
harbor_admin_password = 123456
......
パスワードは変更しないこともできます (デフォルトのログイン ユーザー: admin
、パスワード: ) Harbor12345
。
Docker デーモンは、.crt
ファイルを CA 証明書として解釈し、.cert
ファイルをクライアント証明書として解釈し、最初に.crt
ファイルを.cert
ファイルに変換します。
[root@docker-harbor harbor]# cd ssl/
[root@docker-harbor ssl]# mkdir -p /etc/docker/certs.d/reg.marin.com
[root@docker-harbor ssl]# openssl x509 -inform PEM -in reg.marin.com.crt -out reg.marin.com.cert
[root@docker-harbor ssl]# cp reg.marin.com.cert reg.marin.com.key ca.crt /etc/docker/certs.d/reg.marin.com/
この自己署名成功!
3) Docker CEをインストールする
必要なパッケージをインストールします。
yum install -y yum-utils device-mapper-persistent-data lvm2 -y
安定したリポジトリをセットアップします。
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo -y
インストールDOCKER CE
(このステップは時間がかかるので、気長に待ちます!):
yum install docker-ce docker-ce-cli containerd.io -y
開始Docker
:
systemctl start docker
ミラーを実行して、hello-world
正しくインストールされたことを確認しますDocker CE
。
docker run hello-world
4) 初期化とインストールの検証
初期インストール:
[root@docker-harbor ssl]#
[root@docker-harbor ssl]# cd ..
[root@docker-harbor harbor]# ./prepare
Generated and saved secret to file: /data/secretkey
Generated configuration file: ./common/config/nginx/nginx.conf
Generated configuration file: ./common/config/adminserver/env
Generated configuration file: ./common/config/core/env
Generated configuration file: ./common/config/registry/config.yml
Generated configuration file: ./common/config/db/env
Generated configuration file: ./common/config/jobservice/env
Generated configuration file: ./common/config/jobservice/config.yml
Generated configuration file: ./common/config/log/logrotate.conf
Generated configuration file: ./common/config/registryctl/env
Generated configuration file: ./common/config/core/app.conf
Generated certificate, key file: ./common/config/core/private_key.pem, cert file: ./common/config/registry/root.crt
The configuration files are ready, please use docker-compose to start the service.
install.sh
スクリプトを実行してharbor
リポジトリをインストールします。
注:install.sh
スクリプトを実行する前に、次の 2 つの問題を確認してください。
docker-compose
インストールするかどうか。install.sh
インストールしないと実行時に失敗し、「✖ まず自分で docker-compose(1.7.1+) をインストールして、このスクリプトを再度実行する必要があります。」と報告されます。docker
サービスが正常に実行されているかどうか。そうでない場合は、実行時にinstall.sh
失敗し、「unix:///var/run/docker.sock で Docker デーモンに接続できません。Docker デーモンは実行されていますか?」というエラーが報告されます。
インストールしますCompose
。
次のコマンドを実行して、次Docker Compose
の現在の安定リリースをダウンロードします。
curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
実行可能権限をバイナリに適用します。
chmod +x /usr/local/bin/docker-compose
install.sh
スクリプトを実行してharbor
リポジトリをインストールします。
[root@docker-harbor harbor]# ./install.sh
[Step 0]: checking installation environment ...
Note: docker version: 18.09.4
Note: docker-compose version: 1.24.0
[Step 1]: loading Harbor images ...
bffe2a0fec66: Loading layer [==================================================>] 33.22MB/33.22MB
38e174bed467: Loading layer [==================================================>] 8.964MB/8.964MB
427e4936ae66: Loading layer [==================================================>] 35.77MB/35.77MB
3bfd5214250a: Loading layer [==================================================>] 2.048kB/2.048kB
f30df776629d: Loading layer [==================================================>] 3.072kB/3.072kB
f87afad43f43: Loading layer [==================================================>] 22.8MB/22.8MB
......
953717aa0afc: Loading layer [==================================================>] 22.8MB/22.8MB
Loaded image: goharbor/registry-photon:v2.6.2-v1.7.4
[Step 2]: preparing environment ...
Clearing the configuration file: ./common/config/adminserver/env
Clearing the configuration file: ./common/config/core/env
Clearing the configuration file: ./common/config/core/app.conf
Clearing the configuration file: ./common/config/core/private_key.pem
Clearing the configuration file: ./common/config/db/env
......
Generated certificate, key file: ./common/config/core/private_key.pem, cert file: ./common/config/registry/root.crt
The configuration files are ready, please use docker-compose to start the service.
[Step 3]: checking existing instance of Harbor ...
[Step 4]: starting Harbor ...
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating redis ... done
Creating registryctl ... done
Creating harbor-db ... done
Creating harbor-adminserver ... done
Creating registry ... done
Creating harbor-core ... done
Creating harbor-jobservice ... done
Creating harbor-portal ... done
Creating nginx ... done
✔ ----Harbor has been installed and started successfully.----
Now you should be able to visit the admin portal at https://reg.marin.com.
For more details, please visit https://github.com/goharbor/harbor .
ブラウザのアクセス確認。
ブラウザ アクセスにはドメイン名の解決が必要なので、ローカルhosts
( ) ファイルC:\Windows\System32\drivers\etc\hosts
に次を追加します116.196.88.91 reg.marin.com
。
にアクセスしhttps://reg.marin.com
てログインします。
ログイン後のインターフェースの基本操作:
- 新しいプロジェクトを作成します
test
。
- 新しいユーザーを作成します
marin
。
- ユーザーをプロジェクト管理者
marin
として設定します。test