0
0

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.

App Service on Linux Node runtime における リモートビルドのデプロイ時間を短縮する工夫

Last updated at Posted at 2023-03-15

はじめに

この記事は、以下の記事の続編です。

各デプロイ方法を用いた場合に、少しでも時間を短縮するTipsを記載していきます。

リモートビルドを利用する場合のTips

リモートビルドを利用する場合、主に時間がかかる箇所は

  • Running 'npm install --unsafe-perm'...
  • Running 'npm run build'...
  • Zipping existing node_modules folder...

の 3 箇所です。

npm をやめて、yarnpnpm を使うことで、高速化が期待できるかもしれませんが、今回の記事では npm を使う前提で考えます。

まずは npm install の詳細を見ていきます。npm の実行ログは、Kudu から $home/.npm/_logs/ ディレクトリで確認が可能です。
2回目は npm のキャッシュが効いていることわかります。がそれでも一定の時間がかかってしまいます。
残る改善の余地としては、audit や funds を無くすあたりでしょうか。

npm run build の高速化については、プロジェクトの構成に大きく依存したり、利用するフレームワーク(今回はnext)のノウハウによるものと考えられるので、今回は割愛します。

Zipping existing node_modules folder... については、変更がなければ省略するといったことができそうです。

作戦

次のような方針にしてみました。

通常 npm build 完了後に、Oryx が node_modules/home/site/wwwroot/node_modules.tar.gz としてまとめます。これを再利用してみます。

このファイルを、package-lock.json のハッシュ値、Nodeバージョン、NPMバージョンをキーに/home/site/deploy_cache/node_modules-${md5 hash_of_package_lock.json}-node${NODE_VERSION}-npm${NPM_VERSION}.tar.gz としてキャッシュし、
ビルド時にキャッシュが存在する場合は、キャッシュを展開してnpm install を省略します。

PRE_BUILD_COMMANDCUSTOM_BUILD_COMMANDPOST_BUILD_COMMAND を利用して、上記のフローが実現できるようにしてみます。
詳細は以下の gist に書きました。

結果

package-lock.json、Nodeバージョン、NPMバージョンに変更がない場合 npm install と oryx による Zipping existing node_modules folder... が省略されました。

その代わりに追加された prebuildにおいて、tar.gz を展開する処理で30秒弱増えています。

3:34:51 PM node-deploy-speed-test: prebuild started
3:34:51 PM node-deploy-speed-test: current working dir: /tmp/8db251f5c423ad5
3:34:54 PM node-deploy-speed-test: package-lock.json hash: 2ada1c245c4a3cb78f887bfdcea8aa6f
3:34:54 PM node-deploy-speed-test: /home/site/deploy_cache/node_modules-2ada1c245c4a3cb78f887bfdcea8aa6f-nodev18.14.0-npm9.3.1.tar.gz found, extaracting to working dir
3:35:18 PM node-deploy-speed-test: prebuild end
3:35:18 PM node-deploy-speed-test: Finished executing pre-build command.

全体としては、Done in 191 sec(s). と前回の記事の 2 回目に比べて、100 秒早くなりました。

3:34:32 PM node-deploy-speed-test: Starting deployment...
3:34:33 PM node-deploy-speed-test: Creating zip package...
3:34:34 PM node-deploy-speed-test: Ignoring files from "appService.zipIgnorePattern"
"node_modules{,/**}"
".vscode{,/**}"
3:34:35 PM node-deploy-speed-test: Zip package size: 125 kB
3:34:36 PM node-deploy-speed-test: Fetching changes.
3:34:37 PM node-deploy-speed-test: Cleaning up temp folders from previous zip deployments and extracting pushed zip file /tmp/zipdeploy/4ab23023-a899-42a4-a105-8c996fdf0909.zip (0.12 MB) to /tmp/zipdeploy/extracted
3:34:41 PM node-deploy-speed-test: Updating submodules.
3:34:42 PM node-deploy-speed-test: Preparing deployment for commit id 'c01c7988-2'.
3:34:42 PM node-deploy-speed-test: PreDeployment: context.CleanOutputPath False
3:34:42 PM node-deploy-speed-test: PreDeployment: context.OutputPath /home/site/wwwroot
3:34:43 PM node-deploy-speed-test: Repository path is /tmp/zipdeploy/extracted
3:34:43 PM node-deploy-speed-test: Running oryx build...
3:34:43 PM node-deploy-speed-test: Command: oryx build /tmp/zipdeploy/extracted -o /home/site/wwwroot --platform nodejs --platform-version 18 -p virtualenv_name= --log-file /tmp/build-debug.log  -i /tmp/8db251f5c423ad5 -p compress_node_modules=tar-gz | tee /tmp/oryx-build.log
3:34:45 PM node-deploy-speed-test: Operation performed by Microsoft Oryx, https://github.com/Microsoft/Oryx
3:34:45 PM node-deploy-speed-test: You can report issues at https://github.com/Microsoft/Oryx/issues
3:34:46 PM node-deploy-speed-test: Oryx Version: 0.2.20220825.1, Commit: 24032445dbf7bf6ef068688f1b123a7144453b7f, ReleaseTagName: 20220825.1
3:34:46 PM node-deploy-speed-test: Build Operation ID: |QC7zwKCaWyg=.d8b8eb3f_
3:34:46 PM node-deploy-speed-test: Repository Commit : c01c7988-239e-431c-ae60-bd3a0c7d8f13
3:34:46 PM node-deploy-speed-test: Detecting platforms...
3:34:49 PM node-deploy-speed-test: Detected following platforms:
3:34:49 PM node-deploy-speed-test:   nodejs: 18.14.0
3:34:49 PM node-deploy-speed-test: Detected the following frameworks: Next.js
3:34:50 PM node-deploy-speed-test: Using intermediate directory '/tmp/8db251f5c423ad5'.
3:34:50 PM node-deploy-speed-test: Copying files to the intermediate directory...
3:34:50 PM node-deploy-speed-test: Done in 0 sec(s).
3:34:50 PM node-deploy-speed-test: Source directory     : /tmp/8db251f5c423ad5
3:34:50 PM node-deploy-speed-test: Destination directory: /home/site/wwwroot
3:34:51 PM node-deploy-speed-test: Executing pre-build command...
3:34:51 PM node-deploy-speed-test: prebuild started
3:34:51 PM node-deploy-speed-test: current working dir: /tmp/8db251f5c423ad5
3:34:54 PM node-deploy-speed-test: package-lock.json hash: 2ada1c245c4a3cb78f887bfdcea8aa6f
3:34:54 PM node-deploy-speed-test: /home/site/deploy_cache/node_modules-2ada1c245c4a3cb78f887bfdcea8aa6f-nodev18.14.0-npm9.3.1.tar.gz found, extaracting to working dir
3:35:18 PM node-deploy-speed-test: prebuild end
3:35:18 PM node-deploy-speed-test: Finished executing pre-build command.
3:35:18 PM node-deploy-speed-test: Removing existing manifest file
3:35:18 PM node-deploy-speed-test: Creating directory for command manifest file if it does not exist
3:35:18 PM node-deploy-speed-test: Creating a manifest file...
3:35:18 PM node-deploy-speed-test: Node Build Command Manifest file created.
3:35:18 PM node-deploy-speed-test: Using Node version:
3:35:19 PM node-deploy-speed-test: v18.14.0
3:35:19 PM node-deploy-speed-test: Using Npm version:
3:35:24 PM node-deploy-speed-test: 9.3.1
3:35:24 PM node-deploy-speed-test: Running 'sh azureappservice_custombuild.sh'...
3:35:24 PM node-deploy-speed-test: custombuild started
3:35:24 PM node-deploy-speed-test: current working dir: /tmp/8db251f5c423ad5
3:35:27 PM node-deploy-speed-test: Using cached node_modules, skipping npm install
3:35:30 PM node-deploy-speed-test: > next-app-sample-ts@0.1.0 build
3:35:30 PM node-deploy-speed-test: > next build
3:35:34 PM node-deploy-speed-test: Attention: Next.js now collects completely anonymous telemetry regarding usage.
3:35:35 PM node-deploy-speed-test: This information is used to shape Next.js' roadmap and prioritize features.
3:35:35 PM node-deploy-speed-test: You can learn more, including how to opt-out if you'd not like to participate in this anonymous program, by visiting the following URL:
3:35:35 PM node-deploy-speed-test: https://nextjs.org/telemetry
3:35:35 PM node-deploy-speed-test: info  - Linting and checking validity of types...
3:36:33 PM node-deploy-speed-test: info  - Creating an optimized production build...
3:37:01 PM node-deploy-speed-test: info  - Compiled successfully
3:37:01 PM node-deploy-speed-test: info  - Collecting page data...
3:37:46 PM node-deploy-speed-test: info  - Generating static pages (0/3)
3:37:47 PM node-deploy-speed-test: info  - Generating static pages (3/3)
3:37:47 PM node-deploy-speed-test: info  - Finalizing page optimization...
3:37:47 PM node-deploy-speed-test: Route (pages)                              Size     First Load JS
3:37:47 PM node-deploy-speed-test: ┌ ○ / (391 ms)                             4.6 kB         77.9 kB
3:37:47 PM node-deploy-speed-test: ├   └ css/50901216b76e581e.css             1.87 kB
3:37:47 PM node-deploy-speed-test: ├   /_app                                  0 B            73.3 kB
3:37:47 PM node-deploy-speed-test: ├ ○ /404                                   182 B          73.4 kB
3:37:47 PM node-deploy-speed-test: └ λ /api/hello                             0 B            73.3 kB
3:37:47 PM node-deploy-speed-test: + First Load JS shared by all              74 kB
3:37:47 PM node-deploy-speed-test:   ├ chunks/framework-2c79e2a64abdb08b.js   45.2 kB
3:37:47 PM node-deploy-speed-test:   ├ chunks/main-0ecb9ccfcb6c9b24.js        27 kB
3:37:47 PM node-deploy-speed-test:   ├ chunks/pages/_app-ae907860a06fe57a.js  296 B
3:37:47 PM node-deploy-speed-test:   ├ chunks/webpack-8fa1640cc84ba8fe.js     750 B
3:37:47 PM node-deploy-speed-test:   └ css/876d048b5dab7c28.css               706 B
3:37:47 PM node-deploy-speed-test: λ  (Server)  server-side renders at runtime (uses getInitialProps or getServerSideProps)
3:37:47 PM node-deploy-speed-test: ○  (Static)  automatically rendered as static HTML (uses no initial props)
3:37:48 PM node-deploy-speed-test: Remove node_modules
3:37:53 PM node-deploy-speed-test: package-lock.json hash: 2ada1c245c4a3cb78f887bfdcea8aa6f
3:37:56 PM node-deploy-speed-test: custombuild end
3:37:56 PM node-deploy-speed-test: Executing post-build command...
3:37:56 PM node-deploy-speed-test: postbuild started
3:37:56 PM node-deploy-speed-test: current working dir: /tmp/8db251f5c423ad5
3:37:58 PM node-deploy-speed-test: package-lock.json hash: 2ada1c245c4a3cb78f887bfdcea8aa6f
3:37:59 PM node-deploy-speed-test: /home/site/deploy_cache/node_modules-2ada1c245c4a3cb78f887bfdcea8aa6f-nodev18.14.0-npm9.3.1.tar.gz already exists
3:37:59 PM node-deploy-speed-test: postbuild end
3:37:59 PM node-deploy-speed-test: Finished executing post-build command.
3:38:00 PM node-deploy-speed-test: Preparing output...
3:38:00 PM node-deploy-speed-test: Copying files to destination directory '/home/site/wwwroot'...
3:38:01 PM node-deploy-speed-test: Done in 3 sec(s).
3:38:01 PM node-deploy-speed-test: Removing existing manifest file
3:38:01 PM node-deploy-speed-test: Creating a manifest file...
3:38:01 PM node-deploy-speed-test: Manifest file created.
3:38:01 PM node-deploy-speed-test: Copying .ostype to manifest output directory.
3:38:01 PM node-deploy-speed-test: Done in 191 sec(s).
3:38:03 PM node-deploy-speed-test: Running post deployment command(s)...
3:38:03 PM node-deploy-speed-test: Generating summary of Oryx build
3:38:04 PM node-deploy-speed-test: Parsing the build logs
3:38:04 PM node-deploy-speed-test: Found 0 issue(s)
3:38:04 PM node-deploy-speed-test: Build Summary :
3:38:04 PM node-deploy-speed-test: ===============
3:38:05 PM node-deploy-speed-test: Errors (0)
3:38:05 PM node-deploy-speed-test: Warnings (0)
3:38:05 PM node-deploy-speed-test: Triggering recycle (preview mode disabled).
3:38:06 PM node-deploy-speed-test: Deployment successful. deployer = ms-azuretools-vscode deploymentPath = ZipDeploy. Extract zip.
3:38:14 PM: Deployment to "node-deploy-speed-test" completed.

ローカルビルドを利用する場合のTips

GitHub Actions を利用する場合のTips

★別記事で★

おまけ 1 RunFromPackageの利用

★別記事で★

おまけ 2

餅は餅屋ということで。。。Vercel強い
image.png

0
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?