redwarrior’s diary

C#, ASP.NET, WEB, G*などの雑多な情報

Hyper-V上にJiraを構築する

ヘルプデスク的な使い勝手を求めて、RedmineだけでなくJiraも検証することになったのでHyper-V上にJiraを構築する方法を調べました。

ちなみに前回の記事はこちら

redwarrior.hateblo.jp

目的

Hyper-VCentOS 7を構築し、そこにJira Service Deskをインストールする

環境

前回と同じ

仮想マシンの作成

前回、ゲストOSとしてUbuntuを選択したので、今回はCentOS 7で構築してみました。

以下のサイトを参考にCentOS 7のDVD ISOイメージをダウンロード。前回と同様に「クイック作成」を使用してダウンロードしたISOファイルを選択してインストールを開始しました。

【初心者でもわかる】Linux CentOSのインストール方法まとめ

仮想マシンの再インストール

サイトに従ってインストールは完了しましたが、「ソフトウェアの選択」で「最小限のインストール」を選択したのと「ネットワークの設定」をスキップしてしまったため、GUIがインストールされず黒い画面が表示されてしまいました。

これではやはり不便だったので、再インストールをすることにしました。

仮想マシンの設定でブート順でDVDドライブを先頭にして、DVDドライブのメディアにISOファイルを設定して、仮想マシンを起動するとインストール画面が表示されました。

改めて「ソフトウェアの選択」で「GNOME Desktop」を選択し、「ネットワークの設定」を済ませた上でインストールしました。

Jira Service Deskインストール

Jira Service Deskは、公式ドキュメントに従えばインストールが出来ました。

ドキュメント内でsudoコマンドを使っていて、CentOS 7のインストール直後は一般ユーザでsudoコマンドが使えなかったので、使えるように登録しました。

Jira アプリケーションを Linux にインストールする - アトラシアン製品ドキュメント

CentOSでsudoコマンドが使えない場合の対処法

以下のコマンドで実行権限を与え、インストーラを実行しました。

chmod a+x atlassian-servicedesk-X.X.X-x64.bin

Jiraは評価版ライセンスをAtlassianのサイトで作成するため、ブラウザ(Firefox)にホストPCと同じプロキシサーバを設定しました。

評価版ライセンスの作成は特に問題なく終了し、それなりに時間はかかるが画面の操作に従ってインストールは完了しました。

Jira Service Deskへのアクセス

Firefoxから「http://localhost:8080/」を開くと、「http://localhost:8080/secure/WelcomeToJIRA.jsp」へリダイレクトされてJiraのログイン画面が表示されました。

f:id:redwarrior:20181024171556p:plain

以上。

Hyper-V上にRedmineを構築する

ヘルプデスク的な使い勝手を求めて、Redmineを検証することになったのでHyper-V上にRedmineを構築する方法を調べました。

目的

Hyper-VUbuntu 18.04 LTS 日本語 Remixを構築し、そこにRedmine 3.4.0をインストールする

環境

今回構築するのは社内LAN上のPCで、プロキシの設定や不正接続検知等の対策が取られている

仮想マシンの作成とホストOSのネットワーク遮断

以前、別の環境でHyper-V上で仮想マシンを作成した時は、第1世代と第2世代のどちらを選ぶのか?とか設定があって面倒だなと感じていました。

もうちょっと簡単な方法は無いかと調べると、「クイック作成」という機能があることがわかったので、今回はこの方法で試すことにしました。

Windows 10のHyper-VでLinuxの仮想マシンを作成する:Tech TIPS - @IT

サイトの手順に従って、Ubuntuのインストールが完了したので、さっそく起動するといつの間にかホストPCのネットワークが遮断されている!!!

どうやら、前にHyper-Vを使用した時に作成した仮想スイッチをネットワークで選択したのがまずかったらしい。Ubuntu仮想マシン)を終了した後、ネットワーク管理者にすいませんと謝ってネットワーク接続を復旧してもらい、対策を考えました。

ネットワーク遮断の調査

Hyper-Vの仮想スイッチについて良くわかっていなかったので、改めて調査しました。 以下のサイトを参考にして勉強。

Hyper-Vのネットワークを理解する -外部ネットワーク- | Windowsインフラ管理者への道

Hyper-Vのネットワークを理解する -内部ネットワーク,プライベートネットワーク- | Windowsインフラ管理者への道

コラム - Hyper-V の部屋 | 第5回 仮想環境とネットワーク|CTC教育サービス 研修/トレーニング

Hyper-Vネットワークの基本

わかったのは、仮想スイッチは、仮想NICではないということ。仮想マシンネットワークアダプタが仮想NICであり、仮想NICはホストPCのNICとは別物と扱われること。よって、仮想マシンを起動してネットワークに接続すると、LANケーブルを他のPCに差し替えて使用するのと同じ状態になってしまうのでした。

そんな訳で、「外部ネットワーク」の仮想スイッチは使用できない事がわかったけれど、このままでは仮想マシンはインターネットに接続できないため、対応方法をさらに調査しました。

ネットワーク遮断の解決方法

Windows 10 1709(Fall Creators Update)で、NATの役割をする仮想スイッチ(既定のスイッチ)が用意されたようなので、それを使用すると良さそうだとわかりました。

Windows 10 1709(Fall Creators Update/RS3) Hyper-V の NAPT 仮想スイッチ

「外部ネットワーク」のスイッチを削除して、イーサネットも「Hyper-V Extensible Virtual Switch」をやめて、設定をHyper-V導入前に戻しました。

その状態で、仮想マシンネットワークアダプタの仮想スイッチ項目で「既定のスイッチ」を選択したところ、仮想マシンを起動してもホストPCのネットワークは遮断されなくなりました。

仮想マシン(Ubuntu)からのインターネット接続

次に仮想マシン(Ubuntu)からのインターネット接続を試みたが接続できず。ネットワーク設定は問題ないはずなので、プロキシ設定がされていないと想定。FirefoxでホストPCと同じプロキシサーバを指定して試したところ、インターネットへのアクセスに成功しました。

Redmineインストール

これでようやく、Redmineのインストール作業に移れます。Redmineのインストールには、bitnami Redmineを使用しました。Ubuntu上のFirefoxを使用して、直接ダウンロードしました。

端末を開き、以下のコマンドで実行権限を与え、rootユーザーになってインストーラを実行するとGUIなインストール画面が表示されたので指示に従ってインストールを完了しました。

chmod 755 bitnami-redmine-3.4.6-3-linux-installer.run

一応以下のサイトを参考にインストール先は「/opt/redmine」に変更しました。

bitnami Redmineをインストールする際に気をつけるただ1つのこと | ITソリューション

Redmineへのアクセス

インストールが完了したので、Firefoxから「http://localhost/」を開いてみたがアクセスできない。ファイアウォールでブロックされているかと思ったが、ファイアウォールは起動していませんでした。

調べてみると、GUIで操作できるツール(manager-linux-x64.run)が、インストールディレクトリ(/opt/redmine)にあることが分かったので、rootユーザーになって実行しました。

ツールで確認すると、ApacheMySQLも停止していたので、「Start All」ボタンを押して両方とも起動したのを確認。

改めて「http://localhost/」を開くと、bitnamiのWelcomeページが表示されたので、画面の「Open Redmine」リンクをクリックするとRedmineのトップページが表示されました。

f:id:redwarrior:20181022184214p:plain

以上。

TFSの新しいビルド実行時にWebデプロイも行う

XAMLでない方の新しいビルドが成功したので、Webデプロイも試してみた。

どこに書いてあったか忘れたが、MSBuild引数を設定する事で、Webデプロイが出来るらしいので、やってみた。

f:id:redwarrior:20180905150001p:plain

上の画像の MSBuild引数のところに、XAMLビルドで設定していた引数を設定する。

設定した値:

/p:DeployOnBuild=True /p:PublishProfile="プロファイル名" /p:Password="パスワード"

ビルドステップとしては、「Visual Studioのビルド」でデプロイされるが*1発行できた。

以上。

*1:そのため、発行後にテストが実行される

Excel読込でNPOIをEPPlusのように使うため拡張メソッドを作成した

なぜEPPlusを直接使わないかは、過去の記事を参照。

redwarrior.hateblo.jp

NPOIを直接使うと、同じようなコーディングを繰り返し行う事が結構あったので、拡張メソッドを作成しました。
EPPlusを参考にしたメソッドや、あると便利そうなメソッドを作りました。

public static class NPOIExtension
{
    //GetCell("K21")のようにセルを指定できる
    public static ICell GetCell(this ISheet sheet, string cellRef)
    {
        var cellReference = new CellReference(cellRef);
        return sheet.GetRow(cellReference.Row).GetCell(cellReference.Col);
    }

    //GetCellRange("A3:F80")のようにセルの範囲を指定できる
    public static IList<ICell> GetCellRange(this ISheet sheet, string rangeRef)
    {
        var cells = new List<ICell>();
        var cellRangeAddress = CellRangeAddress.ValueOf(rangeRef);
        for (var i = cellRangeAddress.FirstRow; i <= cellRangeAddress.LastRow; i++)
        {
            for (var j = cellRangeAddress.FirstColumn; j <= cellRangeAddress.LastColumn; j++)
            {
                var cell = sheet.GetRow(i).GetCell(j);
                cells.Add(cell);
            }
        }

        return cells;
    }

    //Cellの値が空の場合は、0ではなくnullを返し、それ以外は int を返すメソッド
    public static int? IntOrNull(this ICell cell)
    {
        switch (cell.CellType)
        {
            case CellType.Formula:
            case CellType.Numeric:
                //NumericCellValueプロパティの取得時に関数が評価される
                //関数の評価結果は、数値として扱う
                return Convert.ToInt32(cell.NumericCellValue);
            case CellType.Blank:
                return null;
            default:
                throw new ArgumentOutOfRangeException();
        }
    }

    //Cellの値が空の場合は、0ではなくnullを返し、それ以外は decimal を返すメソッド
    public static decimal? DecimalOrNull(this ICell cell)
    {
        switch (cell.CellType)
        {
            case CellType.Formula:
            case CellType.Numeric:
                //NumericCellValueプロパティの取得時に関数が評価される
                //関数の評価結果は、数値として扱う
                return Convert.ToDecimal(cell.NumericCellValue);
            case CellType.Blank:
                return null;
            default:
                throw new ArgumentOutOfRangeException();
        }
    }
}

以上です。

(小ネタ)拡張メソッドを使用する場合も、Nullチェックは必要です!

IEnumerableインターフェイスのAnyメソッドを使用した時に、変数の値がnullでエラーになった。Anyメソッドは拡張メソッドなので、変数がnullでエラーになるのはおかしいのでは?と思ったが、答えは意外なところに。

C#で変数の値がnullで落ちる場合に投げられる例外は、System.NullReferenceException である。

それで、今回投げられた例外を良く見てみると、System.ArgumentNullException であった。これは、引数がnullだったら投げる例外なので、つまり拡張メソッドの中でnullと判定されて投げられた例外だったということ。

基本的な事でした。拡張メソッドを使用する場合も、nullチェックは必要という事ですね。

はてなブログをhttps化しました。

id:kazuakix さんの以下の記事を読んで、id:shiba-yan さんや id:tanaka733 さんもhttps化をおすすめしていたので、当ブログもhttps化してみました。

blog.kazuakix.jp

サイドバーのカスタマイズ等はしていなかったので、ほとんど対応は不要だと思っていましたが、混在コンテンツ(Mixed Content)のブロックが発生しました。

開発者ツールで確認すると、bootstrap の css の参照先が、http になっているとのこと。

css の指定をした覚えは無いのでテーマだろうと予想して、公式テーマで似た感じのものに変更したところ、混在コンテンツの表示がなくなりました。

これでアクセスが増えるといいなあ。

Team Foundation Server のXAMLでない方のビルド定義の作成・実行を1から解説する

前回からあっという間に2か月以上たってしまった。細く長くがんばろう。
2015以降のTFSではXAMLビルドは推奨されない*1方式になるので、新しいビルド環境の構築を試してみた。

環境:Team Foundation Server 2015 Update 4、Windows Server 2012SQL Server 2012

目次

  • プールの追加
  • 権限の設定
  • エージェントのインストール
  • エージェントの起動
  • ビルド定義の作成
  • ビルドの実行
  • 感想
  • 参考資料

プールの追加

画面上から歯車アイコンを押して、コントロール パネル画面に遷移する。

f:id:redwarrior:20180808111646p:plain

コレクション管理ページの表示をクリックして、コレクションのプロファイル画面に移動する。

f:id:redwarrior:20180808114633p:plain

エージェントキュータブをクリックする。新しいプールとキューを作成するために、新しいキューリンクをクリックする。

f:id:redwarrior:20180808115714p:plain

ダイアログで「新しいプールの作成」ラジオボタンを選択し、プール名に名前(今回は「VSPool」とする)を設定する。(上記画像は既に作成済)

f:id:redwarrior:20180808115644p:plain

プールの作成に失敗した場合は、権限が不足しているので、Team Foundation 管理者ユーザにプールを作成してもらう。

*1:TFS 2018 Update 2では復活したみたいだが

続きを読む