5
4

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 3 years have passed since last update.

nuxt.js製アプリをgithub actionsでビルドしてFTP Deploy Actionで自分のサーバーにデプロイする

Posted at

nuxt.jsアプリをgithubにpushしたときに、github actionsでビルドし、FTPでデプロイするところまでのmain.ymlを作成しました

手続きとしては以下の通りです

.gitignoreの編集

distフォルダごとプッシュしたいのでdistフォルダを封じている部分をコメントアウトします

# Nuxt generate
# dist

nuxt.config.jsの修正

デフォルトの設定では_nuxtディレクトリ内にハッシュ付きのファイルが増えていくため、差分が分かるように以下コードを追加します

nuxt.config.js
build: {
    filenames: {
      app: () => '[name].js',
      chunk: () => '[name].js',
      css: () => '[name].js',
      img: () => '[path][name].[ext]',
      font: () => '[path][name].[ext]',
      video: () => '[path][name].[ext]'
    }
  }

参考:nuxt 2 で静的ファイルの生成時にファイル名を固定したい。

secretの登録

FTPDeployActionに必要な環境変数を4つsecretに登録します

    secrets.FTP_HOST          :    FTPのhost
    secrets.FTP_USERNAME      :    FTPのユーザー名
    secrets.FTP_PASSWORD      :    FTPのパスワード
    secrets.FTP_REMOTE_ROOT   :    FTPのデプロイ先のディレクトリ(Document Rootからの相対パス)

main.ymlの作成

main.ymlを.github/workflows/配下に作成します

main.yml
name: buildAndDeploy

on:
  push:
    branches:
      - master

jobs:
  build-deploy:
    runs-on: ubuntu-18.04
    steps:
    - uses: actions/checkout@v2

    - name: setup node
      uses: actions/setup-node@v1
      with:
        node-version: '10.x'

    - name: Cache dependencies
      uses: actions/cache@v1
      with:
        path: ~/.npm
        key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
        restore-keys: |
          ${{ runner.os }}-node-

    - name: install
      run: npm ci

    - name: test
      run: npm test

    - name: generate
      run: npm run generate

    - name: commit
      run: |
        git config --local user.name "github action"
        git add .
        git commit -m "generate pages by github action"
        
    - name: Push changes
      uses: ad-m/github-push-action@master
      with:
        github_token: ${{ secrets.GITHUB_TOKEN }}

    - name: Deploy via FTP
      uses: SamKirkland/FTP-Deploy-Action@3.0.0
      with:
        ftp-server: ${{ secrets.FTP_HOST }}
        ftp-username: ${{ secrets.FTP_USERNAME }}
        ftp-password: ${{ secrets.FTP_PASSWORD }}
        git-ftp-args: --remote-root ${{ secrets.FTP_REMOTE_ROOT }}
        local-dir: dist/

main.yml内の解説

デプロイまでの流れとしては以下の通りです

  1. pushを検知
  2. nodeのインストール
  3. nuxt generate
  4. 生成された/distをgithubにpush
  5. FTP Deploy AccessでdistフォルダをFTP

nodeのインストール

    - name: setup node
      uses: actions/setup-node@v1
      with:
        node-version: '10.x'

nuxt generate

    - name: generate
      run: npm run generate

commit

    - name: commit
      run: |
        git config --local user.name "github action"
        git add .
        git commit -m "generate pages by github action"

push

    - name: Push changes
      uses: ad-m/github-push-action@master
      with:
        github_token: ${{ secrets.GITHUB_TOKEN }}

Deploy

    - name: Deploy via FTP
      uses: SamKirkland/FTP-Deploy-Action@3.0.0
      with:
        ftp-server: ${{ secrets.FTP_HOST }}
        ftp-username: ${{ secrets.FTP_USERNAME }}
        ftp-password: ${{ secrets.FTP_PASSWORD }}
        git-ftp-args: --remote-root ${{ secrets.FTP_REMOTE_ROOT }}
        local-dir: dist/

問題点

・FTP Deploy Actionが、pushされたディレクトリからのデプロイを前提していたので、github actionsの仮想マシンでビルド後githubにpushするようにしています。なので毎回手元でのpushは、git pullをしていない限り、リモートブランチとのマージを行う形になります。問題なくCIは動くので、今はこれで運用していますが、トラブった時にめんどくさいかもしれません。もしかしたらFTP Deploy Actitonではなくgithub actionsのVMからftpコマンドを叩いたほうがいいかもしれません。

・generateされるファイルがハッシュ値を含まないようにしているので、ある程度は上書きされますが、/_nuxt/static/内などいくつかのファイルは都度生成されて、たまっていってしまいます。FTP Deploy Actionでは作成か上書きのみしかできないので、デプロイするたびに不要なファイルがたまっていきます。

5
4
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
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?