Things of interesting

プログラミングに関する技術ネタの備忘録

Werckerを使ってGithubへのreleaseとJarアップロードを自動化する

やること

SpringBootでプロジェクトを開発する際に共通で使う機能などをライブラリ化して参照できるようにしたい。

プロジェクトの依存関係で解決してもいいですが、共通ライブラリが肥大化するような場合だとローカルビルドが面倒なので今回はJar化したものを配布することにします。

Wercker設定ファイルの編集

前回の続きから

hnak.hatenablog.jp

公式ドキュメントにリリースとアップロードの手順があるのでこれを参考にします。

GitHub - wercker/step-github-create-release: wercker step for deploying to GitHub releases

GitHub - wercker/step-github-upload-asset: A wercker step for adding an asset to a GitHub release.

wercker.yml に以下のdeployワークフローを追加します。

deploy:
  steps:
    - script:
        name: get version
        code: |
          VERSION=`grep ^version build.gradle | awk -F\' '{print $2}'`
    - github-create-release:
        token: $GITHUB_TOKEN
        tag: $VERSION
    - github-upload-asset:
        token: $GITHUB_TOKEN
        file: build/libs/appname-${VERSION}.jar
        content-type: application/zip

Jarの名前はbuild.gradleから設定できるので以下をbuild.gradleに追加してください。
versionは適当にbuild.gradleからgrepしてます。

jar.baseName = 'appname'
version = '0.0.1-SNAPSHOT'

Weckerの設定変更

Pipeline追加

WebページへログインしワークフローのメニューからAdd New Pipelineを選択します。 f:id:hnakanoya:20171027103849p:plain

YML Pipeline nameにwercker.ymlで設定したdeployを入力してcreateを押します。 f:id:hnakanoya:20171027104104p:plain

ワークフローに先ほど追加したdeployを繋げます。 f:id:hnakanoya:20171027104243p:plain

Githubトークンの取得

WerckerからGithubへpushするのにGithubトークンが必要なので作成します。

GithubのWebページへ行って以下のリンクで設定画面を開きます。
Settings→Developer settings→Personal access tokens f:id:hnakanoya:20171027105701p:plain

Generate new tokenを選択して、新規トークンを作成します。
今回はpublicレポジトリを使うのでpublic_repoのみにチェックをいれます。 f:id:hnakanoya:20171027105742p:plain

トークンが生成されたらコピーしておきます。 f:id:hnakanoya:20171027105906p:plain

Githubトークン設定

Environmentのページを開いてValueに先ほどコピーしたトークンを設定します。
keyはGITHUB_TOKENとしてください。

Wercker実行確認

最初に設定したwercker.ymlをPUSHすると自動的にweckerも実行されます。

deployのpipelineが正常に実行され、githubのreleasesにJarがアップロードされていれば成功です。

参照側プロジェクトの設定

build.gradleに以下を追加

def urlFile = { url, name ->
    File file = new File("$buildDir/libs/${name}.jar")
    file.parentFile.mkdirs()
    if (!file.exists()) {
        new URL(url).withInputStream { downloadStream ->
            file.withOutputStream { fileOut ->
                fileOut << downloadStream
            }
        }
    }
    files(file.absolutePath)
}
dependencies {
    compile urlFile('https://github.com/nakanoya150151/siw/releases/download/0.0.1/siw-0.0.1-SNAPSHOT.jar?raw=true', 'siw')
}

とりあえずこれで連携できますが、Mavenレポジトリを立てたほうがきれいですね。。。
Jar化も含めてやってくれるWebサービスもあるようです。

www.jitpack.io

上のjitpackを紹介していた記事
JitPack.ioでGitHub上のJavaプロジェクトを簡単にライブラリとして参照する · tehepero note(・ω<) 2.0

課題

毎回のPUSHでreleasesを作成しようとしてしまうので制御できるように修正予定です。。。