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ユーザーインターフェースを生成する方法

推薦する

Vue は div の高さをドラッグ可能にします

この記事では、divのドラッグ可能な高さを実現するためのVueの具体的なコードを参考までに共有します...

Apache FlinkCEP でタイムアウトステータス監視を実装するための詳細な手順

CEP - 複合イベント処理。ご注文後、一定期間内にお支払いの確認が取れませんでした。タクシーの配...

CocosCreator最適化DrawCallの詳細な説明

目次序文ドローコールとはDrawCall はパフォーマンスにどのような影響を与えますか?ドローコール...

Vueのカスタムイベントコンテンツ配信の詳細な説明

1. これは理解するのが少し複雑なので、原理を注意深く読んで自分で入力していただければ幸いです。 &...

Linux のスケジュールタスク Crontab コマンドの使用に関する詳細な説明と概要

crontab コマンドは、Unix および Linux で定期的な実行命令を設定するために使用され...

JavaScriptの基本構文とデータ型の詳細な説明

目次JavaScript のインポート1. 内部ラベル2. 外部紹介基本的な構文データ型番号弦ブール...

JS は複数のタブを切り替えるカルーセルを実装します

カルーセルアニメーションは、ページの外観とインタラクティブなパフォーマンスを向上させることができます...

HTML テーブルタグチュートリアル (23): 行の境界線の色属性 BORDERCOLORDARK

行ごとに、暗い境界線の色を個別に定義できます。基本的な構文<TR 境界線の色を暗くする=col...

HTML で 2 つの div タグの間に垂直線を描く方法

最近、インターフェースを描画しているときに、インターフェースに垂直線を描画し、この垂直線の高さが親 ...

JSscriptタグの属性は何ですか

JS スクリプト タグの属性は何ですか? charset : オプション。 src 属性で指定された...

Mysqlのマージ結果と水平スプライシングフィールドの実装手順

序文最近、レポート機能に取り組んでいたのですが、ある月に各部署に入社した人と退職した人の数をカウント...

DOCTYPE要素詳細説明完全版

1. 概要この記事では、DOCTYPE要素を体系的に説明します。同時に、多くの情報を調べました。イン...

HTML での位置の使用に関する簡単な紹介

昨日 HTML を少し学んだばかりで、JD.com の検索バーを作るのが待ちきれませんでした。 作っ...

Linux での Python のアップグレードと pip のインストールの詳細な説明

Linuxバージョンのアップグレード: 1. まず、Linuxオペレーティングシステムに付属するPy...

自己終了XHTMLタグを書くときに注意すべきこと

XHTML の img タグはいわゆる自己終了タグであり、XML では完全に合法です。 XHTMLの...