[{"data":1,"prerenderedAt":1741},["ShallowReactive",2],{"article-github-actions-node-js":3},{"id":4,"title":5,"body":6,"category":1727,"createdAt":1729,"description":1730,"extension":1731,"index":1732,"meta":1733,"navigation":97,"path":1734,"publish":97,"seo":1735,"series":1732,"seriesTitle":1732,"stem":1736,"tag":1737,"thumbnail":1732,"updatedAt":1729,"__hash__":1740},"articles\u002Farticles\u002Fgithub-actions-node-js.md","Github Actionsを用いてVueファイルをビルド・rsyncで本番環境にデプロイする。",{"type":7,"value":8,"toc":1706},"minimark",[9,13,16,19,22,31,36,48,51,62,65,68,336,339,343,346,349,352,358,361,364,367,389,395,410,426,429,432,439,448,453,456,471,477,483,489,495,501,507,510,516,522,525,786,792,794,802,805,808,837,851,954,968,997,1000,1046,1053,1056,1063,1070,1105,1108,1147,1151,1154,1285,1296,1303,1333,1350,1395,1409,1420,1424,1427,1497,1500,1507,1511,1517,1584,1589,1599,1650,1660,1667,1670,1677,1681,1684,1687,1690,1693,1696,1699,1702],[10,11,12],"p",{},"こんにちはjunです。皆さんはVueやReact、Nuxtなどなどフロントエンドフレームワークやライブラリを使っていますでしょうか？これらのライブラリはフロントの構築が楽になりますが、一度Node.jsを用いてビルドする必要があります。そしてビルドしたファイルを読み込ませることで動作します。",[10,14,15],{},"ローカルの環境ではNode.jsがあるので問題ないですが、デプロイする本番環境になくて困ったということはありませんでしょうか？サーバー要件などで本番環境にNode.jsを入れられない、無い場合は予めどこかでビルドして転送する必要があります。",[10,17,18],{},"一番手っ取り早いのはローカルでビルドしてFTPなりrsyncすることです。しかし何人もプロジェクトに関わっていたり、属人化したり、環境が統一されていないなど色々とデメリットがあります。",[10,20,21],{},"私はLaravel+Nuxt.jsなプロジェクトを開発し、Xserver（レンタルサーバー）に配置したことがあります。Laravelのアセットファイルと、Nuxt.jsはNode.jsでビルドする必要がありますが、レンタルサーバー にはNode.jsがありません。（Xserverには気合で入れらるらしいですが、、パフォーマンスなどの都合でやめました。）",[10,23,24,25,30],{},"そこで前から気になっていたGithub Actionsを用いてGithub上でビルドを行い、本番環境でrsyncすることでなんとかアセットファイル系がデプロイできました。今回はこの方法について解説します。前提やGithub Actionsの説明から行いますで、さっさと内部コードを知りたい方は「",[26,27,29],"a",{"href":28},"#%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E6%9B%B8%E3%81%84%E3%81%A6%E3%81%84%E3%81%8F","ワークフローを書いていく","」へ移動してください。",[32,33,35],"h2",{"id":34},"github-actionsとは","Github Actionsとは",[37,38,39],"blockquote",{},[10,40,41,42,47],{},"GitHub Actionsを使用すると、ワールドクラスのCI \u002F CDですべてのソフトウェアワークフローを簡単に自動化できます。 GitHubから直接コードをビルド、テスト、デプロイでき、コードレビュー、ブランチ管理、問題のトリアージを希望どおりに機能させます。(",[26,43,44],{"href":44,"rel":45},"https:\u002F\u002Fgithub.co.jp\u002Ffeatures\u002Factions",[46],"nofollow",")",[10,49,50],{},"Github ActionsはGithubでビルド、テスト、デプロイ作業ができる環境です。Github上のコードを用いてすぐにビルドなどができます。例えばLaravelのVueファイルをビルドする際にはLaravelのプロジェクトルートで",[52,53,58],"pre",{"className":54,"code":56,"language":57},[55],"language-text","npm run prod\n","text",[59,60,56],"code",{"__ignoreMap":61},"",[10,63,64],{},"とnode.jsのコマンドを打って、node.jsを動かしてビルドファイルを作成します。そしてビルド後にはcss,jsディレクトリが作成されます。このビルド操作をGithubの環境でも行えるようにします。",[10,66,67],{},"以下のようなymlファイルをGithub上で作成して、ビルド・やりたいコマンドを記述します。",[52,69,73],{"className":70,"code":71,"language":72,"meta":61,"style":61},"language-yml shiki shiki-themes material-theme-ocean","name: Deploy\n\non: [ workflow_dispatch ]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n    \n    steps:\n    - uses: actions\u002Fcheckout@v2\n      with:\n        ref: release\n    - uses: actions\u002Fsetup-node@v2\n      with:\n        node-version: '14'\n        cache: 'npm'\n     - name: public build\n      run: |\n        npm install\n        npm run prod\n        rsync -av --delete \\\n        .\u002Fpublic\u002Fcss .\u002Fpublic\u002Fjs .\u002Fpublic\u002Fimages \\\n        deploy:$LARAVEL_PATH\u002Fpublic\u002F\n        scp .\u002Fpublic\u002Fmix-manifest.json deploy:$LARAVEL_PATH\u002Fpublic\u002Fmix-manifest.json\n      env:\n        LARAVEL_PATH : ${{ secrets.LARAVEL_PATH }}\n","yml",[59,74,75,92,99,117,122,131,139,144,155,162,170,184,192,203,215,222,239,254,268,280,286,292,298,304,310,316,324],{"__ignoreMap":61},[76,77,80,84,88],"span",{"class":78,"line":79},"line",1,[76,81,83],{"class":82},"s-wAU","name",[76,85,87],{"class":86},"sAklC",":",[76,89,91],{"class":90},"sfyAc"," Deploy\n",[76,93,95],{"class":78,"line":94},2,[76,96,98],{"emptyLinePlaceholder":97},true,"\n",[76,100,102,106,108,111,114],{"class":78,"line":101},3,[76,103,105],{"class":104},"sbqyR","on",[76,107,87],{"class":86},[76,109,110],{"class":86}," [",[76,112,113],{"class":90}," workflow_dispatch",[76,115,116],{"class":86}," ]\n",[76,118,120],{"class":78,"line":119},4,[76,121,98],{"emptyLinePlaceholder":97},[76,123,125,128],{"class":78,"line":124},5,[76,126,127],{"class":82},"jobs",[76,129,130],{"class":86},":\n",[76,132,134,137],{"class":78,"line":133},6,[76,135,136],{"class":82},"  build",[76,138,130],{"class":86},[76,140,142],{"class":78,"line":141},7,[76,143,98],{"emptyLinePlaceholder":97},[76,145,147,150,152],{"class":78,"line":146},8,[76,148,149],{"class":82},"    runs-on",[76,151,87],{"class":86},[76,153,154],{"class":90}," ubuntu-latest\n",[76,156,158],{"class":78,"line":157},9,[76,159,161],{"class":160},"s0W1g","    \n",[76,163,165,168],{"class":78,"line":164},10,[76,166,167],{"class":82},"    steps",[76,169,130],{"class":86},[76,171,173,176,179,181],{"class":78,"line":172},11,[76,174,175],{"class":86},"    -",[76,177,178],{"class":82}," uses",[76,180,87],{"class":86},[76,182,183],{"class":90}," actions\u002Fcheckout@v2\n",[76,185,187,190],{"class":78,"line":186},12,[76,188,189],{"class":82},"      with",[76,191,130],{"class":86},[76,193,195,198,200],{"class":78,"line":194},13,[76,196,197],{"class":82},"        ref",[76,199,87],{"class":86},[76,201,202],{"class":90}," release\n",[76,204,206,208,210,212],{"class":78,"line":205},14,[76,207,175],{"class":86},[76,209,178],{"class":82},[76,211,87],{"class":86},[76,213,214],{"class":90}," actions\u002Fsetup-node@v2\n",[76,216,218,220],{"class":78,"line":217},15,[76,219,189],{"class":82},[76,221,130],{"class":86},[76,223,225,228,230,233,236],{"class":78,"line":224},16,[76,226,227],{"class":82},"        node-version",[76,229,87],{"class":86},[76,231,232],{"class":86}," '",[76,234,235],{"class":90},"14",[76,237,238],{"class":86},"'\n",[76,240,242,245,247,249,252],{"class":78,"line":241},17,[76,243,244],{"class":82},"        cache",[76,246,87],{"class":86},[76,248,232],{"class":86},[76,250,251],{"class":90},"npm",[76,253,238],{"class":86},[76,255,257,260,263,265],{"class":78,"line":256},18,[76,258,259],{"class":86},"     -",[76,261,262],{"class":82}," name",[76,264,87],{"class":86},[76,266,267],{"class":90}," public build\n",[76,269,271,274,276],{"class":78,"line":270},19,[76,272,273],{"class":82},"      run",[76,275,87],{"class":86},[76,277,279],{"class":278},"s6cf3"," |\n",[76,281,283],{"class":78,"line":282},20,[76,284,285],{"class":90},"        npm install\n",[76,287,289],{"class":78,"line":288},21,[76,290,291],{"class":90},"        npm run prod\n",[76,293,295],{"class":78,"line":294},22,[76,296,297],{"class":90},"        rsync -av --delete \\\n",[76,299,301],{"class":78,"line":300},23,[76,302,303],{"class":90},"        .\u002Fpublic\u002Fcss .\u002Fpublic\u002Fjs .\u002Fpublic\u002Fimages \\\n",[76,305,307],{"class":78,"line":306},24,[76,308,309],{"class":90},"        deploy:$LARAVEL_PATH\u002Fpublic\u002F\n",[76,311,313],{"class":78,"line":312},25,[76,314,315],{"class":90},"        scp .\u002Fpublic\u002Fmix-manifest.json deploy:$LARAVEL_PATH\u002Fpublic\u002Fmix-manifest.json\n",[76,317,319,322],{"class":78,"line":318},26,[76,320,321],{"class":82},"      env",[76,323,130],{"class":86},[76,325,327,330,333],{"class":78,"line":326},27,[76,328,329],{"class":82},"        LARAVEL_PATH",[76,331,332],{"class":86}," :",[76,334,335],{"class":90}," ${{ secrets.LARAVEL_PATH }}\n",[10,337,338],{},"Dokcerファイルやバッチファイルと似た感じです。Node.jsの環境などはGithubが用意してくれます。",[340,341,342],"h3",{"id":342},"使える言語など",[10,344,345],{},"結構なんでもいけます。Node.jsはしかり、PHP\u002FPython\u002FRuby\u002FJava\u002FPower Shellなど色々あります。",[340,347,348],{"id":348},"料金",[10,350,351],{},"パブリックリポジトリの場合は何分使おうが無料です。しかしプライベートの場合は無料枠があり、フリーは毎月2000分までとなっています。(2022年1月時点)",[10,353,354,355],{},"参照：",[26,356,44],{"href":44,"rel":357},[46],[10,359,360],{},"私のプロジェクトの場合、大体3分ぐらいで終わりますし、頻繁にビルドしないので基本無料で使えそうです。",[32,362,363],{"id":363},"全体処理の概要とビルド対象",[10,365,366],{},"今回ビルドするプロジェクトはLaravelとNuxtが連携されたプロジェクトです。",[368,369,370,382],"ul",{},[371,372,373,374,377,378,381],"li",{},"Laravelのresources配下に作ったsassとVueファイル。公開ディレクトリの",[59,375,376],{},"css\u002F",",",[59,379,380],{},"js\u002F","に吐き出される",[371,383,384,385,388],{},"Nuxtの静的書き出しファイル。",[59,386,387],{},"dist\u002F","というディレクトリが生成される。",[52,390,393],{"className":391,"code":392,"language":57},[55],".\n├── README.md\n├── app\n├── artisan\n├── bootstrap\n├── composer.json\n├── composer.lock\n├── config\n├── database\n├── nuxt # nuxtはここ\n├── package-lock.json\n├── package.json\n├── phpunit.xml\n├── public # ここにLaravelのcss,jsが吐き出される\n├── resources\n├── routes\n├── server.php\n├── storage\n├── tests\n├── tinker_test.php\n└── webpack.mix.js\n",[59,394,392],{"__ignoreMap":61},[10,396,397,398,401,402,405,406,409],{},"まあとりあえず、Laravelルートで",[59,399,400],{},"npm run prod","そして、",[59,403,404],{},"nuxt\u002F","にて",[59,407,408],{},"npm run generate","してnode.jsを動かす必要があります。",[10,411,412,413,377,415,377,417,377,420,377,423,425],{},"そして生成されてた",[59,414,376],{},[59,416,380],{},[59,418,419],{},"images\u002F",[59,421,422],{},"mix-manifest.json",[59,424,387],{},"ディレクトリ・ファイルを本番サーバーに転送します。",[10,427,428],{},"転送の際にはrsyncを使用し、SSHの鍵認証で接続します。またこのアクションは手動で行うようにします。一応、masterブランチにプッシュされた時に自動で実行なんてこともできます。ただし今回はビルドする環境が欲しいだけなので、処理の実行は手動で行います。以上がActionの概要です。",[32,430,431],{"id":431},"環境変数を定義しておく",[10,433,434,435,438],{},"まずSSHやビルドで使用する",[59,436,437],{},".env","など環境変数を定義しておきます。Github Actionsでも環境変数を定義できます。",[10,440,441,442,447],{},"リポジトリのSettingsから",[26,443,446],{"href":444,"rel":445},"https:\u002F\u002Fgithub.com\u002Fmedia-ch\u002Fsetagaya_foodshare\u002Fsettings\u002Fsecrets\u002Factions",[46],"Secrets","の画面で定義できます。",[449,450],"image-render",{":src":451,":width":452},"'github-actions-node-js\u002Fsecrets-setting.png'","'100%'",[10,454,455],{},"「New repository secret」をクリックしてキー名と値を入力します。",[10,457,458,462,463,466,467,470],{},[459,460,461],"strong",{},"SSH_KEY","：SSHに使用する鍵ファイルの中身です。",[59,464,465],{},".pem","、",[59,468,469],{},".key","などを開いて記述された文字をすべてコピペしてください。",[10,472,473,476],{},[459,474,475],{},"SSH_HOST","：接続先のホスト名です。",[10,478,479,482],{},[459,480,481],{},"SSH_PORT","：接続先のポートです。",[10,484,485,488],{},[459,486,487],{},"SSH_USER","：接続先のユーザーです。",[10,490,491,494],{},[459,492,493],{},"LARAEL_PATH","：本番サーバーでのLaravelが置かれている絶対パスです。",[10,496,497,500],{},[459,498,499],{},"GOOGLE_MAP_API_KEY","：NuxtでGoogleMapのAPI（フロントに出してもOKなやつ）を使っているので定義。あとで使います。",[10,502,503,504,506],{},"以上のSSHに関連する値と、",[59,505,437],{},"の記述で必要であれば書いておきます。それではアクションの内容を書いていきましょう。",[32,508,509],{"id":509},"ワークフローを作成しテンプレートを選択する",[10,511,512,513],{},"メニューの「Actions」をクリックしたのち、「New Workflow」をクリックします。\n",[449,514],{":src":515},"'github-actions-node-js\u002Fmenu.png'",[10,517,518,519],{},"するとworkflowを選択する画面にて、テンプレートをいくつか用意してくれています。\n",[449,520],{":src":521},"'github-actions-node-js\u002Fworkflows.png'",[10,523,524],{},"今回はNode.jsのビルドしかないので「Node.js」を選択します。するとある程度の記述が書かれた状態で、yamlが表示されます。",[52,526,530],{"className":527,"code":528,"language":529,"meta":61,"style":61},"language-yaml shiki shiki-themes material-theme-ocean","# This workflow will do a clean installation of node dependencies, cache\u002Frestore them, build the source code and run tests across different versions of node\n# For more information see: https:\u002F\u002Fhelp.github.com\u002Factions\u002Flanguage-and-framework-guides\u002Fusing-nodejs-with-github-actions\n\nname: Node.js CI\n\non:\n  push:\n    branches: [ master ]\n  pull_request:\n    branches: [ master ]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        node-version: [12.x, 14.x, 16.x]\n        # See supported Node.js release schedule at https:\u002F\u002Fnodejs.org\u002Fen\u002Fabout\u002Freleases\u002F\n\n    steps:\n    - uses: actions\u002Fcheckout@v2\n    - name: Use Node.js ${{ matrix.node-version }}\n      uses: actions\u002Fsetup-node@v2\n      with:\n        node-version: ${{ matrix.node-version }}\n        cache: 'npm'\n    - run: npm ci\n    - run: npm run build --if-present\n    - run: npm test\n","yaml",[59,531,532,538,543,547,556,560,566,573,587,594,606,610,616,622,626,634,638,645,652,676,681,685,691,701,712,721,727,736,749,762,774],{"__ignoreMap":61},[76,533,534],{"class":78,"line":79},[76,535,537],{"class":536},"sC9rS","# This workflow will do a clean installation of node dependencies, cache\u002Frestore them, build the source code and run tests across different versions of node\n",[76,539,540],{"class":78,"line":94},[76,541,542],{"class":536},"# For more information see: https:\u002F\u002Fhelp.github.com\u002Factions\u002Flanguage-and-framework-guides\u002Fusing-nodejs-with-github-actions\n",[76,544,545],{"class":78,"line":101},[76,546,98],{"emptyLinePlaceholder":97},[76,548,549,551,553],{"class":78,"line":119},[76,550,83],{"class":82},[76,552,87],{"class":86},[76,554,555],{"class":90}," Node.js CI\n",[76,557,558],{"class":78,"line":124},[76,559,98],{"emptyLinePlaceholder":97},[76,561,562,564],{"class":78,"line":133},[76,563,105],{"class":104},[76,565,130],{"class":86},[76,567,568,571],{"class":78,"line":141},[76,569,570],{"class":82},"  push",[76,572,130],{"class":86},[76,574,575,578,580,582,585],{"class":78,"line":146},[76,576,577],{"class":82},"    branches",[76,579,87],{"class":86},[76,581,110],{"class":86},[76,583,584],{"class":90}," master",[76,586,116],{"class":86},[76,588,589,592],{"class":78,"line":157},[76,590,591],{"class":82},"  pull_request",[76,593,130],{"class":86},[76,595,596,598,600,602,604],{"class":78,"line":164},[76,597,577],{"class":82},[76,599,87],{"class":86},[76,601,110],{"class":86},[76,603,584],{"class":90},[76,605,116],{"class":86},[76,607,608],{"class":78,"line":172},[76,609,98],{"emptyLinePlaceholder":97},[76,611,612,614],{"class":78,"line":186},[76,613,127],{"class":82},[76,615,130],{"class":86},[76,617,618,620],{"class":78,"line":194},[76,619,136],{"class":82},[76,621,130],{"class":86},[76,623,624],{"class":78,"line":205},[76,625,98],{"emptyLinePlaceholder":97},[76,627,628,630,632],{"class":78,"line":217},[76,629,149],{"class":82},[76,631,87],{"class":86},[76,633,154],{"class":90},[76,635,636],{"class":78,"line":224},[76,637,98],{"emptyLinePlaceholder":97},[76,639,640,643],{"class":78,"line":241},[76,641,642],{"class":82},"    strategy",[76,644,130],{"class":86},[76,646,647,650],{"class":78,"line":256},[76,648,649],{"class":82},"      matrix",[76,651,130],{"class":86},[76,653,654,656,658,660,663,665,668,670,673],{"class":78,"line":270},[76,655,227],{"class":82},[76,657,87],{"class":86},[76,659,110],{"class":86},[76,661,662],{"class":90},"12.x",[76,664,377],{"class":86},[76,666,667],{"class":90}," 14.x",[76,669,377],{"class":86},[76,671,672],{"class":90}," 16.x",[76,674,675],{"class":86},"]\n",[76,677,678],{"class":78,"line":282},[76,679,680],{"class":536},"        # See supported Node.js release schedule at https:\u002F\u002Fnodejs.org\u002Fen\u002Fabout\u002Freleases\u002F\n",[76,682,683],{"class":78,"line":288},[76,684,98],{"emptyLinePlaceholder":97},[76,686,687,689],{"class":78,"line":294},[76,688,167],{"class":82},[76,690,130],{"class":86},[76,692,693,695,697,699],{"class":78,"line":300},[76,694,175],{"class":86},[76,696,178],{"class":82},[76,698,87],{"class":86},[76,700,183],{"class":90},[76,702,703,705,707,709],{"class":78,"line":306},[76,704,175],{"class":86},[76,706,262],{"class":82},[76,708,87],{"class":86},[76,710,711],{"class":90}," Use Node.js ${{ matrix.node-version }}\n",[76,713,714,717,719],{"class":78,"line":312},[76,715,716],{"class":82},"      uses",[76,718,87],{"class":86},[76,720,214],{"class":90},[76,722,723,725],{"class":78,"line":318},[76,724,189],{"class":82},[76,726,130],{"class":86},[76,728,729,731,733],{"class":78,"line":326},[76,730,227],{"class":82},[76,732,87],{"class":86},[76,734,735],{"class":90}," ${{ matrix.node-version }}\n",[76,737,739,741,743,745,747],{"class":78,"line":738},28,[76,740,244],{"class":82},[76,742,87],{"class":86},[76,744,232],{"class":86},[76,746,251],{"class":90},[76,748,238],{"class":86},[76,750,752,754,757,759],{"class":78,"line":751},29,[76,753,175],{"class":86},[76,755,756],{"class":82}," run",[76,758,87],{"class":86},[76,760,761],{"class":90}," npm ci\n",[76,763,765,767,769,771],{"class":78,"line":764},30,[76,766,175],{"class":86},[76,768,756],{"class":82},[76,770,87],{"class":86},[76,772,773],{"class":90}," npm run build --if-present\n",[76,775,777,779,781,783],{"class":78,"line":776},31,[76,778,175],{"class":86},[76,780,756],{"class":82},[76,782,87],{"class":86},[76,784,785],{"class":90}," npm test\n",[10,787,788,789,791],{},"最初は上記の構成となっています。",[59,790,83],{},"はワークフローの名前になります。わかりやすいものに変えておきましょう。",[32,793,29],{"id":29},[10,795,796,797],{},"まず最初にLaravelのアセットファイルを作成してrsyncするとこまで記述します。なお登場する記述に関してはこちらの公式ドキュメントを参考にしてください。",[26,798,801],{"href":799,"rel":800},"https:\u002F\u002Fdocs.github.com\u002Fja\u002Factions\u002Fusing-workflows\u002Fworkflow-syntax-for-github-actions",[46],"ワークフロー構文",[340,803,804],{"id":804},"実行条件などの変更",[10,806,807],{},"最初は実行条件などを変更します。",[52,809,811],{"className":527,"code":810,"language":529,"meta":61,"style":61},"name: Deploy\n\non: [ workflow_dispatch ]\n",[59,812,813,821,825],{"__ignoreMap":61},[76,814,815,817,819],{"class":78,"line":79},[76,816,83],{"class":82},[76,818,87],{"class":86},[76,820,91],{"class":90},[76,822,823],{"class":78,"line":94},[76,824,98],{"emptyLinePlaceholder":97},[76,826,827,829,831,833,835],{"class":78,"line":101},[76,828,105],{"class":104},[76,830,87],{"class":86},[76,832,110],{"class":86},[76,834,113],{"class":90},[76,836,116],{"class":86},[10,838,839,842,843,846,847,850],{},[59,840,841],{},"on:","はこのワークフローの実行条件です。デフォルトでは",[59,844,845],{},"master","ブランチにpushされることが条件ですが、ここでは",[59,848,849],{},"workflow_dispatch","として、手動で実行できるようにします。",[52,852,854],{"className":527,"code":853,"language":529,"meta":61,"style":61},"jobs:\n  build:\n\n    runs-on: ubuntu-latest\n    \n    steps:\n    - uses: actions\u002Fcheckout@v2\n      with:\n        ref: release\n    - uses: actions\u002Fsetup-node@v2\n      with:\n        node-version: '14'\n        cache: 'npm'\n",[59,855,856,862,868,872,880,884,890,900,906,914,924,930,942],{"__ignoreMap":61},[76,857,858,860],{"class":78,"line":79},[76,859,127],{"class":82},[76,861,130],{"class":86},[76,863,864,866],{"class":78,"line":94},[76,865,136],{"class":82},[76,867,130],{"class":86},[76,869,870],{"class":78,"line":101},[76,871,98],{"emptyLinePlaceholder":97},[76,873,874,876,878],{"class":78,"line":119},[76,875,149],{"class":82},[76,877,87],{"class":86},[76,879,154],{"class":90},[76,881,882],{"class":78,"line":124},[76,883,161],{"class":160},[76,885,886,888],{"class":78,"line":133},[76,887,167],{"class":82},[76,889,130],{"class":86},[76,891,892,894,896,898],{"class":78,"line":141},[76,893,175],{"class":86},[76,895,178],{"class":82},[76,897,87],{"class":86},[76,899,183],{"class":90},[76,901,902,904],{"class":78,"line":146},[76,903,189],{"class":82},[76,905,130],{"class":86},[76,907,908,910,912],{"class":78,"line":157},[76,909,197],{"class":82},[76,911,87],{"class":86},[76,913,202],{"class":90},[76,915,916,918,920,922],{"class":78,"line":164},[76,917,175],{"class":86},[76,919,178],{"class":82},[76,921,87],{"class":86},[76,923,214],{"class":90},[76,925,926,928],{"class":78,"line":172},[76,927,189],{"class":82},[76,929,130],{"class":86},[76,931,932,934,936,938,940],{"class":78,"line":186},[76,933,227],{"class":82},[76,935,87],{"class":86},[76,937,232],{"class":86},[76,939,235],{"class":90},[76,941,238],{"class":86},[76,943,944,946,948,950,952],{"class":78,"line":194},[76,945,244],{"class":82},[76,947,87],{"class":86},[76,949,232],{"class":86},[76,951,251],{"class":90},[76,953,238],{"class":86},[10,955,956,957,960,961,963,964,967],{},"このリポジトリの場合、本番環境は常に",[59,958,959],{},"release","ブランチをプルするのでビルド対象ファイルも",[59,962,959],{},"のものを使用します。そのため",[59,965,966],{},"- uses: actions\u002Fcheckout@v2","というブランチのチェックアウトが処理を行う記述をします。",[52,969,971],{"className":527,"code":970,"language":529,"meta":61,"style":61},"    - uses: actions\u002Fcheckout@v2\n      with:\n        ref: release\n",[59,972,973,983,989],{"__ignoreMap":61},[76,974,975,977,979,981],{"class":78,"line":79},[76,976,175],{"class":86},[76,978,178],{"class":82},[76,980,87],{"class":86},[76,982,183],{"class":90},[76,984,985,987],{"class":78,"line":94},[76,986,189],{"class":82},[76,988,130],{"class":86},[76,990,991,993,995],{"class":78,"line":101},[76,992,197],{"class":82},[76,994,87],{"class":86},[76,996,202],{"class":90},[10,998,999],{},"これでリリースブランチにチェックアウトしてビルドできるようになります。",[52,1001,1003],{"className":527,"code":1002,"language":529,"meta":61,"style":61},"- uses: actions\u002Fsetup-node@v2\n      with:\n        node-version: '14'\n        cache: 'npm'\n",[59,1004,1005,1016,1022,1034],{"__ignoreMap":61},[76,1006,1007,1010,1012,1014],{"class":78,"line":79},[76,1008,1009],{"class":86},"-",[76,1011,178],{"class":82},[76,1013,87],{"class":86},[76,1015,214],{"class":90},[76,1017,1018,1020],{"class":78,"line":94},[76,1019,189],{"class":82},[76,1021,130],{"class":86},[76,1023,1024,1026,1028,1030,1032],{"class":78,"line":101},[76,1025,227],{"class":82},[76,1027,87],{"class":86},[76,1029,232],{"class":86},[76,1031,235],{"class":90},[76,1033,238],{"class":86},[76,1035,1036,1038,1040,1042,1044],{"class":78,"line":119},[76,1037,244],{"class":82},[76,1039,87],{"class":86},[76,1041,232],{"class":86},[76,1043,251],{"class":90},[76,1045,238],{"class":86},[10,1047,1048,1049,1052],{},"これでNode.js14の環境を使用できるようになり、npmコマンドも使用できるようになります。それでは",[59,1050,1051],{},"step:","配下に実行するコマンドを書いていきましょう。",[340,1054,1055],{"id":1055},"実行コードの書き方",[10,1057,1058,1059,1062],{},"実行コードは",[59,1060,1061],{},"name:","を用いて区分けできます。長いと何がなんだか分からなくなるので、書いておくといいです。",[10,1064,1065,1066,1069],{},"そして実行内容は",[59,1067,1068],{},"run:","に記述します。",[52,1071,1073],{"className":527,"code":1072,"language":529,"meta":61,"style":61},"    - run: npm ci\n    - run: npm run build --if-present\n    - run: npm test\n",[59,1074,1075,1085,1095],{"__ignoreMap":61},[76,1076,1077,1079,1081,1083],{"class":78,"line":79},[76,1078,175],{"class":86},[76,1080,756],{"class":82},[76,1082,87],{"class":86},[76,1084,761],{"class":90},[76,1086,1087,1089,1091,1093],{"class":78,"line":94},[76,1088,175],{"class":86},[76,1090,756],{"class":82},[76,1092,87],{"class":86},[76,1094,773],{"class":90},[76,1096,1097,1099,1101,1103],{"class":78,"line":101},[76,1098,175],{"class":86},[76,1100,756],{"class":82},[76,1102,87],{"class":86},[76,1104,785],{"class":90},[10,1106,1107],{},"のように１つづつ書いてもいいですが、ここでは以下のようにまとめて書くことにします。",[52,1109,1111],{"className":527,"code":1110,"language":529,"meta":61,"style":61},"    - name: ssh key generate\n      run: |\n        echo \"$SSH_KEY\" > id_rsa\n        mkdir ~\u002F.ssh\n        chmod 700 ~\u002F.ssh\n",[59,1112,1113,1124,1132,1137,1142],{"__ignoreMap":61},[76,1114,1115,1117,1119,1121],{"class":78,"line":79},[76,1116,175],{"class":86},[76,1118,262],{"class":82},[76,1120,87],{"class":86},[76,1122,1123],{"class":90}," ssh key generate\n",[76,1125,1126,1128,1130],{"class":78,"line":94},[76,1127,273],{"class":82},[76,1129,87],{"class":86},[76,1131,279],{"class":278},[76,1133,1134],{"class":78,"line":101},[76,1135,1136],{"class":90},"        echo \"$SSH_KEY\" > id_rsa\n",[76,1138,1139],{"class":78,"line":119},[76,1140,1141],{"class":90},"        mkdir ~\u002F.ssh\n",[76,1143,1144],{"class":78,"line":124},[76,1145,1146],{"class":90},"        chmod 700 ~\u002F.ssh\n",[340,1148,1150],{"id":1149},"sshの設定","SSHの設定",[10,1152,1153],{},"そんでは最初にSSHの設定を行います。毎回、鍵のパスとかを記述するのは面倒なのでSSHのconfigファイルを作ってエイリアスで呼べるようにしましょう。",[52,1155,1157],{"className":527,"code":1156,"language":529,"meta":61,"style":61},"    - name: ssh key generate\n      run: |\n        echo \"$SSH_KEY\" > id_rsa\n        mkdir ~\u002F.ssh\n        chmod 700 ~\u002F.ssh\n        mv id_rsa ~\u002F.ssh\u002F\n        chmod 600 ~\u002F.ssh\u002Fid_rsa\n        echo \"HOST deploy\" >> ~\u002F.ssh\u002Fconfig\n        echo \"HostName $SSH_HOST\" >> ~\u002F.ssh\u002Fconfig\n        echo \"user $SSH_USER\" >> ~\u002F.ssh\u002Fconfig\n        echo \"Port $SSH_PORT\" >> ~\u002F.ssh\u002Fconfig\n        echo \"IdentityFile $HOME\u002F.ssh\u002Fid_rsa\" >> ~\u002F.ssh\u002Fconfig\n        echo \"StrictHostKeyChecking no\" >> ~\u002F.ssh\u002Fconfig\n        echo \"UserKnownHostsFile=\u002Fdev\u002Fnull\" >> ~\u002F.ssh\u002Fconfig\n        chmod 644 ~\u002F.ssh\u002Fconfig\n      env:\n        SSH_KEY: ${{ secrets.SSH_KEY }}\n        SSH_HOST: ${{ secrets.SSH_HOST }}\n        SSH_USER: ${{ secrets.SSH_USER }}\n        SSH_PORT: ${{ secrets.SSH_PORT }}\n",[59,1158,1159,1169,1177,1181,1185,1189,1194,1199,1204,1209,1214,1219,1224,1229,1234,1239,1245,1255,1265,1275],{"__ignoreMap":61},[76,1160,1161,1163,1165,1167],{"class":78,"line":79},[76,1162,175],{"class":86},[76,1164,262],{"class":82},[76,1166,87],{"class":86},[76,1168,1123],{"class":90},[76,1170,1171,1173,1175],{"class":78,"line":94},[76,1172,273],{"class":82},[76,1174,87],{"class":86},[76,1176,279],{"class":278},[76,1178,1179],{"class":78,"line":101},[76,1180,1136],{"class":90},[76,1182,1183],{"class":78,"line":119},[76,1184,1141],{"class":90},[76,1186,1187],{"class":78,"line":124},[76,1188,1146],{"class":90},[76,1190,1191],{"class":78,"line":133},[76,1192,1193],{"class":90},"        mv id_rsa ~\u002F.ssh\u002F\n",[76,1195,1196],{"class":78,"line":141},[76,1197,1198],{"class":90},"        chmod 600 ~\u002F.ssh\u002Fid_rsa\n",[76,1200,1201],{"class":78,"line":146},[76,1202,1203],{"class":90},"        echo \"HOST deploy\" >> ~\u002F.ssh\u002Fconfig\n",[76,1205,1206],{"class":78,"line":157},[76,1207,1208],{"class":90},"        echo \"HostName $SSH_HOST\" >> ~\u002F.ssh\u002Fconfig\n",[76,1210,1211],{"class":78,"line":164},[76,1212,1213],{"class":90},"        echo \"user $SSH_USER\" >> ~\u002F.ssh\u002Fconfig\n",[76,1215,1216],{"class":78,"line":172},[76,1217,1218],{"class":90},"        echo \"Port $SSH_PORT\" >> ~\u002F.ssh\u002Fconfig\n",[76,1220,1221],{"class":78,"line":186},[76,1222,1223],{"class":90},"        echo \"IdentityFile $HOME\u002F.ssh\u002Fid_rsa\" >> ~\u002F.ssh\u002Fconfig\n",[76,1225,1226],{"class":78,"line":194},[76,1227,1228],{"class":90},"        echo \"StrictHostKeyChecking no\" >> ~\u002F.ssh\u002Fconfig\n",[76,1230,1231],{"class":78,"line":205},[76,1232,1233],{"class":90},"        echo \"UserKnownHostsFile=\u002Fdev\u002Fnull\" >> ~\u002F.ssh\u002Fconfig\n",[76,1235,1236],{"class":78,"line":217},[76,1237,1238],{"class":90},"        chmod 644 ~\u002F.ssh\u002Fconfig\n",[76,1240,1241,1243],{"class":78,"line":224},[76,1242,321],{"class":82},[76,1244,130],{"class":86},[76,1246,1247,1250,1252],{"class":78,"line":241},[76,1248,1249],{"class":82},"        SSH_KEY",[76,1251,87],{"class":86},[76,1253,1254],{"class":90}," ${{ secrets.SSH_KEY }}\n",[76,1256,1257,1260,1262],{"class":78,"line":256},[76,1258,1259],{"class":82},"        SSH_HOST",[76,1261,87],{"class":86},[76,1263,1264],{"class":90}," ${{ secrets.SSH_HOST }}\n",[76,1266,1267,1270,1272],{"class":78,"line":270},[76,1268,1269],{"class":82},"        SSH_USER",[76,1271,87],{"class":86},[76,1273,1274],{"class":90}," ${{ secrets.SSH_USER }}\n",[76,1276,1277,1280,1282],{"class":78,"line":282},[76,1278,1279],{"class":82},"        SSH_PORT",[76,1281,87],{"class":86},[76,1283,1284],{"class":90}," ${{ secrets.SSH_PORT }}\n",[10,1286,1287,1288,1291,1292,1295],{},"まず",[59,1289,1290],{},"env:","にて使用する環境変数をコマンド変数に渡します。こうすることでコマンド内で",[59,1293,1294],{},"$SSH_KEY","として値を使用できます。キー、ホスト、ユーザー、ポートを出します。",[10,1297,1298,1299,1302],{},"ちなみに",[59,1300,1301],{},"${{ secrets.SSH_KEY }}","の記述はコンテキストと呼ばれています。ワークフローに関する情報やsecretsに保存した値にアクセスできます。",[52,1304,1306],{"className":527,"code":1305,"language":529,"meta":61,"style":61},"echo \"$SSH_KEY\" > id_rsa\nmkdir ~\u002F.ssh\nchmod 700 ~\u002F.ssh\nmv id_rsa ~\u002F.ssh\u002F\nchmod 600 ~\u002F.ssh\u002Fid_rsa\n",[59,1307,1308,1313,1318,1323,1328],{"__ignoreMap":61},[76,1309,1310],{"class":78,"line":79},[76,1311,1312],{"class":90},"echo \"$SSH_KEY\" > id_rsa\n",[76,1314,1315],{"class":78,"line":94},[76,1316,1317],{"class":90},"mkdir ~\u002F.ssh\n",[76,1319,1320],{"class":78,"line":101},[76,1321,1322],{"class":90},"chmod 700 ~\u002F.ssh\n",[76,1324,1325],{"class":78,"line":119},[76,1326,1327],{"class":90},"mv id_rsa ~\u002F.ssh\u002F\n",[76,1329,1330],{"class":78,"line":124},[76,1331,1332],{"class":90},"chmod 600 ~\u002F.ssh\u002Fid_rsa\n",[10,1334,1287,1335,1337,1338,1341,1342,1345,1346,1349],{},[59,1336,1294],{},"を",[59,1339,1340],{},"id_rsa","としてファイルに出力。そして",[59,1343,1344],{},"~\u002F.ssh","ディレクトリを作成してその配下に置いておきます。鍵と",[59,1347,1348],{},".ssh","ディレクトリの権限変更を忘れないようにしてください。",[52,1351,1353],{"className":527,"code":1352,"language":529,"meta":61,"style":61},"echo \"HOST deploy\" >> ~\u002F.ssh\u002Fconfig\necho \"HostName $SSH_HOST\" >> ~\u002F.ssh\u002Fconfig\necho \"user $SSH_USER\" >> ~\u002F.ssh\u002Fconfig\necho \"Port $SSH_PORT\" >> ~\u002F.ssh\u002Fconfig\necho \"IdentityFile $HOME\u002F.ssh\u002Fid_rsa\" >> ~\u002F.ssh\u002Fconfig\necho \"StrictHostKeyChecking no\" >> ~\u002F.ssh\u002Fconfig\necho \"UserKnownHostsFile=\u002Fdev\u002Fnull\" >> ~\u002F.ssh\u002Fconfig\nchmod 644 ~\u002F.ssh\u002Fconfig\n",[59,1354,1355,1360,1365,1370,1375,1380,1385,1390],{"__ignoreMap":61},[76,1356,1357],{"class":78,"line":79},[76,1358,1359],{"class":90},"echo \"HOST deploy\" >> ~\u002F.ssh\u002Fconfig\n",[76,1361,1362],{"class":78,"line":94},[76,1363,1364],{"class":90},"echo \"HostName $SSH_HOST\" >> ~\u002F.ssh\u002Fconfig\n",[76,1366,1367],{"class":78,"line":101},[76,1368,1369],{"class":90},"echo \"user $SSH_USER\" >> ~\u002F.ssh\u002Fconfig\n",[76,1371,1372],{"class":78,"line":119},[76,1373,1374],{"class":90},"echo \"Port $SSH_PORT\" >> ~\u002F.ssh\u002Fconfig\n",[76,1376,1377],{"class":78,"line":124},[76,1378,1379],{"class":90},"echo \"IdentityFile $HOME\u002F.ssh\u002Fid_rsa\" >> ~\u002F.ssh\u002Fconfig\n",[76,1381,1382],{"class":78,"line":133},[76,1383,1384],{"class":90},"echo \"StrictHostKeyChecking no\" >> ~\u002F.ssh\u002Fconfig\n",[76,1386,1387],{"class":78,"line":141},[76,1388,1389],{"class":90},"echo \"UserKnownHostsFile=\u002Fdev\u002Fnull\" >> ~\u002F.ssh\u002Fconfig\n",[76,1391,1392],{"class":78,"line":146},[76,1393,1394],{"class":90},"chmod 644 ~\u002F.ssh\u002Fconfig\n",[10,1396,1397,1400,1401,1404,1405,1408],{},[59,1398,1399],{},"~\u002F.ssh\u002Fconfig","ファイルにエイリアスの記述を書いておきます。SSHは初回接続時に警告をだすので",[59,1402,1403],{},"StrictHostKeyChecking no","を設定し、known_hostsを出さないように",[59,1406,1407],{},"UserKnownHostsFile=\u002Fdev\u002Fnull","としておきます。",[10,1410,1411,1412,1415,1416,1419],{},"最後に権限をきちんと設定すれば、",[59,1413,1414],{},"deploy","というSSHエイリアスが使える用意なります。手動で",[59,1417,1418],{},".ssh\u002Fconfig","の設定をしていたのを自動化した感じです。",[340,1421,1423],{"id":1422},"ビルド処理rsync処理を記述","ビルド処理・rsync処理を記述",[10,1425,1426],{},"SSHの設定はできたのでLaravelのアセットビルドをするコードを書きます。",[52,1428,1430],{"className":527,"code":1429,"language":529,"meta":61,"style":61},"- name: public build\n  run: |\n    npm install\n    npm run prod\n    rsync -av --delete \\\n    .\u002Fpublic\u002Fcss .\u002Fpublic\u002Fjs .\u002Fpublic\u002Fimages \\\n    deploy:$LARAVEL_PATH\u002Fpublic\u002F\n    scp .\u002Fpublic\u002Fmix-manifest.json deploy:$LARAVEL_PATH\u002Fpublic\u002Fmix-manifest.json\n  env:\n    LARAVEL_PATH : ${{ secrets.LARAVEL_PATH }}\n",[59,1431,1432,1442,1451,1456,1461,1466,1471,1476,1481,1488],{"__ignoreMap":61},[76,1433,1434,1436,1438,1440],{"class":78,"line":79},[76,1435,1009],{"class":86},[76,1437,262],{"class":82},[76,1439,87],{"class":86},[76,1441,267],{"class":90},[76,1443,1444,1447,1449],{"class":78,"line":94},[76,1445,1446],{"class":82},"  run",[76,1448,87],{"class":86},[76,1450,279],{"class":278},[76,1452,1453],{"class":78,"line":101},[76,1454,1455],{"class":90},"    npm install\n",[76,1457,1458],{"class":78,"line":119},[76,1459,1460],{"class":90},"    npm run prod\n",[76,1462,1463],{"class":78,"line":124},[76,1464,1465],{"class":90},"    rsync -av --delete \\\n",[76,1467,1468],{"class":78,"line":133},[76,1469,1470],{"class":90},"    .\u002Fpublic\u002Fcss .\u002Fpublic\u002Fjs .\u002Fpublic\u002Fimages \\\n",[76,1472,1473],{"class":78,"line":141},[76,1474,1475],{"class":90},"    deploy:$LARAVEL_PATH\u002Fpublic\u002F\n",[76,1477,1478],{"class":78,"line":146},[76,1479,1480],{"class":90},"    scp .\u002Fpublic\u002Fmix-manifest.json deploy:$LARAVEL_PATH\u002Fpublic\u002Fmix-manifest.json\n",[76,1482,1483,1486],{"class":78,"line":157},[76,1484,1485],{"class":82},"  env",[76,1487,130],{"class":86},[76,1489,1490,1493,1495],{"class":78,"line":164},[76,1491,1492],{"class":82},"    LARAVEL_PATH",[76,1494,332],{"class":86},[76,1496,335],{"class":90},[10,1498,1499],{},"ワークフローの初期位置はリポジトリルートと対応しています。最初にライブラリなどをインストールしてからビルドします。",[10,1501,1502,1503,1506],{},"終わったらrsyncを行います。エイリアスを定義しておいたので",[59,1504,1505],{},"deploy:$LARAVEL_PATH\u002Fpublic\u002F","と簡単な記述で済みます。",[340,1508,1510],{"id":1509},"nuxtjsのビルド処理を記述する","Nuxt.jsのビルド処理を記述する",[10,1512,1513,1514,1516],{},"次に",[59,1515,404],{},"に移動してnuxt.jsのビルド処理を記述します。",[52,1518,1520],{"className":527,"code":1519,"language":529,"meta":61,"style":61},"    - name: nuxt build\n      run: |\n        cd nuxt\n        touch .env\n        echo \"GOOGLE_MAP_API_KEY=${{ secrets.GOOGLE_MAP_API_KEY }}\" >> .env\n        npm install\n        npm run generate\n        rsync -av --delete .\u002Fdist deploy:$LARAVEL_PATH\u002Fnuxt\u002F\n      env:\n        LARAVEL_PATH : ${{ secrets.LARAVEL_PATH }}\n",[59,1521,1522,1533,1541,1546,1551,1556,1560,1565,1570,1576],{"__ignoreMap":61},[76,1523,1524,1526,1528,1530],{"class":78,"line":79},[76,1525,175],{"class":86},[76,1527,262],{"class":82},[76,1529,87],{"class":86},[76,1531,1532],{"class":90}," nuxt build\n",[76,1534,1535,1537,1539],{"class":78,"line":94},[76,1536,273],{"class":82},[76,1538,87],{"class":86},[76,1540,279],{"class":278},[76,1542,1543],{"class":78,"line":101},[76,1544,1545],{"class":90},"        cd nuxt\n",[76,1547,1548],{"class":78,"line":119},[76,1549,1550],{"class":90},"        touch .env\n",[76,1552,1553],{"class":78,"line":124},[76,1554,1555],{"class":90},"        echo \"GOOGLE_MAP_API_KEY=${{ secrets.GOOGLE_MAP_API_KEY }}\" >> .env\n",[76,1557,1558],{"class":78,"line":133},[76,1559,285],{"class":90},[76,1561,1562],{"class":78,"line":141},[76,1563,1564],{"class":90},"        npm run generate\n",[76,1566,1567],{"class":78,"line":146},[76,1568,1569],{"class":90},"        rsync -av --delete .\u002Fdist deploy:$LARAVEL_PATH\u002Fnuxt\u002F\n",[76,1571,1572,1574],{"class":78,"line":157},[76,1573,321],{"class":82},[76,1575,130],{"class":86},[76,1577,1578,1580,1582],{"class":78,"line":164},[76,1579,329],{"class":82},[76,1581,332],{"class":86},[76,1583,335],{"class":90},[1585,1586,1588],"h4",{"id":1587},"envファイルを使うには",".envファイルを使うには",[10,1590,1591,1592,1594,1595,1598],{},"プロジェクトによっては",[59,1593,437],{},"ファイルを使用して端末ごとに環境変数を定義していると思います。.envは大体",[59,1596,1597],{},"gitignore","されてバージョン管理されていないので、ワークフローないで作成します。",[52,1600,1602],{"className":527,"code":1601,"language":529,"meta":61,"style":61},"      run: |\n        cd nuxt\n        touch .env\n        echo \"GOOGLE_MAP_API_KEY=${{ secrets.GOOGLE_MAP_API_KEY }}\" >> .env\n        npm install\n        npm run generate\n        rsync -av --delete .\u002Fdist deploy:$LARAVEL_PATH\u002Fnuxt\u002F\n      env:\n        LARAVEL_PATH : ${{ secrets.LARAVEL_PATH }}\n",[59,1603,1604,1612,1616,1620,1624,1628,1632,1636,1642],{"__ignoreMap":61},[76,1605,1606,1608,1610],{"class":78,"line":79},[76,1607,273],{"class":82},[76,1609,87],{"class":86},[76,1611,279],{"class":278},[76,1613,1614],{"class":78,"line":94},[76,1615,1545],{"class":90},[76,1617,1618],{"class":78,"line":101},[76,1619,1550],{"class":90},[76,1621,1622],{"class":78,"line":119},[76,1623,1555],{"class":90},[76,1625,1626],{"class":78,"line":124},[76,1627,285],{"class":90},[76,1629,1630],{"class":78,"line":133},[76,1631,1564],{"class":90},[76,1633,1634],{"class":78,"line":141},[76,1635,1569],{"class":90},[76,1637,1638,1640],{"class":78,"line":146},[76,1639,321],{"class":82},[76,1641,130],{"class":86},[76,1643,1644,1646,1648],{"class":78,"line":157},[76,1645,329],{"class":82},[76,1647,332],{"class":86},[76,1649,335],{"class":90},[10,1651,1652,1653,1655,1656,1659],{},"と必要な箇所で",[59,1654,437],{},"ファイルを作って、",[59,1657,1658],{},"echo \"GOOGLE_MAP_API_KEY=${{ secrets.GOOGLE_MAP_API_KEY }}\" >> .env","とGithubの環境変数内容を出力します。これでOKです。",[10,1661,1662,1663,1666],{},"nuxtは静的書出すると",[59,1664,1665],{},"dist","が作成されるので、rsyncで転送します。",[340,1668,1669],{"id":1669},"保存する",[10,1671,1672,1673,1676],{},"記述が終わったら画面右上の「Start Commit」をおして内容をコミットします。ちなみにワークフローファイルはリポジトリの",[59,1674,1675],{},".github\u002Fworkflows","というディレクトリが作られ、そこに保存されます。",[32,1678,1680],{"id":1679},"全ビルドを実行手動","全ビルドを実行（手動）",[10,1682,1683],{},"ではビルドしましょう。Actionsで対象のデプロイ名を選択して「Run Workflow」を押して、対象ブランチを選択して実行します。",[449,1685],{":src":1686},"'github-actions-node-js\u002Fdispatch-job.png'",[10,1688,1689],{},"ビルド中の様子やログは随時確認することができます。ビルドが無事に終了すると以下のように全てチェックマークとなり、処理が終了します。どこかエラーが起きた場合はそこで処理が中止されます。",[449,1691],{":src":1692},"'github-actions-node-js\u002Fsuccess.png'",[10,1694,1695],{},"終わったら本番サーバーで対象のファイルが作られているかなどを確認してみましょう。",[32,1697,1698],{"id":1698},"使ってみた感想",[10,1700,1701],{},"少人数でこれぐらいであればローカルPCで誰でもできそうですが、ボタンひとつでビルドできるようになることや手違いもなくなるのでとてもおすすめです。色々自動化できるようにGithub Actionsを色々探ってみます。",[1703,1704,1705],"style",{},"html pre.shiki code .s-wAU, html code.shiki .s-wAU{--shiki-default:#F07178}html pre.shiki code .sAklC, html code.shiki .sAklC{--shiki-default:#89DDFF}html pre.shiki code .sfyAc, html code.shiki .sfyAc{--shiki-default:#C3E88D}html pre.shiki code .sbqyR, html code.shiki .sbqyR{--shiki-default:#FF9CAC}html pre.shiki code .s0W1g, html code.shiki .s0W1g{--shiki-default:#BABED8}html pre.shiki code .s6cf3, html code.shiki .s6cf3{--shiki-default:#89DDFF;--shiki-default-font-style:italic}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sC9rS, html code.shiki .sC9rS{--shiki-default:#464B5D;--shiki-default-font-style:italic}",{"title":61,"searchDepth":101,"depth":101,"links":1707},[1708,1712,1713,1714,1715,1725,1726],{"id":34,"depth":94,"text":35,"children":1709},[1710,1711],{"id":342,"depth":101,"text":342},{"id":348,"depth":101,"text":348},{"id":363,"depth":94,"text":363},{"id":431,"depth":94,"text":431},{"id":509,"depth":94,"text":509},{"id":29,"depth":94,"text":29,"children":1716},[1717,1718,1719,1720,1721,1724],{"id":804,"depth":101,"text":804},{"id":1055,"depth":101,"text":1055},{"id":1149,"depth":101,"text":1150},{"id":1422,"depth":101,"text":1423},{"id":1509,"depth":101,"text":1510,"children":1722},[1723],{"id":1587,"depth":119,"text":1588},{"id":1669,"depth":101,"text":1669},{"id":1679,"depth":94,"text":1680},{"id":1698,"depth":94,"text":1698},[1728],"devstack","2026-02-11","not node.jsな環境でアセットをビルドして転送する。","md",null,{},"\u002Farticles\u002Fgithub-actions-node-js",{"title":5,"description":1730},"articles\u002Fgithub-actions-node-js",[1738,1739],"infrastructure","node","tRNfJ9LFek0TNwphGk2rKIZmRCAhyvmVgSvx-MGlLXE",1780987139863]