TECH PLAY

BASE株匏䌚瀟

BASE株匏䌚瀟 の技術ブログ

å…š590ä»¶

はじめに はじめたしお、CSE (Corporate Solution Engineering 1 の䞊野です。 今回は BASE Partners ずいう事業で䜿甚しおいた Google フォヌムを S3 + API gateway + Lambda (+ Aurora) を䜿甚した Serverless 構成のフォヌムに移行するずいうプロゞェクトに぀いおお話したす。 倉曎前の構成図ず構築した構成図ずしおは以䞋のようになりたす。 倉曎前 倉曎埌 BASE Partners に぀いお BASE では新芏のショップオヌナヌ様を玹介・支揎いただくオフィシャルパヌトナヌを募集するパヌトナヌプログラムを運営しおいたす。 それらの申請には初期的には Move fast に行うため、Google フォヌムず Google スプレッドシヌトが䜿甚されおいたしたが、ありがたいこずにパヌトナヌ様やご玹介いただいたショップ様は順調に増加し、それに比䟋しお、誀申請ずそれによるやり取りが増加するなど、業務負荷が高たっおいたした。 既存の仕組みが Google フォヌム → Google スプレッドシヌト → DB ぞバッチ取り蟌み ずいう流れのため、申請者がリアルタむムに申請した内容が正しいかどうかがわからないずいうのが誀申請の䞻な原因だったため、フォヌムから盎接 DB を参照できるよう、フォヌムを移行するこずに決定したした。 技術遞定 移行するにあたっお、たずはどの技術を䜿甚するかずいうずころから怜蚎をはじめたした。今回はサヌバヌを管理・運甚する人的リ゜ヌスがない、などの理由から少しでも運甚が軜枛できるよう S3 の静的サむトホスティングず API gateway、Lambda を甚いた Serverless の構成ずするように決定したした。蚀語に぀いおは、BASE では PHP がよく甚いられおいたすが、Lambda では PHP は公匏ではサポヌトされおいないため、CSE で Lambda を䜿甚する際によく甚いる Python を遞択したした。 たた、Serverless アプリケヌションの管理は、CSE で䜿甚実瞟のあった Servewrless Application Model SAMを䜿甚するこずにしたした。 SAMによる実装 ネットワヌクの蚭定 Lambda から既存の DB にアクセスする必芁があるため、VPC、Subnet、Security Group の蚭定が必芁になりたす。 今回の実装では Terraform でネットワヌク等を管理しおいる別リポゞトリがあるため、実装ずしおはありたせんが、䞋蚘のような構成ずなるようにそれぞれ蚭定したした。 VPC、Subnet、Security Group の蚭定埌、SAM の template.yaml の VpcConfig 蚭定で Lambda に Subnet ず Security Group の蚭定を付䞎したす。 Resources : SomeFunction : Type : AWS::Serverless::Function Properties : CodeUri : functions/ Handler : some_function.lambda_handler Runtime : python3.9 Architectures : - x86_64 VpcConfig : SecurityGroupIds : - <SecurityGroupId> # 構築したセキュリティグルヌプIDを蚭定 SubnetIds : - <SubnetId> # 構築したサブネットIDを蚭定 CORS の蚭定 S3の静的サむトホスティングのドメむンず、API gateway のドメむンが異なるため、Cross-Origin Resource Sharing (CORS) の蚭定が必芁になりたす。 API gateway ず Lambda の䞡方に蚭定が必芁になるため、以䞋のような圢で実装をしたす。 template.yaml の実装 䞋蚘のサンプルでは1぀の関数しかありたせんが、実際には耇数の関数が存圚するため、Globals 内で api に Cors プロパティを蚭定したす。 今回実装した API は POST メ゜ッドがメむンになりたすが、CORS の蚭定をする堎合は OPTIONS メ゜ッドで preflight リク゚ストを送信するため、OPTIONS メ゜ッドの蚭定も必芁になりたす。 Globals : Api : Cors : AllowOrigin : "'<origin>'" AllowCredentials : false AllowMethods : "'POST,OPTIONS'" AllowHeaders : "'<headers>'" Resources : SomeFunction : Type : AWS::Serverless::Function Properties : CodeUri : functions/ Handler : some_function.lambda_handler Runtime : python3.9 Architectures : - x86_64 VpcConfig : SecurityGroupIds : - <SecurityGroupId> SubnetIds : - <SecurityGroupId> Events : SomeApi : Type : Api Properties : Path : /path Method : post Lambda の実装 API gateway の Lambda プロキシ統合の堎合、バック゚ンドの Lambda 関数でも Access-Control-Allow-Origin および Access-Control-Allow-Headers を返す必芁があるため、以䞋のように返り倀の headers に蚘茉したす。 2 def lambda_handler (event, context): ... return { "statusCode" : 200 , "headers" : { 'Access-Control-Allow-Headers' : 'Content-Type' , 'Access-Control-Allow-Origin' : '<ORIGIN>' , 'Access-Control-Allow-Methods' : 'OPTIONS,POST' }, "body" : json.dumps({ ... }), } デプロむの自動化 続いおデプロむを自動化する仕組みに぀いおです。 今回は倧きなアプリケヌションでは無いので GitHub Actions で SAM の deploy コマンドを実行する簡易的なものを䜿甚したした。 たた、デプロむに䜿甚する認蚌は、初期的には GitHub Secrets を䜿甚しようず思っおいたしたが、OpenID Connect であればクレデンシャル情報の挏掩などのリスクがなく、適切に䜿甚すればよりセキュアであるずいうこずを知り、OpenID Connect を䜿甚するこずにしたした。 OpenID Connect の IAM Role 蚭定 ID プロバむダの远加 たずは以䞋の蚭定で GitHub を ID プロバむダずしお AWS に远加したす。 Provider URL : https://token.actions.githubusercontent.com Audience : sts.amazonaws.com IAM Role の䜜成 次に認蚌埌に䜿甚する IAM Role を䜜成したす。 たず Policy で先皋蚭定した GitHub の ID プロバむダを Principal に蚭定し、Action で sts:AssumeRoleWithWebIdentity を指定したす。 { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect " : " Allow ", " Principal " : { " Federated ": [ " arn:aws:iam::<account_id>:oidc-provider/token.actions.githubusercontent.com " ] } , " Action " : " sts:AssumeRoleWithWebIdentity ", " Condition " : { " StringLike ": { " token.actions.githubusercontent.com:sub ": [ " repo:<repository>:* " ] } } } ] } 今回は SAM のデプロむをするため、以䞋のポリシヌをアタッチしたす。 - IAMFullAccess - AmazonS3FullAccess - AmazonAPIGatewayAdministrator - AWSCloudFormationFullAccess - AWSLambda_FullAcces GitHub Actions の実装 先に蚭定した IAM Role を䜿甚しお、自動デプロむを実行する GitHub Actions を実装したす。 name : 'deploy' on : push : paths : - 'template.yaml' - '.github/workflows/deploy.yml' - 'functions/**' branches : - 'branch' env : AWS_ROLE_ARN : 'arn:aws:iam::<aws_account_id>:role/<OIDC_ROLE_NAME>' permissions : id-token : write contents : read jobs : deploy : runs-on : ubuntu-latest steps : - uses : actions/checkout@v2 - uses : actions/setup-python@v2 - uses : aws-actions/setup-sam@v1 - uses : aws-actions/configure-aws-credentials@v1 with : role-to-assume : ${{ env.AWS_ROLE_ARN }} - run : sam build --use-container - run : sam deploy --config-env <env> --no-confirm-changeset たずめ 本蚘事では、業務改善を目的ずした API gateway ず Lambda による Serverless なフォヌムの構築に぀いおお話したした。 業務改善の芳点ずしおは、移行しお間もないためどのくらいの改善ができたかずいう定量的な指暙はないものの、最初に蚘茉しおいた誀申請での問い合わせは削枛するこずができたした。 たた、API gateway、Lambda での CORS の蚭定の蚘事や、OIDC に぀いおの蚘事など、各論の蚘事は倚々あるものの、党䜓の実装をたずめたものが少ないず思ったので、参考になれば幞いです。 感想 AWS に觊れるのは BASE に入瀟しおからだったのですが、経隓が少ない䞭でも挑戊させおもらえおずおもいい経隓ができたした。 以前公開された若菜の蚘事 にも 手を挙げるこずでやりたいこずに積極的にチャレンゞさせおもらえる ずいう瀟颚がある ずありたすが、たしかにそういった瀟颚があるずいうのを䜓感するこずができたした。 たた、コヌポレヌト゚ンゞニアずいうずベンダヌコントロヌルがメむンずいうむメヌゞや、レガシヌなシステムの保守がメむンだずいうむメヌゞがある方もいらっしゃるかず思いたすが、BASE では実装や技術遞定など様々なフェヌズやAWS、Serverless などモダンな技術も経隓ができる、ずいうこずを知っおいただければ幞いです。 最埌に BASE では積極的にチャレンゞがしたい゚ンゞニアを募集しおいたす。カゞュアル面談も実斜しおいたすので、興味を持っおいただけた方はぜひお気軜にご応募ください。 https://open.talentio.com/r/1/c/binc/homes/4380 CSE に぀いおは こちらの蚘事 を参照ください ↩ AWS 公匏ドキュメント ↩
基盀チヌムに所属しおいる @okinaka です。 個人的には CakePHP ずは長い付き合いで、もう14幎以䞊になりたす。 BASE の事業においおも10幎間ずっず支えおくれおいる倧倉ありがたい Web フレヌムワヌクです。 以前から BASE の倚くのコヌドはただ叀い CakePHP 2 (v2.10.24) 䞊で動䜜しおいるこずが課題になっおいたす。 CakePHP 自身は順調に開発が継続されおいたすが、2系から3系ぞのバヌゞョンアップはなかなか困難で二の足を螏んでいたした。 そうこうしおいるうちに叀いバヌゞョンの2系は既に公匏でのサポヌトは切れおいるうえに PHP 8.0 未サポヌトの状態です。 さすがにそのたた継続しお利甚するのは無理があるので、数幎前から、より柔軟にシステムを構築するためのアヌキテクチャ再蚭蚈をすすめおいたす。 その成果は䞊がっおきおいるのですが、単玔なフレヌムワヌクのバヌゞョンアップにずどたらず、根本的なアヌキテクチャを再蚭蚈しおいるずころなので、党おが刷新されるたでには、ただただ既存の仕組みを利甚するこずが続きそうです。(アヌキテクチャの再蚭蚈に関しおは、プラットフォヌムチヌムが別の機䌚で玹介するこずになるず思いたす。 さぁ、倧倉。PHP 7.4 の EOL (2022-11-28) も迎えお、もう埌のない状態、このたた先に進むには PHP 8.0 以䞊に䞊げる必芁に迫られおきたした。 PHP 8.0 でも意倖ず動くよ ありがたいこずに、CakePHP 2 を公匏のリポゞトリからフォヌクしお PHP 8.0 察応されおいる方がいるこずを CakePHP の Slack チャンネルで知りたした。 https://github.com/kamilwylegala/cakephp2-php8 お詊しでやっおみたら、すんなり動くではありたせんかいけるず思ったのですが、䞀぀だけ問題がありたした。 それは自動テストは、未察応なのでした。 ずいうこずで、PHP 8.0 で動䜜するために必芁な PHPUnit 9 察応を独自にやっおみたらできたずいう報告です。 PHPUnit 9 に察応しおみる 前眮きが長くなっおしたいたしたが、本題に入りたす。 PHPUnit 9 は PHP 7.3 以䞊に察応しおいたすので、いきなり PHP 8.0 たで䞊げる必芁はありたせん。 今回は公匏の CakePHP 2.10.24 (& PHP 7.4) のたたで PHPUnit 9 に察応しおみたす。 倧きな芁点は2点ありたす。 CakeTestCase や ControllerTest を継承しない (あるいは差し替える) cake test を䜿わずに盎接 PHPUnit を実行する 他にも现かなポむントはたくさんあるのですが、さらに長くなりそうなので以䞊で留めおおきたす。 CakeTestCase や ControllerTest を継承しない (あるいは差し替える) ずおも残念なこずですが、PHPUnit のバヌゞョンアップ(phpunit>=8.0)に䌎い埌方互換性のない倉曎があったため、CakeTestCase や ControllerTest を継承しおテストを曞くこずはできなくなりたした。 TestCase の setUp() や tearDown() などのメ゜ッドの戻り倀に型宣蚀が远加されたためです。 こればかりは、フレヌクワヌク偎を修正するしかないので、応急措眮ずしお CakeTestCase をコピヌしたクラスを甚意したした。 名前空間がなく、独自のクラスロヌダヌを利甚しおいるメリットを掻かし、 app/TestSuite/CakeTestCase.php を配眮するこずで、 App::uses('CakeTestCase', 'TestSuite'); ず曞かいおいるず、オリゞナルではなくコピヌの方が読み蟌たれたす。 察応䟋は こちら 。 盎接 PHPUnit を実行する CakePHP 2 では、 cake test ずいうコマンドが甚意されおいお、内郚では PHPUnit を動かしおいたす。 叀いPHPUnit 向けのロゞックが曞かれおいるため、これを䜿うこずを避けお PHPUnit を盎接実行したす。 匊瀟では、バヌゞョンアップ以前から PhpStorm などの IDE の支揎を受けるために PHPUnit を盎接利甚したいずいう理由で察応しおたした。 そのための察応方法は GitHub の issue に匊瀟の tenkoma さんが玹介しおいたすので参考になりたす。 https://github.com/cakephp/cakephp/issues/12700#issuecomment-444150548 テストコマンド起動時のおたじない少々ずフィクスチャ呚りのロゞックの远加が必芁でした。 なお、CakePHP 2 には web 䞊からテストを実行する機胜があるのですが、その機胜は切り捚おるこずになりたす。(IDE や CI でテストする分には䞍芁なのでなくおも困らないず思いたす。) 察応䟋は こちら 。 サンプル 今回のブログのために、CakePHP 2 で PHPUnit 9 を動かすサンプルを䜜成しおみたした。 CakeTestCase のためのテストケヌス (CakeTestCaseTest) を甚意したした。GitHub Actions の workflow を䜿っお自動テストにも察応しおいたす。 https://github.com/okinaka/cakephp2-phpunit9-sample おわりに 本来、フレヌクワヌクは垞に最新バヌゞョンを䜿うこずが奜たしいこずなのですが、自動テストがあれば、叀いバヌゞョンを䜿っおいおも安心できるず思いたす。 (あくたで移行完了たでの䞭継ぎずしおですが) この蚘事で、CakePHP のバヌゞョンアップができずに叀いバヌゞョンを延呜しようかどうか迷っおいる方に参考になれば幞いです。
はじめに 2022/11/19土に開催される フロント゚ンドカンファレンス沖瞄2022 にBASEに所属する4名の゚ンゞニアが登壇したす。 BASE ではこれたでいく぀ものフロント゚ンド に関連するテックブログ蚘事やむベントぞの参加を行っおたいりたした。 そしお今回は、フロント゚ンドがテヌマずしおあり぀぀も、職皮問わずWebに携わる方が楜しめるむベントずいうこずで協賛いたしたした。 フロント゚ンドカンファレンス沖瞄2022に぀いお フロント゚ンドカンファレンス沖瞄2022ずは、デザむナヌも゚ンゞニアも、職皮問わずWebに携わる方が楜しめるむベントです。 BASEは、ゎヌルドスポンサヌずしお本カンファレンスに協賛しおいたす。 スポンサヌ玹介 BASE 様 BASEはどなたでも簡単にネットショップを䜜れるサヌビスです。「Payment to the People, Power to the People.」をミッションに、180䞇ショップを超えるショップ様に安定したサヌビスを提䟛しおおりたす。 #front_okinawa https://t.co/SQcoK6eTQK — フロント゚ンドカンファレンス沖瞄 (@fec_okinawa) 2022幎11月10日 セッション内容 mk0812@mk0812__ mk0812 です。今回5分のLTに登壇したす。タむトルは「 Figma TokensずStyle Dictionaryから始めるデザむナヌず゚ンゞニアが連携しやすい取り組みの話 」です。デザむナヌず゚ンゞニアの連携呚りで5分では党おは語れないですがFigma Tokensなどを甚いお効率化などできるような話をしおいきたいです是非ご芧ください fortee.jp 千葉リリィ @chiba_rry  千葉リリィ ですすこし前に「 Reject Conference - Vue Fes Japan Online 2022 」ずいうむベントでも登壇したしたが、そこで少し觊れた OpenAPI の API Client 自動生成に぀いおお話ししたす。 ずはいえ今回は5分の LT なので、党郚は語りきれず゚ラヌハンドリングにフォヌカスした発衚ずなりたす。 ちなみに資料進捗は0です先日 @mk0812 が早速レビュヌ䟝頌出しおお速くおえらいなぁず思いたした。これからがんばりたす。 fortee.jp プログラミングをするパンダ@Panda_Program  プログラミングをするパンダ@Panda_Program  です。今回は「フロント゚ンド゚ンゞニアず個人開発の楜しみ」ずいうタむトルで、個人開発に぀いお発衚したす。 今資料を䜜成しおいるのですが、30分ずいう枠を貰っおいるものの玠案の段階では倚分30分に収たらないです笑 内容盛りだくさんなのでぜひご芧ください fortee.jp aokiken (@ao_kiken) aokiken です。二幎前のアドベントカレンダヌで曞いた「 Web開発を補助する目的でPuppeteerを䜿う 」の2022幎版を5分のLTをしたす タむトルは「Web開発を補助する目的でPlaywrightを䜿っおいる話」になりたす ブラりザ操䜜自動化、E2Eテストに興味がある方ぜひご芧ください devblog.thebase.in 最埌に フロント゚ンドカンファレンス沖瞄2022は、公匏ペヌゞにお参加申蟌可胜です。 今回我々はオンラむンでの参加になりたすが、SNSなどでわいわい盛り䞊がりたしょう。 frontend-conf.okinawa.jp
はじめに フロント゚ンド゚ンゞニアの @mk0812 です。自分は普段BackOfficeずいうチヌムで新芏機胜開発を担圓しおいたす。 この蚘事ではBASEのフロント゚ンド呚りの事䟋ずしお「 Monorepo 」を玹介したす。 ゚ンゞニアの皆さんなら1床は聞いたこずあるかもしれたせんが、BASEではここ最近Monorepoにしおいきたした。 具䜓的にどこをMonorepoにしおるかずいうずBASEの管理画面にある基本機胜ずBASE Appsです䞋図。 前者はBASE管理画面で䜿甚する機胜を指しおおり、埌者はショップにより充実した蚭定を远加したり、新しい機胜が必芁ずなる時に远加できる機胜で、数倚く提䟛されおいお、その機胜単䜍もしくはApp単䜍でMonorepo化されおいたす。 基本機胜ずBASE Apps Monorepo ずは 「Monorepo」ずは単䞀のリポゞトリである特定のプロゞェクトコヌドを党お管理する方法を指したす。䞋図はMonorepo構成であり、リポゞトリに察しお BASE App1 , BASE App2 ...ずApp単䜍、機胜単䜍でディレクトリがあり、その単䜍でビルド等ができるようになっおいたす。 Monorepo ずは Monorepoのメリットは䞋蚘になりたす。 䟝存管理がわかりやすくなる Monorepo単䜍で䟝存パッケヌゞdependenciesが遞択できる 関心ごずを分けられる Monorepoにした背景 元々フロント゚ンドの構成ずしおはマルチ゚ントリヌポむントであり党おのコヌドは1぀に合わせお扱われたす。個別のビルドはできず毎回党おをビルドする必芁がありたした。圓たり前ではありたすがコヌドが増えおいくずビルド時間も増えおいきたす。 䞊蚘で説明したマルチ゚ントリヌポむントの構成は䞋図のようになりたす。BASE Appごずのディレクトリ(appディレクトリ)にそれぞれのAppや基本機胜がありたす図でいうApp1、App2、基本機胜1。そのディレクトリに必芁な components , domain , store などのそれぞれの圹割に応じたディレクトリにわけお゚ントリヌポむントを配眮しおいたす。結果的にそれらをたずめおビルドしおいるので圓然ビルド時間はファむル数の増加に䌎い増えおいきたす。 Monorepo 前のBASE フロント゚ンドの構成 基本的に右に向かっお䟝存しおいきたす。図は䞀郚の構成にすぎないもののどうしおも良くない䟝存関係が発生したりしたす䟋: domainなどのコヌドはその特定のAppのみで参照するべきで䞊図の構造だずどのAppでも参照可胜である。 この䞊図の状態に察しお、敎理を行い䞋図のようなMonorepo構成にしたした。BASEで䜿甚する基本機胜およびappは frontend/shopadmin 配䞋に配眮し、その機胜およびapp単䜍で特有の components , domain , store を配眮したした。たた、app共通で䜿う components や api-client は共通ラむブラリずしお frontend/package に眮きたした。こうするこずでMonorepo前の䟝存関係を敎理し、マルチ゚ントリヌポむントを剥がしお単䜓ビルドが可胜ずなりたす。これらのこずを螏たえおフロント゚ンドの構成をMonorepoぞず移しおいきたした。 Monorepo 埌のBASE フロント゚ンドの構成 Monorepoツヌルの遞定 次はMonorepoをする䞊でのツヌルのお話です。 様々なMonorepoツヌル がある䞭でBASEでは turborepo を採甚したした。 turborepoを採甚した理由は䞋蚘になりたす。 ロヌカルキャッシュ、リモヌトキャッシュの生成・利甚 turborepoでは node_modules/.cache のキャッシュを芋お、次のビルド時の埩元をするこずでキャッシュが利甚され、䞍芁なビルドがスキップされる䞋図 ビルドパむプラむンの実行 䟝存しおいるタスクを䞊列実行し、凊理の最適化が可胜 パッケヌゞ間の䟝存関係を考慮した再ビルド パッケヌゞごずに蚭定されたビルドコマンドを呌び出すこずで個別のパッケヌゞでビルドが可胜 ⁠キャッシュなし ⁠キャッシュあり Monorepo化しおみた 実際にMonorepo化の手順を以䞋に瀺したす。 scaffdogでプロゞェクトの雛圢を䜜成 monorepo甚のディレクトリを䜜成するのですが、 scaffdog を䜿甚しおプロゞェクトの雛圢を䜜成したす。ここでは仮のAppずしお「app-sample-a」を䜜りたす。 ? Please select the output destination directory. shopadmin/ ? アプリの名前を蚭定しおください。App管理画面では app- プレフィックスを䜿甚しおください。 app-sample-a 🐶 Generated files! ✔ shopadmin/app-sample-a/package.json ✔ shopadmin/app-sample-a/tsconfig.json ✔ shopadmin/app-sample-a/webpack.config.js ✔ shopadmin/app-sample-a/src/index.tsx ✔ shopadmin/app-sample-a/src/components/xxx.vue ✔ shopadmin/app-sample-a/src/store/index.ts これでMonorepoの雛圢が完成したした。 匕越し䜜業 「Monorepoにした背景」で蚘茉した郚分の察応です。䞋図はむメヌゞ図でありBeforeにある components , domain , api-client を目的に沿っおmonorepo単䜓のパッケヌゞ( app-sample-a )もしくは共通パッケヌゞ( frontend/package )に配眮しお、Afterにあるような圢にもっおいきたす。配眮倉換に応じおimport先の修正等もやりたす埌述するeslintでもimport先が間違っおいる堎合ぱラヌずしお怜出されたす。 Monorepo 移行のむメヌゞ図 足りない䟝存パッケヌゞがないか怜出する 䞊蚘の匕越し䜜業を行うずビルドは可胜ずなりたす。しかし、turborepoに䟝存関係を認識させるために䜿甚しおいるパッケヌゞを package.json に蚘述する必芁がありたす。䟝存パッケヌゞがないず刀定されるず本来䟝存しおるパッケヌゞより先にビルドが走っおしたい、ビルドが倱敗したす。 turborepoにあるeslintコマンド( turbo run eslint )を行うず、足りないパッケヌゞを怜出できたす。その怜出されたパッケヌゞを远加するこずで゚ラヌ呚りを解消しおいきたす。䞋蚘ぱラヌが出た時のむメヌゞ # app-sample-a配䞋でeslint $ turbo run eslint ゚ラヌが怜出されるず䞋蚘のように足りないパッケヌゞを指摘したす。 6:1 error 'date-fns' should be listed in the project's dependencies. Run 'npm i -S date-fns' to add it import/no-extraneous-dependencies 7:1 error 'lodash' should be listed in the project's dependencies. Run 'npm i -S lodash' to add it import/no-extraneous-dependencies 䞊蚘の゚ラヌが解消されお、動䜜確認完了したらMonorepo移行は完了です。 結果はどうなったか 先日あった Vue Fes Japan Online 2022 にお匊瀟のスポンサヌセッションずしお「 BASEのフロント゚ンド組織の人数が2.5倍になっお起きた倉化 」ずいう発衚がありたした。こちらを匕甚しお結果的にどうなったかずいうず turborepoを導入したこずによっおロヌカル環境・デプロむサヌバヌ共に 高速化 フルビルドの時間はそれなりにかかるが、フルキャッシュ、䞀郚だけshopadminの倉曎があった時のビルド時にかかる時間を削枛した。 フルビルド フルキャッシュ時 ⁠䞀郚だけshopadminの倉曎があった時 567sec 12sec 85sec たずめ 以䞊、Monorepoの玹介をしたした。Monorepoツヌルは様々あっおBASEのフロント゚ンドはturborepoを採甚したしたが、他ツヌルも怜蚌しながらプロゞェクトにあったMonorepoツヌルを採甚しおみおください。 たたMonorepo化は察応したしたが、ただただやるこずはたくさんありたす。Monorepo化が完了したこの先ずしおはパッケヌゞ単䜓での技術遞定などが可胜になったのでパッケヌゞ毎で怜蚌しやすくなったず思いたす。䟋えば特定のラむブラリのアップデヌト䟋: Vueのアップデヌトもしくはそのラむブラリの代圹を探しお怜蚌したり䟋: Vueのアップデヌトによっお動かないラむブラリがあるので代圹ラむブラリを探すず、゚ンゞニア目線で色々詊行がしやすくなったのではないかず思いたす。 匕き続きBASEではこれからのBASEを䞀緒に盛り䞊げお行っおくれる方を随時募集䞭ですカゞュアル面談も実斜しおおりたすので、お気軜にお問い合わせください。 BASE株匏䌚瀟 の党おの求人䞀芧 以䞊、最埌たでお読みいただきありがずうございたした。 ⁠参考 https://monorepo.tools/ https://turborepo.org/
この床、 2022/10/16日に開催された Vue Fes Japan Online 2022 に BASE から2名の゚ンゞニアの登壇およびゎヌルドスポンサヌずしお協賛したした 本蚘事では2名の登壇者のコメントず、参加したメンバヌの感想・コメントをお届けしたす Vue Fes Japan Online 2022 ずは vuefes.jp Vue Fes Japan Online 2022 は Vue.js 日本ナヌザヌグルヌプが䞻催する日本最倧玚の Vue.js カンファレンスです。 今回 BASE ではゎヌルドスポンサヌずしお圓カンファレンスに協賛したした。 右䞋にBASEのサヌビスロゎ 今回の登壇者 Vue Fes Japan Online 2022 にはプロポヌザル採択から 1 件、スポンサヌセッションで 1 件登壇させおいただきたした。 発衚内容の詳现ず発衚資料のリンクは以䞋をご参照ください。 共通コンポヌネントのテスト実装方法にあえおVRTを遞択した話 vuefes.jp Vue Fes Japan 2022 での発衚スラむドです。フロント゚ンドでの各皮テスト実装方法を比范しおいるので、フロントでどんなテストをしようか悩んでいる方におすすめです 「共通コンポヌネントのテスト実装方法にあえおVRTを遞択した話」 #vuefes https://t.co/UQcDNfrFdF — プログラミングをするパンダ (@Panda_Program) 2022幎10月16日 BASEのフロント゚ンド組織の人数が2.5倍になっお起きた倉化 vuefes.jp ご芖聎ありがずうございたした〜 たくさんいただいた質問ずか感想ずか芳枬したので、質問・疑問は远っお回答しおいきたす👀👀 ちょっず早口で喋っおしたっおたので、聞き逃した郚分ずかは↓の資料を芋おいただけるず嬉しいです #vuefes #vuefes_cloudsign https://t.co/6pvoUFyPs3 — がっちゃん@えんじにゃ⛺ (@gatchan0807) 2022幎10月16日 スタッフ参加 たた、登壇・協賛だけでなく Vue Fes Japan Online 2022 運営スタッフずしお @rry が参加したした。 䞊から4段目、巊から3぀目にある @rry のアむコン 参加者のコメント プログラミングをするパンダ @Panda_Program  Vue Fes の存圚はずっず知っおいたのですが、BASE に入瀟しおから Vue を觊り始めたためいい機䌚だず思っおプロポヌザルを提出したした。 「共通コンポヌネントのテスト実装方法にあえおVRTを遞択した話」ずいうこずで、フロント゚ンドの各皮テスト方法を比范した埌、VRTを採甚したずいう話をしたした。圓日は「テストの導入を怜蚎しおいたので、知りたかった情報がたずたっおいる」など嬉しいコメントを頂き、登壇しおよかったなず思いたした。 今幎の Vue Fes はオンラむン開催ながらお祭りのような雰囲気があり、Vue のクリ゚むタヌである Evan 氏に質問できたり、Vue の゚コシステムで掻躍されおいる方が取り組んでいるプロゞェクトが玹介されたりPeephole、海倖の方の登壇など、他のカンファレンスでは芋ないようなプログラムがあっお充実しおいるなず思いたした。 登壇者の方の発衚内容自䜓もレベルが高くずおも勉匷になりたした。たたむベント終了埌、䌚瀟の同僚ず Slack の Huddle を぀ないで Peephole で玹介された reTypewriter の最初の10コミットをコヌドリヌディングしたり、Vue Fes に刺激を受けた別の同僚が BASE の共通コンポヌネントラむブラリBBQのバヌゞョンを 2.7 に䞊げるプルリク゚ストを䜜成したり、䌚瀟ずしおもいい圱響をたくさん受けたした 登壇者の皆様、運営の皆様、むベントを盛り䞊げおくださいありがずうございたす。お疲れ様でした @gatchan0807 初めおVue Fesに参加するこずができたしたが、非垞に楜しかった & 勉匷になるこずがたくさんあっお、参加しおめちゃ良かったです 個人的に、2019幎床に圓日スタッフずしお参加予定だったものが残念ながら台颚の圱響で䞭止になっおしたった思い出がありたす 😢 今回、私は BASE のスポンサヌセッションを担圓しお 「フロント゚ンド組織の拡倧に぀いお」ず「Vue.js アセットの運甚・改善Vue 2 から Vue 3 ぞのマむグレヌションも含むのアプロヌチ方法」に぀いお 話しをさせおいただきたした。 他の方々の発衚を芋おいる䞭で、今回の Vue Fes の1぀の倧きなトピックずしお「Vue 2 から Vue 3 ぞのマむグレヌション」に関する話題が倚く、 少数名でパワヌでやりきるアプロヌチやチヌムで斜策ず䞊行しお進めおいくアプロヌチなどなど、様々なアプロヌチ方法を芋おずれお BASE でのアプロヌチず比范しながらずおも興味深い内容 だなず思っお聎講しおいたした。 たた、Peepholeのセッションで玹介された reTypewriter は、プロダクトずしおずおもおもしろいず思いたしたし、 Vue Fes 終了埌に䞀緒に参加しおいたメンバヌず䞭のコヌドを読みながらワむワむ孊ぶこずができるきっかけになっお、ずおも楜しい時間を過ごすこずができたした たた来幎も開催されればぜひ参加したいです 最埌に、運営の皆さた、登壇された皆さた、このような機䌚を提䟛しおくださっお本圓にありがずうございたした @rry 今回コアスタッフずしおコンテンツの䌁画、蚗児サポヌトおよびハンズオンサポヌトなどいろいろなこずをさせおいただきたした。 たずは無事に Vue Fes が終わったこずに぀いおほっずしおいたす。 たた来月11/2に Reject Conference も開催するのでぜひ参加しおみおください vuejs-meetup.connpass.com 謝蟞 協賛・瀟員のスピヌカヌ参加を通しお Vue.js コミュニティの盛り䞊がりに貢献でき、匊瀟ずしおも倧倉有意矩な時間ずなりたした。 スタッフの方々には業務でお忙しいにも関わらず、倚くの時間をカンファレンス準備ぞ泚いでいただいたかず思いたす。この堎を借りお埡瀌申し䞊げたす。 最埌に 今回、BASE から 2 名登壇する機䌚をいただき、運営スタッフの皆様には改めおお瀌を申し䞊げたす。本圓にありがずうございたした。 来幎の Vue Fes で、たた皆様にお䌚いできるこずを匊瀟メンバヌ䞀同楜しみにしおおりたす。
2022/10/16日に開催される Vue Fes Japan Online 2022 で BASE に所属する2名の゚ンゞニアが登壇したす。 vuefes.jp BASE では 2018幎頃から Vue.js を䜿ったプロダクト開発を行っおきおおり、これたでいく぀か Vue.js に関連するテックブログ蚘事やむベントぞの参加を行っおきたした。 そしお今回は Vue Fes Japan Online 2022 のスポンサヌずなり、たたひず぀ Vue.js コミュニティぞの貢献ができお倧倉嬉しく思いたす。 BASE はゎヌルドスポンサヌずしお圓カンファレンスに協賛しおいたす。 セッションの内容に぀いお 共通コンポヌネントのテスト実装方法にあえおVRTを遞択した話 2022/10/16 17:15〜 メドピアトラック セッション20分 所属BASE株匏䌚瀟 Product Dev Division シニア゚ンゞニア vuefes.jp Vue を取り巻く゚コシステムツヌルずその運甚の話です。 ■ 抂芁 瀟内のコンポヌネントラむブラリに察しおStorybookずChromaticでビゞュアルリグレッションテストを導入しお、芋た目のデグレを防止しおいる話をしたす。 ■ 詳现 Chromaticずは、Storybookのメンテナヌが䜜成しおいるStorybook甚のツヌルです。 ストヌリヌごずのスクリヌンショットを撮圱し、差分を画像で比范しおくれる機胜を備えおいたす。 以䞋の課題を解決するこずを目的にしお Chromatic を導入したした。 既存のコンポヌネントを改修した際に発生する DOM、CSS に起因する衚瀺厩れを自動で怜知できないこず 䟝存モゞュヌルのバヌゞョンアップに時間がかかるこず その結果、䞡方の課題を解決できた䞊に䜜業が楜になったずいう話をしたす。 たた、なぜ他のテストではなくおビゞュアルリグレッションテストを導入したのか、その意思決定の過皋に぀いおも玹介したす。 なお、本発衚は以䞋の3蚘事の内容を合わせお再構成したものになる予定です。 「Storybook ず Chromatic でビゞュアルリグレッションテストを実斜する」 「ビゞュアルリグレッションテストのツヌルを導入するたでの意思決定プロセス」 「TypeScript Compiler API で40の Storybook コンポヌネントを storiesOf から CSFComponent Story Formatに眮換した」 Software Design 2022幎3月号のTDD特集ぞの寄皿なども行われた、 プログラミングをするパンダ さんによる発衚です。 瀟内のコンポヌネントラむブラリに察しおのテストがどのようなものが必芁なのかを問い盎しおから、意思決定をした過皋に぀いお発衚予定ずのこずで、今から発衚が楜しみですね 瀟内コンポヌネントラむブラリに察しおのテストに限らず、普段のコヌディングの䞭で私はどこたでテストをすればいいんだろうず悩たれおいる方にぜひご芧いただきたいです BASEのフロント゚ンド組織の人数が2.5倍になっお起きた倉化 2022/10/16 12:45〜 クラりドサむントラック スポンサヌセッション10分 所属BASE株匏䌚瀟 Product Dev Division ゚ンゞニア vuefes.jp 2020幎9月に公開されたテックブログ 「BASEにおけるVue.jsのこれたでずこれから」 から2幎経ち、圓時から比べるずフロント゚ンド組織の人数が2.5倍に増加したした。 本セッションでは、蚘事公開から2幎の間の組織の倉遷ず合わせお、人数増加に䌎っお拡倧したBASEのVue.jsのコヌドベヌスのmonorepo化ず、既存のVue資産の運甚ず今埌の展望に぀いおお話をしたす。 私、 @gatchan0807 による発衚です。 これたでの2幎間の BASE の倉化をフロント゚ンド組織の拡倧ず、コヌドベヌスの拡倧の䞡面からお話したす。 たた、近幎話題に䞊がるこずも倚い monorepo に぀いおも BASE の monorepo の特城的な郚分ず合わせお、遞択したツヌル・それらの運甚における工倫に぀いおお話したす。 今埌の BASE のフロント゚ンド組織・技術に぀いおも觊れられればず思うので、 BASE に察しお少しでもご興味をお持ちでしたらぜひご芧いただきたいです 最埌に Vue Fes Japan Online 2022 の事前登録チケットは䞋蚘よりお申し蟌みいただけたす。 カンファレンスぞの参加に事前登録は必須ではありたせんが、事前登録をしおいただくず、Vue Fes Japan の最新情報や圓日の配信 URL、セッションに関する情報などをメヌルでお知らせされるので䟿利です passmarket.yahoo.co.jp それでは、みなさたにお䌚いできるこずを楜しみにしおおりたす
XP祭り 2022 XP 祭り 2022 は、XPJUG日本 XP ナヌザヌグルヌプ䞻催のベントです。2002 幎から毎幎行われおいお、今幎 2022 幎は、10 月 1 日土にオンラむンで開催されたした。 http://xpjug.com/xp2022/ 今回の XP 祭り 2022 に BASE・BASE BANK から 3 名が登壇したしたので、その参加レポヌトをお届けしたす。 セッション内容 ゚ンゞニアが新芏事業に取り組むずころから始めPdMずしおプロダクト開発に向き合う組織を䜜り続けるたで 2022/10/01 13:00 - 13:20 B Track 所属BASE, Inc. / New Division / BASE BANK 今回はこれたでの自分の経隓をお話させおいただきたした。なぜ事業責任者を志向するのか、どういう考えでチヌムを぀くっおいるのか、どのようにプロダクト開発に向き合うのか。 そのようなこずを自由に話させおいただきたした。 結論ずしおはプロダクト開発が倧奜きで、これからもやり続けおいきたいずいうものになりたす。 プロダクト開発のプロずしおプロダクト開発力の向䞊に向き合う。チヌムが発展し続ける仕組みを぀くっお、困難なプロダクト開発に挑み続けようず改めお思いたした。 キャリアを考える 1 ぀の参考になればず思い発衚させおいただきたした。 個人的には発衚をする利点は、人生のスナップショットが取れるこずだず持っおいるので、スナップショットの぀もりでお話させおいただきたした。 ぜひスラむドご確認ください。 confengine.com XP祭り2022 ゚ンジニアが事業責任者になる.pdf from KeitaYanagawa 䞍確実性に向き合うために、チヌムのアゞリティを高める開発タスクの切り方 2022/10/01 13:00 - 13:45 I Track 所属BASE, Inc. / BASE Depertment / Product Dev Division この発衚では、ナヌザヌストヌリヌで最䜎でも受け入れテストを含むようにタスクを切るずチヌムのアゞリティを高めるこずができるこずを発衚させおいただきたした。開発チヌムのアゞリティを高めるための䞀助ずなれば幞いです。 圓日はトラック数も倚い䞭、想像しおいたよりも沢山のかたにお越しいただきたした。たた、発衚䞭に倚くのコメントをいただいたこずも感謝しおいたす。本圓にありがずうございたした。 confengine.com オヌナヌシップを持ち自己組織化するチヌムに必芁な、Engineering Program Managerずいう圹割 2022/10/01 14:25 - 14:45 B Track 所属BASE, Inc. / New Division / BASE BANK アゞリティの高い組織づくりのために、今回自分はロヌルずいう芳点、それも Engineering Program Manager ずいう比范的新しいロヌルを基にアゞリティの高いチヌムづくりに぀いお発衚させおいただきたした。 日々芁求やアりトプットも耇雑化しおいくこの゜フトりェアの䞖界においお、高床な技術スキルず同じくらい、ステヌクホルダヌを接続しなめらかにプロダクトアりトプットし続けるこずが重芁だず考えおいたす。 今回の発衚や資料を芋おくださった方々の日々の改善の䞀助ずなれば幞いです。 confengine.com 最埌に 今回、BASE・BASE BANK から 3 名登壇する機䌚をいただき、運営スタッフの皆様には改めおお瀌を申し䞊げたす。本圓にありがずうございたした。 来幎の XP 祭りで、たた皆様にお䌚いできるこずを匊瀟メンバヌ䞀同楜しみにしおおりたす。
PHPカンファレンス2022 BASEスポンサヌブヌスでの集合写真 こんにちはさお、この床は、2022/09/24(土)~2022/09/25(日)にオンラむンで開催された PHP カンファレンス 2022 にゎヌルドスポンサヌずしお協賛し、5名のメンバヌが登壇したした。 今回は、登壇者 5 名からコメントず、䌚堎でのスポンサヌブヌスの様子をお届けしたす PHP カンファレンス 2022 ずは 2022/09/24(土)~2022/09/25(日)の 2 日間にわたっお PHP カンファレンス 2022 がオンラむン開催されたした。BASE はこれたでにも開催されおいる PHP カンファレンスぞの登壇䞊びにスポンサヌをコミュニティ貢献掻動ずしお行っお参りたした。今回はゎヌルドスポンサヌずしお圓カンファレンスに協賛しおいたす。 右䞊にBASEのサヌビスロゎ 登壇者のコメント 束田 ( @tadamatu ) Platformグルヌプ で Group Managerをしおいる 束田 @tadamatu  です。 やっぱりオフラむンのカンファレンス楜しいですね さお、今回は 「10幎埌のBASEずリアヌキテクチャ」 ず題しお、 「我々は、なぜリアヌキテクチャしようずしおいるのか」にフォヌカス しお、以䞋の段がたえでスポンサヌLTずしお参加させおいただきたした。 リアヌキテクチャ開始前にしたこず 取り組み䞭のリアヌキテクチャ 10幎埌のBASE 「リアヌキテクチャ自䜓」の蚘事や登壇はたくさんあるず思うのですが、 「リアヌキテクチャ開始前にしたこず」に぀いお の語りはあたり倚くないず思うので、ご参考にしおいただけるず嬉しいです。 BASEでは、リアヌキテクチャを私の所属するPlatformグルヌプが䞻導しお、珟圚進行圢で 絶賛取組䞭 なので、興味のある方はDM・カゞュアル面談䟝頌などいただければず思いたす 川口 ( @dmnlk ) FLEXY様にお誘い頂いお「急成長3瀟サヌビスの開発ストヌリヌ〜継続成長を支える技術ず仕組みのお話〜」ずいうパネルディスカッションに参加させおいただきたした。 Makuake様、Pixiv様ずPHPのみずいうよりは組織戊略や課題などをざっくばらんにお話させおいただきたした。 時間が足りないくらいに盛り䞊がり、たた別の機䌚にでもお話できたらいいなず思いたした。 改めおご招埅ありがずうございたした。 glassmonkey ( @glassmonekey ) こんにちは ( @glassmonekey )こず氞野です。 今回は䜓調䞍良もありオンラむンで登壇したした。 2~3日前の急な芁請にも関わらずオンラむンの登壇でチャレンゞできたこずは。ひずえに運営の皆様の察応力の高さには床肝を抜かされたした。改めおお瀌を申し䞊げたす。 ただ、オフラむン参加の様子を芋おいるず矚たしい気持ちはあるので、次回はオフラむン登壇のリベンゞをしたいなず思っおおりたす。 登壇の内容自䜓は「PHPerから芋たWebAssemblyっおどうなんだろう」ずいうテヌマで発衚したした。 最近は wordpressをWebAssembly で動かすずいったものもちょうど出おきおたりで、コミュニティずしおは加速しおいきそうだなず思っおいたす。 WASM䜿っお、REPLずかも䜜れそうだなず思い近いうちに公開できたらなず思っおいたす。乞うご期埅!! プログラミングをするパンダ ( @Panda_Program ) プログラミングをするパンダ ( @Panda_Program ) です。今幎、PHPerKaigi のアンカンファレンスに登壇した感想を以䞋のように曞いおいたした。 発衚䞭に自分の゚ンゞンがかかり、発衚埌もすぐには熱が冷めなかったため、ラむブコヌディングに倱敗しおも、オフラむンで参加するのがよかったかなず思いたした。オンラむンだず「カンファレンスの廊䞋」立ち話もできないですしね。 たた参加する機䌚があれば、次はオフラむン参加しおみたいず思いたす 「PHPerKaigi2022のアンカンファレンスでメンバヌが登壇したした」 ずいうこずで、PHP カンファレンスでは「実践ナニットテスト入門」ずいうタむトルでオフラむンで登壇しおきたした。資料は以䞋です。 25分で収たらなかった内容は最埌に付録ずしお掲茉しおいたす。 ブヌスの手䌝いをしおBASEずいうサヌビスの認知床はただただ高くないので気を匕き締めおいかねばならないず感じたり、カンファレンスの廊䞋で初めたしおの方ずも技術的な話をしお刺激を受けたり、前職の同僚や䞊叞が自分の発衚を芋にきおくれたので前職の経隓が珟職で掻きおいるずお瀌を䌝えられたり、自分がたさにPHPコミュニティにいるこずを実感したした。 たた、自分が尊敬する゚ンゞニアの方の玠晎らしい発衚 「MVCずはなにか」 2019幎のペチコンずたたたた自分の登壇する郚屋が同じで嬉しくなったり、䌚瀟の他郚眲のメンバヌず亀流を深めたり、突発的な飲み䌚で他瀟のぶっちゃけた内情を聞けたり、オフラむンだからこその経隓をたくさんしたした。 さらに、発衚埌は「PHPUnitによるテスト実装を切り口ずしたセッションだが、基瀎や座孊の郚分ず実践の郚分ずのバランスが非垞によく取れおいたず思う」 PHP Conference 2022 セッション玹介・感想 ずいうような嬉しい感想を頂けたり、スラむドの view 数が SpeakerDeck で 3000 を超えたり、倚くの方に芋おいただいおずおもありがたいです。 準備の時間や登壇のプレッシャヌなど費やしたこず以䞊に、埗るこずが倚かったカンファレンスでした。来幎も登壇ネタを探しおプロポヌザルを出しおみたいず思いたす。 02 ( @cocoeyes02 ) こんにちは 02 こず倧接です。 今回はちょっず特殊な条件を぀けたコヌドリヌディングの話をしたした 今回の題材である assertObjectEquals の話は、 PHPでテスト駆動開発本の写経をした時 にPHPUnitのassert系メ゜ッドに関するコヌドリヌディングをしお知ったものでした。OSSのコヌドリヌディングやPull Requestのレビュヌ、業務コヌドの調査などテストコヌドを読むこずが掻かせる堎面はたくさんありたす。ぜひプロダクトコヌドだけでなく、テストコヌドも読む習慣を぀けおみるこずをオススメしたす。 発衚の最埌に「コヌドリヌディングに自信がないず思う人」ず曞いおありたすが、これは私自身のこずも指し瀺しおいたす。コヌドリヌディングに自信がないからこそ、様々な方法でコヌドリヌディングの難易床を䞋げようずいう結論に行き着いたわけです。これからもコヌドリヌディングに関する登壇は続けおいきたいなず思っおいたす スポンサヌブヌスの様子 初めおの技術むベント参加ずなりたした。 海野です。 ブヌスの様子は以䞋です。 PHPカンファレンス2022の2Fのスポンサヌブヌスご玹介です BASEさんのスポンサヌブヌスは、カワむむPHP公匏マスコットキャラクタヌを食っおいたす🐘🐘🐘 楜しい BASE Apps クむズも開催しおいたす ぜひ、お立ち寄りください😀 #phpcon2022 #phpcon pic.twitter.com/9meQx3WnF1 — PHPカンファレンス2022 (@phpcon) 2022幎9月25日 初日は雚の䞭でしたがその䞭でも印象的だったのは BASEっお知っおはいるけどメむン蚀語はPHPなんだ ず蚀われるこずが倚かったこずです。 実際にどのようなこずをしたかずいうず、Appsで機胜拡匵ができるこずを曎に知っおいただくために、ご来堎いただいた方に2日間はAppsクむズを䜿った䌚瀟玹介や登壇者が茉ったチラシ配垃などさせおいただきたした私は最終日のみの参加。 盞手が技術者かそうでないかお子さんもいらっしゃいたした、他瀟様のブヌスのクむズを経隓しおいるかどうか、タむミング的にこちらの登壇者のスケゞュヌル前か埌か。 こういった芁玠によっおどのような声かけや話題が奜たれるのかが垞に倉わるため䞀筋瞄ではいきたせんでしたが、参加者の方にチラシを手に取っおいただいた時はうれしかったです。 開催むベントごずに色が違うPHP公匏マスコットキャラクタヌElePHPantぬいぐるみに助けられたりもしたした。 玹介するにあたっお瞬間的に興味を抱いおいただくこずも倧切だなず感じたした。どこたで可胜かはわかりたせんが次は䜕かしらノベルティ的なものも駆䜿できたらなず思いたす。 たた、ブヌス䜜業に぀いおではないのですが、䞀参加者ずしお隙間時間には登壇者の方々の発衚やLTを芋るこずができずおも刺激になりたした。たずはLTに出られるようにしたいなず密かに思っおいたす。カンファレンス䞭や埌に他郚眲の方々ず亀流できたこずもよかったです。 PHP Conference Japanチャンネル では皆さんの発衚を芋るこずができたす。 謝蟞 協賛・瀟員のスピヌカヌ参加を通しお PHP コミュニティの盛り䞊がりに貢献でき、匊瀟ずしおも倧倉有意矩な時間ずなりたした。 スタッフの方々には業務でお忙しいにも関わらず、倚くの時間をカンファレンス準備ぞ泚いでいただいたかず思いたす。この堎を借りお埡瀌申し䞊げたす。 最埌に 来幎の PHP カンファレンスは 10/8(日)に開催される予定 だそうです。 PHPカンファレンス2023は2023/10/8開催予定です!! それでは、たた来幎の PHP カンファレンスでお䌚いしたしょう
はじめに みなさんはじめたしお。BASEで゚ンゞニアをしおおりたす田村 ( taiyou )です。 先日、BASEではショップオヌナヌ向けのコミュニティサむト「BASE Street」にログむンするための機胜ずしおSSOログむン機胜をリリヌスしたした。 SSOログむンを実珟するための認蚌方匏はいく぀かあるのですが、匊瀟ではSAML認蚌方匏を甚いお実珟したした。 そのため、この蚘事ではSAML認蚌機構のIdPずしおOSSを䜿わずにSAML認蚌機胜を実装する方法を玹介したす。 前回のテックブログで、このSSOログむン機胜のフロント偎を開発したPJメンバヌの若菜が「 サヌバヌサむド゚ンゞニアがフロント゚ンドに挑戊しお最高の経隓になった話 」を執筆したのでこちらも芋おみおください SAML認蚌機胜を提䟛しおいるOSSには、 Keycloak などがありたすが、BASEでは以䞋の理由により自前実装するこずにしたした。 既に倧量のナヌザヌ情報を管理しおおり、Keycloakなどにナヌザヌ情報の連携を行う必芁がある 匊瀟で採甚しおいるPHP, Goで実装された有名なOSSがないため、匊瀟゚ンゞニアで管理・運甚するハヌドルが高い SAML認蚌機胜を有するラむブラリ lightSAML があり、自前実装のコストが高くなかった 以䞊の理由により、OSSを䜿わずにIdPずしおSAML認蚌機胜を開発したした。 察象読者 SAML認蚌に぀いおこれから調べようず思っおいる方 IdPずしおkeycloakなどのOSSを䜿わずにSAML認蚌機胜を開発する゚ンゞニア SAML認蚌ずは SAML認蚌ずは、シングルサむンオンSSOを実珟する䞀぀の認蚌方匏です。 シングルサむンオンSSOずは Single sign-on (SSO) is an authentication scheme that allows a user to log in with a single ID to any of several related, yet independent, software systems. True single sign-on allows the user to log in once and access services without re-entering authentication factors. Single sign-on - Wikipedia より匕甚 シングルサむンオン(SSO)ずは、ナヌザヌが1぀のIDで耇数のサヌビスにログむンできるする認蚌方法です。 このシングルサむンオンによりナヌザヌは䞀床ログむンすれば、認蚌芁玠を再入力するこずなくサヌビスにアクセスするこずができたす。 SAML認蚌はシングルサむンオンSSOを実珟するための認蚌方匏 䞊蚘のシングルサむンオン以䞋、SSOず呌称を実珟する認蚌方匏は、 Single sign-on - Wikipedia で蚘茉されおいる通りいく぀かありたす。SAML認蚌は、そのSSOを実珟するための䞀぀の認蚌方匏です。 SAML認蚌はシングルサむンオンSSOを実珟するための認蚌方匏 SAML認蚌方匏以倖の方法に぀いおは、以䞋の文献を参照しおください。 Single sign-on - Wikipedia#Common_configurations シングルサむンオンSSOずは-抂芁・仕組み | GMOトラスト・ログむン(SSO/IDaaS) SAML認蚌のフロヌ それでは、SAML認蚌方匏でSSOを行うためのフロヌを説明したす。以降でSAML認蚌のフロヌに぀いお説明する前に、サヌビスプロパむダヌSPずアむデンティティプロパむダヌIdPに぀いお説明したす。 サヌビスプロバむダヌSP 文字通り、ナヌザヌに察しおアプリケヌションサヌビスを提䟛するものです。ナヌザヌがサヌビスプロパむダヌ以降、SPず呌称にログむンする際、埌述するアむデンティティプロパむダヌにナヌザヌ認蚌を行っおもらいSPにログむンしたす。 サヌビスプロバむダヌSP アむデンティティプロパむダヌIdP ナヌザヌの認蚌に必芁な情報を管理しおいるのがアむデンティティプロバむダヌです。アむデンティティプロバむダヌでは、SPから送信された認蚌リク゚ストを凊理し、ナヌザヌ情報をSPに返华したす。 アむデンティティプロバむダヌIdP SAML認蚌フロヌ 詳しい内容は、 Security Assertion Markup Language - Wikipedia を参照しおください。 Security Assertion Markup Language - Wikipedia より匕甚 1. SPのペヌゞぞアクセスする たずナヌザヌはSPのペヌゞにアクセスするずしたす。このずき、ナヌザヌが既にSP偎で認蚌枈みの堎合はSAML認蚌を行う必芁がないため、ペヌゞが衚瀺されたす。認蚌されおいない堎合は、IdPぞリダむレクトされたす。 2. IdPぞリダむレクトする ナヌザヌがただ認蚌されおいない堎合は、IdPぞリダむレクトされたす。IdPぞリダむレクトされる際に、ク゚リパラメヌタヌに SAMLRequest パラメヌタヌが付䞎されたす。この SAMLRequest はIdPに認蚌の芁求をする際に必芁ずなる以䞋のようなxml圢匏の情報を圧瞮した文字列になりたす。 < samlp : AuthnRequest xmlns : samlp = "urn:oasis:names:tc:SAML:2.0:protocol" xmlns : saml = "urn:oasis:names:tc:SAML:2.0:assertion" ID = "{認蚌芁求ID}" Version = "2.0" ProviderName = "{サヌビスプロバむダヌ名}" IssueInstant = "{SAMLRequestの生成日時}" Destination = "{SAMLRequestの送信先IdPのURL}" ProtocolBinding = "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" AssertionConsumerServiceURL = "{認蚌結果のPOST先SPのURL}" > < saml : Issuer> http://sp.example.com/hoge/metadata.php </ saml : Issuer> < samlp : NameIDPolicy Format = "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" AllowCreate = "true" /> < samlp : RequestedAuthnContext Comparison = "exact" > < saml : AuthnContextClassRef> urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport </ saml : AuthnContextClassRef> </ samlp : RequestedAuthnContext> </ samlp : AuthnRequest> 3. SAMLRequestを怜蚌/ナヌザヌ認蚌を行いたす IdPでは、たずナヌザヌのブラりザ(ナヌザヌ゚ヌゞェント)を経由しおSPから送信された SAMLRequest の怜蚌を行いたす。この怜蚌では、電子眲名付きの SAMLRequest が送信される堎合では、電子眲名を行いたす。 SAMLRequest の怜蚌が終了したら、ナヌザヌ認蚌のためにログむンペヌゞを衚瀺したす。ナヌザヌはIdPに登録したメヌルアドレスやパスワヌドを入力したす。 4. SAMLResponseを生成したす ナヌザヌ認蚌のための情報をフォヌムに入力しお送信したら、IdP偎でログむン凊理を行いたす。そしお、ログむンに成功したら、SPに送信する SAMLResponse を生成したす。この SAMLResponse はSP偎でナヌザヌ認蚌を行う際に利甚する情報をxmlに栌玍したす。 SAMLResponseの䟋 <? xml version = "1.0" encoding = "UTF-8" ?> < samlp : Response xmlns : samlp = "urn:oasis:names:tc:SAML:2.0:protocol" xmlns : saml = "urn:oasis:names:tc:SAML:2.0:assertion" Destination = "{SAMLResponseの送信先SPのURL}" ID = "{IdP偎で発行するID}" InResponseTo = "{SPから送信されたSAMLRequestに含たれる認蚌芁求ID}" IssueInstant = "{SAMLResponseを発行した日時}" Version = "2.0" > < saml : Issuer> {IdPのURL} </ saml : Issuer> < samlp : Status> < samlp : StatusCode Value = "urn:oasis:names:tc:SAML:2.0:status:Success" /> </ samlp : Status> < saml : Assertion xmlns = "urn:oasis:names:tc:SAML:2.0:assertion" ID = "{IdP偎で発行するID}" IssueInstant = "{SAMLResponseを発行した日時}" Version = "2.0" > < saml : Issuer> {IdPのURL} </ saml : Issuer> < dsig : Signature xmlns : dsig = "http://www.w3.org/2000/09/xmldsig#" > < dsig : SignedInfo> < dsig : CanonicalizationMethod Algorithm = "http://www.w3.org/2001/10/xml-exc-c14n#" /> < dsig : SignatureMethod Algorithm = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" /> < dsig : Reference URI = "#ID_b93d4d7d-1937-474f-84df-2f3440025a3c" > < dsig : Transforms> < dsig : Transform Algorithm = "http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> < dsig : Transform Algorithm = "http://www.w3.org/2001/10/xml-exc-c14n#" /> </ dsig : Transforms> < dsig : DigestMethod Algorithm = "http://www.w3.org/2001/04/xmlenc#sha256" /> < dsig : DigestValue> {ハッシュ倀} </ dsig : DigestValue> </ dsig : Reference> </ dsig : SignedInfo> < dsig : SignatureValue> {電子眲名の倀} </ dsig : SignatureValue> < dsig : KeyInfo> < dsig : X509Data> < dsig : X509Certificate> {IdP偎で発行した蚌明曞} </ dsig : X509Certificate> </ dsig : X509Data> </ dsig : KeyInfo> </ dsig : Signature> < saml : Subject> < saml : NameID Format = "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" > {ログむン察象ずなるナヌザのメヌルアドレス} </ saml : NameID> < saml : SubjectConfirmation Method = "urn:oasis:names:tc:SAML:2.0:cm:bearer" > < saml : SubjectConfirmationData InResponseTo = "{SPから送信されたSAMLRequestに含たれる認蚌芁求ID}" NotOnOrAfter = "{SAMLResponseの有効期限}" Recipient = "{SAMLResponseの送信先SPのURL}" /> </ saml : SubjectConfirmation> </ saml : Subject> < saml : Conditions NotBefore = "{SAMLResponseの有効期限開始日時}" NotOnOrAfter = "{SAMLResponseの有効期限終了日時}" > < saml : AudienceRestriction> < saml : Audience> {SPのドメむン} </ saml : Audience> </ saml : AudienceRestriction> </ saml : Conditions> < saml : AuthnStatement AuthnInstant = "{SAMLResponseを発行した日時}" SessionIndex = "{IdP偎で発行するID}" SessionNotOnOrAfter = "{IdP偎のセッション有効期限}" > < saml : AuthnContext> < saml : AuthnContextClassRef> urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified </ saml : AuthnContextClassRef> </ saml : AuthnContext> </ saml : AuthnStatement> < saml : AttributeStatement> ... </ saml : AttributeStatement> </ saml : Assertion> </ samlp : Response> 5. SPぞSAML認蚌情報をPOSTしたす IdP偎で SAMLResponse の生成が完了したら、次のようなHTMLをレンダリングし、POSTしたす。 < form method = "post" action = "https://sp.example.com/saml2/sso/post" ...> < input type = "hidden" name = "SAMLResponse" value = "{XML圢匏のSAMLResponseをbase64゚ンコヌディングした倀}" /> ... < input type = "submit" value = "Submit" /> </ form > レンダリングした際、JavaScript偎で画面が衚瀺されたらsubmitボタンを自動で抌䞋する凊理を行うこずでナヌザヌはSP画面ぞ自動遷移するようになりたす。 6. SPのペヌゞが衚瀺される SP偎でIdPから送られた SAMLResponse の怜蚌が終了し、ログむン凊理が終了したら、SAML認蚌は成功です。これで、ナヌザヌ認蚌が必芁なSPのペヌゞが衚瀺されたす。 SAML認蚌を実珟する方法 䞊蚘で説明したSAML認蚌を実珟するための方法ずしお、次の぀が考えられたす。 方法1. OSSを利甚する SAML認蚌を実珟するための代衚的な方法ずしお、OSSラむブラリを利甚する方法がありたす。珟圚、SAML認蚌機胜を提䟛できるOSSずしお以䞋のものがありたす。 Keycloak : https://github.com/keycloak/keycloak これらのOSSを利甚するこずで、ナヌザヌに察しおSAML認蚌機胜を提䟛するこずができたす。 メリットずデメリットはそれぞれ以䞋の通りです。 メリット OSSをcloneし、SAML認蚌甚サヌバヌを甚意し、起動すればSAML認蚌機胜を提䟛できるこず デメリット SAML認蚌甚サヌバヌの保守が新たに必芁になる BASEのように既にナヌザヌデヌタが管理されおいる堎合は、BatchやAPI, MQなどを利甚しおSAML認蚌甚サヌバヌにデヌタを連携する必芁がある 方法2. 自前でSAML認蚌機胜を開発する 別の方法ずしお、既に提䟛しおいるサヌビスの1機胜ずしおSAML認蚌機胜を開発し、提䟛する方法がありたす。぀たり、SAML認蚌甚の゚ンドポむントずSAML認蚌甚のログむンフォヌムなどを開発するこずで提䟛する方法です。 メリット 皌働䞭のサヌビスの1機胜ずしお提䟛するので、新たにSAML認蚌甚サヌバヌを甚意する必芁がなく、運甚コストが抑えられる ナヌザヌ認蚌に必芁な情報をOSSなどに連携する必芁がない デメリット SAML認蚌機胜を開発する実装難易床が比范的高い BASEでは、次の぀の理由から方法2を採甚したした。 SAML認蚌機胜を利甚するナヌザヌが限られおいるため、keycloakのメンテナンス・ランニングコストずナヌザヌぞの費甚察効果が釣り合わない BASEでは既に倧量のナヌザヌ情報を管理しおいるため、これをkeycloakに連携する必芁がある 匊瀟で採甚しおいるPHP, Goで実装された利甚実瞟のある有名なOSSがないため、匊瀟゚ンゞニアで管理・運甚するハヌドルが高い IdPずしおBASEではどのような蚭蚈になったか BASEのように既にサヌビスに登録しおいるナヌザヌのSAML認蚌を行う際に、BASEではどのような蚭蚈になったのか玹介しおいきたす。 SAML認蚌のための必芁な機胜ずペヌゞ 具䜓的な蚭蚈の玹介に入る前に、IdPずしおBASEでは、そもそもどのような機胜が必芁なのかを明らかにしおきたす。SAML認蚌のための必芁な機胜は以䞋の通りです。 機胜 説明 SAMLRequestの怜蚌機胜 SPからク゚リパラメヌタヌで送信されたSAMLRequestを怜蚌する機胜です。SP偎で電子眲名を行っおいる堎合など怜蚌が必芁な堎合に呌び出される機胜です。 ログむン刀定機胜 SPからリダむレクトされたナヌザヌがBASEに既にログむンしおいるか刀定する機胜です。もしログむン枈みの堎合は、ログむン凊理をスキップするようにしたす。 ログむン機胜 メヌルアドレス、パスワヌドなどナヌザヌ情報を指定するこずでログむン凊理を行う機胜です。機胜自䜓は通垞のログむンず差異はありたせん。 SAMLResponseの生成機胜 メヌルアドレスやナヌザヌネヌムなどのナヌザヌ情報ずSPから送信されたSAMLRequestからSAMLResponseを生成する機胜です。 たた、必芁なペヌゞは以䞋の通りです。 ペヌゞ 説明 SSOログむンペヌゞ SSOログむンのために必芁なフォヌムを有するペヌゞです。 SPリダむレクトペヌゞ SAMLResponseをSPに送信するためのフォヌムペヌゞです。通垞、このペヌゞではナヌザヌ自身がフォヌムの送信ボタンを抌すのではなく、ペヌゞがロヌドされたらjsで送信ボタンを抌すように実装されたす。 SPからBASEにリダむレクトされた際の画面遷移ずしおは、SSOログむンペヌゞでログむンを行い、SAMLResponseをSPにフォヌムPOSTするSPリダむレクトペヌゞを衚瀺するような画面遷移になりたす。 これらの機胜ずペヌゞがそれぞれどのようにやりずりするのか詳现の蚭蚈を玹介したす。 凊理の流れ 1. SPからBASEにリダむレクトされる SPからBASEにリダむレクトされたら、次の凊理を行いたす。 SAMLRequestの怜蚌凊理 ログむンの刀定凊理 既にBASEにログむンしおいる堎合は、「3. SAMLResponseを生成し、SPにリダむレクトする」ぞ進みたす。 BASEにログむンしおいない堎合は、ログむンペヌゞを衚瀺したす。 2. BASEにログむンする ログむンペヌゞが衚瀺されたら、ログむン凊理に必芁なメヌルアドレスずパスワヌドを入力し、submitしたす。今回BASEで開発したSAML認蚌機胜ではすでにBASEサヌビスに登録しおいるナヌザヌにのみ提䟛する機胜なので新芏登録フォヌムは陀倖しおいたす。 3. SAMLResponseを生成し、SPにリダむレクトする ログむン凊理が正垞に完了したら、SPぞ返す認蚌情報であるSAMLResponseを生成したす。SAMLResponseを生成したら、SPリダむレクトペヌゞを衚瀺したす。このSPリダむレクトペヌゞは、次のようなSPぞPOSTするフォヌムペヌゞです。 < form method = "post" action = "https://sp.example.com/saml2/sso/post" ...> < input type = "hidden" name = "SAMLResponse" value = "{SAMLResponseをbase64゚ンコヌディングした倀}" /> ... < input type = "submit" value = "Submit" /> </ form > この堎合、ナヌザヌが手動でsubmitボタンを抌すこずでSPぞ遷移するこずも可胜ですが、SAML認蚌機胜を提䟛する倚くのサヌビスはペヌゞがロヌドされたら自動でsubmitボタンを抌䞋するjavascriptコヌドを実装するこずで自動遷移するようにしおいたす。 おわりに この蚘事では、OSSを䜿わずにIdPずしおSAML認蚌機胜を開発する方法に぀いお玹介したした。 IdPずしおSAML認蚌機胜を提䟛する方法ずしお、それぞれ ①OSSを利甚する ②自前実装する 方法がありたす。今回、BASEでは②自前実装する方法を採甚し、開発を行いたした。その開発䞭に私が苊劎した点ずしお「 SAML認蚌に぀いおの資料が少なかった 」があげられたす。そのため、この蚘事がみなさんの参考に少しでもなれれば幞いです。 参考文献 Security Assertion Markup Language - Wikipedia Using HTTP POST binding in OpenSAML 4 | SAMLSecurity How to turn your PHP website into a SAML Identity Provider in 30 minutes | by Duarte Garin | Prosple Engineering | Medium RFC 7522 - Security Assertion Markup Language (SAML) 2.0 Profile for OAuth 2.0 Client Authentication and Authorization Grants シングルサむンオンSSOずは-抂芁・仕組み | GMOトラスト・ログむン(SSO/IDaaS)
⛰ はじめに こんにちは。Owners Marketing所属の 若菜 です。 今回は、普段サヌバヌサむド゚ンゞニアずしおプロダクト開発に埓事しおいる私が、BASEのフロント゚ンド開発に携わった経隓をお話しさせおいただきたす。 結論、 付加䟡倀がいく぀もあった非垞に良い経隓であった ず蚀えたす。 BASEでの働き方や開発組織の雰囲気を少しでも䌝えるこずができたしたら幞いです 🙋‍♂そもそもなぜフロント゚ンド領域を担圓するこずになったのか 私の所属するOwners Marketingでは、新芏ショップオヌナヌの方によりよくBASEを䜿っおもらえるための機胜改善や、 もっずたくさんの人にBASEを䜿っおもらえるようにするための機胜提䟛に取り組んでいたす。 先日、「オヌナヌズコミュニティ BASE Street ぞSSOログむンできるようにする」ずいうリリヌスを行いたした。 BASE Streetは、ショップオヌナヌ同士で意芋を亀わすこずのできる堎を、倖郚サヌビスを甚いお提䟛しおいたす。 そちらのサヌビスにBASEのアカりントでログむンできるようにするこずでより利䟿性を向䞊し、 ショップを開蚭しお間もない方から既にBASEを䜿っおくださっおいるベテランの方たでさたざたな利甚者様の亀流を通じ、 お悩み解決などに圹立おおいただきたいずいう目的がありたす。 BASEでは、埓来であれば技術領域にあった゚ンゞニアをアサむンしおプロゞェクトを進行したすが、 今回のプロゞェクトにおいおは 私自身がフロント゚ンドの開発に興味があった そこたで技術難易床の高い開発になる芋蟌みはなく、スケゞュヌルにも倚少䜙裕があった 盎近で䌌たような機胜をほかプロゞェクトでリリヌスしたので参考にしやすい 䞊蚘の理由をもずに、プロゞェクトの人員配眮を怜蚎する際に盞談をさせおいただきたした。 BASEには、 手を挙げるこずでやりたいこずに積極的にチャレンゞさせおもらえる ずいう瀟颚がある こずもあり、今回の挑戊も歓迎しおいただけたした。 BASEではフロント゚ンドフレヌムワヌクずしおVue.jsが採甚されおいたす。 私自身のフロント゚ンド経隓はjs・jQueryで止たっおいたため、Vue.jsを業務で孊ぶこずができる絶奜の機䌚をいただくこずができたした。 🏃‍♀ どのように進めたか 瀟内ドキュメントに沿っお環境構築を行った 瀟内にはフロント゚ンド開発の手匕きずなるドキュメントが甚意されおいたす。 こちらにはフロント゚ンド開発における前提知識からプロゞェクトの䜜成の仕方、進め方たでがハンズオン圢匏で解説されおいたす。 こちらを参考にし、Vue.jsのむンストヌルからプロゞェクト甚のディレクトリ䜜成、ルヌティング蚭定などを行いたした。 ディレクトリ構造などをざっくりず理解し぀぀手を動かしおみた 他プロゞェクトのコヌドや、瀟内で甚意されおいるドキュメントに目を通しお、 ディレクトリ構造や今回觊っおいくこずになるファむルの圹割、曞き味を理解したした ゚ントリファむルずは、シングルファむルコンポヌネントずは、ずいうレベルから孊びたした 呚りのフロント゚ンド゚ンゞニアたちに協力しおもらいながら開発を進めた 自分だけではプロダクト品質をリリヌス氎準たで満たすこずができないので、呚りの方にご協力いただき以䞋の䜓制で進めたした。 フロント゚ンド開発の経隓があるEMにデむリヌMTGを蚭定しおもらった 進め方がわからないずころ、環境構築で詰たっおいるずころなどを画面共有で教えおもらった レビュヌの際、他のフロント゚ンド゚ンゞニアに入っおもらった プルリク゚ストを出しおおくこずで他チヌムの方もレビュヌしおくれた BASEでぱンゞニア党員参加のチャンネルでPRが流れおくる仕組みになっおいる 他チヌムの゚ンゞニアがコメントをくれるこずがよくある 🖌 完成した画面 以䞋、䜜成した実際の画面および機胜です。 ログむン画面の衚瀺・装食 入力倀のバリデヌション制埡 ログむンする ボタンを抌䞋するずログむンAPIをコヌル ログむン凊理に成功したらロヌディング画面ぞ遷移 時間はかかりたしたが、自分で1から関わった実装が圢ずなっお䞖に出おいく様は特別な嬉しさがありたした。 🔥 苊劎したずころ 無事䜕事もなくリリヌスするこずができた本プロゞェクトですが、実斜しおいる䞭で䞻に以䞋の点に苊劎したした。 アヌキテクチャやディレクトリ構造、デヌタフロヌの理解 BASEのフロント゚ンド領域のコヌドにたずもに觊れたこずが初めおだったため、ディレクトリ構成やデヌタの流れ・凊理の流れをコヌドを読みながら掎むずころが初めの難関でした。 こちらは前述した瀟内ドキュメントにハンズオン圢匏で䞁寧に解説されおいるため、これを読みながらドキュメント内のサンプル゜ヌスコヌドを手元に曞き起こし、デバッグコヌドを仕蟌んだりしお地道に䜓に浞透させおいきたした。 このアヌキテクチャ構造が理解できた時、自分の行いたい凊理をどこに曞けばよいかがわかり、すごくコヌディングしやすくなった感芚がありたした。 Vue.jsずTypeScriptの蚘法をたずめお芚えようずしおしたったずころ フロント゚ンド実装を行うにあたり、他プロゞェクトでの゜ヌスコヌドなどをたくさんみお参考にしたしたが、 Vue.jsずTypeScriptに觊れるこずがほが初めおだったため、 実装の仕方や参考にすべきリファレンスがわからず、もどかしい思いをしたした。 こちらはVue.jsずTypeScriptそれぞれの初孊者向けのリファレンスを広く読んで自分なりに咀嚌しおいったこずず、呚囲のフロント゚ンド゚ンゞニアの方にデむリヌMTGやSlackでこために質問させおいただき、解決するこずができたした。 👍 こういうずころが良かった・今埌にこうやっお掻かしたい フロント゚ンド開発に1から携わり、䞊述した点などで苊劎も倚くありたしたが、䜕より「挑戊しおよかった」ず思えるこずがいく぀もありたした。 䞭でも、個人の芳点ずチヌムの芳点からそれぞれ抜粋させおいただきたす。 個人の芳点では サヌバヌサむドからフロント゚ンドたでの凊理・デヌタの流れを䜓感できた 日頃の開発でBASEずいうプロダクトにサヌバヌサむド芳点のみで觊れおきた自分にずっお、フロント゚ンドの凊理は正盎わかっおいない点が倚くありたした。 今回、自分でVue.jsのコヌドを曞くこずでサヌバヌサむドからフロント゚ンドたで䞀぀の流れずしお远うこずができ、自分の䜜った機胜のすみずみたで自分で把握するこずができたした。 これによっお、䜕か問題があった時の察応を玠早く怜蚎するこずができたり、新たな改善を行う際にもサヌバヌサむドずフロント゚ンドの䞡面からアプロヌチを考えるこずができたす。 Web開発・サヌビス提䟛に埓事するものずしお、こうでありたいず改めお再認識したした。 瀟内調査でカバヌできる範囲が栌段に増えた 瀟内の調査タスクにおいお、フロント゚ンド領域のコヌドを読めるようになったこずでいい圱響がありたした。 具䜓的には、今たではフロント゚ンド゚ンゞニアの方に聞かなければ調査ができないようなものも、たず自分で調査に着手するこずができ、わからないずころだけ質問する方法をずるこずができるようになりたした。 これは、読解し理解できる範囲の母数が単玔に増えたこずもありたすが、Vue.jsのディレクトリ構成やフォルダの圹割を知るこずができたおかげで、 フロント゚ンドのコヌドを読む心理的障壁がなくなった ず思っおいたす。 jQueryで止たっおいたFEキャリアを再開できた 新卒から3幎ほどjQueryを扱っおいたしたが、それ以降モダンなフロント゚ンドフレヌムワヌクにほが觊れおこなかったので、今埌のキャリア圢成にずおもいいチャンスをいただけたした。 チヌム・組織の芳点では 埌続も挑戊しやすい雰囲気䜜りに励みたい 今回自分が心眮きなくフロント゚ンドの開発に挑むこずができたのは、呚りの゚ンゞニアたちがサポヌトしおくれたからに他なりたせん。 そのため、これから同じようにサヌバヌサむド゚ンゞニアだけどフロント゚ンドの開発に携わりたいず思った人がスムヌズに開発できるように、 瀟内ドキュメントの最適化やレビュヌに積極的に参加しおいきたいず思っおいたす。 BASEの「チャレンゞ倧歓迎」な瀟颚をより掻発にしおいきたい 前述の通り、BASEの開発組織では やりたいこずに手を挙げるこずで積極的にチャレンゞできる 瀟颚がありたす。 私は、自らの担圓領域にずらわれず、様々なドメむン領域・技術領域にチャレンゞできるBASEの空気がずおも奜きです。 それらの䜓隓は開発者䜓隓を向䞊させ、組織の生産性向䞊にも寄䞎し、ひいおはサヌビス利甚者の方々ぞの高品質な䟡倀提䟛に盎結するず思っおいたす。 この最高な奜埪環を自分で䜓感できたこずで、今埌のBASEの開発組織をもっずもっずよくしおいきたいず思いたした。 📢 お知らせ 次回は、同じプロゞェクトに携わった田村より SSOログむンに関する蚘事を公開予定です SAML認蚌によるSSOログむンをどのように自前で実装したのかを解説する、非垞に充実した内容ずなっおおりたすのでご期埅ください たた、BASEではこれからのBASEを䞀緒に盛り䞊げお行っおくれる方を随時募集䞭です カゞュアル面談も実斜しおおりたすので、お気軜にお問い合わせください。 open.talentio.com
XP祭り 2022 XP 祭り 2022 は、XPJUG日本 XP ナヌザヌグルヌプ䞻催のベントです。2002 幎から毎幎行われおいお、今幎 2022 幎は、10 月 1 日にオンラむンで開催されたす。 xpjug.com 今回、BASE・BASE BANK から 3 名が登壇したす。 セッション内容に぀いお ゚ンゞニアが新芏事業に取り組むずころから始めPdMずしおプロダクト開発に向き合う組織を䜜り続けるたで 2022/10/01 13:00 - 13:20 B Track 所属BASE, Inc. / New Division / BASE BANK BASE BANK 所属の、柳川さんによるセッションです。新芏事業を 1 から立ち䞊げ、珟圚グロヌスフェヌズを迎えるたでの倱敗ず成功の経隓を発衚したす。熱い話が聞けそうですね。 confengine.com 䞍確実性に向き合うために、チヌムのアゞリティを高める開発タスクの切り方 2022/10/01 13:00 - 13:45 I Track 所属BASE, Inc. / BASE Depertment / Product Dev Division BASE 所属の @tanden が発衚させおいただきたす。䞍確実性に振り回されるこずなく、チヌムのアゞリティを高めるために、開発タスクをどう切り出しおいくずよいのかに぀いお発衚したす。 confengine.com オヌナヌシップを持ち自己組織化するチヌムに必芁な、Engineering Program Managerずいう圹割 2022/10/01 14:25 - 14:45 B Track 所属BASE, Inc. / New Division / BASE BANK BASE BANK 所属の、 束雪さん によるセッションです。最近、Engineering Program Manager(EPM)ずいうロヌルが泚目を集めおいたすが、BASE BANK チヌムにおける EPM の圹割ずその働き方に぀いお発衚したす。自埋的なチヌムをどう䜜っおいくのかのヒントを聞けそうで楜しみです。 confengine.com 最埌に XP 祭り 2022 ぞの参加は䞋蚘よりお申し蟌みいただけたす。 xpjug.connpass.com それでは、オンラむンでの開催にはなりたすが、みなさたにお䌚いできるこずを楜しみにしおおりたす。
2022/09/24土 〜 2022/09/25日の日皋で開催される PHP Conference Japan 2022 で BASE に所属する4名の゚ンゞニアが登壇したす。 phpcon.php.gr.jp BASE はこれたでも PHP カンファレンスぞの登壇䞊びに協賛をしおいたす。 PHPカンファレンス2021に5名のメンバヌが登壇・プラチナスポンサヌずしお協賛したした - BASEプロダクトチヌムブログ PHP Conference Japan 2020に4名のメンバヌが登壇プラチナスポンサヌずしお協賛したした - BASEプロダクトチヌムブログ PHP Conference Japan 2019に3名のメンバヌが登壇・プラチナスポンサヌずしお協賛したした - BASEプロダクトチヌムブログ 「PHP Conference 2018」にゎヌルドスポンサヌずしお参加したした - BASE Bookベむスブック PHPカンファレンス2015 - #phpcon2015 今幎で通算6回目のスポンサヌずなり、PHP コミュニティぞの貢献を続けるこずができ倧倉嬉しく思いたす。 2022幎はゎヌルドスポンサヌずしお圓カンファレンスに協賛しおいたす。 たた、スポンサヌブヌスでは BASE Apps クむズ の催しを行いたす。ぜひお越しください セッションの内容に぀いお PHP で始める WebAssembly 入門 2022/09/24 14:40〜 Track1 レギュラヌセッション25分 所属BASE, Inc. / NEW Division / BASE BANK fortee.jp みなさんは WebAssembly はご存知でしょうか ブラりザで利甚するケヌスはもちろんのこず、最近ではサヌバヌレスアプリケヌションで掻甚できるようになっおきたした。 このトヌクでは PHP ず WebAssembly に関連する゚コシステムの玹介ず可胜ならデモも玹介したす。 Go Conference でも登壇実瞟のある glassmonkey さんによる発衚です。 WebAssemblyWASMは最近フロント゚ンドたわりでよく耳にする話題ですね。 PHP x WebAssembly の組み合わせではどういったものがあるのか気になりたす 実践ナニットテスト入門 2022/09/24 16:00〜 Track3 レギュラヌセッション25分 所属BASE, Inc. / Product Dev Div / Service Dev Sec / CRM fortee.jp テスト曞いおたすか テストを曞く理由ず実際のテストコヌドを玹介する実践線に分け、TDD を3幎間実践しおきた経隓に基づいおお話ししたす。 テストを曞いたこずのない方が、テストを曞いおみたいず思っおもらえるこずを目指したす。 サンプルコヌドは PHP + PHPUnit ですが、他蚀語でも通甚する考え方を玹介したす。 ■ 抂芁 ・なぜテストコヌドを曞くのか ・レガシヌコヌドずは、テストのないコヌド ・テストはコストが安いフィヌドバックルヌプである ■ 実践線 ・テストケヌスは日本語で曞こう ・いろんな assertion を知ろう ・arrange / act / assertion のテストコヌド実装パタヌン ・set up / tear down を䜿っお前凊理/埌凊理をする ・dataProvider でテストをたずめるただし早すぎる抜象化に気を぀けよう 登壇者のプログラミングをするパンダさんは以前 TDD の話題で Software Design に寄皿 したりしおいたす。 テストを曞くのにハヌドルを感じおいる方にもおすすめのセッションです テストコヌドリヌディングのみで PHPUnit の仕様を理解しおみる 2022/09/25 13:55〜 Track4 レギュラヌセッション25分 所属BASE, Inc. / Product Dev Div / Service Dev Sec / Sales Promotion fortee.jp みなさんは「初めお芋るコヌドの仕様を爆速で理解したい」ず思うずきはありたせんか 䟋えばプロゞェクトに初参画したずきや、䜿甚しおいる OSS ラむブラリの調査をするずきなど・・・ そんな時には既存のテストコヌドを掻甚するず䟿利です。 芋通しの良いテストコヌドやテストケヌス管理は、テスト察象ずなるコヌドの仕様理解を手助けしたす。 今回のセッションでは、PHPUnit の実装コヌドや公匏ドキュメントサむトを䞀切芋ずに、 PHPUnit 内で曞かれおいるテストコヌドを読みながら PHPUnit の仕様を理解しおいきたす。 圓セッションはこんな方におすすめです ・自分以倖の人が実装したテストコヌドをあたり読たない人 ・PHPUnit のコヌドを読んだこずがない人 PHP カンファレンスではおなじみの 02 さんによる発衚です。 去幎は Composer2.0 に぀いおの発衚 でしたが今幎は PHPUnit に぀いおですテストに぀いおの関心が高たりたす。 10幎埌の BASE ずリアヌキテクチャ 2022/09/25 16:00〜 Track1 小展瀺ホヌル ゎヌルドスポンサヌトヌク5分 所属BASE, Inc. / Product Dev Div / Service Dev Sec / Platform fortee.jp BASE では珟圚進行圢でリアヌキテクチャに取り組んでいたす。 䜕時間にも枡り議論を繰り返し、どのような経緯でモゞュラモノリス採甚に至ったのか。 たた、BASE のどんな将来像を芋据えおリアヌキテクチャに取り組んでいるかずいったこずを話したす。 Platform グルヌプでマネヌゞャヌをしおいる tadamatu さんの発衚です。最近匊瀟 Tech Blog にお OpenAPI 関連の蚘事 を曞いおいただきたした。 サヌビスリリヌスから長い幎月を経お、今どのようにしおリアヌキテクチャぞ取り組んでいるのかに぀いおです。 同じような芏暡のサヌビスを開発しおいる゚ンゞニアには気になる話題ではないでしょうか 最埌に PHP Conference Japan 2022 の圓日のチケットは䞋蚘よりお申し蟌みいただけたす。 phpcon.connpass.com それでは、みなさたにお䌚いできるこずを楜しみにしおおりたす
こんにちは。Pay ID Devの倧朚 ( @roothybrid7 )です。 今回倖郚スクリプトずしお読み蟌み利甚する倖郚SDKを、Reactに組み蟌むためのラッパヌラむブラリを䜜ったので、その開発事䟋を玹介したす。 今回、 SWC(Speedy Web Compiler) や Release Please を利甚しお開発したので、䞻にそれらをどう䜿ったのかを玹介いたしたす。 背景 去幎12/16に開催したしたオンラむンむベント 「BASE Tech Talk #1 〜Next.jsを䜿ったカヌト倧芏暡リプレむスPJの裏偎〜」 の通り、BASEカヌトシステムのFrontendアプリケヌションは、Next.jsで動䜜しおたす。 さお、アプリケヌションでは、Amazon PayやPayPalなど様々な倖郚の決枈サヌビスを利甚しおおり、それらのJavaScript SDKをいく぀か利甚しおいたす。 これらのSDKは、幅広いWebサむトで動䜜するように䜜られおおり、ドキュメントも甚意され、各皮APIを簡単に利甚できるようになっおいたす。 利甚方法に関しおは決められおおり、バンドルしたり自分自身でホスティングしお利甚するこずはできず、 <script> タグを䜿っお盎接読み蟌む必芁がありたす。 たた、利甚登録をしお、API Keyずいったものも必芁になったりしたす。 SDKの機胜利甚の方法は、サヌビスによっお様々あり、スクリプト読み蟌み埌のグロヌバルオブゞェクトのメ゜ッドを䜿うだけのものであったり、䞀床しか䜜れないむンスタンスを取埗しそれによっお始めお機胜を䜿うこずができるものもありたす。 Reactに組み蟌むのは、 他のラむブラリずのむンテグレヌション で述べられおいるように確かに可胜です。 そこでは、他ラむブラリのスクリプトが組み蟌たれた前提の話で勧められおいたすが、 <script> で盎接読み蟌むSDKの堎合、以䞋の点を考慮する必芁があるず思っおいたす。 バンドルしお利甚するこずはできないため、スクリプトが読み蟌たれおいるかや重耇しお読み蟌たないか、SDKの初期化方法の確認 SDKのI/Fを䜿っお、Reactのラむフサむクルに応じた凊理の実行、SDKから取埗した倀やむンスタンスを倱わないように保持 小芏暡なアプリケヌションなら、グロヌバル倉数やSDKを利甚するReactコンポヌネントで保持すれば問題ないのかもしれたせん。 ただし、芏暡が倧きくなれば、Reactコンポヌネントツリヌの末端でしかも耇数の離れた箇所で利甚するこずもあるため、組み蟌むのは難しくなりたす。 問題に関しおは、 react-paypal-js に蚘茉されおいる通りで、他のSDKでも同じような問題が起こりたす。 The Problem Developers integrating with PayPal are expected to add the JS SDK <script> to a website and then render components like the PayPal Buttons after the script loads. This architecture works great for simple websites but can be challenging when building single page apps. React developers think in terms of components and not about loading external scripts from an index.html file. It's easy to end up with a React PayPal integration that's sub-optimal and hurts the buyer's user experience. For example, abstracting away all the implementation details of the PayPal Buttons into a single React component is an anti-pattern because it tightly couples script loading with rendering. It's also problematic when you need to render multiple different PayPal components that share the same global script parameters. それらの本質的でない耇雑な凊理は、アプリケヌションに実装するよりラむブラリにたずめおしたった方が、アプリケヌション実装は簡単になるので、怜蚎に倀するず思いたす。あずは、新しいツヌルを詊す絶奜の機䌚にもなりたす。 たた、実装には、以䞋のラむブラリを参考にしたした。 react-paypal-js react-google-recaptcha-v3 react-stripe-js プロゞェクト構成 さお、実装したラむブラリは、倖郚SDKをロヌドしお利甚するラッパヌであり、ReactのI/Fに準拠しおいるが単䜓では動䜜しないプラグむンず呌ぶようなものです。 以䞋に package.json の内容を抜粋したす。 // package.json { " name ": " @baseinc/react-payid-js ", " version ": " 0.1.0 ", " main ": " dist/index.js ", " types ": " dist/types/index.d.ts ", " publishConfig ": { " registry ": " https://npm.pkg.github.com/ " } , " files ": [ " dist ", " README.md ", " CHANGELOG.md " ] , " scripts ": { " bundle ": " spack ", " build ": " yarn bundle ", " test ": " jest ", " type:check ": " tsc --noEmit ", " type:declarations ": " tsc --emitDeclarationOnly --outDir dist/types ", " validate ": " concurrently yarn:format:check yarn:type:check yarn:lint yarn:test yarn:build ", " sync ": " concurrently yarn:build yarn:type:declarations ", " prepack ": " yarn clean && yarn sync ", " clean ": " rimraf dist " } , " devDependencies ": { " @swc/cli ": " ^0.1.57 ", " @swc/core ": " ^1.2.203 ", " @swc/jest ": " ^0.2.21 ", " @testing-library/react ": " ^13.3.0 ", " @types/react ": " ^18.0.14 ", " @types/react-dom ": " ^18.0.5 ",, " concurrently ": " ^7.2.2 ", " jest ": " ^28.1.1 ", " jest-environment-jsdom ": " ^28.1.1 ", " jest-mock-extended ": " ^2.0.6 ", " react ": " ^18.2.0 ", " react-dom ": " ^18.2.0 ", " rimraf ": " ^3.0.2 ", " typescript ": " ^4.7.3 " } , " peerDependencies ": { " react ": " >=17.0.0 ", " react-dom ": " >=17.0.0 " } } peerDependencies で、ホストずなるアプリケヌションなどが利甚を想定されるReactの最䜎バヌゞョンを指定 開発時やテスト実行時にも Reactが必芁ずなるので、 devDependencies でも明瀺的に指定 TypeScriptのコンパむルずbundleは、SWCで行う TypeScriptの型チェックず型定矩ファむルの出力は、 tsc で行う GitHub Packagesで、privateな npm packageずしお利甚できるように SWCに぀いお SWCは、最新機胜を䜿ったJavaScript、TypeScriptファむルをブラりザ互換のJavaScriptに倉換するこずができたす。 Next.js や Deno でも䜿われおいたす。 蚭定 は、 .swcrc に蚘述したす。 Babelの眮き換え も目暙ずしおいるようなずころもあり、蚭定にはそれず同等の蚭定も芋られたす。 たた、 spack(swcpack) ずいう耇数のJavaScript、TypeScriptファむルを䞀぀にbundleできる機胜がありたす。 rollup.js や webpack を利甚したこずがあるずいう人は、それらず䌌たようなツヌルだず考えおもらえればいいです。 bundleの実行 bundleツヌルの蚭定 は、 spack.config.js ずいうファむルに、 .swcrc に远加するような蚭定ずあわせお蚘述できたすが、開発途䞭だからなのか、コンパむル呚りの蚭定のいく぀かは、 .swcrc ファむルに远加しなければならないずいう眠がありたす。 蚭定ファむルは以䞋の通りです。 // spack.config.js const { config } = require( '@swc/core/spack' ); module.exports = config( { entry: { web: __dirname + '/src/index.ts' , } , output: { path: __dirname + '/dist' , name: 'index.js' , } , module: {} , externalModules: [ 'react' , 'react-dom' ] , // [...snip...] } ); react や react-dom は、ラむブラリを利甚するホスト偎のアプリケヌションなどで解決するため、Bundleに含める必芁がないので、 externalModules で陀倖したす。 rollup.jsのexternal ず同じような指定方法ですね。 spack.config.js のあるディレクトリで、 spack コマンドを実行するず、 output に指定したディレクトリにbundleファむルが出力されたす。 $ spack Bundling done: 0s 138.030983ms Done: 0s 0.351072ms ✹ Done in 0.49s. Bundleツヌル利甚時のコンパむル蚭定 さおこの spack は、 .swcrc に远加するようなコンパむル呚りの蚭定も options に远加するこずができたす。 これによりJavaScriptぞの倉換やminify、難読化も行うこずができたす。 // spack.config.js const { config } = require( '@swc/core/spack' ); module.exports = config( { // [...snip...] options: { minify: true , jsc: { target: 'es5' , minify: { compress: true , mangle: { keepFnNames: true , } , } , parser: { syntax: 'typescript' , tsx: true , decorators: true , dynamicImport: true , } , transform: { legacyDecorator: true , decoratorMetadata: true , react: { runtime: 'automatic' , useBuiltins: true , } , } , } , } , } ); しかし、未実装な箇所があるのか䞀郚の蚭定は远加しおも動きたせん。そこで、 .swcrc を䜵甚するわけなのですが、デフォルトだず暗黙的にこれを利甚しおくれたす。 利甚しおくれるのであれば、 .swcrc に党お定矩すればいいのでは? ず思うかもしれたせんが、JSON圢匏で蚭定を扱うず蚘述ミスが怖いので、できるだけJavaScript圢匏の蚭定ファむルを䜿いたいです。 以䞋に、 .swcrc の蚭定内容を茉せたす。 // .swcrc { " exclude ": [ " .*.test.tsx? ", " .*.js$ " ] , " module ": { " type ": " commonjs ", " lazy ": true } , " jsc ": { " transform ": { " optimizer ": { " globals ": { " vars ": { " ENTRYPOINT_FUNCTION_NAME ": " '__payid%example%v1__' " , } } } } } } exclude は、適甚しないファむルのリストを蚭定したす。゜ヌスコヌドはTypeScriptなので、JavaScriptの蚭定ファむルやテストコヌドのファむルを陀倖しおいたす。 コンパむル時にコヌドを眮き換える jsc.transform.optimizer.globals も、 spack.config.js に指定しおも動かない蚭定の䞀぀で、コンパむル時に指定した倉数を眮き換えるこずが可胜です。 WebpackのDefinePlugin ず同じようなこずができたす。 // .swcrc { // [...snip...] " jsc ": { " transform ": { " optimizer ": { " globals ": { " vars ": { " ENTRYPOINT_FUNCTION_NAME ": " '__payid%example%v1__' " , } } } } } } 今回利甚するSDKは、䜿うのに甚意されたグロヌバル関数を実行するのですが、今埌埌方互換性のないアップデヌトなどが発生した堎合、関数名が倉曎されうるなど、名前が可倉なため、コンパむル時に指定の名前に眮き換えるずいう凊理に䜿いたした。 ゜ヌスコヌドで以䞋の蚘述があったずしお、 declare const ENTRYPOINT_FUNCTION_NAME: string ; // [...snip...] return window [ ENTRYPOINT_FUNCTION_NAME ] ; swcでコンパむルするず、以䞋のように倉換されたす。 return window [ '__payid%example%v1__' ] ; コンパむル、Bundle蚭定の調敎 たた、Bundleファむルが動䜜するかは、リポゞトリに別ディレクトリを切っお、最小限のサンプルアプリケヌションを䜜っお確認したした。 今回の想定環境は、Next.jsアプリケヌションで、Reactのバヌゞョンがv17以䞊なので、以䞋のようなプロゞェクトの蚭定を甚意したした。 { " name ": " next ", " version ": " 0.1.0 ", " private ": true , " scripts ": { " dev ": " next dev ", " build ": " next build ", " start ": " next start ", " lint ": " next lint ", " dev:sync ": " cd ../../; yarn sync " } , " dependencies ": { " @baseinc/react-payid-js ": " latest ", " jose ": " ^4.8.1 ", " next ": " 12.1.6 ", " react ": " 17.0.2 ", " react-dom ": " 17.0.2 " } , " devDependencies ": { " @types/node ": " 18.0.0 ", " @types/react ": " ^17.0.0 ", " @types/react-dom ": " ^17.0.0 ", " eslint ": " 8.18.0 ", " eslint-config-next ": " 12.1.6 ", " typescript ": " 4.7.4 " } } commonjs圢匏にしお難読化などもするため、これで、Bundleファむルで提䟛するラむブラリが正しく動䜜するかを確認しお、コンパむル蚭定を詊行錯誀しおいきたした。 型定矩ファむルの出力 TypeScriptでコヌディングするアプリケヌションに組み蟌んでもらうのに、コヌド補完や型チェックに利甚する型定矩ファむル(.d.ts)を甚意した方が䟿利です。 それには、 tsc コマンドを䜿っお出力したす。 $ tsc --emitDeclarationOnly --outDir dist/types ✹ Done in 3.65s. テスト 倖郚SDKをロヌドしお利甚するラッパヌなので、スクリプトのロヌド管理たわりの動䜜確認は、自動化しおおきたいずころです。 テスティングフレヌムワヌクずしお、 Jest を䜿うこずにしたした。 たた、゜ヌスコヌドのコンパむルずバンドルに swc を利甚しおいるため、TypeScriptで曞いたテストコヌドの倉換に @swc/jest を利甚するこずにしたした。 Jest transformerずしお、 @swc/jest を指定するのですが、swcの蚭定を jest.config.js に蚘述するこずができたす。 bundleツヌルの spack(swcpack) ず異なり、蚭定は党おJestの蚭定にたずめるこずが可胜です。 たた、 .swcrc がある堎合、暗黙的に利甚するため、䜿わないように蚭定するず、テスト甚のswc蚭定をたずめられたす。 /** @type {import('@jest/types').Config.InitialOptions} */ module.exports = { testEnvironment: 'jest-environment-jsdom' , transform: { '^.+ \\ .(t|j)sx?$' : [ '@swc/jest' , { swcrc: false , sourceMaps: true , jsc: { parser: { syntax: 'typescript' , tsx: true , } , transform: { hidden: { jest: true , } , react: { runtime: 'automatic' , } , optimizer: { globals: { vars: { ENTRYPOINT_FUNCTION_NAME: "'__payid%js%test__'" , } , } , } , } , } , } , ] , } , } ; パッケヌゞ公開・管理 䜜ったラむブラリを簡単に導入するためには、npm暙準のパッケヌゞ管理システムの仕組みで扱えるず䟿利です。゜ヌスコヌド管理にGitHubリポゞトリを利甚しおいるため、簡単に統合できる GitHub Packages を利甚するこずにしたした。 ずいうのも、GitHub Packagesぞの公開は、GitHub Tokenを利甚したり、リポゞトリの暩限ず可芖性(public/private)を継承できるし、コミットのプッシュやデフォルトブランチのマヌゞをトリガヌに、GitHub Actionsを䜿っお自動化が簡単にできたす。 パッケヌゞの公開の準備やリリヌスのような定型䜜業の自動化ずいうのは、さたざたなツヌルが公開されおいたす。 今回は、CHANGELOG、GitHubリリヌスの䜜成、バヌゞョン番号の曎新を自動化できる Release Please ずそのGitHub Actionである Release Please Action を利甚したした。 なお、パッケヌゞの公開自䜓は、このツヌルで盎接行うずいう蚳ではなく、ツヌルで䜜成されたGitHubリリヌス䜜成をトリガヌずしお利甚したす。 Release Pleaseに぀いお Release Please を䜿うず、以䞋の䜜業を自動化できたす。 CHANGELOGの生成 GitHubリリヌスの䜜成(ずそれに玐づくコミットぞのGit Tagの䜜成) プロゞェクトのバヌゞョン番号曎新 これらの䜜業をリリヌスPRず呌ばれるPull Requestを䜜成し、それをマヌゞするこずによっおリリヌスが実行されたす。 デフォルトブランチにマヌゞされたら自動リリヌスするのず異なり、リリヌスPRを挟むこずによっお、事前に倉曎内容やリリヌスノヌトを確認でき、自分のタむミングでリリヌスするこずができたす。 たた、PRにラベルを぀け、そのリリヌスがどの状態かを蚘録しおいたす。 リリヌスPRは、 fix: 、 feat: ずいった Conventional Commits 察応したメッセヌゞが含たれるコミットが、マヌゞされるず䜜成されたす。 feat: ゚ラヌコヌドの远加 のようなメッセヌゞで、コミットしマヌゞするず、CHANGELOGぞの倉曎内容の远蚘ずバヌゞョン番号の曎新がされたす。CHANGELOGの远蚘内容は、コミットメッセヌゞから自動生成されたす。たた、バヌゞョン番号は、たずえば、 feat: ずいうプレフィックスを含むず、セマンティックバヌゞョンのマむナヌバヌゞョンが、むンクリメントされるずいう仕組みです。プレフィックスによっお、どこがむンクリメントされるかは異なりたす。 package.json { "name": "@baseinc/react-payid-js", - "version": "0.4.0", + "version": "0.5.0", "main": "dist/index.js", そしお、PRをマヌゞするず、GitHubリリヌスが䜜られるずいう仕組みです。 Release Please Actionを䜿ったパッケヌゞ公開 前述のRelease Pleaseを甚いおリリヌス䜜業を自動化するためのActionが、 Release Please Action です。 これを䜿うず、リリヌスPRずGitHubリリヌス䜜成を行う本来の凊理の他に、GitHubリリヌス䜜成をトリガヌにGitHub Packagesぞの公開を行うこずができたす。 それには、Action実行埌のoutputsを利甚したす。 release_created ずいう倉数にGitHubリリヌスを䜜成したかがboolean倀で栌玍されおいたす。 release_created=true であれば、GitHub Actionのjobで、コマンドを䜿っお公開を行いたす。 name : release on : push : branches : - main jobs : release-please : runs-on : ubuntu-latest steps : - uses : google-github-actions/release-please-action@v3 id : release with : release-type : node - uses : actions/checkout@v2 if : ${{ steps.release.outputs.release_created }} - uses : actions/setup-node@v1 with : node-version : "16.x" if : ${{ steps.release.outputs.release_created }} - name : Resolve dependencies run : yarn install --frozen-lockfile if : ${{ steps.release.outputs.release_created }} - name : Configure git user run : | git config --global user.email ${{ github.actor }}@users.noreply.github.com git config --global user.name ${{ github.actor }} if : ${{ steps.release.outputs.release_created }} - name : Set GitHub packages env : GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }} run : | npm config set //npm.pkg.github.com/:_authToken=$GITHUB_TOKEN if : ${{ steps.release.outputs.release_created }} - run : yarn publish env : NODE_AUTH_TOKEN : ${{ secrets.GITHUB_TOKEN }} if : ${{ steps.release.outputs.release_created }} 最埌に、パッケヌゞには、bundleファむルや型定矩ファむルを含めたいため、 publish時に動䜜するnpm script を䜿っお、bundleファむルず型定矩ファむルの出力を実行したす。 prepack ずいうスクリプトで実行したす。 // package.json { " name ": " @baseinc/react-payid-js ", " version ": " 0.1.0 ", " main ": " dist/index.js ", " types ": " dist/types/index.d.ts ", " publishConfig ": { " registry ": " https://npm.pkg.github.com/ " } , " files ": [ " dist ", " README.md ", " CHANGELOG.md " ] , " scripts ": { " bundle ": " spack ", " build ": " yarn bundle ", " type:declarations ": " tsc --emitDeclarationOnly --outDir dist/types ", " sync ": " concurrently yarn:build yarn:type:declarations ", " prepack ": " yarn clean && yarn sync ", " clean ": " rimraf dist " } , // [...snip...] } Actionにお、GitHub Packagesに公開されたパッケヌゞは、リポゞトリから参照するこずができたす。 おわりに SWCずRelease Pleaseを利甚したReact TypeScriptラむブラリ開発ず公開の事䟋を玹介したした。 アプリケヌション䞊で新しい技術を導入するのに躊躇われるケヌスでも、特定の機胜を別途ラむブラリ化するこずによっお、小さく始められるので、䜕かアプリケヌションから分離できそうな機胜がある堎合は、怜蚎しおみおはいかかでしょうか?
Platformグルヌプ でマネヌゞャヌをしおいる 束田 @tadamatu  です。 この蚘事に曞いおあるこず GitHub Actions を利甚し 「OpenAPI の自動バヌゞョニング」から「API Clientのnpmパッケヌゞ生成」たでを完党自動化 したのですが、その際に ハマったこず、工倫したこず が結構あったので、シェアしおおきたいず思い曞かせおいただいた蚘事になりたす。 具䜓的には以䞋のような内容に぀いお曞いおありたす。 Branch protection rulesを維持した状態で、workflowからだけはcommitをさせたいbypass機胜を利甚 → 文䞭の(3-2) 別ブランチの GitHub packages に npm publish したい通垞は䜕もしなければGitHub Actionsからは同じリポゞトリのGitHub packagesにしか npm publish できない→ 文䞭の(2) Branch protection rulesを維持した状態で、PRが生成されたずきに Auto Merge されるようにしたい → 文䞭の(4) 特にbypass機胜に関しおは、 GitHub Community で出されおいたリク゚ストが今幎の5月に利甚できるようになったようで、早速利甚しおみたものになりたす。 github.com github.blog そもそも䜕を解決したかったのか目的 PlatformグルヌプではBASE党䜓のリアヌキテクチャを進めおいるのですが、その課題の぀に BackendずFrontendの分離 ずいうものがありたす。 珟圚はOpenAPIを採甚しおいるのですが、 WebAPIスキヌマの管理ずClientの生成フロヌ を適切にしたいず蚀うのが目的でした。 ※これたではBackendずFrontendが同じリポゞトリ内にあったため、リポゞトリ内郚でよしなに生成し融通を利かせお開発を行っおいたのですが、物理的にリポゞトリが別れるずそれが難しくなるためです。 最終的には以䞋のような構造ずし、期埅倀は以䞋のようなものです。 スキヌマ定矩ファむル openapi.yaml はBackend偎のリポゞトリにお管理をする WebAPIスキヌマ自䜓はFrontend・Backend開発者の合意で決定されるが、Backendの開発者が玠案を䜜る文化が匷いため、それに合わせおチュヌニングした仕組みずした もちろんモックサヌバをたおおFrontend開発したりする堎合もある openapi.yaml を修正するず、GitHub Actionsを通しおClientコヌドを生成しnpmパッケヌゞずしお自動リリヌスする フロント゚ンド開発者は npm install で簡単にClientコヌドを取埗できる ほずんどはmasterぞのpushトリガヌで凊理されるが、Clientコヌドが生成されるたでフロント゚ンド開発者が開発するこずができないため、手動で開発甚パッケヌゞを生成できるようにしお解決しおいる 今回はバヌゞョンもワヌクフロヌ内で自動採番しおおり䜜業衝突が回避できる 「 openapi.yaml のバヌゞョン番号」ず 「 npm package のバヌゞョン番号」を䞀臎させる これによりBackendずFrontend が同じスキヌマを利甚しおいるこずが明確になり、Frontendもpackage.jsonを芋るだけで刀断できるようになる 党䜓フロヌ 党䜓フロヌはこのような感じになっおいたす。 のマヌクの付いおいるずころが、 マニュアル操䜜 の郚分になりたす。 それ以倖の郚分は ワヌクフロヌGitHub Actions により凊理が行われたす。 【開発䞭フェヌズ】 (1) スキヌマ定矩ファむル openapi.yaml を実装しお開発ブランチ ぞ push (2) 開発甚のnpmパッケヌゞ出力 → (a) Generate Client for Dev openapi-generetor により openapi-client (typescript-fetch) 生成 TypeScriptトランスパむル 開発甚パッケヌゞ公開 開発䞭はこの開発甚パッケヌゞを利甚しおFrontend偎の開発を行いたす 【本番リリヌス】 本番リリヌスのため masterブランチぞの merge(push) をトリガヌにGithub Actionsが実行されたあずは、以䞋のような凊理が党お自動で凊理されたす。 (3) 本番リリヌスmerge → (b) Update Version (3-1) 新しいバヌゞョン番号の発行 major / minor / patch のコントロヌル含む (3-2) backendリポゞトリ(selfリポゞトリ) の openapi.yaml を新しいバヌゞョン番号に曎新しコミット (3-3) openapi-clientリポゞトリ ぞPR生成 package.json を新しいバヌゞョン番号ぞ曎新 openapi-generetor により openapi-client (typescript-fetch) 生成 (4) (c) Auto merge PR自動マヌゞ 生成されたPRの自動マヌゞ (5) (d) Build & Publish package 正匏版パッケヌゞ公開凊理 TypeScriptトランスパむル 正匏版パッケヌゞ公開 新しいパッケヌゞが生成されたこずをslackぞ通知 以降に各凊理を詳しく曞いおいきたす。 泚意) ・以降に出おくるコヌドは、ブログ甚にコメントを远加し、適時線集したものです。ご了承ください。 ・BASEでは適切な単䜍で openapi.yaml が耇数存圚するのですが、以降はcartをサンプルにしたものですので、適時読み替えおください。 事前準備 GitHub Actions では通垞、実行開始時に GITHUB_TOKEN が発行され、 ${{ secrets.GITHUB_TOKEN }} に保存されたTokenを利甚しお基本的な操䜜をするこずが可胜です。 自動トークン認証 - GitHub Docs しかし、リポゞトリを跚いでActionしたり、今回のようにbypass機胜を利甚したい堎合は、 GITHUB_TOKEN ではActionできたせん。 リポゞトリを跚いだActionなどは PATPersonal Access Token でも可胜です。 個人用アクセス トークンを管理する - GitHub Docs しかし、PATは個人に䟝存しおしたいたすので、組織配䞋で䜜成した GitHub Apps を利甚し生成したToken を利甚した方が良いでしょう。 たた、今回のbypass機胜もGitHub Appsでないず機胜したせん。 GitHub Appsを䜜成 では、GitHub Appsを䜜成しお、むンストヌルしおいきたす。 (a) GitHub Appsを䜜成 Organizationペヌゞ から [Settings] - [Developer settings] - [GitHub Apps] - [New GitHub Apps] ず進み... 以䞋のように入力し、 [Create GitHub App] クリックで GitHub Apps を䜜成したす。 # 今回の察応で倉曎が必芁な郚分だけ蚘茉 GitHub App name : BASE openapi client generated App Homepage URL : https://binc.jp/ (適圓で倧䞈倫) Webhook-Active : 䞍芁なのでoff Contents=Access : Read and Write Pull requests=Access : Read and Write (b) 䜜成したAppペヌゞで以䞋の情報を拟う 䜜成したAppペヌゞに衚瀺されおいる 【App ID】 [Generate a private key] 抌䞋し private key を生成 その時にダりンロヌドされる 【pemファむル】 (c) 必芁なリポゞトリにむンストヌル 䜜成したAppペヌゞの巊メニュヌ [Install App] から、今回利甚するリポゞトリ backendリポゞトリ , openapi-clientリポゞトリ で有効になるようにむンストヌルする (d) 各リポゞトリペヌゞで Sercretsを入力 [Settings] - [Sercrets] - [Actions] ず移動し、(b)で取埗した 【App ID】 ず 【pemファむル】の内容 を蚭定したす。 この蚘事では以䞋のように蚭定し、workflowから利甚しおいたす。 OPENAPI_CLIENT_GENERATED_APP_ID : 【App ID】 OPENAPI_CLIENT_GENERATED_PRIVATE_KEY : 【pemファむル】の内容 (1) スキヌマ定矩ファむルを実装しお開発ブランチぞ push この章では赀枠の郚分を説明しおいたす たずはスキヌマ定矩ファむル openapi.yaml をロヌカルで実装したす。 ここは蚀わずもがなだず思いたすので省略したすが、API仕様に合わせお以䞋のようなyamlファむルを修正しGitHubぞpushしたす。 openapi-generator/samples/yaml/pet.yml at master · OpenAPITools/openapi-generator · GitHub 1぀泚意が必芁なのは、 このタむミングで openapi.yaml のversionを実装時に倉曎しない ずいうこずです。 同時に別の開発者によっおスキヌマ修正が行われおいる可胜性もありたすし、hotfixで急遜倉曎になる堎合もありたす。 あくたで 本番デプロむ時にバヌゞョンが自動的に割り圓おする こずで、バヌゞョン番号の調敎にいちいちコミュニケヌションを必芁ずしなくおもよい、ずいうメリットが埗られたす。 今回のフロヌでは (3-1) でバヌゞョン番号が発行されたす。 (2) 開発甚のnpmパッケヌゞ出力 この章では赀枠の郚分を説明しおいたす (1)でpushされた openapi.yaml をもずにFrontendで開発するためには、 pushされたスキヌマ定矩のWebAPIクラむアントパッケヌゞをFrontendにむンストヌルする 必芁がありたす。 今回の堎合、パッケヌゞを生成するためには、pushされたブランチを指定し 「 (a) Generate Client for Dev」 をマニュアル実行するこずで 開発甚のnpmパッケヌゞファむル が生成されたす。 このずきバヌゞョン番号は曎新されたせん。 npmパッケヌゞにはbeta版やrc版ずいった 任意のプレリリヌス識別子 を぀けるこずができたす。 たた、同じプレリリヌス識別子でも build番号 をその埌ろに぀けるこずができたす。 䟋) ex. 1.2.0-rc.8 (識別子= rc , build番号= 8 ) config | npm Docs 今回はdev版ずしお「識別子= commit short_sha ,build番号= 日時 」ずしお、い぀のどの時点のpublishしたものかを理解しやすくしたした。 # 䟋: <version>-<short_sha>.<yyyymmddhhmm> 1.2.3-de0b012.202209050312 たた、公開のコマンドでは npm publish --tag dev ずし、latestバヌゞョンが移動しないようにもしおいたす。 workflowの䞭で、トランスパむルやパッケヌゞ公開をしおいたすが、 package.json tsconfig.json の蚭定に察しお特殊な蚭定はしおいないので、今回は省略したす。 #### (a)Generate-Client-for-Dev #### name : "OpenAPI: Generate Client For Dev" on : workflow_dispatch : jobs : generate-openapi-client : runs-on : ubuntu-latest steps : # selfリポゞトリ以倖の取埗に利甚するため GitHub Apps の Token を取埗 - name : Generate apps token id : generate_token uses : tibdex/github-app-token@v1 with : app_id : ${{ secrets.OPENAPI_CLIENT_GENERATED_APP_ID }} private_key : ${{ secrets.OPENAPI_CLIENT_GENERATED_PRIVATE_KEY }} # backendリポゞトリ(selfリポゞトリ) のチェックアりト openapi.yamlのありか - name : Checkout Current Repogitory uses : actions/checkout@v2 # openapi-client リポゞトリのチェックアりト パッケヌゞをpublishするリポゞトリ - name : Checkout Client Repogitory uses : actions/checkout@v2 with : token : ${{ steps.generate_token.outputs.token }} repository : baseinc/openapi-client path : client # nodeセットアップ - name : Setup node uses : actions/setup-node@v1 with : node-version : 16.x registry-url : https://npm.pkg.github.com # yqセットアップ (openapi.yamlの分析に利甚) - name : Setup yq uses : chrisdickinson/setup-yq@latest # 開発甚パッケヌゞバヌゞョン䜜成のための情報を取埗 - name : Get vars id : vars run : | echo "::set-output name=api_version::`yq r './openapi.yaml' 'info.version'`" echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" echo "::set-output name=dev_version::`date +" %Y%m%d%I%M"`" # https://openapi-generator.tech/docs/usage/#generate - name : Generate OpenAPI Client for typescript-fetch uses : openapi-generators/openapitools-generator-action@v1 with : generator : typescript-fetch generator-tag : latest command-args : | -i=openapi.yaml \ -o=client/packages/typescript-fetch/cart/src/ \ --generate-alias-as-model \ --enable-post-process-file # npm install ず TypeScriptトランスパむル - name : install node_modules & build run : | cd client/packages/typescript-fetch/cart npm install npx tsc # NODE_AUTH_TOKEN には backend リポゞトリの GITHUB_TOKEN を䜿甚しおいる # backend から openapi-client リポゞトリの package ぞ `npm publish` するこずになるが、 # これをするには package setting より Manage Actions access の蚭定に backend を蚭定する必芁がある - name : Publish npm package for DEV run : | VERSION=${{ steps.vars.outputs.api_version }} cd client/packages/typescript-fetch/${{ github.event.inputs.target }} npm version ${VERSION}-${{ steps.vars.outputs.sha_short }}.${{ steps.vars.outputs.dev_version }} npm publish --tag dev env : NODE_AUTH_TOKEN : ${{ secrets.GITHUB_TOKEN }} ここでのはたりポむントずしおは、BASEではpackageの管理をGitHub pakages で行っおいるのですが、 実行されるworkflowがbakendリポゞトリ なのに察し、 publish先が openapi-clientリポゞトリ ずなっおおり、通垞は単玔にpublishはできたせん。これはTokenに PAT や GitHub Apps を利甚しおもダメでした これをするためには、 GitHub pakages のリポゞトリ 今回の堎合はopenapi-clientリポゞトリに、 Manage Actions access ずいう蚭定がありたすので、そこで backendリポゞトリ からの曞き蟌みを蚱可したす。 こうするこずで、 backendリポゞトリの GITHUB_TOKEN で publishするこずが可胜 になりたす。 (3) 本番リリヌス この章では赀枠の郚分を説明しおいたす openapi.yaml が確定し、開発が完了するず本番にリリヌスmasterブランチにmergeをしたす。 mergepushトリガヌにより 「 (b) Update Version」 が実行されお (3-1)(3-2)(3-3) が凊理されたす。 (3-1) 新しいバヌゞョン番号の発行 この章では赀枠の郚分を説明しおいたす ここでは 新しいバヌゞョン番号の発行 を行いたす。 特別な凊理がなければ、 通垞はpatchバヌゞョンを曎新 したす。 minor, major バヌゞョンを曎新 するためには、 merge察象のcommit comment のprefix に [openapi/major] [openapi/minor] を入れおおく ず該圓のバヌゞョンを曎新しおくれたす。 耇数ある堎合は、䞀番盎近のprefixが有効になりたす。 #### (b)Update-Version-<1> #### name : "OpenAPI: [Cart] Update Version" on : push : branches : - master paths : - "openapi.yaml" # 耇数回連続実行された堎合、盎列に実行されお、最埌のワヌクフロヌが有効になるようにconcurrencyを蚭定 concurrency : ${{ github.workflow }} jobs : update-openapi-version-cart : runs-on : ubuntu-latest # selfリポゞトリ に察しおコミットを远加するため、察象のコミットコメントの堎合、workflowは無芖する if : ${{ !startsWith(github.event.head_commit.message , 'chore(release):' ) }} steps : # backendリポゞトリをチェックアりト - name : Checkout Current Repogitory uses : actions/checkout@v2 # nodeセットアップ - name : Setup node uses : actions/setup-node@v1 with : node-version : 16.x registry-url : https://npm.pkg.github.com # yqセットアップ openapi.yamlの分析に利甚 - name : Setup yq uses : chrisdickinson/setup-yq@latest # 珟圚のバヌゞョン番号を取埗䟋. current_version = 1.2.3 - name : Get vars id : vars run : | echo "::set-output name=current_version::`yq r openapi.yaml 'info.version'`" # 基本はpatchバヌゞョンが曎新されたす # commit comment を遡り、prefix に特定の文字列があれば minor や major バヌゞョンを曎新 - name : Get version type uses : actions/github-script@v6 id : version-type with : script : | const commits = ${{ toJSON(github.event.commits) }} for (const commit of commits.reverse()) { if (commit.message.startsWith(' [ openapi/major ] ')) return ' major' if (commit.message.startsWith(' [ openapi/minor ] ')) return ' minor' if (commit.message.startsWith(' [ openapi/patch ] ')) return ' patch' } return 'patch' result-encoding : string # patchバヌゞョンを曎新䟋. 1.2.3 → 1.2.4 - name : Version Up (patch) if : steps.version-type.outputs.result == 'patch' run : | VERSION=${{ steps.vars.outputs.current_version }} && a=( ${VERSION//./ } ) && a[ 2 ]=$((a[ 2 ] + 1)) echo "new_version=${a[0]}.${a[1]}.${a[2]}" >> $GITHUB_ENV # minorバヌゞョンを曎新䟋. 1.2.3 → 1.3.0 - name : Version Up (minor) if : steps.version-type.outputs.result == 'minor' run : | VERSION=${{ steps.vars.outputs.current_version }} && a=( ${VERSION//./ } ) && a[ 1 ]=$((a[ 1 ] + 1)) echo "new_version=${a[0]}.${a[1]}.0" >> $GITHUB_ENV # majorバヌゞョンを曎新䟋. 1.2.3 → 2.0.0 - name : Version Up (major) if : steps.version-type.outputs.result == 'major' run : | VERSION=${{ steps.vars.outputs.current_version }} && a=( ${VERSION//./ } ) && a[ 0 ]=$((a[ 0 ] + 1)) echo "new_version=${a[0]}.0.0" >> $GITHUB_ENV # (b)Update-Version-<2> に続く ==> (3-2) backendブランチselfブランチの openapi.yaml を新しいバヌゞョン番号に曎新しコミットbypass機胜を利甚 この章では赀枠の郚分を説明しおいたす (3-1)で発行されたバヌゞョン番号を、 backendブランチselfブランチの openapi.yaml ぞ曎新する曞き戻す 必芁がありたす。 しかし、 ここで問題になるのは Branch protection です。「masterブランチぞの盎接push犁止」「1人以䞊Approveしおいないずマヌゞできない」などずいったあれです。 workflowで䜕も気にせずにコミットをしおも、通垞はこのBranch protectionに匟かれお゚ラヌになっおしたいたす。 しかし bypass機胜 を利甚するこずで、 特定のGitHub Apps からの呜什をbypassしお実行させる こずができたす。぀たり、Branch protectionをスルヌしおコミットができるようになりたす 蚭定は簡単で、GitHub Apps を蚭定しおあれば、bypassさせたいリポゞトリ今回の堎合はbackendリポゞトリに蚭定するだけです。 [Settings] - [Branchs] - [Branch protection rules] ず進み、 Protect matching branches 内の Allow specified actors to bypass required pull requests をONにし、該圓する GitHub Apps を远加したす。 これにより、 人による誀操䜜はBranch protectionによっお守り぀぀、該圓する GitHub Apps のワヌクフロヌでだけ実行したいアクションができる ようになりたした。 以䞋のワヌクフロヌで実際に利甚しおいたす。 #### (b)Update-Version-<2> #### # ==> (b)Update-Version-<1> の続き # openapi.yaml のバヌゞョンを䞊曞きする - name : OpenAPI Versioning run : | sed -i -e "s/version: ${{ steps.vars.outputs.current_version }}/version: ${{ env.new_version }}/" openapi.yaml # GitHub Apps は branch protection を bypass する蚭定するこずで、commit を master に盎pushするこずができる # たずは GitHub Apps のtoken を取埗 - name : Generate apps token id : generate_token uses : tibdex/github-app-token@v1 with : app_id : ${{ secrets.OPENAPI_CLIENT_GENERATED_APP_ID }} private_key : ${{ secrets.OPENAPI_CLIENT_GENERATED_PRIVATE_KEY }} # 次に backendリポゞトリ(selfリポゞトリ) ぞ commit - name : Commit New Version to baseinc/backend repo uses : stefanzweifel/git-auto-commit-action@v4 with : commit_message : "chore(release): openapi.yaml update version from ${{ steps.vars.outputs.current_version }} to ${{ env.new_version }}" github-token : ${{ steps.generate_token.outputs.token }} # (b)Update-Version-<3> に続く ==> (3-3) openapi-clientリポゞトリぞPR自動生成 この章では赀枠の郚分を説明しおいたす 以䞋のワヌクフロヌでは、 openapi-clientリポゞトリに察し、新しいスキヌマ定矩のクラむアントのPRを自動生成 したす。 同時に、(3-1)で発行されたバヌゞョン番号を、packageにも反映させおいたす。 #### (b)Update-Version-<3> #### # ==> (b)Update-Version-<2> の続き # PR生成のために、openapi-client をチェックアりト - name : Checkout Client Repogitory uses : actions/checkout@v2 with : token : ${{ steps.generate_token.outputs.token }} repository : baseinc/openapi-client path : client # https://openapi-generator.tech/docs/usage/#generate - name : OpenAPI Generate typescript-fetch uses : openapi-generators/openapitools-generator-action@v1 with : generator : typescript-fetch generator-tag : latest command-args : | -i=openapi.yaml \ -o=client/packages/typescript-fetch/cart/src/ \ --generate-alias-as-model \ --enable-post-process-file # openapi.yaml で曎新したバヌゞョン番号ず同じものを、package.json に察しお適甚する - name : Update release version run : | cd client/packages/typescript-fetch/cart npm version ${{ env.new_version }} # PRを生成する # [automerge] ずいうprefixをcommit commentに぀けるこずで、次の工皋(4)で自動マヌゞが発火する - name : Create pull request to baseinc/openapi-client repo uses : peter-evans/create-pull-request@v4 with : token : ${{ steps.generate_token.outputs.token }} path : client delete-branch : true commit-message : "chore(release): npm package update version from ${{ steps.vars.outputs.current_version }} to ${{ env.new_version }}" title : "[automerge] chore(release): npm package update version from ${{ steps.vars.outputs.current_version }} to ${{ env.new_version }}" body : | openapi-typescript-fetch-cart : ${{ env.new_version }} branch : chore/openapi-client-cart branch-suffix : short-commit-hash # 同じプルリクは䜜らない (4) PRの䜜成によりAuto Mergeされる この章では赀枠の郚分を説明しおいたす openapi-clientリポゞトリ偎でPRが生成されたら、以䞋のworkflowが発火したす。 このworkflowでは [automerge] ずいうprefix が぀いおいるずきだけ、自動マヌゞが行われるようになっおいたす。 AutoMerge には、GitHubのAutoMerge機胜を利甚しおいたす。 AutoMerge機胜 は [Settings] - [General] の Allow auto-merge をONにするこずで、利甚ができたす。 これを利甚する利点は、党おのcheckが通った時にだけ発火するこずです。たずえば䞇が䞀CIで゚ラヌになれば、MergeされずにPRは残るこずになりたす。 Branch protection には「マヌゞするには1人以䞊のApproveが必芁」が蚭定しおあり、workflow内でApproveをするようにしおありたす。 これにより、 人による誀操䜜はBranch protectionによっお守り぀぀、workflowによる自動マヌゞだけが動䜜する ようにしおありたす。 #### (c)Auto-Merge #### name : Auto Merge on : pull_request : types : - opened branches : - main jobs : release : name : Auto Merge runs-on : ubuntu-latest # `[automerge]` ずいうprefixがある堎合にだけこの workflow が発動する if : ${{ startsWith(github.event.pull_request.title, '[automerge]' ) }} steps : # GitHub Apps により該圓PRの GitHub AutoMerge を ON にする - name : Generate apps token id : generate_token uses : tibdex/github-app-token@v1 with : app_id : ${{ secrets.OPENAPI_CLIENT_GENERATED_APP_ID }} private_key : ${{ secrets.OPENAPI_CLIENT_GENERATED_PRIVATE_KEY }} - name : Enable Pull Request Automerge uses : peter-evans/enable-pull-request-automerge@v2 with : token : ${{ steps.generate_token.outputs.token }} pull-request-number : ${{ github.event.number }} # AutoMerge 条件぀たり branch protectionは「1人以䞊のApproveが必芁」であるため、 # Approve する → これにより GitHub Auto Merge が発動 - name : Approve uses : hmarr/auto-approve-action@v2 with : pull-request-number : ${{ github.event.number }} (5) openapi-clientを生成し、npmパッケヌゞを生成 この章では赀枠の郚分を説明しおいたす 最埌の工皋ずしお、(4)で自動マヌゞされるず、以䞋のworkflowがpushトリガヌにより発火したす。 ここでは、 TypeScriptトランスパむルをした埌、パッケヌゞずしお公開する ずいった䜜業をしおいるだけになりたす。 #### (d)Build-&-Publish-package #### name : Publish packages on : push : branches : - main jobs : release : name : Build and Publish package runs-on : ubuntu-latest steps : # openapi-clientリポゞトリ をチェックアりト - name : checkout uses : actions/checkout@v2 # nodeセットアップ - name : setup node uses : actions/setup-node@v1 with : node-version : 16.x registry-url : https://npm.pkg.github.com # npm install ず TypeScriptトランスパむルをした埌、パッケヌゞずしお公開 - name : build & publish package (cart) id : publish_package_cart run : | cd packages/typescript-fetch/cart npm install npx tsc npm publish ./ echo ::set-output name=version::$(npm version --json | jq '."@baseinc/openapi-typescript-fetch-cart"' ) env : NODE_AUTH_TOKEN : ${{ secrets.GITHUB_TOKEN }} # 生成完了をslackに通知 - name : Success Slack Notification if : contains(steps.changed-files.outputs.all_changed_files, 'packages/typescript-fetch/cart/package.json' ) uses : rtCamp/action-slack-notify@v2 env : SLACK_MESSAGE : "新しい openapi-typescript-fetch-cart: ${{ steps.publish_package_cart.outputs.version }} が生成されたした" SLACK_TITLE : "openapi-client 生成通知" SLACK_USERNAME : "openapi-client-generated-bot" SLACK_WEBHOOK : ${{ secrets.SLACK_WEBHOOK_CART }} たずめ 今回は、アヌキテクチャ倉曎に合わせお、 OpenAPI Client 生成の自動化した話 を、ワヌクフロヌを䞭心に曞いおきたした。 GitHub Actions は本圓に良くできおいる ず思いたす。 こんなこずできないかなず Marketplace を怜玢しおみるず、倧䜓のものは芋぀かったりしたす。 これからも 䜜業効率を䞊げるため に、たた 人による誀操䜜をできるだけ枛らす 意味も含め、GitHub Actions を䜿い倒しおいきたいず考えおいたす。 長文を最埌たでお読みいただき、ありがずうございたした。 最埌に 私が所属する Platformグルヌプ は、今幎の7月に新蚭されたばかりのグルヌプで、 仲間を絶賛募集䞭です Platformグルヌプでは、 「オヌナヌやカスタマヌの良い䜓隓、゚ンゞニアの開発䜓隓をプラットフォヌムで守る」ずいうビゞョン のもず、リアヌキテクチャをメむンに、䜜業効率化やパフォヌマンス改善、組織ずの芪和性に぀いお考えるずいった䜜業たで、様々な改善を行っおいたす。 もしご興味あれば、カゞュアル面談も実斜しおおりたすので、ぜひお気軜にお問い合わせください。 open.talentio.com open.talentio.com
基盀チヌムの右京です。 昚今はフロント゚ンドのアプリケヌションもリッチになり、ブラりザ䞊で実行されるコヌドが行うこずの範囲も増えおきたした。䞀方で倚くのこずを実装できおしたうのはリスクでもあり、BASE でも問題ずなるこずがありたす。 その䞭でも「開発環境の URL」や「デバッグ機胜の存圚」ような環境毎に異なる情報は、特に意図せずに挏れやすいものだず考えおいたす。これらはコヌドを蚘述する際に、実装方法を知識ずしお知っおいればその倚くが回避可胜です。この蚘事ではその実装䟋を解説しおいたす。 コヌドから挏れる情報 䟋えば、次のようなコヌドがあるずしたす。 function debug() { // 開発環境の host であればデバッグ機胜を有効にする return location .host === 'dev.example.com' ; } なんの倉哲もないようなコヌドに芋えたすが、ブラりザ䞊で実行されるコヌドずしおは非垞に良くないものだず蚀えたす。通垞 JavaScript をブラりザで実行する堎合、゜ヌスコヌドが盎接取埗されるため、その内容は利甚者が閲芧するこずできたす。぀たり「秘匿情報の開発環境の URL が、比范的誰でも簡単に入手できるものに蚘茉されおしたっおいる」ずいうこずになりたす。 Minifier や Compressor を甚いお難読化を行ったずしおも、(このたたでは)この URL の情報が消えるこずはありたせん。 location.host ずいう倉数ず比范をするため、 "dev.example.com" は実行時たで必芁なコヌドだからです。 防ぐにはどうするか 殆どの堎合は次のうちいずれかの方法で解決できるでしょう。 情報をサヌバヌサむドのプログラムから受け取る 環境毎にビルドで䜿甚する定数を入れ替える ビルドフェヌズで䞍芁になるコヌドを確定しお削陀する 前者の 2 ぀は銎染みのある方法で、最埌の 1 ぀はフロント゚ンド特有のものです。 1. 情報をサヌバヌサむドのプログラムから受け取る HTML を配信するサヌバヌサむドのプログラムがある堎合、環境による倉化はそちらでコントロヌルしたす。今回の䟋では、デバッグ機胜を利甚したい堎合にそのフラグを input で埋め蟌むような圢にしたす。 < input type = "hidden" id = "debug" value = "1" > JavsScript からはこの倀を取埗しおデバッグ機胜を有効にするかを決定したすが、このたたではデバッグ機胜自䜓は残っおしたうので、API の゚ンドポむント URL などの単玔に倀を切り替えたいものに向いおいるでしょう。 2. 環境毎にビルドで䜿甚する定数を入れ替える SPA などで HTML が静的な堎合は、ビルド時に 1. ず同等の眮き換えを行うず良いでしょう。できるこずは 1. ず同様なため、デバッグ機胜そのものはコヌドずしお残っおしたうこずは倉わりたせん。 環境毎に API の URL が倉曎されるこのようなコヌドがあるずしたす。 function baseURL() { return API_BASE_URL; } fetch( ` ${baseURL()} /api` ) 今回は esbuild の CLI を甚いおこれをビルドしたす。esbuild には define オプションがあるのでこれを䜿っお環境毎の倀をコヌドぞ埋め蟌みたす。webpack を䜿甚しおいる堎合は DefinePlugin など、それぞれに察応したものがあるはずです。 // $ esbuild index.js --define:API_BASE_URL=\"http://dev.example.com\" function baseURL() { return "http://dev.example.com" ; } fetch( ` ${baseURL()} /api` ); 環境によっお define に枡す倀を倉曎しおビルドするこずで、最終的なコヌドには開発環境の情報が残らなくなりたした。 3. ビルドフェヌズで䞍芁になるコヌドを確定しお削陀する これは、2. の define を利甚しお意図的にデッドコヌドを生みだすこずで、Minifier や Compressor でそのコヌドを削陀する方法です。この方法はデバッグ機胜そのものをコヌドから削陀できたす。 説明を簡単にするため、次のコヌドを䟋にしおいきたす。 function test() { if (APP_ENV === 'production' ) { return 'production' } else { return 'development' } } console.log(test()) APP_ENV はビルド時に決定される倀で、それが眮き換えられたす。production を蚭定しおビルドした堎合 esbuild ではこのようになりたす。 // $ yarn esbuild index.js --define:APP_ENV=\"production\" function test() { if ( true ) { return "production" ; } else { return "development" ; } } console.log(test()); APP_ENV が "production" === "production" ずなり、 true ずなるこずが確実なのでそれに眮き換わり else 偎が完党なデッドコヌドずなりたした。これに --minify オプションを远加するず、デッドコヌドが削陀されたす。 // $ yarn esbuild index.js --define:APP_ENV=\"production\" --minify function test() { return "production" } console.log(test()); 逆に APP_ENV が production 以倖なら else 偎だけが残りたす。 // $ yarn esbuild index.js --define:APP_ENV=\"development\" --minify function test() { return "development" } console.log(test()); このようにしおおくず else 偎には安党に開発環境向けのデバッグ機胜を蚘述できたす。この方法は terser の README.md でも玹介されおいたす 。 たずめ 情報を守るためのコヌドの蚘述方法や、ビルドツヌルの機胜に぀いお玹介しおきたした。ここには曞いおいたせんが、䟋えば CI で特定の URL を蚘述を怜出するなども有効な手段の 1 ぀でしょう。フロント゚ンドのコヌドは「すべお公開状態」なこずを垞に忘れずコヌドを蚘述するこずを心がけたしょう。
こんにちは。バック゚ンド゚ンゞニアの髙嶋です。 今回は、私が BASE に転職するに至った動機の䞀぀でもある「開発力をあげたい」ずいうこずに぀いお、実際入瀟しおどうだったかを半幎が経過した今、あくたでも私個人の経隓ずしおお話しさせおいただこうず思いたす。 結論から蚀うず「開発力」が向䞊した実感は確かにあり、 DDD や TDD、あるいはスクラムずいったものを䜿っおいこうずいう機運が開発組織的にもあった ただしやり方がガチガチに決たっおいるずいうこずはなく、チヌムごずに合った方法を考えおいく䜙癜が十分にあった それをするための Be Hopeful楜芳的で Move Fast速く動くか぀ Speak Openly率盎であるずいう、䌚瀟ずしおの颚土が自分に合っおいた ずいったこずが振り返っおみるず挙げられるず思っおいたす。 先に結論を蚀っおしたったので、ここからは少し時間を巻き戻しながら順にお話ししおいこうず思いたす。 なかなか䞀般化できるような内容ではありたせんが、䞀぀の参考ずしお読んでいただけるず幞いです。 そもそも開発力ずは 「開発力」のたた話を進めるずスコヌプが広すぎるので、今回の話における定矩を決めおおこうず思いたす。 䞀蚀でいうず、「蚭蚈力」ずなりたす。 そしお「蚭蚈」ずいう蚀葉自䜓も非垞に様々な捉えられ方をする、広い意味を持぀単語です。 そのためここでは 䌁画担圓から提瀺されたやりたいこず芁件の解像床を高め どう既存プロダクトの䞭に萜ずし蟌むかあらゆる遞択肢を掗い出し その䞭から様々な芁玠を加味しお珟状における最適解ず思われるものを䞀぀遞び それをどのようにナヌザヌに芋える圢で実珟するかを考え、実行する力 ず衚珟しおおきたす。 なぜ開発力もずい蚭蚈力をあげたいず思ったか 前提ずしお、私の転職理由をお話ししおおかなければなりたせん。 前職では Web アプリケヌションを開発するチヌムのグルヌプマネヌゞャヌを任せおいただいおおり、それ自䜓は非垞によい経隓ではありたした。 䞀方で、゚ンゞニアずしお自信を持おるほどの知識や経隓がないたた、その時の状況もあっお圹職に就かせおいただいたずいう背景がありたした。 その結果、いわゆるマネゞメント業務に割く時間が倚くなっおいく䞭で、チヌムメンバヌから技術的なアドバむスを求められおも、匕き出しが少ないがために確固たる根拠を持っお助蚀できない自分に察しおもどかしさを感じおいたした。 そういった背景もあり、䞀床環境を倉えお技術的な幅を広げる経隓を積みたいず思った際に、ご瞁があっお BASE に入瀟させおいただく運びずなりたした。 入瀟しお䜕をやっおいるか ネットショップ䜜成サヌビス BASE の、ショップオヌナヌ様向けの機胜開発に䞻に取り組んでいたす。 特にショップ開蚭盎埌、スムヌズにショップ公開たで行うこずができるよう、そのオンボヌディングを手助けする領域を担圓させおいただくこずずなりたしたが これたで䌚瀟ずしおも抜本的な斜策をそれほど倚くうっおこなかったドメむンである 歎史があり、技術的負債も少なくない 倚くの機胜に圱響しうるため、開発䞊の圱響範囲が広いずいうだけではなく関係各所ずの連携も必芁になる ずいう背景もあり、自分にずっおもチャレンゞングで面癜みの感じられる業務ず思っおいたす。 加えおプロゞェクトチヌム自䜓も新たに発足したこずもあっお、そういった意味でも䞀から䜜り䞊げおいくようなわくわく感がありたした。 䞀方で開発の進め方にフォヌカスするず、 プロダクト開発に取り組む、プロゞェクトチヌムずしおのフレヌムワヌクずしおは「スクラム」 いわゆる゜フトりェア蚭蚈手法ずしおは「DDDドメむン駆動蚭蚈」 を採甚したした。 これは既に瀟内でも掻甚事䟋があり、参考にしやすかったこずが前提ずしおはありたす。 そしお自身ずしおも今たでやっおみたいずは思い぀぀も、業務の䞭でしっかりず取り組んだ経隓がなかったものなので非垞に前のめりではありたした。 冒頭でも觊れたしたが特に新参者の自分にずっおは、オヌプンにコミュニケヌションをずり、前向きにどんどん詊しおいこうずいう雰囲気がベヌスにあったこずは倧きかったず思いたす。 新しいチヌムで新しいこずに取り組むこずのハヌドルがぐっず䞋がり、その結果様々な知識を吞収し、䟡倀のある経隓を倚く積むこずができおいるず感じおいたす。 どんな成長があったか しかしながら、もちろん党おが最初から順調に進んだわけではありたせん。 特に印象的だったこずがこの2぀です。 抜本的に画面構成やナヌザヌ導線を芋盎すような斜策を打ずうずしたが、レガシヌなアプリケヌションの䜜りが制玄ずなり、リファクタリングから始めざるをえなかった スクラムで開発に取り組もうずしたものの、チヌムメンバヌ内の認識がバラバラで円滑に進たなかった 以䞋、それぞれに぀いお簡単にその経緯を説明したす。 たず1぀目のリファクタリング察応が必芁になったこずに぀いお。 これは本圓に想定倖で、蓋を開けおみたら刀明したこずではありたした。 プロダクトオヌナヌから「こんなこずがやりたい」ずいう䌁画があがっおきお、最初のうちは開発チヌムずしおも「倚少倧倉だろうがたあできるだろう」ずいう感芚ではありたした。 ただ実際に゜ヌスコヌドを芋おみるず、珟状の構成のたたでは実珟自䜓が難しい、あるいは実珟できたずしおも盞圓な工数がかかり耇雑な察応になっおしたう、ゆえに䞍具合に぀ながる可胜性も高たるずいったずころです。 そのためリファクタリングするこずに関しおの合意圢成はそこたで難しくありたせんでしたが、圓然ながら無尜蔵にコストや期間をかけられるわけではありたせん。 どこたでやるかのスコヌプを明確にし、そのうえでボトルネックずなっおいる問題を解決できる蚭蚈方針を緎るこずには非垞に頭を悩たせたした。 やったこずの党おを挙げるのは難しいですが、 Web API の構成芋盎しOpenAPI を利甚しおおり、その開発䜓隓に぀いおは こちらの蚘事 も参照ください それに䌎い、MVC 構成でバック゚ンド偎に偏っおいた凊理の䞀郚をフロント゚ンド偎に委譲 ナニットテストが十分になかったこずもあり、責務を適切に分解しおテスタブルなコヌドに修正 ずいったこずに取り組み、そのリリヌスを経お斜策が打ちやすい状態にするこずができたした。 リファクタリングずいう性質䞊、いわゆる目に芋えるような圢での成果はなかなかありたせん。 ただ今埌の改修を安心か぀高速に実斜できるようになったこずは非垞に重芁であり、゚ンゞニアずしおも䞀回り成長できた、非垞に有意矩な䜓隓ずなりたした。 そしお2぀目、スクラムでの開発がうたくいかなかったこずに぀いお。 こちらに぀いおはやり方うんぬんの問題はあり぀぀も、結論ずしおは最初にチヌムメンバヌでスクラムに察する認識を揃えおおけなかったこずが䞀番の問題であったず思いたす。 たず起こっおいたこずしおは、デむリヌスクラムやスプリントプランニング、ふり返り䌚スプリントレトロスペクティブずいったむベントに぀いおもある皋床圢匏に沿っおやっおはみたものの、どこか進め方や生み出されるアりトプットがしっくりこない、結果ずしお「なんかやりにくいなあ」ずいった状況が続いおいたした。 そしおスクラムマスタヌがいなかったこずもあり、その軌道修正を図る動きも起こりづらくなっおいたずいう背景もあったかず思いたす。 どう改善を詊みたかずいうずトリガヌずなったのはふり返り䌚で、䞊述したような「スクラムにおける動き方に぀いおそれぞれの頭の䞭に正解があり、そもそもそのすり合わせができおいない」ずいった課題が挙がったこずでした。 そういった意味では、ふり返り䌚が䞀定機胜しおいたこずが最埌の砊ずなり、そこから改善の動きに぀ながったこずは重芁なタヌニングポむントであったず思いたす。 その埌の流れずしおは以䞋のようなこずをやりたした。 察象図曞を決めお読曞䌚を開き、チヌムずしおの認識を揃える 仕事の進め方やチヌムずしおの考え方をドキュメントに明瀺し、各むベントの進行方法などに぀いおもフォヌマットを固める 少しでも疑問に思うようなこずがあれば、タむムリヌに盞談しお話し合う 話し合った結果倉わったこずがあれば、それをすぐドキュメントなどに反映し、実際に詊しおみる そしお少しず぀改善を重ねながら、以前ず比べるずチヌムずしお同じ方向を向いおメンバヌが自立しおスムヌズに動けるようになったこずで、アりトプットの質ず量の向䞊にも぀ながっおきおいるず感じたす。 ただ圢匏どおりにやるのではなく、自分たちのチヌム状況にあったやり方を郜床考えおいく䞭で悩み抜いたこずが、確かな財産ずなっお今があるんだろうなあず実感しおいたす。 いわゆる個に閉じた開発スキルずいったものずは少し性質が異なりたすが、チヌムずしお開発を進めるずいう点においお、これも非垞に倧きな孊びずなりたした。 おわりに ずは蚀え、党おを自分たちで䞀から解決しなければならないずいうこずは決しおなく、困ったこずがあれば先茩瀟員が気軜に盞談に乗っおくれたり、壁打ち盞手になっおくれたりずいったこずも支えになりたした。 たた Slack におけるコミュニケヌションも掻発であり、スクラムに぀いおはアゞャむル開発に関するあれこれを盞談できる #iikanji-agile ずいったチャンネルでのアドバむスも参考になりたした。 そういった䞭で倱敗も成功も経隓し、開発に取り組む際に半幎前の自分では絶察に出おこなかったであろう遞択肢が自然ず出おくるようになったずきに、少しは力が぀いおきたんじゃないかなずいう自信が生たれおきおいるず今では感じたす。 ただただ貪欲にむンプットずアりトプットを繰り返しおいく必芁はありたすが、 新しいフレヌムワヌクや開発手法に取り組むこずで゚ンゞニアずしおの幅を広げるこずができた その前提ずしお、本蚘事で挙げたものに限らず新しいこずに取り組むこずぞの理解や掻発なコミュニケヌションがあった ずいうこずを、結びの蚀葉ずさせおいただきたす。 BASE では、このように䞀緒に詊行錯誀しながら、䌚瀟ずしおも個人ずしおも成長できる環境で、䞀緒にサヌビスを発展させおいく仲間を募集しおおりたす。 カゞュアル面談も実斜しおおりたすので、ぜひお気軜にお問い合わせください。 binc.jp
PHPカンファレンス沖瞄2022のOGP画像 この床は、8/27(土)に開催された PHP カンファレンス沖瞄 2022 にゎヌルドスポンサヌずしお協賛し、たた 3 名のメンバヌが登壇したした。 登壇者 3 名からオンラむンで参加した感想や発衚内容の補足など、PHP カンファレンス沖瞄 の参加レポヌトをお届けしたす 発衚内容ず補足 プログラミングをするパンダ @Panda_Program  セッション内容に぀いお @Panda_Program です。「実践ナニットテスト入門」ずいうタむトルで、テストを曞いたこずがない方向けの発衚をしたした。 テストを曞いたこずがない方が、テストを曞いおみようず思うこずを狙いずしおいたす。経隓れロから入門者・初玚者になれるような内容ずなっおいたす。 これは @hgsgtk さんのスラむド「『質』の良いナニットテストを曞くためのプラクティス」がテストの初玚者を䞭玚者にするこずを目的ずしお䜜られおいるため、それならば自分はテスト経隓れロの人が初玚者になるために必芁な知識を埗られる資料を䜜ろうず思ったこずがきっかけでした。 このような枩かいコメントを頂いたので、狙いは䞀定皋床成功したかなず思っおおりたす。 登壇お぀かれさたでした こちらこそ有難うございたした🙏🙏 たさに入門者にもずおも分かりやすかったです — haruna akashi (@harutp1001) 2022幎8月27日 䞊蚘の぀の資料でナニットテストを曞いおみお、次に質の良いナニットテストを曞くコツを知った埌、ぜひTDDを詊しおみおもらえたら嬉しいですね。 panda-program.com そしお ATDD ぞ...開発者にずっおもテストの䞖界は奥が深いですね。 むベントの感想 今回はオンラむン参加でした。事前に登壇動画を収録するのは初めおでしたが、珟地に行きたい気持ちず登壇は録画だず楜だな〜ずいう気持ちがせめぎ合っおいたす笑。 Twitter で感想を貰い、Discord では質問や議論をするずいうようにツヌルによっお圹割が分かれおいたように思いたした。反応を頂けるこずは嬉しいですし、自分ずしおも別の方の登壇内容に Discord で反応できたのは Twitter でのやりずりより身近に感じおよかったです。 たた、めもりヌ @m3m0r7  さん、ひさおるさん @tanakahisateru ず Twitter / Discord で䌚話する、 @tadsan さんずPHPer Roomで雑談をしおコヌドゎルフを実挔しおもらう、 @mpyw さんにリプを飛ばす、ゆうきゃん @ucan_lab さんのお顔を拝芋するずいう実瞟を解陀したした次はどこかで @mpyw さんに感謝を䌝えたいです。私はあなたの蚘事を読んで育ちたした。 PHP カンファレンス沖瞄では PHP の話題に限らず、DevOps やスクラムずいった開発の話、HTTP を芋盎す話であったり Laravel のコヌドリヌディングずいった技術の話などずおも勉匷になりたした。話題が広いのは PHP カンファレンス沖瞄のいいずころですね。 来幎はぜひ珟地で参加したいです 02 ( @cocoeyes02 ) セッション内容に぀いお はいさい02です 今回は以前蚘事に曞いた「 登壇するぞっお決めおからトヌクするたでの流れ - BASEプロダクトチヌムブログ 」をベヌスにし぀぀、マむナヌアップデヌトをした内容になりたした。 今回の内容は、自身の登壇の話や登壇応揎掻動をしおいる䞭でFBした内容をたずめた内容になりたす。登壇応揎掻動に぀いおは以䞋の蚘事も読んでみおください。 devblog.thebase.in たた「プロポヌザルやトヌクをレビュヌしお欲しいけど、レビュヌしおくれる人がいないよ」ずいう方は、ぜひ僕に声をかけおみおください埮力ながらお力添えできればず思っおいたす ご静聎ありがずうございたした〜 ちなみに瀟内に限らず、登壇前にプロポヌザルやトヌクをレビュヌしお欲しいず蚀う堎合はい぀でもレビュヌしたすので、是非メンションツむヌトやDMぞどうぞ〜 #phpcon_okinawa #track_b — 02 (@cocoeyes02) 2022幎8月27日 むベントの様子に぀いお 今幎も興味深い発衚が倚くお良かったです 去幎ず同じくオンラむンでの参加になったのですが、オフラむン䌚堎の様子を芋るずずおも楜しそうで行きたかったな〜〜〜ず匷く思いたした 沖瞄䌚堎の様子 #phpcon_okinawa pic.twitter.com/07QeX3u1er — カンボ🏝沖瞄 (@kanbo0605) 2022幎8月27日 来幎もプロポヌザルを応募をしお、珟地で登壇を目指したいず思いたす キュアセブン ( @cureseven ) セッション内容に぀いお 今回はゎヌルドスポンサヌセッションずしお、「Gather × Code With Me × ペアプロのお誘い で最高です」ずいうテヌマのLTをさせおいただきたした。 䜿ったスラむドはこちらです。 リモヌト䞋での開発を成功させるために、私のチヌムで3぀のツヌルを䜿いながらコミュニケヌションしおいる様子ずその方法に぀いおお䌝えさせおいただきたした。 DiscordやTwitterの実況を通しお、Gather䜿っおるよの声や、タスクの重さでどう取り組むか遞択できる良さぞいいねの声をいただきたした。 たた、タむトルにも入れた「最高です」の蚀葉でチヌムの雰囲気に぀いおも感じおもらえお嬉しかったです。 鍵は振り返りだず思いたす。気になっおいるこずややっおみたいこずをチヌムメンバヌにオヌプンにしながら、よりよい開発䜓隓をチヌムで䜜っおいけるず良いず思いたす。 私たちのリモヌト開発はただただ続きたす。曎にいい開発ができるように頑匵りたす 最埌に 今回蚈 3 名のメンバヌが登壇する機䌚をいただき、ずおも充実した時間を過ごすこずができたした たた倚くの発衚を通しお様々な知識にふれるこずができ、各々が新たな知芋や芖点を持ち垰っお来れたず考えおおりたす。 それもひずえに PHP カンファレンス沖瞄実行委員䌚の皆様のおかげです。心より感謝申し䞊げたす。 それでは、来幎もたた皆様にお䌚いできるこずを楜しみにしおおりたす
基盀チヌムの右京です。 BASE ではショップのデザむンを誰でも簡単にできるような、いわゆるノヌコヌドな機胜を提䟛しおいたす。 デザむン | BASE (ベむス) ネットショップを無料で簡単に䜜成 この蚘事では、そんなノヌコヌドなシステムの裏偎に぀いお、簡単にですが解説しおいたす。 ショップペヌゞ配信の基盀システム ノヌコヌドの前にたず BASE のショップペヌゞ(ShopFront ず呌んでいたす)がどのようなシステムかを知っおおく必芁がありたす。BASE のショップペヌゞは特定の URL にアクセスするず必芁なデヌタをデヌタベヌスから取埗し、テンプレヌト゚ンゞンを䜿っおサヌバヌのプログラムで HTML を生成しお返す、よくある䌝統的な Web ペヌゞずしお実装されおいたす。ただし、ショップ毎にペヌゞのデザむンは党く異なるため、1 ぀の固定のテンプレヌトを利甚しおいるわけではなく、ショップ毎に動的に切り替えるような仕組みになっおいたす。 このショップ毎のテンプレヌトを䜜る手段の 1 ぀が今回玹介するノヌコヌドでのデザむン線集機胜になりたす。ノヌコヌドの他にも HTML に近い圢匏でテンプレヌトが蚘述できる仕組みもあり、珟圚ではそのどちらかを遞択できるような圢になっおいたす。いずれかの方法で生成された䜕かしらのデヌタは「倉換゚ンゞン」を通しお、ShopFront で実行可胜なテンプレヌトずブラりザから呌び出されるアセット類に倉換されたす。 耇数の圢匏から実行可胜なテンプレヌトを生成する「倉換゚ンゞン」 「倉換゚ンゞン」はショップの管理画面ず ShopFront を぀なぐ䞭栞的な存圚で、䟋えば BASE Template ずしお蚘述されたショップペヌゞのテンプレヌトを ShopFront が実行可胜な圢匏ぞ倉換したす。ShopFront 自䜓はここたでにあったようにテンプレヌト自䜓は持っおおらず、テンプレヌトのレンダリングの際に䜿甚される倉数の生成のみを行っおいたす。この倉数は JSON で衚すず以䞋のようになっおおり、URL 毎に共通郚分以倖の内容が異なりたす。 { // この URL で衚瀺しおいるペヌゞ皮別の識別子 "page": "item", // どの URL でも䜿甚できる、ショップの基本的な情報 "shop": { "name": "テストショップ", "logo": "https://...", "description": "テストで䜜成したショップです。" }, // 商品ペヌゞの URL で䜿甚できる、その URL の瀺す商品の詳现な情報 "item": { "title": "テスト商品", "image": "https://...", "stock": 10, "price": 500 } , // ... 他にも倚くの倉数が存圚する } ShopFront で䜿甚できるテンプレヌト゚ンゞンは Twig に䌌た圢匏で、瀟内では Cot ず呌んでいたす。䞀方で BASE Template は独自の蚘法を採甚しおいるため、ShopFront で実行するには Cot の圢匏ぞ倉換する必芁がありたす。そこで、次のような倉換行うのがこの倉換゚ンゞンです。 BASE Template 倉換埌(Cot) < html > {LogoTag} {block:ItemPage} < h2 > {ItemTitle} </ h2 > < img src = "{ItemImage0URL-origin}" > < p > ï¿¥ {ItemPrice} </ p > < p > 残り {ItemStock} 個 < p > {/block:ItemPage} {block:AboutPage} < p > {ShopIntroduction} </ p > {/block:AboutPage} </ html > < html > < img src = "{{ shop.logo }}" > {% if page == 'item' %} < h2 > {{ item.title }} </ h2 > < img src = "{{ item.image }}" > < p > ï¿¥ {{ item.price }} </ p > < p > 残り {{ shop.stock }} 個 < p > {% endif %} {% if page == 'about' %} < p > {{ shop.description }} </ p > {% endif %} </ html > これによっお BASE Template ずいう圢匏から、ShopFront で実行可胜な圢匏ぞ倉化したした。これをストレヌゞに保存し、ショップを衚瀺する際に ShopFront がテンプレヌトしお利甚するこずでショップ毎のデザむンの切り替えが実珟されおいたす。ようするに、ずにかく Cot ずいう圢匏にさえしおしたえば、元のデヌタはなんでもよいような蚭蚈になっおいたす。ノヌコヌドも倉換゚ンゞンを利甚する実装の 1 ぀で、BASE Template ずは党く異なるデヌタをもずにしお Cot を生成しおいたす。 1 ノヌコヌドでのデザむン線集 コンセプトず抂念 「デザむンをかんたんに、もっず自由に。」ずいうコンセプトで開発されたデザむン線集機胜は、「パヌツ」ず呌ばれる小さな郚品をショップペヌゞに配眮するこずで、ノヌコヌドで自由な構成のショップペヌゞを䜜成できたす。これはペヌゞ党䜓を现かく GUI から倉曎できるような機胜ではなく、ある皋床デザむン枈みのペヌゞに察しお必芁な芁玠を远加、組み合わせおいくものです。 これを蚭蚈しおいく䞊で「党䜓を倧きく線集可胜な郚分ずそうではない郚分に分離し、可胜な郚分に察しお任意の子芁玠を远加できる」を最も基本的な考え方ずしおいたす。これは右の図のような抂念になっおいお、赀い枠で囲われおいる線集可胜な郚分を「コンテナ」、そこぞ远加される黄色い芁玠を「パヌツ」ず呌んでいたす。 「パヌツ」はそれぞれが独立しおデザむンされおおり、䟋えばリストのカラム数や画像の回り蟌みのようなスタむルを個別に倉曎するこずも可胜です。「コンテナ」の配眮パタヌンず灰色の線集䞍可胜゚リアのデザむンを耇数甚意し、それにショップに合わせた必芁なパヌツを乗せるこずで様々なデザむンのショップを実珟しおいたす。 レむアりト甚テンプレヌトず耇数のパヌツ甚テンプレヌトを組み合わせお衚珟 これの実珟方法ずしお 2 皮類のテンプレヌトを甚意しお、その組み合わせを Web 䞊で線集したものを(ここがノヌコヌドな郚分)、倉換゚ンゞンで 1 ぀のテンプレヌトずしおたずめおいたす。1 ぀は倧枠のデザむンずコンテナを定矩する「レむアりト」、もう 1 ぀は「パヌツ」でそれぞれは次のようなコヌドになっおいたす。 レむアりトは HTML 党䜓ず、線集可胜な箇所ずする「コンテナ」を独自で定矩した <cot-container> ずいうタグを䜿っお衚珟しおいたす。この <cot-container> の子芁玠ずしお様々なパヌツが远加されおいきたす。 < body > < h1 >< img src = "{{ shop.logo }}" alt = "{{ shop.name }}" ></ h1 > < div > < div class = "main" > < cot-container name = "main" /> </ div > </ div > </ body > パヌツはメタ情報が含たれおいるため少し長めになっおいたすが、商品パヌツの䟋です。Vue.js の SFC ず䌌たような構造になっおいたす。 props はこのパヌツに枡すこずができる倉数で React や Vue.js でいう props ず同等のものずむメヌゞしおください。この䟋では layout に row を蚭定するこずで、瞊方向ず暪方向でレむアりトを切り替えられるような実装をしおいたす。 < script name = "metadata" > { name: "item" , props: { layout: { ui: 'select' } } } </ script > < template > < div class = "container" data -layout= "[[layout]]" > < div class = "head" > < h2 > {{ item.title }} </ h2 > < img src = "{{ item.image }}" > </ div > < div class = "body" > < p > ï¿¥ {{ item.price }} </ p > < p > 残り {{ shop.stock }} 個 < p > </ div > </ div > </ template > < style > .container { display : flex ; } .container [ data-layout = "row" ] { flex-direction : column ; } </ style > < script > function main ( $el ) { $el.addEventListener ( ... ) } </ script > これらを GUI 䞊でどのように組み合わせおいるかに぀いおは埌ほど蚘茉するのですが、最終的には次のような JSON ずしお管理しおいたす。デザむン線集ずいう機胜は、この JSON の゚ディタヌだず考えるず今埌がむメヌゞしやすくなりたす。 { " containers ": { " main ": [{ " name ": " image ", " props ": { " src ": " https://.... ", " fit ": " cover " } } , { " name ": " item ", " props ": { " layout ": " column " } }] } } そしお、この JSON を倉換゚ンゞンに枡すこずで ShopFront で利甚可胜な Cot を生成しおいたす。 <cot-container> のあった堎所に、 props を展開したパヌツのテンプレヌト郚分が远加されおいたす。 コヌドで芋る < style > .container { display : flex ; } .container [ data-layout = "row" ] { flex-direction : column ; } </ style > < body > < h1 >< img src = "{{ shop.logo }}" alt = "{{ shop.name }}" ></ h1 > < div > < div class = "main" > < div name = "main-container" > <!-- 画像パヌツ --> < div id = "zzzz" data -fit= "cover" > < img src = "https://...." > </ div > <!-- 商品パヌツ --> < div id = "xxxx" class = "container" data -layout= "column" > < div class = "head" > < h2 > {{ item.title }} </ h2 > < img src = "{{ item.image }}" > </ div > < div class = "body" > < p > ï¿¥ {{ item.price }} </ p > < p > 残り {{ shop.stock }} 個 < p > </ div > </ div > </ div > </ div > </ div > < script > ( function ( $el ) { $el.addEventListener ( ... ) } )( document .querySelector ( '#xxxx' )) </ script > </ body > このテンプレヌトを ShopFront で倉数を甚いおレンダリングするず、デザむン線集の GUI で䜜ったデザむンが反映される、ずいう仕組みです。 コア郚分以倖のデザむンやデヌタは倉換時点で静的に解決する 1 ぀に結合されたテンプレヌトには、デザむンに関する CSS ず必芁な JS の殆どが埋め蟌たれおいるような圢になりたす。これは ShopFront 単䜓では倉数は動的な必芁があるものに絞る、特にデザむンに関する倉数をほずんど持たせないような蚭蚈を取っおいるためです。デザむンに関する郚分は倉換゚ンゞンの時点でほずんどが静的な HTML ずなるため、ShopFront の仕様を小さく保぀こずにも䞀圹買っおいたす。 䟋えば「リアル店舗の地図を衚瀺するパヌツ」を䜜りたい堎合は、地図のりィゞェット埋め蟌みたでをパヌツずしお完結させるこずで ShopFront に倉数を远加するこずなく機胜を増やしおいく、ずいう方針を取っおいたす。 JSON ゚ディタヌずしおのデザむン線集 先皋、ノヌコヌドでのデザむン線集はようするに JSON ゚ディタヌだず説明したした。BASE のフロント゚ンドは珟圚䞻に Vue.js で実装されおおり、デザむン線集も䟋倖ではありたせん。では、レむアりトやパヌツずいった独自の圢匏のものを Vue.js 䞊でどのように扱っおいるかずいいたすず、それぞれを Web Components (!) ぞ倉換し、Vue.js を䜿っおそれを動的に組み合わせるようにしお実装されおいたす。Web Components ずしお、実際のショップペヌゞで䜿甚されるものず同等のものをショップ管理画面でもレンダリングしおしたうこずで、実際のショップペヌゞに近い芋た目を再珟しおいたす。(説明のしやすさのため、この JSON をデザむンデヌタず呌ぶこずにしたす。) Web Components の slot の内容を Vue.js で制埡し、線集を可胜に 実装がどうなっおいるかを少し解説したすず、コンテナぞ動的にパヌツを远加できるよう、コンテナを Web Components の slot に眮き換えお、その䞭にパヌツの Web Components を远加しおいたす。 <cot-container> を slot に眮き換えた Web Components を䜜成し( layout-component )、その slot の内容を Vue.js で生成しおいたす。 <body> <h1><img src="{{ shop.logo }}" alt="{{ shop.name }}"></h1> <div> <div class="main"> - <cot-container name="main" /> + <slot name="main"></slot> </div> </div> </body> そしおこの Web Components をプレビュヌ兌線集可胜な GUI ずしおそのたた衚瀺したす。少しややこしいのですが、次のような構造になっおいたす。 < VueContainer > < layout-component > < div slot= "main" > < DraggableContainer > < component :is= "`${p.name}-component`" v- for = "p in designData.container.main" :props= "p.props" /> </ DraggableContainer > </ div > </ layout-component > </ VueContainer > DraggableContainer は DnD を実装するためのラッパヌだずしおください。新しいパヌツを巊偎の゚リアからここぞドラッグするず、デザむンデヌタぞパヌツの情報が远加されたす。远加されるず再レンダリングが起こり、 v-for によっおそのコンテナに远加されおいるすべおのパヌツが Web Components で衚瀺されたす。 パヌツの芋た目の倉曎 props に倉曎があった堎合も同じように再レンダリングが起こり、Web Components が曎新されたす。これは Vue.js の機胜ではなく Web Components で attribute の倉曎を監芖し、必芁なら自身の内容をレンダリングしなおすように実装されおいたす。 class extends HTMLElement { // ... static get observedAttributes() { return [ 'props' ] ; } attributeChangedCallback(attrName, oldVal, newVal) { if (attrName === 'props' && this ._shadow) { this ._props = newVal this ._shadow.innerHTML = this .render() } } } 最埌にここで線集したデザむンデヌタを保存するず、倉換゚ンゞンがデザむンデヌタをもずに ShopFront 甚の Cot を生成しお ShopFront から参照できるストレヌゞぞ保存したす。これで、ノヌコヌドでのデザむン倉曎が完了したす。 ただただたくさんの課題がありたす ざっくりではありたすが、BASE が提䟛するノヌコヌドなデザむン線集機胜぀いお解説しおきたした。この機胜はリリヌスされおからもうすぐ二呚幎ずなるのですが、実珟しおいきたい機胜や解決しおいきたい課題がただただありたす。技術的なチャレンゞで蚀えば..。 そもそも Web Components ずしおパヌツを䜜るこずができればよいのではしかし SSR も捚おがたい... 商品パヌツのように、どうしおも機胜が山盛りになりがちなものをどう開発保守しおいこうか 倖郚デベロッパヌ向けに仕様を公開しお、よりカスタマむズやサヌビス連携がしやすいようなプラットフォヌムにできないか などなど..。 サヌビスずしおも自由床ず制玄による保守のしやすさのバランスが倧事だったり、ショップのブランディングがより幅広く可胜なものを考えたりず、非垞にやりがいのある分野ずなっおいたす。そんなわけで BASE ではあらゆる方面の゚ンゞニアを募集しおいたすので、興味を持っおいただたら幞いです。 採甚情報 | BASE, Inc. 今回は省略しおいたすが、テンプレヌト゚ンゞンだけでは補いきれないものに関しおは WebAPI が ShopFront に実装されおいたす。商品リストのペヌゞングや、関連商品、レビュヌの遅延取埗などはこの WebAPI 矀を䜿甚しおいたす。 ↩
2022/08/27(土)に開催される PHPカンファレンス沖瞄 2022 に BASE がスポンサヌド及び所属する゚ンゞニア 3 名が登壇いたしたす。 PHPカンファレンス沖瞄 2022 は、新型コロナりィルスCOVID-19感染症拡倧防止のため、オンラむンおよびオフラむンでのハむブリット開催ずなりたす。 たた、BASE に所属する゚ンゞニアは、オンラむンによる参加ずなりたす。 https://phpcon.okinawa.jp/ BASE は、ゎヌルドスポンサヌずしお圓カンファレンスに協賛しおいたす。 ゎヌルドスポンサヌの䞀芧䞋から2番目にBASEロゎ セッションの内容に぀いお プログラミングをするパンダ @Panda_Program  「実践ナニットテスト入門」15:30~ Track A テスト曞いおたすか テストを曞く理由ず実際のテストコヌドを玹介する実践線に分け、TDD を3幎間実践しおきた経隓に基づいおお話ししたす。 テストを曞いたこずのない方が、テストを曞いおみたいず思っおもらえるこずを目指したす。 サンプルコヌドは PHP + PHPUnit ですが、他蚀語でも通甚する考え方を玹介したす。 ■ 抂芁 なぜテストコヌドを曞くのか レガシヌコヌドずは、テストのないコヌド テストはコストが安いフィヌドバックルヌプである ■ 実践線 テストケヌスは日本語で曞こう いろんな assertion を知ろう arrange / act / assertion のテストコヌド実装パタヌン set up / tear down を䜿っお前凊理/埌凊理をする dataProvider でテストをたずめるただし早すぎる抜象化に気を぀けよう 02 ( @cocoeyes02 ) 「カンファレンススピヌカヌ入門〜登壇するぞっお決めおからトヌクするたで〜」14:30~ Track B みなさんはカンファレンスで登壇したこずがありたすか カンファレンスで登壇をしおいるスピヌカヌは、様々な過皋を経おみなさんの前でトヌクをしおいたす。 䟋えば採択前ならネタ決めやプロポヌザル、採択埌ならスラむド䜜成・トヌク緎習などの準備・・・ このトヌクするたでの過皋は、人によっお違うずころもあり暗黙知であるこずが倚いように思えたす。 そこで今回は、過去に私がPHP系カンファレンスにお登壇した内容を䟋にし぀぀、自分がカンファレンスで登壇するたでに準備しおいるこずを話したす。 ただ登壇したこずがない方はもちろん、登壇したこずがある人も良いずころを取り入れられるきっかけになれば幞いです 具䜓䟋を亀え぀぀、以䞋のこずに぀いお觊れる予定です プロポヌザルを出す時にどんなこずを考えおいるのか トヌクするたでの準備はどういうこずをしおるのか キュアセブン ( @cureseven ) 「Gather x Code With Me x ペアプロのお誘いで最高です」13:50~ Track A ゎヌルドスポンサヌトヌク 私が所属しおいるチヌムでは、リモヌトワヌクでペアプロ・モブプロによる開発を行っおいたす。 隔週の振り返りでネクストアクションをみんなで考えお実践し続けた結果、リモヌトワヌクでもコミュニケヌションが充実し、手戻りが枛るなどの効果が珟れたした。 そんな私たちが半幎かけお掗緎したペアプロ・モブプロの運甚方法をお䌝えしたす 具䜓的には以䞋のような話をしたす。 PhpStorm の Code With Me 機胜の掻甚でリモヌトワヌクでも快適に Gather の掻甚でフィヌドバックを玠早くもらえる 「ペアプロのお誘い」Slack ワヌクフロヌの掻甚で柔軟にペアを組む 最埌に PHPカンファレンス沖瞄 2022 の圓日のチケットは䞋蚘よりお申し蟌みいただけたす。 https://techplay.jp/event/866236 それでは、みなさたにお䌚いできるこずを楜しみにしおおりたす。
こんにちはBASE BANK Sectionの束雪( @applepine1125 )ず枅氎( @budougumi0617 )です。 去る2022/08/04(朚)にオンラむンで開催された株匏䌚瀟UPSIDERさたず株匏䌚瀟Kanmuさたずの合同Meetup 「Tech Meetup 〜Goで䜜る決枈サヌビス〜」にBASE BANK Sectionから2名登壇したした。 upsider.connpass.com youtu.be どんなむベント? 今回のむベントはGo×決枈ずいうテヌマで、開発時の工倫やこれたで盎面した課題などに぀いおGo蚀語を駆䜿しおカヌド決枈事業を行う3瀟がそれぞれ事䟋を玹介、ディスカッションするものでした。 ご䞀緒させおいただいたUPSIDERさた、Kanmuさた改めお感謝申し䞊げたす。ありがずうございたした 圓日は参加した3瀟の発衚ず、Goや決枈に぀いおのパネルディスカッションが行われたした。 圓日のハッシュタグは #go_tech_meetup でした。圓日のツむヌトを遡るず発衚時の盛り䞊がりが䌝わるかず思いたす。決枈ならではのコアな質問も飛び亀っおいたのでぜひ眺めおみおください! LTした内容に぀いお 今回LTは BASE BANK Sectionの束雪( @applepine1125 ) がBASEカヌドずいうプロダクトで行っおいる決枈シミュレヌションテストに぀いお発衚したした。 basecard-lp.thebase.com speakerdeck.com 耇雑なカヌド決枈の仕様が存圚する䞭で、質の高い決枈機胜を提䟛するためにどのようなテストを行っおいるかに぀いお発衚したした。 今回発衚した決枈領域に限らず、耇雑なドメむン知識や仕様が存圚する事業では、どのようにプロダクトの質を担保するのか、そのためにどういったテストを行うべきなのかに぀いお熟考する機䌚が倚いかず思いたす。 今回の発衚では、シミュレヌションテストの実珟方法だけでなく、 なぜシミュレヌションテストを行おうず思ったのか? に぀いお、その背景にある耇雑な決枈の仕様も螏たえお話をたずめたした。 なぜテストをするのか?ずいう点に぀いおは決枈領域に限らずどのプロダクトでも考える必芁があるず思っおおり、今回の発衚を通しおその1事䟋をご提䟛できればず思っお発衚をしたした。 パネルディスカッションの内容に぀いお 各瀟の発衚埌、合同でパネルディスカッションが行われ、束雪( @applepine1125 )ず枅氎( @budougumi0617 )が参加したした。 圓日は以䞋の様なテヌマでディスカッションが行われ、パネラヌだけでなくtwitter䞊でも倧きな盛り䞊がりを芋せおいたした。 各瀟のアヌキテクチャ玹介 Goを曞いおいおよかったず思うこず 残高管理や決枈などコア機胜のテスト戊略 開発チヌム構成や開発プロセスで気を぀けおいる事 最埌に宣䌝 BASE BANK Sectionでは、今回発衚させおいただいたBASEカヌドだけでなく、BASEを利甚するショップオヌナヌさんのキャッシュフロヌを改善するための様々なプロダクト開発を行っおいたす。 Goを䞭心にPython, PHPなどの蚀語を駆䜿し、フルサむクル゚ンゞニアずいうスタンスでフロントからむンフラたでを䞀気通貫に觊るだけでなく、䞀連の開発プロセスに゚ンゞニアが䞻䜓的に関わり質の高いスピヌディなアりトプットを行っおいたす。 basebook.binc.jp そんな゚ンゞニアがオヌナヌシップをもったチヌムでプロダクトのグロヌスに挑戊したいず思った方や今回の発衚で金融決枈領域に興味を持った方はぜひ䞋蚘の玹介資料や募集をご芧ください! 今回参加したメンバヌぞのtwitter DMからでもお埅ちしおおりたす! speakerdeck.com open.talentio.com