Gogs+Jenkins+Docker による .NetCore ステップの自動デプロイ

Gogs+Jenkins+Docker による .NetCore ステップの自動デプロイ

環境説明

  • Tencent Cloud 軽量サーバー、構成1c 2g 6mb 、システムはubuntu 20.14 、Docker と Jenkins はこのサーバー上にインストールされています。
  • このサーバーには Synology 218+、Gogs が 1 台あります。

Dockerのインストール

古いDockerをアンインストールする

sudo apt-get 削除 docker docker-engine docker.io containerd runc

apt パッケージ インデックスを更新し、apt が HTTPS 経由でリポジトリを使用できるようにパッケージをインストールします。

sudo apt-getアップデート

sudo apt-get インストール \
  apt-transport-https \
  ca証明書\
  カール\
  gnupg \
  lsb リリース

Docker公式GPGキーを追加する

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Dockerをインストールする

sudo apt-get install docker-ce docker-ce-cli containerd.io

hello-world を実行して、Docker が正しくインストールされていることを確認します。出力Hello from Docker!はインストールが成功したことを示します。

sudo docker run hello-world

さまざまなシステムのインストール方法については、公式のDockerインストール手順を参照してください。

ゴグのインストール

Gogs は、Go 言語で開発された、軽量で簡単に構築できるセルフサービス Git サービスです。 Gogs を選んだ主な理由は、内部使用率が数 GB の Gitlab よりもはるかに軽量であることです。 Gogs はシステムのオーバーヘッドを大幅に削減し、実行時に 100 MB のメモリしか消費しません。私のGogsはSynology上で実行され、結果は同じです。どちらもDockerでホストされています。

Gogsイメージをプル

sudo docker pull gogs/gogs

Gogsファイルのマウントパスを作成する

mkdir -p /var/gogs

コンテナ6022を起動するとhttps、6080はhttpになります。正常に起動しているかはdocker psコマンドで確認できます。

docker run -d --name=my_gogs -p 6022:22 -p 6080:3000 -v /var/gogs:/data gogs/gogs

コンテナが起動したら、 http://xxxxxxxx:6080から Gogs の初期設定を実行します。

推奨されるデータベース タイプは、Linux に付属する SQLite3 です。これは、12 人程度のチームをサポートするのに十分です。ドメイン名: Gogs が配置されているサーバーのドメイン名または IP アドレスを入力します。 http ポート番号はコンテナの内部ポートと一致します。アプリケーション URL に Gogs のドメイン名ポートまたは IP ポートを入力します。[インストール] をクリックし、新しいユーザーを登録してログインします。

Gogsをインストールしたら、後で使用するために新しいデモリポジトリを作成します。

Gogs 公式ドキュメント

Docker で .NetCore サービスをホストする

新しいWebApiプロジェクトを作成する

プロジェクトにDockerFileファイルを追加して設定するだけです

#依存関係のバージョンを指定します。FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim 
ワークディレクトリ /app

コピー ./publish
WORKDIR /publish
# DockerコンテナをポートEXPOSE 80を公開するように設定する
# タイムゾーンを設定する RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo 'Asia/Shanghai' >/etc/timezone 
# プログラムエントリ ENTRYPOINT ["dotnet", "DemoWebApi.dll"]

API サービスを公開します。公開されたファイルに DockerFile ファイルがない場合、プロジェクト ファイルを手動で変更する必要があります。リリースが成功したら、公開されたファイルをサーバーで指定されたフォルダーにコピーします。

 <アイテムグループ>
        <なし更新="Dockerfile">
            <CopyToOutputDirectory>常に</CopyToOutputDirectory>
        </なし>
    </アイテムグループ>

サーバーにコピーしたリリース ファイルのルート パスに移動し、 docker build -t {REPOSITORY}:{TAG} .このコマンドは、DockerFile を通じて Docker イメージ ファイルを生成します。REPOSITORY はイメージの名前、TAG はタグです。たとえば、 docker build -t demo:v1 .


生成されたすべてのイメージを表示するには、 docker imagesコマンドを使用します。

イメージが正常に生成されたら、イメージを使用してコンテナを作成して実行できます。 docker run --name demoapi -dp 5009:80/tcp demo:v1コマンドを実行して、コンテナを作成して実行します。
-d: コンテナをバックグラウンドで実行し、コンテナ ID を返します。
-p: ホスト ポート: コンテナ ポートの形式でポート マッピングを指定します。コンテナ ポートは、プログラムが起動されるポートです。プロジェクトにハードコードすることをお勧めします。
-- name: コンテナ名

実行後、 docker psを使用して実行中のすべてのコンテナのステータスを表示できます。すべてのコンテナを表示するには、 docker ps -aコマンドを使用します。

Postmanを使用して、デプロイメントが成功したかどうかをテストします。

一般的なDockerコマンドをいくつか挙げる

  • docker restart {容器id} #コンテナを再起動します
  • docker start {容器id} #コンテナを起動する
  • docker attach {容器id} # これによりコンテナが終了し、attachによりユーザーはコンテナの標準出力を見ることができるようになります
  • docker attach {容器id} --sig-proxy=false # パラメータを追加しても同期終了は発生しません
  • docker exec -it {容器id} /bin/bash # コンテナに入るには、exec コマンドを使用してコンテナ内でコマンドを実行する必要があります。
  • docker logs {容器id} -f # 追跡ログ出力 -f 追跡ログ出力
  • docker rm -f {容器id} # 停止したコンテナを削除します
  • docker rmi {REPOSITORY:TAG} # 指定されたイメージを削除します
  • docker image prune # コンテナによって参照されていないイメージを削除します

この時点で、サービスは Docker でホストされていますが、リリースごとに新しいイメージを構築し、古いコンテナを停止して新しいコンテナを作成する必要があり、ワークロードが目に見えないほど増加します。 Jenkinsはこれを実行できます

Jenkinsのインストール

Jenkins は Java に依存しているため、Java SDK をインストールする必要があります。ここでは、Java 8 を選択します。

sudo apt-get で openjdk-8-jdk をインストールします

JenkinsのLTSバージョンのインストール

wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key を追加 -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable バイナリ/ > \
    /etc/apt/sources.list.d/jenkins.list'
sudo apt-getアップデート
sudo apt-get でジェンキンスをインストールします

実行ステータスを確認するにはsystemctl status jenkins通常、出力は次のようになります。

Jenkins のデフォルト ポートは 8080 です。インストールが成功すると、 http://xxxx:8080からアクセスできます。最初のステップはロックを解除することです。インストールが成功すると、管理者パスワードが出力されます。コマンドcat /var/lib/jenkins/secrets/initialAdminPasswordを使用することもできます。

パスワードを入力した後、初期化ページに入り、推奨プラグインのインストールを選択します。

プラグインのインストールには時間がかかる場合があります。

完了したら、管理者アカウントを作成してログインし、システム管理に入り、プラグイン管理を選択して、 gogsプラグインを検索してインストールします。

インストール後、Jenkins を再起動する必要があります。リンクhttp://xxxx:8080/restartアクセスして「再起動」をクリックするか、 service jenkins restart実行して再起動します。

スクリプトの実行を容易にするには、Jenkins を root ユーザーとして実行する必要があります。 vim /etc/sysconfig/jenkinsまたはvim /etc/default/jenkinsファイルを編集し、 JENKINS_USERのコメントを解除し、値をJENKINS_USER="root"フォルダーの権限を変更します。

chown -R ルート:ルート /var/lib/jenkins
chown -R ルート:ルート /var/cache/jenkins
chown -R ルート:ルート /var/log/jenkins

Jenkinsの一般的な操作

  • service jenkins start
  • service jenkins restartを再起動するか、 http://xxxx:8080/restartにアクセスしてください。
  • service jenkins stopを停止するか、 http://xxxx:8080/exitにアクセスしてください。
  • 設定ファイルを再読み込みしますhttp://xxxx:8080/reload

Jenkinsによる自動化

サーバー上でプロジェクトをビルドする必要があるため、.NetCore 環境をインストールする必要があります。Microsoft の公式ドキュメントを参照して、自分でインストールすることができます。

新しく作成したプロジェクトをGogsリポジトリにプッシュし、リポジトリの詳細設定をクリックします。

Webフックを選択し、新しいGogs Webフックを追加します

Web フックを設定します。プッシュ アドレスの前に Jenkins アクセス リンクが付き、ジョブ名は自分で定義できます。プッシュ時にのみフックをトリガーするように選択することも、イベントを自分で選択することもできます。

追加後、再度「Web フックの管理」をクリックし、新しく作成したフックを選択して「プッシュのテスト」をクリックして正常かどうかを確認します。ジョブが定義されていないという例外がスローされた場合、フックが正常であることを意味します。他の例外の場合は、プッシュ アドレスが正しいかどうか、Jenkins 上の Gogs プラグインが正しくインストールされているかどうかを確認できます。

Jenkins ページに戻り、新しいタスクを作成します。タスク名は Gogs のジョブ名と同じです。「フリースタイル ソフトウェア プロジェクトのビルド」を選択します。

リポジトリ設定を追加します。リポジトリ URL はリポジトリのアドレスです。クリックしてリポジトリの資格情報を追加します。最後に、操作のブランチを指定します。

シェルスクリプトをビルドして実行を選択します。スクリプトはサーバー上に配置してここで呼び出すこともできます。便宜上、ここに記述するだけです。


# デモイメージが存在するか、または Docker イメージが存在するかを確認します | grep demo &> /dev/null
[ $? -ne 0 ]の場合
それから
   # 存在しない場合は処理しません echo "not existing demo"
それ以外
    # イメージが存在する場合、コンテナはデフォルトで実行されているとみなされます echo "existed demo"
   	# コンテナとイメージの削除を停止します docker stop demoapi
    docker rm -f デモapi
    docker rmi デモ:v1
フィ

# イメージを再構築して生成し、コンテナを実行します cd DemoWebApi/
# 指定したパスに公開する dotnet publish -c Release -o /publish
# イメージを生成するためのパスを入力し、コンテナを起動します cd /publish
docker build -t demo:v1 を実行します。
docker run --name demoapi -dp 5009:80/tcp demo:v1 

保存したら、「今すぐビルド」をクリックして確認します。ビルドが失敗した場合は、コンソール出力で詳細なビルド プロセスとエラー情報を確認できます。

Gogs 管理 Web フック ページに戻り、再度プッシュします。成功すると、Jenkins が自動的にビルドして公開します。その後は、Master ブランチにプッシュする限り、自動的に公開されます。


要約する

私は単純に自分の取り組みの全過程を記録しました。Jenkins と Docker には、使いながら徐々に理解する必要がある機能が他にもたくさんあります。

Gogs+Jenkins+Docker による .NetCore の自動デプロイの方法と手順についてはこれで終わりです。Docker による .NetCore の自動デプロイに関するその他の関連コンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • ASP.NET Core 開発 Docker デプロイ
  • Linux CentOS の Docker に Asp.Net Core (.Net6) をデプロイする
  • Linux システム Docker への ASP.NET Core アプリケーションのデプロイのプロセス分析
  • Jenkins + Docker + ASP.NET Core の自動デプロイメントの問題について (落とし穴を避ける)
  • docker を使用して Asp.net コア アプリケーションをデプロイするための完全な手順
  • Asp.net Core Jenkins Docker のワンクリックデプロイの実装
  • ASP.NET Core Docker デプロイメントの詳細
  • .Net Core は Docker コンテナを展開します

<<:  MySQL で 2 つのセットの交差/差/和を取得する方法

>>:  JavaScript スロットリングとアンチシェイクに関する簡単な説明

推薦する

Reactは、読み込み、読み込み完了、読み込み失敗の3つの段階の原則分析を実装します。

最近ブログに書いたのですが、プロジェクトリストの中に写真がたくさんあり、最初は読み込みが遅いので、ス...

Vue3 における ref と reactive の詳細な説明と拡張

目次1. 参照と反応1. 反応的2.参照2. shallowRef と shallowReactiv...

MySQLソースコマンドの使い方の紹介

目次ネット上の質問から生まれた思考MySQL ソースコマンドネット上の質問から生まれた思考今日仕事中...

商品クエリ機能を実現するJavaScript

この記事の例では、商品検索機能を実現するためのJavaScriptの具体的なコードを参考までに共有し...

jsはCanvasを使用して複数の画像を1つの実装コードにマージします

解決 関数 mergeImgs(リスト) { const imgDom = document.cre...

Navicat でストアド プロシージャ、トリガーを作成し、カーソルを使用する簡単な例 (画像とテキスト)

1. テーブルを作成する<br /> まず、2 つのテーブル (users テーブルと...

MySQL関連のツールをいくつかお勧めします

序文:インターネット技術の継続的な発展に伴い、MySQL 関連のエコシステムはますます充実し、ますま...

HTML ファイルにフラッシュ ビデオ形式 (flv、swf) ファイルを埋め込む方法

Flash ファイル形式: .FLV および .SWFフラッシュ ビデオ形式には、.flv と .s...

Maxwell を使用して MySQL データをリアルタイムで同期する方法

目次マクスウェルについてMaxwellの設定と使用1. Maxwellインストールパッケージをダウン...

SQL における参照整合性の詳細な説明 (1 対 1、1 対多、多対多)

1. 参照整合性参照整合性とは、主に外部キー制約を使用した複数のテーブル間の設計を指します。複数テ...

TSで最も一般的な宣言マージ(インターフェースマージ)

目次1. マージインターフェース1.1 非関数メンバー1.2 関数メンバー序文:今日お話ししたいのは...

HTML の著作権記号のフォント選択問題 (著作権記号をより美しくする方法)

1. 問題を発見する&copy; は HTML の著作権記号ですが、間違ったフォントを選択す...

Linux 論理ボリューム管理 (LVM) の使用法の概要

ディスク領域の管理は、システム管理者にとって重要な日常的なタスクです。ディスク領域が使い果たされると...

Element-ui NavMenuサブメニューを使用して再帰的に生成する場合のエラーの詳細な説明

ナビゲーションバーのサブメニューを再帰的に生成すると、メニューは正常に生成できるが、マウスをホバーす...

MySQLの自動増分主キーの実装の詳細な説明

目次1. 自己増分値はどこに保存されますか? 2. 自己価値修正メカニズム3. 自動増分値を変更する...