ブログ

ryuzeeによるブログ記事。不定期更新

Azure DevOps + App Serviceで簡単にCI/CD環境を構築する

みなさんこんにちは。@ryuzeeです。

Azure DevOpsは、バージョン管理、バックログやIssue管理、CI、CD、成果物管理、テストの管理などが行えるオールインワンのプロジェクト支援プラットフォームです。今年Visual Studio Team Servicesからブランド変更されて、Azure DevOps Servicesという名前になりました。

このAzure DevOpsとApp Serviceを組み合わせることで、30分くらいでCI/CD環境とデプロイ先の環境が簡単に作れますので、紹介します。

なお、各スクリーンショットをクリックすると、画像を拡大して表示します。

Azure DevOpsにアクセスする

まず、以下のURLからAzure DevOpsにアクセスします。

Azure DevOpsのOrganizationを作る

次にOrganizationを作成します。

  • 既にOrganizationが存在する場合は、そのまま利用すれば良いでしょう
  • その後に、すぐにプロジェクトを作るのではなく、プロセスのデフォルトをScrumに変更します(プロジェクト作成後に開発プロセスを変更できないためです)

gitの操作に利用する公開鍵を登録する

gitを使う際にいちいちパスワードを入力するのは面倒なので、公開鍵を設定します。

  • Azure DevOpsの右上のユーザーアイコンをクリックしてSecurityを選択し、公開鍵を追加します
  • なお、この手順はgitでパスワード認証を利用する場合は不要です
  • 必要であれば、ローカル環境の~/.ssh/configを編集し、以下のようにデフォルトの鍵を指定しておくと便利です
Host azuredevops ssh.dev.azure.com
  HostName ssh.dev.azure.com
  IdentityFile ~/.ssh/id_rsa_foobar
  User foobar

Azure DevOpsのプロジェクトを作る

ここまでで基本的な準備はできたので、プロジェクトを作成します。今回はMyFirstAppという名前にしました。

  • この時点でBoardsReposPipelinesTest PlansArtifactsが作成されます。ReposPipelinesの中身はまだ空です

デプロイ用のテストプロジェクトを作る

今回はRailsアプリケーションのコンテナを用意して、これをデプロイしたいと思います。 以下のように進めていきます。

  • 適当な作業ディレクトリを作成します(今回はMyFirstApp
  • bundle init してGemfileを作成します。作成されたGemfileの中でrailsのコメントアウトを外します
  • bundleを実行して、Rails関連のファイルを適用します
  • rails new . を実行して、Railsのプロジェクトを作成します
  • script/web_entrypoint.sh などの名前でpumaの起動用スクリプトを用意します。内容は以下のようになります。このときバインドするIPアドレスを指定しておく必要があります
#!/bin/sh

if [ -z "${RAILS_ENV}" ]; then
  RAILS_ENV=development
fi

cd `dirname $0`
cd ..
if [ -f "tmp/pids/server.pid" ]; then
  rm tmp/pids/server.pid
fi
RAILS_ENV=$RAILS_ENV bundle exec rails s -b 0.0.0.0
  • Dockerfileを作成します。内容は以下のようになります
FROM ruby:2.5.1-alpine3.7
ENV LANG C.UTF-8
ENV APP_HOME /opt/application

RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME
ADD Gemfile* $APP_HOME/

RUN apk update && \
    apk add --update tzdata && \
    apk add --no-cache \
      build-base ruby-dev libressl-dev libc-dev sqlite-dev sqlite-libs \
      linux-headers mariadb-dev yarn && \
    gem install --no-ri --no-rdoc bundler && \
    bundle install && \
    apk del --purge linux-headers build-base libc-dev libressl-dev ruby-dev && \
    rm -rf /var/cache/apk/*

ADD . $APP_HOME

EXPOSE 3000

ENTRYPOINT ["sh", "./script/web_entrypoint.sh"]
  • ローカルでの動作確認用にdocker-compose.ymlも作成しておきます(今回のサンプルではまだMySQLは使いませんが、今後のことを考えて入れてあります)
version: "3"
services:
  mysql:
    image: mysql:5.7.22
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    environment:
      MYSQL_DATABASE: myfirstapp
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: password
    ports:
      - "3306:3306"
    hostname: db
    volumes:
      - mysql-data:/var/lib/mysql
  web:
    build: .
    command: "sh ./script/web_entrypoint.sh"
    volumes:
      - .:/opt/application:cached
    environment:
      RAILS_ENV: development
      DB_HOST: "mysql"
      DB_PORT: "3306"
      DB_USER: "root"
      DB_PASSWORD: "password"
      DB_NAME: "myfirstapp"
      RAILS_LOG_TO_STDOUT: "yes"
      WEB_CONCURRENCY: 3
      MAX_CONNECTION_POOL: 5
    ports:
      - "3000:3000"
    depends_on:
      - "mysql"

volumes:
  mysql-data:
    driver: local
  • この時点でコンテナが動作することを確認しておきましょう
    • docker-compose up --build
    • http://localhost:3000にアクセスして、Railsの初期画面が表示されればOKです

  • 出来上がったら、ここまでのコードをローカルでコミットしておきます
  • 次にコードをAzure DevOpsのレポジトリにpushします
    • 初期は以下のような画面が表示されるので、指示に従います

  • pushが終われば、以下にようにファイルが表示されるはずです

Azure Container Registryを用意する

コンテナイメージを保存するために、Azure Container Registryを用意します

  • ここではmyfirstapp9999という名前にしました
  • 本当は、Service Principleを使った方が良いですが、今回は簡単にするために管理者ユーザーを有効にしておきます
  • 用意ができたらコンテナをビルドしてプッシュします。この作業はローカルで実行します
    • 作業にはAzure CLIが必要になりますので、インストールを済ませておきます
az login
az account set --subscription a1682555-4005-4a7d-83cd-11111aa999a9
az acr login --name myfirstapp9999
docker build -t myfirstapp .
docker tag myfirstapp myfirstapp9999.azurecr.io/myfirstapp9999/myfirstapp
docker push myfirstapp9999.azurecr.io/myfirstapp9999/myfirstapp

Azure App Serviceを用意する

デプロイ先の環境となるApp Serviceを用意します。 Azure Portalの左メニューからApp Serviceを選択して、一覧からWeb Appを選択して進めます。以下のような画面が表示されます。

  • このときOSはLinux、公開はDocker イメージを選択します
  • App Service プランは既存のものでも新規でも構わないので、作成したい環境にあわせて指定します
  • コンテナーの構成で、Azure コンテナーレジストリを選択し、レジストリやイメージに上記で作成したものを指定します
  • アプリケーションの設定で、アプリ設定名PORT3000を指定して、Railsに接続できるようにします(なお必須ではありませんが、あわせて、全般設定の箇所で常時接続オンにしておくと良いでしょう)
  • この状態で保存すると、一旦現状のコンテナがデプロイされるので、動作確認しておきます

デプロイセンターを設定する

次にCI・CD関連の設定を行います。

App Serviceのメニューからデプロイセンターを選択します

あとはウイザードの指示に従って設定すればOKです

Azure DevOps側でビルドパイプラインとデプロイパイプラインが作成されていることを確認する

以上で作業が終了なので、Azure DevOps側でビルドパイプラインとデプロイパイプラインが作成されていることを確認します

  • CIの設定

  • CDの設定

なお、実際のビルドとデプロイの定義は以下のようになっています。

  • CIの定義

  • CDの定義

これらから分かるとおり、デプロイセンター経由で設定しても、Azure DevOps上で手作業で設定しても同じ状態にできることが分かります。

まとめ

ここまでで30分くらいで、CI/CD環境やデプロイ先の環境が作れることが分かりました。 このあと、ビルドプロセスの中でテストを実行する、といった設定を加えていけばよいでしょう。 Azureを使っている場合は、全部をAzureの中で完結できるので、いろいろ楽ができると思います。

それでは。

アジャイルコーチングやトレーニングを提供しています

株式会社アトラクタでは、アジャイル開発に取り組むチーム向けのコーチングや、認定スクラムマスター研修などの各種トレーニングを提供しています。ぜひお気軽にご相談ください。

詳細はこちら
  • スクラム実践者が知るべき97のこと
  • 著者/訳者:Gunther Verheyen / 吉羽龍太郎 原田騎郎 永瀬美穂
  • 出版社:オライリージャパン(2021-03-23)
  • 定価:¥ 2,640
  • スクラムはアジャイル開発のフレームワークですが、その実装は組織やチームのレベルに応じてさまざまです。本書はスクラムの実践において、さまざまな課題に対処してきた実践者が自らの経験や考え方を語るエッセイ集です。日本語書き下ろしコラムを追加で10本収録
  • プロダクトマネジメント ―ビルドトラップを避け顧客に価値を届ける
  • 著者/訳者:Melissa Perri / 吉羽龍太郎
  • 出版社:オライリージャパン(2020-10-26)
  • 定価:¥ 2,640
  • プロダクト開発を作った機能の数やベロシティなどのアウトプットで計測すると、ビルドトラップと呼ばれる失敗に繋がります。本書ではいかにしてビルドトラップを避けて顧客に価値を届けるかを解説しています。
  • SCRUM BOOT CAMP THE BOOK 【増補改訂版】
  • 著者/訳者:西村直人 永瀬美穂 吉羽龍太郎
  • 出版社:翔泳社(2020-05-20)
  • 定価:¥ 2,640
  • スクラム初心者に向けて基本的な考え方の解説から始まり、プロジェクトでの実際の進め方やよく起こる問題への対応法まで幅広く解説。マンガと文章のセットでスクラムを短期間で理解できます。スクラムの概要を正しく理解したい人、もう一度おさらいしたい人にオススメ。
  • みんなでアジャイル ―変化に対応できる顧客中心組織のつくりかた
  • 著者/訳者:Matt LeMay / 吉羽龍太郎、永瀬美穂、原田騎郎、有野雅士
  • 出版社:オライリージャパン(2020-3-19)
  • 定価:¥ 2,640
  • アジャイルで本当の意味での成果を出すには、開発チームだけでアジャイルに取り組むのではなく、組織全体がアジャイルになる必要があります。本書にはどうやってそれを実現するかのヒントが満載です
  • レガシーコードからの脱却 ―ソフトウェアの寿命を延ばし価値を高める9つのプラクティス
  • 著者/訳者:David Scott Bernstein / 吉羽龍太郎、永瀬美穂、原田騎郎、有野雅士
  • 出版社:オライリージャパン( 2019-9-18 )
  • 定価:¥ 3,132
  • レガシーコードになってから慌てるのではなく、日々レガシーコードを作らないようにするにはどうするか。その観点で、主にエクストリームプログラミングに由来する9つのプラクティスとその背後にある原則をわかりやすく説明しています。
  • Effective DevOps ―4本柱による持続可能な組織文化の育て方
  • 著者/訳者:Jennifer Davis、Ryn Daniels / 吉羽 龍太郎、長尾高弘
  • 出版社:オライリージャパン( 2018-3-24 )
  • 定価:¥ 3,888
  • 主にDevOpsの文化的な事柄に着目し、異なるゴールを持つチームが親和性を高め、矛盾する目標のバランスを取りながら最大限の力を発揮する方法を解説します
  • ジョイ・インク 役職も部署もない全員主役のマネジメント
  • 著者/訳者:リチャード・シェリダン / 原田騎郎, 安井力, 吉羽龍太郎, 永瀬美穂, 川口恭伸
  • 出版社:翔泳社( 2016-12-20 )
  • 定価:¥ 1,944
  • 米国で何度も働きやすい職場として表彰を受けているメンローの創業者かつCEOであるリチャード・シェリダン氏が、職場に喜びをもたらす知恵や経営手法、より良い製品の作り方などを惜しみなく紹介しています
  • アジャイルコーチの道具箱 – 見える化の実例集
  • 著者/訳者:Jimmy Janlén / 原田騎郎, 吉羽龍太郎, 川口恭伸, 高江洲睦, 佐藤竜也
  • 出版社:Leanpub( 2016-04-12 )
  • 定価:$14.99
  • この本は、チームの協調とコミュニケーションを改善したり、行動を変えるための見える化の実例を集めたものです。96個(+2)の見える化の方法をそれぞれ1ページでイラストとともに解説しています。アジャイル開発かどうかに関係なくすぐに使えるカタログ集です
  • カンバン仕事術 ―チームではじめる見える化と改善
  • 著者/訳者:原田騎郎 安井力 吉羽龍太郎 角征典 高木正弘
  • 出版社:オライリージャパン( 2016-03-25 )
  • 定価:¥ 2,138
  • チームの仕事や課題を見える化する手法「カンバン」について、その導入から実践までを図とともにわかりやすく解説した書籍。カンバンの原則などの入門的な事柄から、サービスクラス、プロセスの改善など、一歩進んだ応用的な話題までを網羅的に解説します。
  • Software in 30 Days スクラムによるアジャイルな組織変革“成功"ガイド
  • 著者/訳者:Ken Schwaber、Jeff Sutherland著、角征典、吉羽龍太郎、原田騎郎、川口恭伸訳
  • 出版社:アスキー・メディアワークス( 2013-03-08 )
  • 定価:¥ 1,680
  • スクラムの父であるジェフ・サザーランドとケン・シュエイバーによる著者の日本語版。ビジネス層、マネジメント層向けにソフトウェア開発プロセス変革の必要性やアジャイル型開発プロセスの優位性について説明
  • How to Change the World 〜チェンジ・マネジメント3.0〜
  • 著者/訳者:Jurgen Appelo, 前川哲次(翻訳), 川口恭伸(翻訳), 吉羽龍太郎(翻訳)
  • 出版社:達人出版会
  • 定価:500円
  • どうすれば自分たちの組織を変えられるだろう?それには、組織に変革を起こすチェンジ・マネジメントを学習することだ。アジャイルな組織でのマネージャーの役割を説いた『Management 3.0』の著者がコンパクトにまとめた変化のためのガイドブック