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

推薦する

CSS で background-color を使用して背景画像にマスク効果を追加する 2 つの方法

div で background-color と background-image を同時に設定する...

Web デザインでフラッシュ オーバーレイ ポップアップ レイヤーの z-index プロパティを設定しても機能しない

デフォルトでは、Flash は常にページのトップレベルに表示されます。つまり、ページに DHTML ...

CSSをインポートする方法に関する詳細な洞察の要約

CSS の開発履歴についてはここでは紹介しません。ブログを書いている理由の 1 つは、フロントエンド...

Tencent インタビュー: SQL ステートメントの実行が非常に遅くなる理由は何ですか? ---後悔シリーズは見ないで(推奨)

正直に言うと、この質問には MySQL のコア知識がかなり必要で、コンピュータ ネットワークの知識を...

CSS でよく使用されるフォントサイズ、フォント単位、行の高さの詳細な説明

px(ピクセル)ピクセルという言葉は皆さんもよくご存知だと思います。次に、この単位に関するちょっとし...

LinuxでHomebrewを使用する正しい方法

多くの人が Linux Homebrew を使用しています。これをより良く使用するための 3 つのヒ...

Vueはツリーテーブルを実装する

この記事では、ツリーテーブルを実装するためのVueの具体的なコードを例として紹介します。具体的な内容...

JavaScript における call、apply、bind の実装原則の詳細な説明

目次序文電話使用法成し遂げるシンプルな実装バージョン:アップグレード版:適用する使用法成し遂げるバイ...

Ubuntu 16.4 で完全に分散された Hadoop 環境を構築するための実践的なチュートリアル

序文この記事は主にubantu 16.4 Hadoop完全分散構築に関する関連コンテンツを紹介し、皆...

HTML テーブルの行間および列間の操作 (rowspan、colspan)

一般的に、<td> 要素の colspan 属性はセルの列間操作を実装するために使用され...

CSS が初期読み込み時の白い画面の時間に与える影響

外部 CSS ファイルを使用したレンダリング パイプライン上図では、HTML データの要求から DO...

Nginx proxy_redirect の使用方法の詳細な説明

今日、Apache の nginx リバース プロキシを実行していたときに、ちょっとした問題に遭遇し...

flexとは何か、flexレイアウト構文の詳細なチュートリアル

フレックスレイアウトFlex は Flexible Box の略で、「柔軟なレイアウト」を意味します...

MySQLコンテナ間のレプリケーション構成例の詳細な説明

背景先週、会社で MySQL レプリケーションのトレーニングを受けたので、今週末は学んだことを実践す...

React コンポーネントのコンストラクタとスーパーの知識ポイントのまとめ

1. Reactでクラス宣言する際のヒント 上記のように、Child クラスは class キーワー...