Docker+Jenkins+Gitlab+Djangoアプリケーションデプロイ実践の詳細な説明

Docker+Jenkins+Gitlab+Djangoアプリケーションデプロイ実践の詳細な説明

1. 背景

インターネット アプリケーションの急速な更新と反復という状況では、従来の手作業や単純なスクリプトではもはやこの変化に適応できません。Devops は優れたソリューションを提供します。CI/CD の適用により、日々の作業が大幅に容易になります。自動化された高速な継続的インテグレーション/継続的デリバリーにより、アプリケーション開発が高速化し、安定性と信頼性が向上します。

2. トポロジカル環境

2.1 アーキテクチャトポロジ

上記の例に示すように、次のプロセス トポロジを簡単に説明します。

  • 開発者がローカルコードをgitlab-serverにプッシュすると、Webhookが自動的にJenkinsをトリガーしてアプリケーションをビルドします。
  • アプリケーションをdockerホストにデプロイし、gitlabserverからソースコードをgit cloneしてアプリケーションを起動します。
  • LBは高可用性のためにフロントエンドに配置できる
  • データベース接続クラウドデータベース
  • ログはlogに保存され、後でelkに配信されてログの視覚化が実現されます。
  • ビルド完了メール通知(テストまたは開封)

2.2 システムソフトウェアバージョン

名前バージョン
リナックスCentOS 7.3 64ビット
ドッカー1.13
ジャンゴ2.0

3. インストールと展開

3.1 Jenkinsのインストールとデプロイメント

Jenkinsのインストールと展開については、Jenkins Notesを参照してください。

インストールが完了したら、Dockerターゲットサーバーを追加します

送信メールサーバーの設定

3.2 Dockerのインストールとデプロイ

Dockerのインストールと展開、Dockerfileの書き方の詳細については、Dockerコンテナの詳細な説明を参照してください。

3.3 Gitlabのインストールとデプロイメント

GitLabは、いくつかのコマンドを実行することでパブリックLinuxサーバーにインストールできます。パブリックネットワークがない場合は、 /etc/gitlab/gitlab.rb /gitlab.rbファイルのexternal_url 'http://自己的內網IP'手動で変更する必要があります。

yum install -y libsemanage-static libsemanage-devel policycoreutils openss
h-server openssh-clients postfix
systemctl postfix を有効にする && systemctl postfix を開始する

https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-8.0 を実行します。
0-ce.0.el7.x86_64.rpm
rpm -i gitlab-ce-8.0.0-ce.0.el7.x86_64.rpm
# パブリックIPを取得する
PUBLICIP=$(curl http://ipv4.icanhazip.com)
# sed -i "s/gitlab-server/${PUBLICIP}/g" /etc/gitlab/gitlab.rb を変更します

gitlab-ctl の再構成
gitlab-ctl を再起動する

echo "ユーザー名:root"
echo "パスワード:5iveL!fe"

3.4 構成リリースプロセス

Jenkinsはフリースタイルのソフトウェアプロジェクトを作成します

パラメータ化されたビルドを使用して、Docker でインポートされたマッピング ソース ポートとリリースのその後の展開を容易にします。

ソースコードはgitlabのDjangoプロジェクトから取得しました。

Webhookを使用してGitLabとJenkinsを接続する

Jenkins インストール プラグイン:

ランダムなトークン値を生成する

Jenkinsによって生成されたGitLab Webhook URLをgitlabに設定する

開発者がコードをローカルにプッシュすると、Jenkins は自動的にプロジェクト ビルドをトリガーします。Dockerfile には git pull コードが記述されています。ここでも、Jenkins から Docker ホストにコードを配布する必要はありません。Jenkins は Docker ビルドのトリガーとして使用されます。

ビルドが完了した後にメールを設定する

メールテンプレート、メールタイプの選択:

コンテンツタイプの選択: HTML

メールの件名を入力してください:構建通知:${BUILD_STATUS} - ${PROJECT_NAME} - Build # ${BUILD_NUMBER} !

通知テンプレートを作成します。

<!DOCTYPE html>
<html>
<ヘッド>
<メタ文字セット="UTF-8">
<title>${ENV, var="JOB_NAME"}-${BUILD_NUMBER} ビルド ログ</title>
</head>

<body 左マージン="8" マージン幅="0" 上マージン="8" マージン高さ="4"
 オフセット="0">
 <テーブルの幅="95%" セルパディング="0" セル間隔="0"
 スタイル="font-size: 11pt; フォントファミリー: Tahoma、Arial、Helvetica、sans-serif">
 <tr>
  <td>(このメールはプログラムによって自動的に送信されますので、返信しないでください!)</td>
 </tr>
 <tr>
  <td><h2>
   <font color="#0000FF">ビルド結果 - ${BUILD_STATUS}</font>
  </h2></td>
 </tr>
 <tr>
  <td><br />
  <b><font color="#0B610B">ビルド情報</font></b>
  <hr size="2" width="100%" align="center" />
 </tr>
 <tr>
  <td>
  <ul>
   <li>プロジェクト名: ${PROJECT_NAME}</li>
   <li>ビルド番号: ${BUILD_NUMBER} ビルド</li>
   <li>SVN バージョン: ${SVN_REVISION}</li>
   <li>トリガーの理由: ${CAUSE}</li>
   <li>ビルド ログ: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
   <li>ビルド URL: <a href="${BUILD_URL}">${BUILD_URL}</a></li>
   <li>作業ディレクトリ: <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
   <li>プロジェクト URL: <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
  </ul>
  </td>
 </tr>
 <tr>
  <td><b><font color="#0B610B">前回からの変更
   ビルド成功:
  <hr size="2" width="100%" align="center" />
 </tr>
 <tr>
  <td>
  <ul>
   <li>過去の変更: <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li>
  </ul> ${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="ビルド #%n の変更:<br />%c<br />",showPaths=true,changesFormat="<pre>[%a]<br />%m</pre>",pathFormat=" %p"}
  </td>
 </tr>
 <tr>
  <td><b>失敗したテスト結果</b>
  <hr size="2" width="100%" align="center" />
 </tr>
 <tr>
  <td><プレ
   $失敗したテスト
  <br /> </td>
 </tr>
 <tr>
  <td><b><font color="#0B610B">ビルド ログ (最後の 100 行):</font></b>
  <hr size="2" width="100%" align="center" />
 </tr>
 <!-- <tr>
  <td>テスト ログ (テストが実行された場合):
  href="${PROJECT_URL}ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip">${PROJECT_URL}/ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip</a>
  <br />
  <br />
  </td>
 </tr> -->
 <tr>
  <td><textarea cols="80" rows="30" readonly="読み取り専用"
   style="font-family: Courier New">${BUILD_LOG, maxLines=100}</textarea>
  </td>
 </tr>
 </テーブル>
</本文>
</html>

トリガー タイプは、必要に応じて入力できます。ここでは、成功か失敗かに関係なくメールを送信するには、常に入力します。

リモートDockerサーバー内のファイルを表示する

Django デプロイメントでは、conda を使用してプロジェクトの Python 3.6 環境パッケージをパッケージ化し、Docker イメージを作成しました。

以前は、純粋な Python 3.6 システムが使用されていました。ビルドのたびに、pip を使用して requirements.txt 内のモジュールをインストールしていました。ただし、時間の経過とともに環境がほとんど変更されないため、pip のインストールには毎回時間がかかります。そのため、conda を使用してパッケージ化された Python 環境をカスタマイズし、環境の展開時間を短縮しました。また、docker イメージ作成の -v パラメータを使用して、ローカル ディスクを環境にマウントすることもできます。毎回、ローカル conda をビルドして、迅速な環境展開を完了できます。

Dockerfile を表示

87a69025db6aより
メンテナー kaliarch

# dockerで作業ディレクトリENV WORK_DIR /work/を定義します
# dockerで作業ディレクトリを作成する RUN mkdir $WORK_DIR
# マッピングポートを定義する EXPOSE 80

ワークディレクトリ $WORK_DIR 
git clone http://123.xxxx.xxxxx.245/Devops/go2cloud.git を実行します。

# 起動サービススクリプトを追加する ADD *.sh ${WORK_DIR}

CMD `which bash` /work/start_all.sh && tail -f /work/logs/server-$(date +%F).log

Django 起動スクリプトを表示する

#!/bin/bash

BASEPATH=$(cd `dirname $0`;pwd)

PY_CMD = /python3/bin/python

# サービスエントリファイル #MAIN_APP=${BASEPATH}/go2cloud/manage.py 
# 移行スクリプトエントリファイル SCRIPTS_APP=${BASEPATH}/go2cloud/scripts/migrate_task_schdule.py
# スクリプトエントリファイルを削除します DELETE_APP=${BASEPATH}/go2cloud/scripts/delete_transfer_server.py

# ログディレクトリ LOG_DIR=${BASEPATH}/logs/
[ ! -d ${LOG_DIR} ] && mkdir ${LOG_DIR}

# サービスを開始します #nohup ${PY_CMD} -u ${MAIN_APP} runserver 0.0.0.0:80 >> ${LOG_DIR}server-$(date +%F).log 2>&1 &
# スクリプト移行スケジュールを開始します。スクリプト echo "---------$0 $(date) excute----------" >> ${LOG_DIR}task-script-$(date +%F).log
nohup ${PY_CMD} -u ${SCRIPTS_APP} >> ${LOG_DIR}script-$(date +%F).log 2>&1 &

# 移行および削除スクリプトを開始します echo "---------$0 $(date) excute----------" >> ${LOG_DIR}delete-script-$(date +%F).log
nohup ${PY_CMD} -u ${DELETE_APP} >> ${LOG_DIR}delete-script-$(date +%F).log 2>&1 &

Jenkins デプロイメント スクリプトを表示する

#!/bin/bash

リリース=$1
ポート=$2

BASEPATH=$(cd `dirname $0`;pwd)

# go2cloud-platform イメージをビルド cd /dockerwork
docker build -t go2cloud-platform-mini:$release を実行します。

IMGNAME=$(docker イメージ|awk -v release=$release '{if($1=="go2cloud-platform-mini" && $2==release) print $3}')

$IMGNAMEをエコーする
# コンテナを起動します docker run -d -p ${port}:80 -v /testlog/:/work/logs ${IMGNAME}

-vパラメータを使用して、ログをDockerホストに永続的に保存します。

4. テスト表示

4.1 テストビルド

手動でテストを構築する

4.2 ログの表示

4.3 Dockerコンテナの表示

4.4 アプリをテストする

5. 反省と改善

  • 現在接続しているデータベースはクラウドサーバー上に構築されたデータベースです。その後、データベースもdockerを使用し、複数のグループがdocker-composeを使用して統一された展開と管理を行います。
  • 後で、パブリッククラウドのk8sクラスターを使用して便利なテストを行うことができます。
  • 現在、docker コンテナによって生成されたログは docker ホスト上に存在します。その後、ログは cos に保存され、ログの視覚化処理のために elk クラスターに配信されます。
  • 統一された方法でイメージを管理し、ローカルイメージリポジトリを作成します
  • Gitlabはコードレビューを追加し、自動テストと組み合わせる

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Docker+gitlab+jenkins は、ゼロから自動デプロイメントを構築します
  • CentOS での GitLab+Jenkins 継続的インテグレーション環境の設定 (Jenkins のインストール)
  • Docker Gitlab+Jenkins+Harborは永続的なプラットフォーム運用を構築します
  • フロントエンドアプリケーションのjenkins+gitlab+nginxデプロイメント
  • JenkinsはGitlabを統合し、自動デプロイメントの全プロセス記録を実現します

<<:  MySQLの重複排除方法

>>:  ドラッグアンドドロップでVueユーザーインターフェースを生成する方法

推薦する

Next.js 入門チュートリアル

目次導入Next.jsプロジェクトを作成するNext.js プロジェクトを手動で作成するcreact...

スクロールバーを非表示にする HTML の簡単な実装

1. 属性付きHTMLタグXML/HTML コードコンテンツをクリップボードにコピー< htm...

HTML におけるメタの役割について (インターネットから収集および分類)

W3Cschoolではこのように説明しています<meta> 要素は、検索エンジン向けの説...

MySQL データ定義言語 DDL の基本ステートメント

MySQL DDL ステートメントDDL、DMLとは何ですか。 DDL はデータ定義言語であり、CR...

Ubuntu 16.04にJenkinsをインストールするための詳細な手順

1. 前提条件JDKがインストールされましたecho $PATHソフトリンクを作成し、JDKのインス...

MySQLとPythonの相互作用の例

目次1. データを準備するデータテーブルを作成するデータの挿入2. SQLドリル1. SQL文の強化...

Centos7 での MySQL 5.7.20 のインストールと設定に関する詳細なチュートリアル

1. 公式 Web サイトから MySQL 5.7 インストール パッケージ (mysql-5.7....

要素テーブルからヘッダーを削除する方法

show-header属性を使用したドキュメントのヒントshow-header <el-テーブ...

数千万データを持つMySQLテーブルを最適化する実践記録

序文まずここで説明させてください。インターネット上では、Alibaba では 500 万のデータを異...

Vue は Axios リクエスト フロントエンドのクロスドメイン問題をどのように解決するのか

目次序文1. クロスドメインの問題はなぜ発生するのでしょうか? 2. 解決策クロスオリジンリソース共...

シンプルなカレンダー効果を実現する JavaScript コード

この記事では、シンプルなカレンダー効果を実現するためのJavaScriptの具体的なコードを参考まで...

Vueはファイルのアップロードとダウンロードを実装します

この記事では、参考までにVueのファイルのアップロードとダウンロードの具体的なコードを紹介します。具...

MySQL 5.7.17 最新インストールチュートリアル(画像とテキスト付き)

mysql-5.7.17-winx64 は MySQL の最新バージョンです。インストールは無料で...

MySQL の非主キー自己増分使用例の分析

この記事では、例を使用して、MySQL の非主キーの自己増分の使用方法を説明します。ご参考までに、詳...