Try .NET Core

.NET Coreを動かした、試した記録を書き残します。

Linux(CentOS7)で、ASP.NET Coreアプリのビルド自動化(1)

ASP.NET Coreアプリを、サービス化することが出来ました。
しかし、まだPHPのお手軽さ加減には、一歩届きません。

PHPでは、ソースを書き換えただけで、すぐに動作が変わってくれます。
が、ASP.NET Coreはビルドしなきゃいけません。
その都度、sshで入って操作するの、面倒です嫌です。

そこで、Gitを経由したビルドの自動化を試みます。
導入するのは、GitBucketとJenkinsです。

javaの導入

ひとまずは、現在インストール済みの全パッケージを、最新に更新します。

[root@centos7 ~]# yum update

続いて、Javaです。
GitBucket, Jenkinsの両方ともJavaアプリなので、先に入れておきます。

このへんを参考に、一番新しいOpenJDK1.8系パッケージを見てみます。

[root@centos7 ~]# yum list | grep java-1.8
java-1.8.0-openjdk.x86_64               1:1.8.0.111-1.b15.el7_2        updates
java-1.8.0-openjdk-accessibility.x86_64 1:1.8.0.111-1.b15.el7_2        updates
java-1.8.0-openjdk-accessibility-debug.x86_64
java-1.8.0-openjdk-debug.x86_64         1:1.8.0.111-1.b15.el7_2        updates
java-1.8.0-openjdk-demo.x86_64          1:1.8.0.111-1.b15.el7_2        updates
java-1.8.0-openjdk-demo-debug.x86_64    1:1.8.0.111-1.b15.el7_2        updates
java-1.8.0-openjdk-devel.x86_64         1:1.8.0.111-1.b15.el7_2        updates
java-1.8.0-openjdk-devel-debug.x86_64   1:1.8.0.111-1.b15.el7_2        updates
java-1.8.0-openjdk-headless.x86_64      1:1.8.0.111-1.b15.el7_2        updates
java-1.8.0-openjdk-headless-debug.x86_64
java-1.8.0-openjdk-javadoc.noarch       1:1.8.0.111-1.b15.el7_2        updates
java-1.8.0-openjdk-javadoc-debug.noarch 1:1.8.0.111-1.b15.el7_2        updates
java-1.8.0-openjdk-src.x86_64           1:1.8.0.111-1.b15.el7_2        updates
java-1.8.0-openjdk-src-debug.x86_64     1:1.8.0.111-1.b15.el7_2        updates
[root@centos7 ~]#

ほうほう、ありますね。
こちらによると、1.8.0-openjdk,1.8.0-openjdk-headlessを入れておけばよさげ。
また、あとから使う予定のwgetも一緒にインストールします。

[root@centos7 ~]# yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-headless wget
読み込んだプラグイン:fastestmirror
epel/x86_64/metalink                                     | 5.0 kB     00:00
epel                                                     | 4.3 kB     00:00
  --- 中略 ---
  xorg-x11-font-utils.x86_64 1:7.5-20.el7
  xorg-x11-fonts-Type1.noarch 0:7.5-9.el7

完了しました!

どれどれ?

[root@centos7 ~]# java -version
openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-b15)
OpenJDK 64-Bit Server VM (build 25.111-b15, mixed mode)

java、動いてますね。

参考:
参考メモ/CentOS7 の OpenJDK パッケージの構成メモ

GitBucketの導入

バイナリとデータの配置先フォルダを作ります。

[root@centos7 ~]# mkdir -p /home/webroot/gitbucket/bin
[root@centos7 ~]# mkdir -p /home/webroot/gitbucket/data

GitBucketのリリースページから、最新版のgitbucket.warを頂いてきます。

[root@centos7 ~]# cd /home/webroot/gitbucket/bin/
[root@centos7 bin]# wget https://github.com/gitbucket/gitbucket/releases/download/4.7.1/gitbucket.war
--2016-12-03 21:14:28--  https://github.com/gitbucket/gitbucket/releases/download/4.7.1/gitbucket.war
github.com (github.com) をDNSに問いあわせています... 192.30.253.112, 192.30.253.113
  --- 中略 ---
終了しました --2016-12-03 21:15:35--
経過時間: 1m 7s
ダウンロード完了: 1 ファイル、45M バイトを 1m 5s で取得 (707 KB/s)

apacheユーザーが実行出来るよう、所有権を変更しておきます。

[root@centos7 ~]# chown -Rf apache:apache /home/webroot/gitbucket

起動時のデータパスやプレフィクスなどを指定したかったので、tomcat経由でなく直接javaから起動させます。
先だってsystemdのサービス定義方法を覚えたところなので、早速追加しましょう。

[root@centos7 ~]# vi /etc/systemd/system/gitbucket.service

中身はこんなふうに。

[Unit]
    Description=GitBucket Service

    [Service]
    ExecStart=/usr/bin/java -jar /home/webroot/gitbucket/bin/gitbucket.war --gitbucket.home=/home/webroot/gitbucket/data --port=8002 --prefix=/
    WorkingDirectory=/home/webroot/gitbucket/data
    Restart=always
    RestartSec=10
    SyslogIdentifier=gitbucket
    User=apache

    [Install]
    WantedBy=multi-user.target

サービスを起動してみます。

[root@centos7 bin]# systemctl daemon-reload
[root@centos7 bin]# systemctl enable gitbucket
Created symlink from /etc/systemd/system/multi-user.target.wants/gitbucket.service to /etc/systemd/system/gitbucket.service.
[root@centos7 bin]# systemctl start gitbucket
[root@centos7 bin]# systemctl status gitbucket
● gitbucket.service - GitBucket Service
   Loaded: loaded (/etc/systemd/system/gitbucket.service; disabled; vendor preset: disabled)
   Active: active (running) since 日 2016-12-04 00:17:42 JST; 10s ago
 Main PID: 27599 (java)
   CGroup: /system.slice/gitbucket.service
           mq27599 /usr/bin/java -jar /home/webroot/gitbucket/bin/gitbucket.w...

12月 04 00:17:45 centos7.local gitbucket[27599]: Using job-store 'org.quartz...
12月 04 00:17:45 centos7.local gitbucket[27599]: 00:17:45.400 [main] INFO  o...
12月 04 00:17:45 centos7.local gitbucket[27599]: 00:17:45.400 [main] INFO  o...
12月 04 00:17:45 centos7.local gitbucket[27599]: 00:17:45.401 [main] INFO  o...
12月 04 00:17:45 centos7.local gitbucket[27599]: [INFO] [12/04/2016 00:17:45...
12月 04 00:17:45 centos7.local gitbucket[27599]: 00:17:45.420 [main] INFO  o...
12月 04 00:17:45 centos7.local gitbucket[27599]: 00:17:45.423 [main] INFO  o...
12月 04 00:17:45 centos7.local gitbucket[27599]: 2016-12-04 00:17:45.962:INF...
12月 04 00:17:45 centos7.local gitbucket[27599]: 2016-12-04 00:17:45.971:INF...
12月 04 00:17:45 centos7.local gitbucket[27599]: 2016-12-04 00:17:45.971:INF...
Hint: Some lines were ellipsized, use -l to show in full.

サービス定義にある、サーバの8002番ポートにブラウザからアクセスしてみます。
f:id:try_dot_net_core:20161204002140j:plain
GitBucket、起動してます!

参考:
GitHub gitbucket/gitbucket/release

Jenkinsの導入

概ねGitBucketと同じような流れです。
バイナリとデータの配置先フォルダを作ります。

[root@centos7 ~]# mkdir -p /home/webroot/jenkins/bin
[root@centos7 ~]# mkdir -p /home/webroot/jenkins/data

Jenkinsバイナリ配布ページから、最新版のjenkins.warを貰ってきます。

[root@centos7 ~]# cd /home/webroot/jenkins/bin/
[root@centos7 bin]# wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war
--2016-12-04 00:35:16--  http://mirrors.jenkins-ci.org/war/latest/jenkins.war
mirrors.jenkins-ci.org (mirrors.jenkins-ci.org) をDNSに問いあわせています... 52.202.51.185
  --- 中略 ---
100%[======================================>] 68,851,608   986KB/s 時間 1m 47s

2016-12-04 00:37:04 (630 KB/s) - `jenkins.war' へ保存完了 [68851608/68851608]

apacheユーザーが実行出来るよう、所有権を変更しておきます。

[root@centos7 bin]# chown -Rf apache:apache /home/webroot/jenkins

こちらも起動時のプレフィクスを指定したいので、javaから起動させます。
jenkinsサービスを追加します。

[root@centos7 ~]# vi /etc/systemd/system/jenkins.service

中身はこんなふうに。

[Unit]
    Description=Jenkins Service

    [Service]
    ExecStart=/usr/bin/java -jar /home/webroot/jenkins/bin/jenkins.war --httpPort=8003 --prefix=/
    WorkingDirectory=/home/webroot/jenkins/data
    Restart=always
    RestartSec=10
    SyslogIdentifier=jenkins
    User=root
    Environment=JENKINS_HOME=/home/webroot/jenkins/data

    [Install]
    WantedBy=multi-user.target

環境変数設定Environmentが増えているのがミソです。
GitBucketと違い、開始時にデータフォルダを指定するオプションがありません。
そのためこのあたりを参考に、環境変数でデータフォルダを指定しています。
こういうの、まとめておくとバックアップがラクチンですから。

また、実行権限はrootにしています。
お行儀の悪い設定ではあるんですが...。

Jenkinsはビルド等のシェルスクリプト実行時、サービス再起動などのroot権限が必要な処理を行います。
root以外のユーザーでJenkinsが実行されている場合、visudo設定でsudoの認証を回避することになります。
そうすると、セキュリティもクソもないんですよね。

まあ、Jenkinsの攻撃が成功してしまったらオワリだ、ということで、肚を括りましょう:-)

さて、Jenkinsも起動してみましょう。

[root@centos7 ~]# systemctl daemon-reload
[root@centos7 ~]# systemctl enable jenkins
Created symlink from /etc/systemd/system/multi-user.target.wants/jenkins.service to /etc/systemd/system/jenkins.service.
[root@centos7 ~]# systemctl start jenkins
[root@centos7 ~]# systemctl status jenkins
● jenkins.service - Jenkins Service
   Loaded: loaded (/etc/systemd/system/jenkins.service; enabled; vendor preset: disabled)
   Active: active (running) since 日 2016-12-04 01:43:20 JST; 6s ago
 Main PID: 28999 (java)
   CGroup: /system.slice/jenkins.service
           mq28999 /usr/bin/java -jar /home/webroot/jenkins/bin/jenkins.war -...

12月 04 01:43:24 centos7.local jenkins[28999]: ****************************...*
12月 04 01:43:24 centos7.local jenkins[28999]: ****************************...*
12月 04 01:43:24 centos7.local jenkins[28999]: ****************************...*
12月 04 01:43:24 centos7.local jenkins[28999]: Jenkins initial setup is req....
12月 04 01:43:24 centos7.local jenkins[28999]: Please use the following pas...:
12月 04 01:43:24 centos7.local jenkins[28999]: efad29c130da48e3980ebc59b032b8ab
12月 04 01:43:24 centos7.local jenkins[28999]: This may also be found at: /...d
12月 04 01:43:24 centos7.local jenkins[28999]: ****************************...*
12月 04 01:43:24 centos7.local jenkins[28999]: ****************************...*
12月 04 01:43:24 centos7.local jenkins[28999]: ****************************...*
Hint: Some lines were ellipsized, use -l to show in full.

起動したみたい?

f:id:try_dot_net_core:20161204014603j:plain
初期設定画面ですね!

参考:
Starting and Accessing Jenkins
Change JENKINS_HOME on Red Hat Linux?

apache-VirtualHost化

ASP.NET Coreアプリに加えて、GitBucketとJenkinsが稼働し始めました。
外部パートナーからのアクセスを考えて、全てapache経由で動くように調整します。

/etc/httpd/conf/httpd.confを編集して VirtualHostを3つ作ります。
dotnet.centos7.local, git.centos7.local, jenkins.centos7.local の3つのドメイン名を定義しました。

#---前回追加した箇所をコメントアウト---
#ProxyPreserveHost On
#ProxyPass / http://localhost:5000/
#ProxyPassReverse / http://localhost:5000/

#---ここから追記---
#-------------------------------------------------------
# Service dotnet.centos7.local
#-------------------------------------------------------
<VirtualHost *:80>
        ServerName dotnet.centos7.local
        ErrorLog /var/log/httpd/dotnet.centos7.local.error.log
        CustomLog /var/log/httpd/dotnet.centos7.local.access.log common

        ProxyPreserveHost On
        ProxyPass / http://localhost:5000/
        ProxyPassReverse / http://localhost:5000/
</VirtualHost>

#-------------------------------------------------------
# Service git.centos7.local
#-------------------------------------------------------
<VirtualHost *:80>
        ServerName git.centos7.local
        ErrorLog /var/log/httpd/git.centos7.local.error.log
        CustomLog /var/log/httpd/git.centos7.local.access.log common

        ProxyPreserveHost On
        ProxyPass / http://localhost:8002/
        ProxyPassReverse / http://localhost:8002/
</VirtualHost>

#-------------------------------------------------------
# Service jenkins.centos7.local
#-------------------------------------------------------
<VirtualHost *:80>
        ServerName jenkins.centos7.local
        ErrorLog /var/log/httpd/jenkins.centos7.local.error.log
        CustomLog /var/log/httpd/jenkins.centos7.local.access.log common

        ProxyPreserveHost On
        ProxyPass / http://localhost:8003/
        ProxyPassReverse / http://localhost:8003/
</VirtualHost>

開発用Windows機のhostsファイルにも、上記3ドメインを書き込みます。
f:id:try_dot_net_core:20161204020845j:plain

ブラウザから、確認してみましょう。 f:id:try_dot_net_core:20161204021215j:plain
ん、おっけーです!



今回分のソースコードはこちら。
まだ、Visual Studioが生成するテンプレートのままです。
github.com

次回、いよいよ連動ビルド設定に入ります!