はじめに
アイキューブドシステムズでCLOMOのサーバーサイドを担当している Kakuno です。 弊社ではBitbucketからGitHubへ移行し、現在ではGitHubでソースコードの管理を行っております。
GitHubに移行してからチームで様々な工夫をして運用しているおかげで、今では様々な恩恵があります。 今回はその内容についてブログにしたいと思います。
どんなことをしているのか
現在GitHubでこのようなフローを設定しています。 私が担当しているサーバーサイドを事例に、それぞれどんなことをやっているのか下記に詳細を説明していきます。 また、GitHub Actionsに関しては設定例を記載してあるので参考にしてみてください。
静的解析ツール
以前、ハッピーな開発ライフを過ごすために静的解析ツールを本格導入したという記事でご紹介させていただいたように、GitHub Actionsを用いてRuboCopが自動的にrubyのコードをチェックするように設定されています。現在はそれに加えて、JavaScriptもチェックするようにESLintとCoffeeScriptLintも追加しています。
設定例)
name: reviewdog on: [pull_request] jobs: rubocop: name: runner / rubocop runs-on: ubuntu-latest steps: - name: Check out code uses: actions/checkout@v2 - uses: ruby/setup-ruby@v1 # https://github.com/reviewdog/action-rubocop を参考にsetup-rubyを追加。 with: ruby-version: XXXX - name: rubocop (Panel) uses: reviewdog/action-rubocop@v1 with: github_token: ${{ secrets.github_token }} reporter: github-pr-review rubocop_version: XXXX rubocop_flags: --config Panel/.rubocop.yml Panel/ eslint: name: ESLint runs-on: ubuntu-latest steps: - name: Check out code uses: actions/checkout@v2 - name: eslint (Panel) uses: reviewdog/action-eslint@v1 with: github_token: ${{ secrets.github_token }} reporter: github-pr-review eslint_flags: './Panel/app/**/*.{ts,js}' coffeelint: name: CoffeeScriptLint runs-on: ubuntu-latest steps: - name: Check out code uses: actions/checkout@v2 - name: coffeelint (Panel) uses: reviewdog/action-coffeelint@v1 with: github_token: ${{ secrets.github_token }} reporter: github-pr-review coffeelint_flags: './Panel/app/assets'
RSpecの実行
弊社はテストコードのチェックはとても大事に考えています。そのため、プルリクエストの時点でGitHub Actionsを用いて、 必ず全てのRSpecに合格しているかどうかをチェックしています。
RSpecに関しては1つでも失敗していれば、マージできないように制限をかけています。
設定例)
name: RSpec on: [pull_request] jobs: rspec_for_panel: name: Setting and Rspec for Panel runs-on: ubuntu-latest services: mysql: image: mysql:XXXX env: MYSQL_DATABASE: XXXX MYSQL_USER: XXXX MYSQL_PASSWORD: XXXX MYSQL_ROOT_PASSWORD: XXXX TZ: Asia/Tokyo ports: - 3306:3306 steps: - name: Check out code uses: actions/checkout@v2 - name: setup run: | # To install Gemfile sudo apt-get update && sudo apt-get install -y nodejs mariadb-client tzdata sudo timedatectl set-timezone Asia/Tokyo - uses: ruby/setup-ruby@v1 with: ruby-version: XXXX bundler: XXXX bundler-cache: true working-directory: ./Panel/ - name: Setup database run: | cd Panel RAILS_ENV=test bundle exec rake db:migrate:reset env: TZ: Asia/Tokyo - name: RSpec run: | cd Panel bundle exec rspec --profile 50 --format progress --format RspecJunitFormatter --out spec/test-results/rspec.xml spec env: TZ: Asia/Tokyo
自動デプロイ
弊社ではlocal環境で検証しきれないものは、develop用のAKS検証環境にデプロイして検証をします。 これもGitHub Actionsを用いて、特定のブランチにコードがマージされた場合、Docker ImageをビルドしてAzure Container Registry (ACR)に登録をします。 その後、spinnakerを用いてAKSにデプロイするように設定しています。
設定例)
name: devbuild on: push: branches: - XXXX jobs: docker_build_panel: name: docker_build_panel runs-on: ubuntu-latest steps: - name: Check out code uses: actions/checkout@v2 - uses: toko-bifrost/ms-teams-deploy-card@master # https://github.com/marketplace/actions/microsoft-teams-deploy-card if: always() with: github-token: ${{ github.token }} webhook-uri: ${{ secrets.MS_TEAMS_DEV_CLOMO_CSAM_WEBHOOK_URL }} - name: Login to Azure Container Registry uses: azure/docker-login@v1 with: # https://github.com/Azure/docker-login login-server: ${{ secrets.CONTAINER_REGISTRY_NAME }} username: ${{ secrets.CONTAINER_REGISTRY_USER_NAME }} password: ${{ secrets.CONTAINER_REGISTRY_PASSWORD }} - name: docker build Panel uses: docker/build-push-action@v2 env: default_asset_sync_azure_access_key: ${{ secrets.ASSET_SYNC_AZURE_ACCESS_KEY }} with: context: . file: dockerfiles/panel/Dockerfile load: true build-args: | default_asset_sync_azure_access_key=${{ secrets.ASSET_SYNC_AZURE_ACCESS_KEY }} asset_sync_enabled=true smtp_settings_password=${{ secrets.SMTP_SETTINGS_PASSWORD }} tags: | ${{ secrets.CONTAINER_REGISTRY_NAME }}/dev-clomo/panel:dev-${{ github.run_id }} ${{ secrets.CONTAINER_REGISTRY_NAME }}/dev-clomo/panel:latest - name: docker push Panel run: | docker push ${{ secrets.CONTAINER_REGISTRY_NAME }}/dev-clomo/panel:dev-${{ github.run_id }} docker push ${{ secrets.CONTAINER_REGISTRY_NAME }}/dev-clomo/panel:latest
またTeamsと連携してデプロイ完了時には特定のチャンネルに通知が行くようにしてあります。
ブランチ運用
gitのブランチ運用には一般的なGitFlowを用いています。 開発する際にはfeatureブランチを作成するのですが、開発規模が多くなるとたくさんのfeatureブランチが作成されます。
ブランチが沢山あることで、必要なブランチを見つけにくかったり、checkout先を間違えてしまったりなど様々な弊害があります。
そこで、開発終了してマージした後はブランチを自動的に削除するように設定をしています。 ただ、この設定を入れておくと、消したくない大事なブランチも消えてしまいます。 そこで特定のブランチだけはブランチ保護をかけて、自動的に削除されないようにしています。
まとめ
GitHubは連携がしやすく、また様々な便利ツールもたくさんあるので、積極的に取り入れる検討をしています。これらはサーバーメンバーが主体的に発案して、ミーティングで議論し、どのように取り入れるか決めています。開発以外でも、こういった地道な改善活動にも積極的に取り組んでいます。まだ取り入れようと思っているものはたくさんあるので、その時はまたご紹介出来ればと思います。
最後に、弊社では採用活動を実施しています。 皆様のご応募をお待ちしております。