{"id":13472163,"url":"https://github.com/gree/aurora","last_synced_at":"2025-05-02T17:33:04.434Z","repository":{"id":18116440,"uuid":"21190869","full_name":"gree/aurora","owner":"gree","description":"AuroraはI/OをシャーディングするためのJava/Scala向けライブラリです。","archived":false,"fork":false,"pushed_at":"2014-12-24T08:14:34.000Z","size":304,"stargazers_count":32,"open_issues_count":0,"forks_count":3,"subscribers_count":12,"default_branch":"develop","last_synced_at":"2024-10-30T04:13:16.274Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gree.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-06-25T05:00:45.000Z","updated_at":"2023-08-02T18:56:45.000Z","dependencies_parsed_at":"2022-08-24T13:52:39.320Z","dependency_job_id":null,"html_url":"https://github.com/gree/aurora","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gree%2Faurora","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gree%2Faurora/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gree%2Faurora/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gree%2Faurora/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gree","download_url":"https://codeload.github.com/gree/aurora/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224324421,"owners_count":17292521,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T16:00:52.494Z","updated_at":"2024-11-12T18:09:11.543Z","avatar_url":"https://github.com/gree.png","language":"Java","funding_links":[],"categories":["Java"],"sub_categories":[],"readme":"# Aurora\n\n[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/gree/aurora?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n\nAuroraはI/OをシャーディングするためのJava/Scala向けライブラリです。\n\n[![Build Status](https://travis-ci.org/gree/aurora.svg?branch=develop)](https://travis-ci.org/gree/aurora)\n\n## 特徴\n\n- Scala, Javaで利用可能\n    - Java版は `aurora-core`、Scala版は `aurora-scala` を提供\n    - 他のJVM言語から利用できるはずです\n- ストレージデバイスフリー\n    - コネクションやSQLなどのストレージデバイス固有の知識に依存しない\n    - 標準ではJDBC, Redis, Memcacheなどに対応\n\n## ライセンス\n\nCopyright (c) 2014 GREE, Inc.\n\nMIT License\n\n## サポートする言語\n\n- Java (SE 7以降)\n- Scala 2.10.x, 2.11.x\n\n## 機能一覧\n\n- データソース・シャーディング機能  \n事前に定義したデータソース群とリゾルバによって、ヒントに応じたデータソースを解決できます(データソースからコネクションの変換は別途ロジックが必要。詳細は後述)。\n- テーブル名・シャーディング機能  \n事前に定義したリゾルバによって、ヒントに応じたテーブル名を解決できます。\n\n\n## 使い方(利用者向け)\n\n### データソース・シャーディング機能\n\n#### プロジェクトのひな形を作成する\n\n##### Scalaの場合\n\n- `typesafe-activator`と`sbt`をインストールする。\n\n```sh\n$ brew install typesafe-activator sbt\n```\n\n- `typesafe-activator` でプロジェクトのひな形を作成する。 `minimal-scala` を選択する。\n\n```sh\n$ activator new\nFetching the latest list of templates...\n\nBrowse the list of templates: http://typesafe.com/activator/templates\nChoose from these featured templates or enter a template name:\n  1) minimal-java\n  2) minimal-scala\n  3) play-java\n  4) play-scala\n(hit tab to see a list of all templates)\n\u003e 2\nEnter a name for your application (just press enter for 'minimal-scala')\n\u003e example\nOK, application \"example\" is being created using the \"minimal-scala\" template.\n\nTo run \"example\" from the command-line, run:\n/Users/junichi.kato/temp/example/activator run\n\nTo run the test for \"example\" from the command-line, run:\n/Users/junichi.kato/temp/example/activator test\n\nTo run the Activator UI for \"example\" from the command-line, run:\n/Users/junichi.kato/temp/example/activator ui\n```\n\n- `build.sbt` に `aurora-scala` ライブラリへの依存関係を追加する。\n\n```scala\nname := \"\"\"example\"\"\"\n\nversion := \"1.0\"\n\nscalaVersion := \"2.11.1\"\n\nresolvers ++= Seq(\n\t\"Sonatype OSS Release Repository\" at \"https://oss.sonatype.org/content/repositories/releases/\",\n\t\"Sonatype OSS Snapshots Repository\" at \"https://oss.sonatype.org/content/repositories/snapshots\"\n)\n\nlibraryDependencies += \"net.gree.aurora\" %% \"aurora-scala\" % \"x.x.x\"\n```\n\n- 以下の手順でコンパイルできることを確認する。\n\n```sh\n$ cd example\nexample $ sbt clean compile\n```\n\n##### Javaの場合\n\n- Mavenをインストールする\n\n```sh\n$ brew install maven\n```\n\n- Maven Archetypeでプロジェクトのひな形を生成する。\n\n```sh\n$ mvn archetype:generate -DarchetypeArtifactId=maven-archetype-quickstart\n[INFO] Scanning for projects...\n[INFO]\n[INFO] Using the builder org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder with a thread count of 1\n[INFO]\n[INFO] ------------------------------------------------------------------------\n[INFO] Building Maven Stub Project (No POM) 1\n[INFO] ------------------------------------------------------------------------\n\u003csnip\u003e\nDefine value for property 'groupId': : example\nDefine value for property 'artifactId': : example\nDefine value for property 'version':  1.0-SNAPSHOT: :\nDefine value for property 'package':  example: :\nConfirm properties configuration:\ngroupId: example\nartifactId: example\nversion: 1.0-SNAPSHOT\npackage: example\n Y: : Y\n[INFO] ----------------------------------------------------------------------------\n[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.0\n[INFO] ----------------------------------------------------------------------------\n[INFO] Parameter: groupId, Value: example\n[INFO] Parameter: packageName, Value: example\n[INFO] Parameter: package, Value: example\n[INFO] Parameter: artifactId, Value: example\n[INFO] Parameter: basedir, Value: /Users/user/\n[INFO] Parameter: version, Value: 1.0-SNAPSHOT\n[INFO] project created from Old (1.x) Archetype in dir: /Users/user\n[INFO] ------------------------------------------------------------------------\n```\n\n- `pom.xml` に `aurora-core` ライブラリへの依存関係を追加する。\n\n```xml\n\u003cdependencies\u003e\n  \u003cdependency\u003e\n  \t\u003cgroupId\u003enet.gree.aurora\u003c/groupId\u003e\n  \t\u003cartifactId\u003eaurora-core\u003c/artifactId\u003e\n  \t\u003cversion\u003ex.x.x\u003c/version\u003e\n  \u003c/dependency\u003e\n\u003c/dependencies\u003e\n```\n\n- 以下の手順でコンパイルできることを確認する。\n\n```sh\n$ cd example\nexample $ mvn clean compile\n```\n\n\n#### 設定ファイルを用意する\n\nまず最初に設定ファイル(`conf/application.conf`)を用意します。Auroraは`typesafe config`を利用しています。\n\n例えばJDBCの場合は、以下のように記述します。\n\n```\naurora {\n    sharding-configs {\n        database {\n            type=jdbc\n            default {\n                driver-class-name=\"org.mysql.Driver\"\n                prefix-url=\"jdbc:mysql://\"\n                user-name=user1\n                password=user1pass\n                read-only-user-name=user2\n                read-only-password=user2pass\n            }\n            cluster-groups=[\n                {\n                    main {\n                        clusters=[\n                            {\n                                cluster1 {\n                                    master=\"192.168.1.2\"\n                                    slaves=[\n                                        \"192.168.1.3\",\n                                        \"192.168.1.4\"\n                                    ]\n                                    standby=\"192.168.1.254\"\n                                    database=\"test_a\"\n                                }\n                            },\n                            {\n                                cluster2 {\n                                    master=\"192.168.2.2\"\n                                    slaves=[\n                                        \"192.168.2.3\",\n                                        \"192.168.2.4\"\n                                    ]\n                                    standby=\"192.168.2.254\"\n                                    database=\"test_b\"\n                                }\n                            }\n                        ]\n                    }\n                },\n                {\n                    sub {\n                        clusters=[\n                            {\n                                cluster1 {\n                                    master=\"192.168.3.2\"\n                                    slaves=[\n                                        \"192.168.3.3\",\n                                        \"192.168.3.4\"\n                                    ]\n                                    standby=\"192.168.3.254\"\n                                    database=\"test_a\"\n                                }\n                            },\n                            {\n                                cluster2 {\n                                    master=\"192.168.4.2\"\n                                    slaves=[\n                                        \"192.168.4.3\",\n                                        \"192.168.4.4\"\n                                    ]\n                                    standby=\"192.168.4.254\"\n                                    database=\"test_b\"\n                                }\n                            }\n                        ]\n                    }\n                }\n            ]\n        }\n    }\n}\n```\n\n`aurora/sharding-configs/database`の部分は、`sharding-config-id`と呼び、開発者が自由に命名できます。\n\nJDBCの場合は`type=jdbc`としてください。`type`は必須項目です(他にも`genric`, `redis`などが使えます。後述)\n\n`default`には、各データソースで共通な設定項目(ドライバクラス名やユーザ名など)を記述します。`driver-class-name`, `prefix-url`, `user-name`, `password`, `read-only-user-name`, `read-only-password`は必須項目です。\n\n\u003ctable\u003e\n\u003cthead\u003e\n\t\u003ctd\u003e項目名\u003c/td\u003e\u003ctd\u003e意味\u003c/td\u003e\u003ctd\u003e補足\u003c/td\u003e\n\u003c/thead\u003e\n\u003ctr\u003e\n\t\u003ctd\u003edriver-class-name\u003c/td\u003e\u003ctd\u003eJDBCドライバクラス名\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\t\u003ctd\u003eprefix-url\u003c/td\u003e\u003ctd\u003eJDBC接続URLのプレフィックス\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\t\u003ctd\u003euser-name\u003c/td\u003e\u003ctd\u003eJDBC接続ユーザ名\u003c/td\u003e\u003ctd\u003eマスターデータソースに利用します\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\t\u003ctd\u003epassword\u003c/td\u003e\u003ctd\u003eJDBC接続ユーザのパスワード\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\t\u003ctd\u003eread-only-user-name\u003c/td\u003e\u003ctd\u003eJDBC接続ユーザ名(読込み専用)\u003c/td\u003e\u003ctd\u003eスレーブデータソースに利用します\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\t\u003ctd\u003eread-only-password\u003c/td\u003e\u003ctd\u003eJDBC接続ユーザ(読込み専用)のパスワード\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n続く、`cluster-groups`(クラスターグループ)には、後述する`cluster`(クラスター)を複数個 登録します(1個でもよい)。クラスターグループは機能ごとに分割したい時に便利です。\n`aurora/sharding-configs/{sharding-config-id}/cluster-groups/(main|sub)`の部分は、`cluster-group-id`と呼び、開発者が自由に命名できます。この二つのIDはデータソースを選択する際に必要になります。\n`aurora/sharding-config/{sharding-config-id}/cluster-groups/{cluster-groupo-id}/clusters/(cluster1|cluster2)`の部分は、`cluster-id`と呼び、開発者が自由に命名できます。\n\n続く、`cluster`(クラスター)には、マスター用途(`master`)とスレーブ用途(`slave`)のデータソースを定義できます。1クラスターにマスターは1台とし、スレーブは複数台を登録します。`database`にはデータベース名を指定します。(`standby`はコメントです)\n\n\n### ヒントを与えてデータソースを解決する\n\nヒントを受け取ってクラスタ名を返すリゾルバ(`clusterIdResolver`)を実装し、AuroraShardingServiceを初期化します(`auroraShardingService`)。\n`AuroraShardingService#resolveClusterByHint`メソッドを使って、ヒントに応じたクラスターを取得します。\n\nクラスターにはデータソースが含まれているので、それを使って目的に応じてI/Oを行います(データソースからコネクションの変換はアプリケーション開発者が行う必要があります)\n\n#### Javaの場合\n\n```java\npackage net.gree.aurora;\n\nimport net.gree.aurora.application.AuroraShardingService;\nimport net.gree.aurora.application.AuroraShardingServiceFactory;\nimport net.gree.aurora.domain.cluster.AbstractClusterIdResolver;\nimport net.gree.aurora.domain.cluster.Cluster;\nimport net.gree.aurora.domain.cluster.ClusterIdResolver;\nimport net.gree.aurora.domain.datasource.DataSourceRepository;\nimport net.gree.aurora.domain.datasource.DataSourceSelector;\nimport net.gree.aurora.domain.datasource.JDBCDataSource;\nimport net.gree.aurora.domain.hint.Hint;\nimport net.gree.aurora.domain.hint.HintFactory;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.sql.*;\n\npublic class Main {\n\n    private static class User {\n        private final int id;\n        private final String name;\n\n        User(int id, String name){\n            this.id = id;\n            this.name = name;\n        }\n\n        public int getId() {\n            return id;\n        }\n\n        public String getName() {\n            return name;\n        }\n\n        @Override\n        public String toString() {\n            return \"User{\" +\n                    \"id=\" + id +\n                    \", name='\" + name + '\\'' +\n                    '}';\n        }\n    }\n\n    // リゾルバを定義する\n    private final ClusterIdResolver\u003cInteger\u003e clusterIdResolver = new AbstractClusterIdResolver\u003cInteger\u003e(\"cluster\") {\n\n        @Override\n        protected String getSuffixName(Hint\u003cInteger\u003e userIdHint, int clusterSize) {\n            return Integer.toString(((userIdHint.getValue() +1) % clusterSize) + 1);\n        }\n        \n    };\n\n    // AuroraShardingServiceを初期化する\n    private final AuroraShardingService\u003cInteger\u003e auroraShardingService = AuroraShardingServiceFactory.create(clusterIdResolver, new File(\"./conf/example.conf\"));\n\n    private final DataSourceRepository dataSourceRepository = auroraShardingService.getDataSourceRepository().get();\n\n    private User findByUserId(int userId) throws SQLException, ClassNotFoundException, IOException {\n        // sharding-config-idとcluster-group-idとヒントを引数に与えてclusterを解決する\n        Cluster cluster = auroraShardingService.resolveClusterByHint(\"database\", \"main\", HintFactory.create(userId)).get();\n\n        // スレーブはランダム選択\n        DataSourceSelector\u003cInteger\u003e selector = cluster.createDataSourceSelectorAsRandom(dataSourceRepository);\n        // スレーブデータソースを選択する\n        JDBCDataSource dataSource = selector.selectDataSourceAsJDBC(null).get();\n        // 書き込み用途でマスターを利用する場合は、以下。\n        // JDBCDataSource dataSource = cluster.masterDataSource(dataSourceRepository).get();\n\n        System.out.println(dataSource);\n\n        // データソースからコネクションを取得する\n        Connection connection = getConnection(dataSource);\n\n        // コネクションを使ってSQLを発行する\n        Statement st = connection.createStatement();\n        ResultSet rs = st.executeQuery(\"SELECT * FROM user WHERE id = \" + userId);\n        if (rs.next()) {\n            return convertToModel(rs);\n        }else {\n            throw new IOException(\"entity is not found.\");\n        }\n    }\n\n    // ここでは都度コネクションを取得していますが、\n    // 必要に応じてコネクションプールからコネクションを取得してもよいでしょう\n    private Connection getConnection(JDBCDataSource dataSource) throws ClassNotFoundException, SQLException {\n        Class.forName(dataSource.getDriverClassName());\n        return DriverManager.getConnection(dataSource.getUrl(), dataSource.getUserName(), dataSource.getPassword());\n    }\n\n    private User convertToModel(ResultSet resultSet) throws SQLException {\n        return new User(resultSet.getInt(\"id\"), resultSet.getString(\"name\"));\n    }\n\n    public static void main(String[] args) throws SQLException, ClassNotFoundException, IOException {\n        User user = new Main().findByUserId(1);\n        System.out.println(user);\n    }\n\n}\n```\n\n#### Scalaの場合\n\n```scala\npackage net.gree.aurora.scala\n\nimport java.io.{IOException, File}\nimport java.sql.{Connection, DriverManager, ResultSet}\n\nimport net.gree.aurora.scala.application.AuroraShardingService\nimport net.gree.aurora.scala.domain.cluster.AbstractClusterIdResolver\nimport net.gree.aurora.scala.domain.datasource.JDBCDataSource\nimport net.gree.aurora.scala.domain.hint.Hint\nimport org.sisioh.dddbase.core.lifecycle.sync.SyncEntityIOContext\n\nimport scala.util.Try\n\nobject Main extends App {\n\n  case class User(id: Int, name: String)\n\n  // リゾルバを定義する\n  private val clusterIdResolver = new AbstractClusterIdResolver[Int](\"cluster\") {\n\n    override protected def getSuffixName(userIdHint: Hint[Int], clusterSize: Int): String = {\n      (((userIdHint.value + 1) % clusterSize) + 1).toString\n    }\n\n  }\n\n  // AuroraShardingServiceを初期化する\n  private val auroraShardingService = AuroraShardingService(clusterIdResolver, new File(\"./conf/example.conf\"))\n\n  private implicit val dataSourceRepository = auroraShardingService.dataSourceRepository.get\n  private implicit val ctx = SyncEntityIOContext\n\n  private def findByUserId(userId: Int): Try[User] = {\n    // sharding-config-idとcluster-group-idとヒントを引数に与えてclusterを解決する\n    auroraShardingService.resolveClusterByHint(\"database\", \"main\", Hint(userId)).map { cluster =\u003e\n      // スレーブはランダム選択\n      val selector = cluster.createDataSourceSelectorAsRandom\n      // スレーブデータソースを選択する\n      val dataSource = selector.selectDataSourceAsJDBC().get\n      // 書き込み用途でマスターを利用する場合は、以下。\n      // val dataSource = cluster.masterDataSource\n\n      println(dataSource)\n\n      // データソースからコネクションを取得する\n      val connection = getConnection(dataSource)\n\n      // コネクションを使ってSQLを発行する\n      val st = connection.createStatement\n      val rs = st.executeQuery(\"SELECT * FROM user WHERE id = \" + userId)\n      if (rs.next())\n        convertToModel(rs)\n      else\n         throw new IOException(\"entity is not found.\")\n    }\n  }\n\n  // ここでは都度コネクションを取得していますが、\n  // 必要に応じてコネクションプールからコネクションを取得してもよいでしょう\n  private def getConnection(dataSource: JDBCDataSource): Connection = {\n    val url = dataSource.url\n    val userName = dataSource.userName\n    val password = dataSource.password\n    Class.forName(dataSource.driverClassName)\n    DriverManager.getConnection(url, userName, password)\n  }\n\n  private def convertToModel(resultSet: ResultSet): User =\n    User(\n      id = resultSet.getInt(\"id\"),\n      name = resultSet.getString(\"name\")\n    )\n\n  val user = findByUserId(1).get\n\n  println(user)\n\n}\n```\n\n上記のサンプルコードは、以下の手順で実行することができます(MySQLサーバをlocalhostで稼働させている前提)。\n\n```sh\n$ git clone git@github.com:gree/aurora.git\n$ cd aurora/tool\n$ sh setup_testdb.sh\n$ cd ..\n$ sbt \"project aurora-scala-example\" run\n```\n\n### その他のデータソースタイプについて\n\n- 対応しているデータソースタイプ\n    - 汎用タイプ(generic)\n    - JDBC(jdbc)\n    - Redis(redis)\n\n### テーブル名・シャーディング機能\n\nTBD\n\n## ビルド手順(コミッタ・コントリビュータ向け)\n\n### ビルドに必要なもの\n\n- Java SE 7\n\n[こちら](http://www.oracle.com/technetwork/java/javase/downloads/index.html)からダウンロードする。\n\n- Scala 2.10.x, 2.11.x\n\nsbtが自動的にダウンロードするのでインストールは不要\n\n- sbt\n\n以下の手順でインストール。\n```sh\n$ brew install sbt\n```\n\n### ソースコードの取得\n\n```sh\n$ git clone git@github.com:gree/aurora.git\n$ cd aurora\naurora $ git config -l | grep user # 意図どおりか確認する\n```\n\n### ビルド手順\n\n```sh\naurora $ sbt clean +package\n```\n\ntarget以下のパスにjarファイルが生成されます。\n\n### IntelliJ IDEA\n\n以下の手順を行い、IDEA上でOpen Projectを行う。\n\n```sh\n$ echo 'addSbtPlugin(\"com.github.mpeltonen\" % \"sbt-idea\" % \"1.6.0\")' \u003e  ~/.sbt/0.13/plugins/build.sbt\naurora $ sbt clean gen-idea\n```\n\n### ローカルリポジトリへのデプロイ\n\n```sh\naurora $ sbt clean publish-local\n```\n\n\n### リモートリポジトリ(Sonatype)へのデプロイ方法(コミッタのみの権限)\n\n### 前提\n\n- Sonatype JIRA のアカウントを持っていること。なければ[ここから](https://issues.sonatype.org/secure/Dashboard.jspa)サインアップしてアカウントを取得する。\n- Sonatype リポジトリへのデプロイ権限を持っていること。欲しい方は、Issueから申請してください。\n- 以下の内容で `~/.ivy2/.credentials` を作成する。\n\n```scala\nrealm=Sonatype Nexus Repository Manager\nhost=oss.sonatype.org\nuser=JIRAアカウント名\npassword=パスワード\n```\n\n- gpgで鍵を作る\n\n鍵を生成する\n\n```sh\n$ gpg --gen-key\n```\n\n生成された鍵を確認する\n    \n```sh\n$ gpg --list-keys\n```\n\n```sh\n/home/user1/.gnupg/pubring.gpg\n--------------------------------\npub   2038R/7544FE41 2014-06-15\nuid                  XXXXX YYYYY \u003cxxxxx@xxxx.xxx\u003e\nsub   2038R/FD94AE63 2014-06-15\n```\n\n鍵をサーバに送信する\n\n```sh\n$ gpg --send-keys 7544FE41\n```\n\n#### スナップショット版のデプロイ方法\n\n```sh\naurora $ sbt clean +publish\n```\n\n#### リリース版のデプロイ方法\n\n```sh\n# リリースブランチを作成する\naurora $ git flow release start v0.0.4\n# commonSettingsのversionをあげる\naurora $ vi project/Build.scala\naurora $ sbt clean test\naurora $ git flow release finish v0.0.4\naurora $ git push origin master\naurora $ git push origin develop\naurora $ git push origin refs/tags/v0.0.4\n# マスターブランチからデプロイを行う\naurora $ sbt clean\naurora $ sbt +publishSigned\naurora $ sbt +sonatypeRelease\n```\n\n## 開発への貢献\n\nPull Requestをお待ちしております。\n\n\n## 短縮URL\n\nhttp://git.io/aurora\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgree%2Faurora","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgree%2Faurora","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgree%2Faurora/lists"}