0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ASP.NET API + Nginx + Docker ComposeをGithub Actionsを使ってCI/CD環境を構築する

Last updated at Posted at 2022-11-02

はじめに

以前の記事でAsp.netとNginxをdocker-composeで動くようにしましたが、今回はこれをGithub Actionsを使ってVPS上にテスト・ビルド・デプロイしようと思います。
image.png
Github Actionsを使って、DockerHubにImageを出力して、LinuxからPullするというのもありなのですが、今回はこのDockerHubを使用しない形となっています。そのため、Linux側でdocker composeでの再ビルドをしています。

前提

VPS(ubuntu22.40): 自分はConoha Vpsを使用しています。awsやazureでも似たようなものですが、お作法は違うかもしれません。あとawsやaaureとかだとGitなども自前のものがあったりで、もっと簡単にいろいろな作業ができると思います。自分は勉強のために設定からできるようにとVPSを使用しています。
UbuntuにGit, docker composeをインストール済み
Github: アカウントを持っていてRepositoryを作成している
開発環境: Windows11, C#, ASP.net, Visual Studio 2022 (Javeでも基本作業は変わらないです)

記事の内容

  • VPSでのユーザー作成とSSL鍵の作成
  • Githubでの鍵の設置
  • ローカル環境でのコード作成とGithub Actions用ymlファイル作成
  • push build test deploy
    以上の構成となっています。ここは知っているという場合は読み飛ばしてください。

VPS環境での作業

ユーザー作成は、Github Actionsで使用するものですが、すでにある場合は次に進んでください。rootしか使っていないという場合でも操作はあまり変わりません。

ユーザー作成

この辺りはwebを調べればいくらでも出てくるところですが、一応手順として書きます。
rootユーザーになるか、sudoからコマンドを始めます。
ここではdemouserとします。

sudo useradd -m demouser

-m オプションはユーザーのホームディレクトリを作成するという意味です。
このあとパスワードを聞かれるので入力します。
続いて、このユーザーにsudo権限を与えておきます。

sudo usermod -aG sudo demouser

できあがったら作成したユーザーに切り替えます。

su demouser

SSL鍵作成

秘密鍵と公開鍵を作成します。
自分のイメージとしては秘密鍵=鍵、公開鍵=鍵穴です。鍵穴はいつもそこにありますが、鍵を持っている人にしか開けられないという感じです。

sshディレクトリに移動

cd ~/.ssh

rsa 4096bitの鍵を作成

mail@address.comは自分のメールアドレスに入れ替えてください。

sudo ssh-keygen -t rsa -b 4096 -C mail@adress.com

このあと Enter passphraseと聞かれますが、パスフレーズは入力せずにそのままEnterキーで次に進みます。それ以外もEnterキーで未入力のまま進んで問題ありません。
これで~/.sshの中をみるとid_rsaとid_rsa.pubができています。
注意事項ですが、pubは公開鍵なのであまり問題ありませんが、秘密鍵は他人に渡したり、公開することは絶対にしないでください。自分の家の鍵を人に渡してしまうのと同じです。

ls

このうち.pubとなっているのが公開鍵です。

id_rsa  id_rsa.pub

中を確認したい場合はcatコマンドで見ることができます。

sudo cat id_rsa
sudo cat id_rsa.pub

公開鍵はこんな感じ

ssh-rsa xxxxxxxxxxx~xxxxxxxxxx== mail@adress.com

秘密鍵はこんな感じです

-----BEGIN OPENSSH PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END OPENSSH PRIVATE KEY-----

このうち、秘密鍵をコピーして同じ名前で自分のPCにファイルを作成しておきましょう。

鍵を使ってログインできるようにする

公開鍵でのログインができるように設定ファイルを変更します。
nanoを使っていますがviでも構いません。

sudo nano /etc/ssh/sshd_config

この中の以下のところの#を消して有効化します。

HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

AuthorizedKeysFile      .ssh/authorized_keys .ssh/authorized_keys2

また以下の設定値をnoからyesに変更します。

PubkeyAuthentication yes

これで保存して、変更を反映させます。

systemctl reload sshd

確認

Windowsの場合はPowerShellで確認してみます。(macの方はコンソールでできます)

"id_rsaを保存しているフォルダを指定してください"
cd C:\Users\demouser\documents\id_rsa

sshコマンドで接続

"xxx.xxx.xxx.xxxはVPSのIPアドレス"
ssh -i id_rsa demouser@xxx.xxx.xxx.xxx

これで接続できれば、Github Actionsでも使用することができます。
もしパスワードを聞かれたり、Invalid Formatとなった場合は、どこかに問題がありますのでいろいろ調べてみましょう。

リポジトリ用のフォルダ作成

GithubからリポジトリをPushするためのディレクトリを作っておきます

sudo mkdir /repo/demo

これはご自分の好きな名前や場所で作成してください。Github Actionsで使用するymlファイルで使用します。

Github接続情報

Githubの接続時に使用する秘密鍵をどれにするかの接続情報ファイルを作成します

sudo nano ~/.ssh/config

configファイルがない場合は空のドキュメントができると思います。
この中に以下のような設定を書いて保存します。

Host github.com
HostName github.com
IdentityFile ~/.ssh/id_rsa
User git

Githubでの作業

作業に入る前に、今回Github Actionsを使用した構成を書いておきます。
公開鍵と秘密鍵の置き場所がポイントです。
現在はVPS上に公開鍵・秘密鍵がある状態です。
image.png
Githubにコミット(push)すると、Github Actionsでビルドとテストが始まり、デプロイするためにGithubに保存された秘密鍵を使用してVPSに接続します。VPSで行うコマンドも送信します。
次に、送信されたコマンドでVPS側からGighubにpull requestを送り、Repositoryを受信します。
最後にVPS側でビルドとdocker-compose up を行い、アプリが起動するようにします。

GithubのSettingsからの設定

image.png
SSH and GPG keysを選択
image.png
New SSH keyボタンを押下
image.png
SSH Keys / Add new
Titleに適当な名前を入力
Key typeはAuthengication Key
Keyにid_rsa.pubの内容を貼り付けます
image.png

RepositoryのSettingsを設定

Repositoryを選択してSettingsをクリック
image.png
SecurityのSecrets#Actionsを選択します
image.png
New repository secretをクリック
image.png
Actions secretsの項目を入力
image.png
設定値は以下の感じで5つ作成します

  1. Name: DEMOHOST
    Secret: xxx.xxx.xx.xxx (VPSのIPアドレスもしくはドメイン)
  2. Name: SSH_PORT
    Secret: 22 (VPSでの設定に従ってください)
  3. Name: DEMO_USER
    Secret: demouser (ユーザー名)
  4. Name: DEMO_PASS
    Secret: ログインパスワード
  5. Name: DEMO_ID_RSA
    Secret: 秘密鍵を貼り付ける

これでVPSとGithubでの作業は完了です。
最後にローカル環境での作業となります。ここまでくれば、基本的にローカル環境で開発を行い、Githubにコミットすれば、自動的にVPSで使用できるようにまでなります。

ローカル環境(Visual Studio)での作業

基本的なローカル開発は以前の記事を参考にしてください。
ここではdocker-composeまでは完了しているという前提で、Github Actionsのための設定ymlファイルを紹介します。

build.yml作成

Visual Studioのトップにworkflowsフォルダを作成し、その中にbuild.ymlファイルを作成します。
ここではbuild.ymlとしていますが、この名前は自由です。
重要なのは、workflowsフォルダをトップに作成するということです。
image.png

build.ymlの中身

# GitHub リポジトリの [アクション] タブに表示されるワークフローの名前(省略可能)
name: '.net build test deploy'

# ワークフローのトリガー
# 変更がリポジトリにプッシュされるたびに、ワークフロー実行がトリガーされます
on:
  push:
  pull_request:
    branches: [ main ]
    paths:
    - '**.cs'
    - '**.csproj'
env:
    DOTNET_VERSION: '6.0.x'
jobs:
  build-and-test:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v3
      - name: Setup .NET
        uses: actions/setup-dotnet@v3
        with:
          dotnet-version: ${{ env.DOTNET_VERSION }}
      - name: Install dependencies
        run: dotnet restore [ソリューション名].sln 
      # Build
      - name: Build
        run: dotnet build [ソリューション名].sln --configuration Release --no-restore
      # Test
      - name: Test with dotnet
        run: dotnet test [ソリューション名].sln --no-restore --verbosity normal
      # docker-compose
      - name: docker-compose build
        run: docker compose build
  deploy:
    runs-on: ubuntu-22.04
    needs: build-and-test
    steps:
      - name: Deploy to Conoha VPS
        uses: appleboy/ssh-action@master
        with:
          key: ${{ secrets.DEMO_ID_RSA }}
          host: ${{ secrets.DEMOHOST }}
          username: ${{ secrets.DEMO_USER }}
          port: ${{ secrets.DEMO_PASS }}
          script: |
            cd /repo/demo
            git pull git@github.com:[user]/[repository].git
            docker compose -f docker-compose.yml build
            docker compose up -d

最後に

これで基本的な設定は完了です。
ローカル環境で開発を行い、Githubにpushすると、こんな感じの画面がGithub Actionsに表示されます。
image.png
こまかくbuild.ymlについて説明していませんでしたが(後日記事にするかもです)、buildとtestが終わってからdeployが行われるようにymlファイルを記述しています。
すべてうまくいけば緑色に表示されます。
VPS側ではbuildとdocker compose up -dが走っているので、自動的にビルドと起動が行われています。

ちなみにテストに失敗すると、deployは行われないようになっています。

これで、ローカル環境で開発を行い、Githubにpushすることで、自動テスト・自動ビルド・自動デプロイが行われようになりました。

大切なこと

CI/CDがきちんと行われるためには、間違ったコードがデプロイされないということが大切です。
つまり、テストがきちんと成功/失敗することが重要になります。
テストコードを書くことは、開発現場では軽視されがちですが、実はテストコードこそが開発の効率性に寄与するということになります。テストコードを書く習慣が業界にもっと広がることを願うばかりです。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?