[{"data":1,"prerenderedAt":362},["ShallowReactive",2],{"news-item-\u002Fja\u002Fnews\u002Fgitlabrunner-nodejs-ec2":3},{"id":4,"title":5,"body":6,"category":350,"created by":351,"date":352,"description":21,"extension":353,"meta":354,"navigation":355,"path":356,"sections":357,"seo":358,"stem":359,"thumbnail":360,"__hash__":361},"content_ja\u002Fja\u002Fnews\u002Fgitlabrunner-nodejs-ec2.md","EC2インスタンスにおけるGITLAB RUNNERとNODEJSを使ったCI\u002FCD作成方法",{"type":7,"value":8,"toc":334},"minimark",[9,13,18,22,25,28,32,35,41,54,59,62,88,91,99,108,111,120,123,127,130,133,136,139,142,145,148,151,161,164,170,173,179,182,188,191,197,201,204,207,210,216,219,225,228,234,237,241,244,248,251,257,260,266,269,273,277,280,286,289,292,296,299,303,306,310,313,316,322,328],[10,11,12],"h2",{"id":12},"紹介",[14,15,17],"h3",{"id":16},"cicdとは","CI\u002FCDとは",[19,20,21],"p",{},"CIとは、Continuous Integrationの略で、継続的インテグレーションと呼ばれ、ソースコードがバージョンアップ管理システムのGITに変更される度に自動化されたビルドとテストを実行する手法をいいます。開発者のソースコード変更が『良い』状態となり、コードベースでの開発により適しています。",[19,23,24],{},"CDとは、Continuous Deliveryの略で、継続的デリバリーと呼ばれ、継続的インテグレーションを拡張した手法であり、ソースコードがGITに変更される度に自動化されたビルドとテストを実行するだけでなく、アプリがいつも安定してデプロイが実施されるが、本番環境へのデプロイは手動で行うというものです。",[19,26,27],{},"CDとは、Continuous Deploymentの略でもあり、継続的デプロイメントと呼ばれ、継続的デリバリーと同様に、継続的インテグレーションを拡張した手法をいいます。ただし、継続的デリバリーと異なり本番環境へのデプロイを手動で行う代わりに、自動的に実施しユーザーが最新のものをすぐに利用することができます。",[14,29,31],{"id":30},"gitlab-runnerとは","GitLab Runnerとは",[19,33,34],{},"GitLab Runnerはビルドやテストやデプロイ等のジョブを実行し、そのジョブの結果をGitLabへ返却するといったことに使われるオープンソースプロジェクトです。Runnerは仮想マシンであり、VPSでもあり、Dockerコンテナーでもあり、そして、各Dockerコンテナーのグループです。GitLabとオープンソースとを連携した 仕組みであるGitLab CI\u002FCDと共に使って各ジョブを実行します。GitLabとRunnerはAPIを通してコミュニケーションします。",[19,36,37],{},[38,39,40],"strong",{},"Runnersの種類",[42,43,44,48,51],"ul",{},[45,46,47],"li",{},"Shared Runners：GitLabによって提供されたもの",[45,49,50],{},"Specific Runners：単一のGitLabのプロジェクトに使われる、ユーザーによって自作されたもの",[45,52,53],{},"Group Runners：複数のGitLabのプロジェクトに使われる、ユーザーによって自作されたもの",[19,55,56],{},[38,57,58],{},"Executor選択",[19,60,61],{},"GitLab Runnerには様々な目的に応じて適切な、ジョブの実行方式であるExecutorを選択することができます。GitLab Runnerが提供するExecutorの種類は以下の通りとなります。",[42,63,64,67,70,73,76,79,82,85],{},[45,65,66],{},"SSH",[45,68,69],{},"Shell",[45,71,72],{},"Parallels",[45,74,75],{},"VirtualBox",[45,77,78],{},"Docker",[45,80,81],{},"Docker Machine (auto-scaling)",[45,83,84],{},"Kubernetes",[45,86,87],{},"Custom",[19,89,90],{},"然し、この記事では以下の２つのExecutorについてお話しします。",[42,92,93,96],{},[45,94,95],{},"・Docker Executor：『テスト』ジョブに使われます。サーバーのリソースを節約するため、GitLabによって提供されたShared Runnersを『テスト』ジョブに使われます。",[45,97,98],{},"・Shell Executor：『デプロイ』ジョブに使われます。このExecutorを用いてサーバーにてコマンドを直接実行します。",[19,100,101,102],{},"他のExecutor及びその使い方について、以下のURLを参照してください。 ",[103,104,105],"a",{"href":105,"rel":106},"https:\u002F\u002Fdocs.gitlab.com\u002Frunner\u002Fexecutors\u002FREADME.html",[107],"nofollow",[14,109,110],{"id":110},"構成図",[112,113],"img",{"className":114,"alt":117,"src":118,"style":119},[115,116],"block","mx-auto","","https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2020\u002F09\u002F01155419\u002FDigram.png","width: 80%;",[19,121,122],{},"GitLabは、GitLabのDevelopブランチへソースコードをプッシュした時、テストとデプロイのステージを含むパイプラインを生成します。ここでNodeJSアプリケーションを開発するので、この二つのステージのみ要りますが、Typescriptアプリケーションならば、それらの他に『ビルド』ステージも必要です。",[112,124],{"className":125,"alt":117,"src":126,"style":119},[115,116],"https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2020\u002F09\u002F01155704\u002F2stage.png",[19,128,129],{},"『テスト』ステージには『テスト』ジョブが含まれます。ここで、前述の如くサーバーのリソースを節約するため、GitLabによって提供されたGitLab Shared Runner（Executor Docker利用）を使います。「テスト」ジョブの実行がエラーなく成功したら、『デプロイ』という次のステージへ遷移します。",[19,131,132],{},"『デプロイ』ステージには『デプロイ』ジョブが含まれます。ここで、EC2インスタンスに、Webサーバーと共にインストールされたGitLab Runner（Executor Shell利用）を使います。 Runnerのタスクとして、ソースコードの変更を検出し、その差分をプロジェクトフォルダーにコピー＆ペーストしてから、NodeJSサービスを再起動します。",[19,134,135],{},"ステージとジョブをコンフィグするには .gitlab-ci.ymlファイルを作成して、GitLabへソースコードと共にプッシュする必要があります。",[19,137,138],{},"注：ファイルを各ステージで交換するために、 対象ファイルをGitLabの共有ストレージに保存することができます。通常は、libraries \u002Fnode_modulesをキャッシュに保存します。ただし、Typescriptならば、『.ts』から『.js』にビルドした時に生成されるファイル をArtifactsに保存します。ここで、NodeJSを使っているので、Artifactsが不要になります。",[10,140,141],{"id":141},"実現手順",[14,143,144],{"id":144},"サーバー設定",[19,146,147],{},"まず、Amazon Linux AMIを実行するEC2インスタンスを新たに作成します。ブラウザーからNodeJSサーバーへアクセスするためのポート3000を開放しておきます。その後、PuTTYを用いてサーバーへアクセスします。",[19,149,150],{},"下記のコマンドで、GitLab Runnerをインストールします。",[152,153,158],"pre",{"className":154,"code":156,"language":157},[155],"language-text","$ curl -L https:\u002F\u002Fpackages.gitlab.com\u002Finstall\u002Frepositories\u002Frunner\u002Fgitlab-runner\u002Fscript.rpm.sh | sudo bash\n$ sudo yum install gitlab-runner\n","text",[159,160,156],"code",{"__ignoreMap":117},[19,162,163],{},"下記のコマンドで、NodeJSをインストールします。",[152,165,168],{"className":166,"code":167,"language":157},[155],"$ sudo yum install -y gcc-c++ make\n\n$ curl -sL https:\u002F\u002Frpm.nodesource.com\u002Fsetup_14.x | sudo -E bash –\n\n$ sudo yum install -y nodejs\n",[159,169,167],{"__ignoreMap":117},[19,171,172],{},"下記のコマンドで、NodeJSプロジェクトをバックグラウンドで実行するためのforever packageをインストールします。",[152,174,177],{"className":175,"code":176,"language":157},[155],"$ sudo npm install forever -g\n",[159,178,176],{"__ignoreMap":117},[19,180,181],{},"下記のコマンドで、プロジェクトのディレクトリを作成します。",[152,183,186],{"className":184,"code":185,"language":157},[155],"$ sudo mkdir -p \u002Fvar\u002Fwww\u002Fproject-ci\n",[159,187,185],{"__ignoreMap":117},[19,189,190],{},"下記のコマンドで、プロジェクトディレクトリへ読取、書込み、実行をGitLab Runnerが行なえるような権限を与えます。",[152,192,195],{"className":193,"code":194,"language":157},[155],"$ sudo setfacl -m user:gitlab-runner:rwx \u002Fvar\u002Fwww\u002Fproject-ci\n",[159,196,194],{"__ignoreMap":117},[14,198,200],{"id":199},"gitlabリポジトリおよびnodejsデモプロジェクトの作成","GitLabリポジトリおよびNodeJSデモプロジェクトの作成",[19,202,203],{},"GitLabのリポジトリを作成してローカルにクローンします。",[19,205,206],{},"以下の３つのファイルをクローンしたフォルダーに追加しておきます。",[19,208,209],{},"package.json",[152,211,214],{"className":212,"code":213,"language":157},[155],"{\n  \"name\": \"project-ci\",\n  \"version\": \"1.0.0\",\n  \"description\": \"project to research Gitlab Runner\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Test OK\\\" && exit 0\",\n    \"start\": \"node index.js\"\n  },\n  \"keywords\": [],\n  \"author\": \"nghia.nt\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"express\": \"^4.17.1\"\n  }\n}\n",[159,215,213],{"__ignoreMap":117},[19,217,218],{},"index.js",[152,220,223],{"className":221,"code":222,"language":157},[155],"const express = require('express');\nconst app = express();\nconst port = process.env.NODE_PORT || 3000;\napp.get('\u002F', function (req, res) {\n  res.send('Hello World From Briswell Vietnam!');\n});\napp.listen(port, function () {\n  console.log('Listening on port ' + port);\n});\n",[159,224,222],{"__ignoreMap":117},[19,226,227],{},".gitignore",[152,229,232],{"className":230,"code":231,"language":157},[155],"node_modules\u002F\niisnode\u002F\nnpm-debug.log*\n.vscode\u002F\n.idea\u002F\n.env*\n**\u002F*.log\ndist\u002F\n",[159,233,231],{"__ignoreMap":117},[19,235,236],{},"その後、それらのファイルをGitLabのDevelopブランチへプッシュします。",[14,238,240],{"id":239},"gitlabでのgitlab-runner登録","GitLabでのGitLab Runner登録",[19,242,243],{},"対象プロジェクトのGitLabにアクセスして、Settings→CI\u002FCDに辿ってから、Runners項目の『Set up a specific Runner manually』にあるURLとトークンをメモしておいてください。",[112,245],{"className":246,"alt":117,"src":247,"style":119},[115,116],"https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2020\u002F09\u002F01164951\u002Ftoken.png",[19,249,250],{},"PuTTYに戻り、下記のコマンドを実行することでGitLab Runnerを登録します。",[152,252,255],{"className":253,"code":254,"language":157},[155],"$ sudo gitlab-runner register\n",[159,256,254],{"__ignoreMap":117},[19,258,259],{},"上記のコマンドを実行したのち、ウィザードからは上記に取得したURLとトークンの入力を求めます。",[152,261,264],{"className":262,"code":263,"language":157},[155],"Please enter the gitlab-ci coordinator URL (e.g. https:\u002F\u002Fgitlab.com\u002F):\nhttps:\u002F\u002Fgitlab.com\u002F\nPlease enter the gitlab-ci token for this runner:\nk753PaGiosBxxxxxxx\nPlease enter the gitlab-ci description for this runner:\nmy-shell-runner\nPlease enter the gitlab-ci tags for this runner (comma separated):\nmy-shell-runner\nRegistering runner... succeeded                     runner=ajgHxcNz\nPlease enter the executor: virtualbox, docker+machine, kubernetes, docker, shell, ssh, docker-ssh+machine, docker-ssh, parallels:\nshell\nRunner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!\n",[159,265,263],{"__ignoreMap":117},[19,267,268],{},"登録が終わったら、GitLabの設定画面へアクセスして確認しましょう。以下の画像のように情報が表示されるのであれば、登録に成功したということです。",[112,270],{"className":271,"alt":117,"src":272,"style":119},[115,116],"https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2020\u002F09\u002F01155853\u002FRegiterComplete.png",[14,274,276],{"id":275},"gitlabのプロジェクトのステージ及びジョブのコンフィグ","GitLabのプロジェクトのステージ及びジョブのコンフィグ",[19,278,279],{},"プロジェクトのソースコードに以下の情報を含める.gitlab-ci.ymlファイルを新たに作ります。",[152,281,284],{"className":282,"code":283,"language":157},[155],"# We have 2 stage Test and Deploy\nstages:\n  - test\n  - deploy\n\n# Config cache\ncache:\n  paths:\n    - node_modules\u002F\n\n# Test job\ntest:\n  # Docker image\n  image: node:latest\n  # Attach Test job to Test stage\n  stage: test\n  # Config to use GitLab Shared Runner with Executor Docker\n  tags:\n    - docker\n  script:\n    - npm install\n    - npm run test\n  # Defines the names of branches and tags the job runs for\n  only:\n    - develop\n\n# Deploy job\ndeploy:\n  type: deploy\n  # Attach Deploy job to Deploy stage\n  stage: deploy\n  # Config to use our Runner with Executor Shell\n  tags:\n    - my-shell-runner\n  script:\n    # Only copy changed files to project folder\n    - cp -r -u * $PROJECT_DIR\n    - cd $PROJECT_DIR\n    - npm install\n    # Restart NodeJS service\n    - forever stop index.js || true\n    - forever start index.js\n  only:\n    - develop\n",[159,285,283],{"__ignoreMap":117},[19,287,288],{},"その後、このファイルをGitLabのDevelopブランチへプッシュします。",[19,290,291],{},"次に、環境変数を設定しましょう。GitLab画面にてSettings→CI\u002FCD→Variablesに辿ってから、『Protect variable』項目にチェックを外して『Add Variable』ボタンを押下してください。",[112,293],{"className":294,"alt":117,"src":295,"style":119},[115,116],"https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2020\u002F09\u002F01162408\u002Fvariable.png",[19,297,298],{},"GitLab画面にてCI\u002FCD→Pipelinesにアクセスして確認しましょう。",[112,300],{"className":301,"alt":117,"src":302,"style":119},[115,116],"https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2020\u002F09\u002F01160006\u002FPipelines.png",[19,304,305],{},"あと、ブラウザーからサーバーへポート3000でアクセスできます。",[112,307],{"className":308,"alt":117,"src":309,"style":119},[115,116],"https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2020\u002F09\u002F01160048\u002Fbrowser.png",[19,311,312],{},"このように、GitLab Runnerを使ってNodeJSプロジェクトを、CI\u002FCDと連携したEC2インスタンスへデプロイすることに成功しました。",[10,314,315],{"id":315},"参照元",[19,317,318],{},[103,319,320],{"href":320,"rel":321},"https:\u002F\u002Fopensource.com\u002Farticle\u002F18\u002F8\u002Fwhat-cicd",[107],[19,323,324],{},[103,325,326],{"href":326,"rel":327},"https:\u002F\u002Fdocs.gitlab.com\u002Fee\u002Fci\u002Fquick_start\u002F",[107],[19,329,330],{},[103,331,332],{"href":332,"rel":333},"https:\u002F\u002Fdocs.gitlab.com\u002Frunner\u002F",[107],{"title":117,"searchDepth":335,"depth":335,"links":336},2,[337,343,349],{"id":12,"depth":335,"text":12,"children":338},[339,341,342],{"id":16,"depth":340,"text":17},3,{"id":30,"depth":340,"text":31},{"id":110,"depth":340,"text":110},{"id":141,"depth":335,"text":141,"children":344},[345,346,347,348],{"id":144,"depth":340,"text":144},{"id":199,"depth":340,"text":200},{"id":239,"depth":340,"text":240},{"id":275,"depth":340,"text":276},{"id":315,"depth":335,"text":315},"tech talk","Briswell Vietnam Co Ltd","2020-10-07","md",{},true,"\u002Fja\u002Fnews\u002Fgitlabrunner-nodejs-ec2",null,{"title":5,"description":21},"ja\u002Fnews\u002Fgitlabrunner-nodejs-ec2","https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2020\u002F10\u002F07093335\u002Fgitlab-runner-logo.png","MqQwrYYFuZtqwxpyk4zUbAR7S2wzSwGM3LTI2OZC4rw",1785320530887]