Upgrade to Pro — share decks privately, control downloads, hide ads and more …

爆速で成長する おでかけ情報サービスの成長を支えるデザインと開発の取り組みについて

mahiguch
October 25, 2022

爆速で成長する おでかけ情報サービスの成長を支えるデザインと開発の取り組みについて

GREE Tech Conference 2022の登壇資料です。

mahiguch

October 25, 2022
Tweet

More Decks by mahiguch

Other Decks in Technology

Transcript

  1. 7
 7
 国内最大級の おでかけ情報サービス 80万 60万 掲載記事数 総口コミ数 掲載メディア数 500

    appカテゴリランキング両 OS首位 「Google Play ベスト オブ 2018」ベスト アプリ 2018 生活お役立ち部門 優秀賞 ※2019年1月時 点 1500万 500万 月間ユーザー数 アプリDL数 月間流通額 12億円 aumoについて
  2. 9
 9
 事業を通じて実現したい未来 メディア SaaS 課題 ユーザー 店舗・施設 行きたいお店、施設、場所が見つからない Ex.地元で人気の飲食店に行きたいのに定番のお店

    しか情報がない 価値 提供 ユーザーとロケーションのマッチング最適化 地域情報を網羅的に集めて、求めるユーザーに届ける 課題 大規模ポータルサイトに広告投下しないと集客ができ ない、簡単・安価にマーケティングしたい 価値 提供 実店舗のマーケティングをワンストップで提供 サイト作成、顧客管理、プロモーション、決済など
  3. 13
 13
 SaaS事業の特徴 SNSのアカウント管理や分析、SNS投稿の サイト掲載ができる フォロワーを増やしたい・認知を広げたいな どのニーズに合わせた広告出稿も可能 SNS ドメインパワーの強いaumoサイト内に施設 ページを作成

    SEO獲得しているキーワードページに掲載 が可能 SEO (検索対策) Googleビジネスプロフィールを一括管理で きる MEOの順位をさらに上げたい場合も施策投 下可能 MEO (マップ検索対策) 実店舗のマーケティングとして必須と言われるSEO・SNS・MEOの領域で主にサービスを展開
  4. 14
 14
 今後事業の方針 ユーザー規模を3年で3倍にしていく (より多くのユーザーに使ってもらうサービスに ) メディア事業 口コミなど一般ユーザーの生の情報が集まるメ ディアを目指す 投稿したくなるサービスに磨きをかけて、コミュニティを活性化さ

    せて、ユーザーからの口コミを増やす(UI/UXの改善、ポイント 機能、満足度の高いレコメンド機能など) より多くのユーザーが使える環境づくり 速度改善、SEO改善など 顧客のニーズにあわせた機能開発を爆速 で進めていく SaaS事業 ロイヤルカスタマーを生み出せるための 機能開発 デジタルギフト、プレゼントキャンペーン機能など 店舗・施設の情報を、より多くのユーザーに最適に 届ける仕組みづくり プレスリリース掲載・拡散 Googleビジネスプロフィール管理ツールなど
  5. 33
 33
 【変更前】画面ごとの定義 <style lang="scss"> .page-leaflet { &__title { &-text

    { &.glay { color: #777; } 【変更後】全体で使えるように定義 <style lang="scss"> .color { &-neutral-gray-700 { color: #777; } カラーパレット対応: cssのclass名をFigmaに合わせた
  6. 35
 35
 pages/organizations/_id/leaflets/_leafletid/index.vue 【変更後】 export default { layout: 'OrganizationTemplate' }

    【変更前】 <template lang="pug"> header img(src="~assets/images/log o.svg") div お店・施設管理画面 チラシ入稿画面 - レイアウト コンポーネント
  7. 36
 36
 pages/organizations/_id/leaflets/_leafletid/index.vue 【変更後】 <template lang="pug"> div SidebarOrganization 【変更前】 <template

    lang="pug"> ul li NuxtLink(:to="path") 店舗管理 li NuxtLink(:to="path") 店舗一覧 チラシ入稿画面 - メニュー コンポーネント
  8. 37
 components/molecules/form/shop/FormShopLeafletImages.vue 【変更後】 div FormShopLeafletImages 37
 【変更前】 form div(v-for="image in

    leafletImages" :key="image.id") チラシ入稿画面 - コンポーネント コンポーネント
  9. 42
 42
 • デプロイ頻度の高さ ◦ 開発差分が出来上がる度に各人がデプロイ作業をする体制 ◦ デプロイ先も多い ▪ qaデプロイの際はqa

    ▪ 本番デプロイの際はinternalとproduction • 作業の手間と抜け漏れリスク ◦ rspecテストによるデータ整合性の確認 ◦ アセット更新によるアセット差分の反映 ▪ gulpでアセット差分を作成してコミット ▪ aws s3 sync デプロイに関する課題
  10. 43
 43
 • デプロイ頻度の高さ ◦ 開発差分が出来上がる度に各人がデプロイ作業をする体制 ◦ デプロイ先も多い ▪ qaデプロイの際はqa

    ▪ 本番デプロイの際はinternalとproduction • 作業の手間と抜け漏れリスク ◦ rspecテストによるデータ整合性の確認 ◦ アセット更新によるアセット差分の反映 ▪ gulpでアセット差分を作成してコミット ▪ aws s3 sync → github actionsで自動化する デプロイに関する課題
  11. 44
 44
 • github actions上で ◦ 環境構築 ◦ テスト自動化 ◦

    アセット更新自動化 github actionsでの作業自動化
  12. 45
 45
 • github actions上で ◦ 環境構築 ◦ テスト自動化 ◦

    アセット更新自動化 github actionsでの作業自動化
  13. 46
 46
 • リポジトリをcloneする ◦ aumoの実装やDB周りが入ったaumoリポジトリ - name: Clone Aumo

    Repository uses: actions/checkout@v2 with: repository: aumo-repository token: ${{ secrets.ACCESS_TOKEN }} path: aumo github actions 上で環境構築
  14. 47
 47
 • testDB準備 ◦ aumoのコンテナでDBのcreateとresetとmigrate - name: migration test_db

    working-directory: ./aumo env: RAILS_ENV: test run: | docker-compose run –rm aumo bundle exec rails db:create RAILS_ENV=test docker-compose run –rm aumo bundle exec rails db:reset RAILS_ENV=test docker-compose run –rm aumo bundle exec rails aumo:db:migrate RAILS_ENV=test github actions 上で環境構築
  15. 48
 48
 • github actions上で ◦ 環境構築 ◦ テスト自動化 ◦

    アセット更新自動化 github actionsでの作業自動化
  16. 49
 49
 • testする! ◦ rspecを叩く! - name: Test with

    Rspec working-directory: ./aumo run: docker-compose run --rm web bundle exec rspec テスト自動化
  17. 50
 50
 • github actions上で ◦ 環境構築 ◦ テスト自動化 ◦

    アセット更新自動化 github actionsでの作業自動化
  18. 53
 53
 • gulpのアセット差分作成とコミット - name: Run Gulp & Commit

    & Push run: | npm run gulp -- release git config user.name github-actions git config user.email [email protected] git add public/assets git commit -m “Update assets[skip actions]” git push アセット更新自動化
  19. 54
 54
 • awsとの接続を認証 - name: “Configure AWS credentials” uses:

    aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ${{ secrets.AWS_REGION }} アセット更新自動化
  20. 55
 55
 • gulpのアセットをaws s3にsync アセット更新自動化 - name: Sync S3

    working-directory: ./public/assets run: aws s3 sync . S3://hogehoge..
  21. 58
 58
 • コンフリクトを回避したい ◦ aumoではGithub workflowに近い運用をしている ◦ featureでアセット差分をコミットすると、developやqaへのマージの際にコンフリクトが発生 してしまう

    ◦ developブランチまたはqa用のブランチでのみアセット更新を行うようにする feature/xxx feature/yyy qa アセット更新 - ブランチで実行有無制御 アセット更新コミット コンフリクト
  22. 59
 59
 • コンフリクトを回避したい ◦ aumoではGithub workflowに近い運用をしている ◦ featureでアセット差分をコミットすると、developやqaへのマージの際にコンフリクトが発生 してしまう

    ◦ developブランチまたはqa用のブランチでのみアセット更新を行うようにする if: ${{ github.head_ref == ‘develop’ || contains(github.head_ref, ‘tmp/qa’)) }} アセット更新 - ブランチで実行有無制御
  23. 60
 60
 • アセットの差分をチェックするworkflowを作成 on: workflow_call: inputs: workflow_id: description: APIで取得したいworkflow_id(or

    filename) type: string required: true grep_argument: description: 差分にフィルターをかけるgrepの引数(オプション込み) type: string required: true secrets: access_token: required: true outputs: should_run: description: GREP_ARGUMENTに対する差分があったか(呼び出し元で後続処理すべきか ) value: ${{ jobs.check.outputs.should_run }} アセット更新 - 差分で実行有無制御
  24. 61
 61
 • github APIで 前回成功したworkflowのcommitのSHAを取得する ◦ GET https://api.github.com/repos/{owner}/{repo}/actions/ workflows/{workflow_id}/runs

    ◦ { … “workflow_runs”:[ { … “head_sha”: XXXXXXXXX } ] } アセット更新 - 差分で実行有無制御
  25. 62
 62
 • github APIで 前回成功したworkflowのcommitのSHAを取得する - id: get_sha name:

    Get the last success workflow sha run: | url=“https://api.github.com/repos/${{ github.repository }}/actions/workflows/${{ inputs.workflow_id }}/runs?status=success&per_page=1&branch=${{ github.head_ref }}” echo “last_success_sha=$(curl -H “Authorization: Bearer ${{secrets.ACCESS_TOKEN}}” -sX GET -G “$url”) | jq -r ‘.workflow_runs[0]?.head_sha // empty’)” >> $GITHUB_OUTPUT アセット更新 - 差分で実行有無制御
  26. 63
 63
 • github APIで 差分取得する ◦ GET https://api.github.com/repos/{owner}/{repo}/compare/ {basehead}

    ◦ { … “files”:[ { … “filename”: XXXXXXXXX } ] } アセット更新 - 差分で実行有無制御
  27. 64
 64
 • github APIで 差分取得しアセットに差分があればtrueを返す - id: check name:

    Check Diff Assets run: | url=“https://api.github.com/repos/${{ github.repository }}/compare/ ${{ steps.get_sha.outputs.last_success_sha || github.base_ref }}...${{ github.head_ref }}” diff_filenames=$(curl -H “Authorization: Bearer ${{ secrets.access_token }}” -sSLX GET -G “$url” | jq -r ‘.files[]?.filename // empty’) set +e diff_filtered=$(echo “$diff_filenames” | grep ${{ inputs.grep_argument }}) set -e echo “should_run=`[ -n “$diff_filtered” ] && echo “true” || echo “false”`” >> $GITHUB_OUTPUT アセット更新 - 差分で実行有無制御
  28. 65
 65
 • 差分チェックworkflowを呼び出し、結果で実行有無制御 jobs: check: if: ${{ github.head_ref ==

    ‘develop’ || contains(github.head_ref, ‘tmp/qa’)) }} uses: ./.github/workflows/check_diff.yml with: workflow_id: update_assets.yml grep_argument: “-E ‘^frontend/’” secrets: access_token: ${{ secrets.ACCESS_TOKEN }} update_assets: needs: check if: ${{ needs.check.outputs.should_run == ‘true’ }} # アセット更新処理 アセット更新 - 差分で実行有無制御
  29. 66
 66
 • 差分チェックworkflowを呼び出し、結果で実行有無制御 jobs: check: if: ${{ !contains(github.head_ref, ‘tmp/qa’))

    }} uses: ./.github/workflows/check_diff.yml with: workflow_id: test.yml grep_argument: “-vE ‘^frontend/’” secrets: access_token: ${{ secrets.ACCESS_TOKEN }} test: needs: check if: ${{ needs.check.outputs.should_run == ‘true’ }} # テスト処理 テスト - 実行有無制御
  30. 67
 67
 • テストが自動化された ◦ 作業工数を削減できた ◦ データ整合性に関する品質の担保がされた • デプロイアセット更新を自動化した

    ◦ 作業工数を削減できた ◦ アセット更新に関する品質の担保ができた • 心理的安全性が向上した • 興味ある開発改善分野のタスクに手を上げて経験をつめた • 今後もさらなる工数削減や品質の担保を進めていきたい 作業自動化まとめ
  31. 68
 68
 このセッションのまとめ • aumoについて ◦ 顧客もユーザもサービスも拡大している • デザインの取り組み ◦

    用途毎のわかりやすく柔軟なデザインを定義 • ソフトウェアの取り組み ◦ デザイン定義を実装に伝搬 • インフラの取り組み ◦ 作業を自動化 • 長期的な工数削減と品質担保で心理的安全性を向上