Ubuntu 14.04で2系のgitを使う

gozuk16.hatenablog.com

上の記事に続いて、gitが古いので新しくしておく

$ sudo add-apt-repository ppa:git-core/ppa
 The most current stable version of Git for Ubuntu.

For release candidates, go to https://launchpad.net/~git-core/+archive/candidate .
 More info: https://launchpad.net/~git-core/+archive/ubuntu/ppa
Press [ENTER] to continue or ctrl-c to cancel adding it

gpg: keyring `/tmp/tmpm1h_rrd0/secring.gpg' created
gpg: keyring `/tmp/tmpm1h_rrd0/pubring.gpg' created
gpg: requesting key E1DF1F24 from hkp server keyserver.ubuntu.com
gpgkeys: key E1DD270288B4E6030699E45FA1715D88E1DF1F24 can't be retrieved
gpg: no valid OpenPGP data found.
gpg: Total number processed: 0

$ sudo apt-key adv --keyserver hkp://pgp.mit.edu:80 --keyserver-options http-proxy=http://proxy.example.com:8080/ --recv-keys E1DF1F24
Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --homedir /tmp/tmp.kL0BZJ0wMB --no-auto-check-trustdb --trust-model always --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyserver hkp://pgp.mit.edu:80 --keyserver-options http-proxy=http://proxy.example.com:8080/ --recv-keys E1DF1F24
gpg: requesting key E1DF1F24 from hkp server pgp.mit.edu
gpg: key E1DF1F24: public key "Launchpad PPA for Ubuntu Git Maintainers" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

$ sudo aptitude update
$ sudo aptitude safe-upgrade

出来た

$ git version
git version 2.13.0

Jenkinsのlinuxスレーブが起動しなくなったのでJavaを上げた

今日はやたらyak shavingした日なのでブログに残しておこう。( TДT)

いつの間にかLinux Slaveが起動しなくなってた

Jenkinsの画面からノードを選択して手動で起動してみる

[06/29/17 19:31:05] [SSH] スレーブのプロセスを開始: cd "/home/jenkins" && java  -jar slave.jar

<===[JENKINS REMOTING CAPACITY]===>channel started

Slave JVM has not reported exit code. Is it still running?
[06/29/17 19:31:09] Launch failed - cleaning up connection
[06/29/17 19:31:09] [SSH] コネクション終了
ERROR: Connection terminated
java.io.EOFException
    at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2638)
    at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:3113)
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:853)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:349)
    at hudson.remoting.ObjectInputStreamEx.<init>(ObjectInputStreamEx.java:48)
    at hudson.remoting.AbstractSynchronousByteArrayCommandTransport.read(AbstractSynchronousByteArrayCommandTransport.java:34)
    at hudson.remoting.SynchronousCommandTransport$ReaderThread.run(SynchronousCommandTransport.java:59)
Caused: java.io.IOException: Unexpected termination of the channel
    at hudson.remoting.SynchronousCommandTransport$ReaderThread.run(SynchronousCommandTransport.java:73)

あらら? Slave JVM has not reported exit code. Is it still running? をぐぐってみるとどうやらJavaのバージョンに依存するエラーらしい。今まではJava7で動いていたのがだめになったんだろうか・・・

Java8にあげてみる

ubuntu 14.04なのでPPAで入れることにしました。

$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:webupd8team/ppa
 Oracle Java (JDK) Installer (automatically downloads and installs Oracle JDK7 / JDK8 / JDK9). There are no actual Java files in this PPA.

Important -> Why Oracle Java 7 And 6 Installers No Longer Work: http://www.webupd8.org/2017/06/why-oracle-java-7-and-6-installers-no.html

More info (and Ubuntu installation instructions):
- for Oracle Java 7: http://www.webupd8.org/2012/01/install-oracle-java-jdk-7-in-ubuntu-via.html
- for Oracle Java 8: http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html

Debian installation instructions:
- Oracle Java 7: http://www.webupd8.org/2012/06/how-to-install-oracle-java-7-in-debian.html
- Oracle Java 8: http://www.webupd8.org/2014/03/how-to-install-oracle-java-8-in-debian.html

Oracle Java 9 (for both Ubuntu and Debian): http://www.webupd8.org/2015/02/install-oracle-java-9-in-ubuntu-linux.html

For JDK9, the PPA uses standard builds from: http://jdk.java.net/9/ (and not the Jigsaw builds!).

Important!!! For now, you should continue to use Java 8 because Oracle Java 9 is available as an early access release! You should only use Oracle Java 9 if you explicitly need it, because it may contain bugs and it might not include the latest security patches! Also, some Java options were removed in JDK9, so you may encounter issues with various Java apps. More information and installation instructions (Ubuntu / Linux Mint / Debian): http://www.webupd8.org/2015/02/install-oracle-java-9-in-ubuntu-linux.html
 More info: https://launchpad.net/~webupd8team/+archive/ubuntu/java
Press [ENTER] to continue or ctrl-c to cancel adding it

gpg: keyring `/tmp/tmp7j4t0u3c/secring.gpg' created
gpg: keyring `/tmp/tmp7j4t0u3c/pubring.gpg' created
gpg: requesting key EEA14886 from hkp server keyserver.ubuntu.com
gpgkeys: key 7B2C3B0889BF5709A105D03AC2518248EEA14886 can't be retrieved
gpg: no valid OpenPGP data found.
gpg: Total number processed: 0

相変わらずプロキシ環境下で鍵をインストールするところで失敗する・・・。

gozuk16.hatenablog.com

自分の記事を参考に鍵だけインストー

$ sudo apt-key adv --keyserve
[http://gozuk16.hatenablog.com/entry/2016/03/24/144400:embed:cite]

r hkp://pgp.mit.edu:80 --keyserver-options http-proxy=http://proxy.example.com:8080/ --recv-keys EEA14886

Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --homedir /tmp/tmp.JJ3XwYe2dV --no-auto-check-trustdb --trust-model always --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyserver hkp://pgp.mit.edu:80 --keyserver-options http-proxy=http://proxy.example.com:8080/ --recv-keys EEA14886
gpg: requesting key EEA14886 from hkp server pgp.mit.edu
gpg: key EEA14886: public key "Launchpad VLC" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

更新してインストー

$ sudo aptitude update
$ sudo aptitude install oracle-java8-installer

$ sudo java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
root@ci-slave-linux1:/etc/apt/sources.list.d# ls
webupd8team-java-trusty.list

直ったー

[06/29/17 19:49:45] [SSH] スレーブのプロセスを開始: cd "/home/jenkins" && java  -jar slave.jar
<===[JENKINS REMOTING CAPACITY]===>channel started
Slave.jar version: 3.7
This is a Unix agent
Evacuated stdout

Agent successfully connected and online

ubuntu で do-release-upgrade が失敗する

proxy環境下にあると以下のようなエラーがしばらく繰り返して失敗します。

0% [ヘッダの待機中です]
0% [ヘッダの待機中です]
0% [ヘッダの待機中です]
エラー http://security.ubuntu.com/ubuntu/ xenial-security/main linux-headers-4.4.0-71 all 4.4.0-71.92
  接続失敗 [IP: 192.168.0.1 8080]
0% [ヘッダの待機中です]

どうやらProxyがおそすぎてタイムアウトするらしいです。

まずは速いミラーに変えます。 /etc/apt/source.list/etc/apt/source.list.distUpgradeを日本の早そうなミラーに書き換えました。

launchpad.net

それでもでかいファイルは駄目っぽいので、手動で落として /var/cache/apt/archives に放り込んだら進みだした。

まったくもう。まともなプロキシにするだけでどれだけ生産性が向上することやら。(´Д`)ハァ…

参考

srad.jp

NuGetパッケージのキャッシュをクリアする

自分が悪いのですが、snapshotを作らずに同じバージョンのパッケージをNexusリポジトリにどんどん上書きしていたら、参照しているプロジェクト側で何度消して入れ直しても古いパッケージが入ってしまうようになった。

キャッシュは、C:\Users\ユーザ名\AppData\Local\NuGet にあるというのはぐぐってわかったのだがそこにもファイルはなく。。。
Nexusのキャッシュをクリアしたり、再起動したりどうにも行き詰まっていたが結局はnugetコマンドで解決しました。

結論としては、NuGetのキャッシュはあちこちにある!ということらしいです。(;´д`)トホホ…

  • キャッシュの一覧を表示する
C:\home\gozu\projects\hogehoge\src>nuget locals all -list
http-cache: C:\Users\gozu\AppData\Local\NuGet\v3-cache
packages-cache: C:\Users\gozu\AppData\Local\NuGet\Cache
global-packages: C:\Users\gozu\.nuget\packages\
temp: C:\Users\gozu\AppData\Local\Temp\NuGetScratch
  • キャッシュをクリアする
C:\home\gozu\projects\hogehoge\src>nuget locals all -clear
Clearing NuGet HTTP cache: C:\Users\gozu\AppData\Local\NuGet\v3-cache
Clearing NuGet cache: C:\Users\gozu\AppData\Local\NuGet\Cache
Clearing NuGet global packages cache: C:\Users\gozu\.nuget\packages\
Local resources cleared.

これで解決しました。

Visual Studio 2015にしたらNuget restoreで参照設定が復元されなくなった

Jenkinsで流すと、nuget restoreは一見正常に終了しているが次のMSBuildでエラーになります。

エラーは次の通り。(ちょっと長いけど)

ResolveAssemblyReferences:
  プライマリ参照 "log4net" です。
C:\Program Files\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3245: この参照を解決できませんでした。アセンブリ "log4net" が見つかりませんでした。アセンブリが間違いなくディスクに存在することを確認してください。 コードにこの参照が必要な場合、コンパイル エラーが発生する可能性があります。 [c:\jenkins\workspace\Foo_bar_develop-CTIV4IL2JPHXPYVJDTYNNVX42T665ZR7U5MNMTNIGCKMRODFHMAA\src\bar\bar.csproj]
          検索パスは "{TargetFrameworkDirectory}" です。
          "C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\log4net.winmd" を考慮しましたが、存在しませんでした。
          "C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\log4net.dll" を考慮しましたが、存在しませんでした。
          "C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\log4net.exe" を考慮しましたが、存在しませんでした。
          検索パスは "{Registry:Software\Microsoft\.NETFramework,v4.0,AssemblyFoldersEx}" です。
          AssemblyFoldersEx の場所が考慮されました。
          検索パスは "{AssemblyFolders}" です。
          "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\log4net.winmd" を考慮しましたが、存在しませんでした。
          "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\log4net.dll" を考慮しましたが、存在しませんでした。
          "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\log4net.exe" を考慮しましたが、存在しませんでした。
          "C:\Program Files\Microsoft SQL Server\120\SDK\Assemblies\log4net.winmd" を考慮しましたが、存在しませんでした。
          "C:\Program Files\Microsoft SQL Server\120\SDK\Assemblies\log4net.dll" を考慮しましたが、存在しませんでした。
          "C:\Program Files\Microsoft SQL Server\120\SDK\Assemblies\log4net.exe" を考慮しましたが、存在しませんでした。
          "C:\Program Files\IIS\Microsoft Web Deploy V3\log4net.winmd" を考慮しましたが、存在しませんでした。
          "C:\Program Files\IIS\Microsoft Web Deploy V3\log4net.dll" を考慮しましたが、存在しませんでした。
          "C:\Program Files\IIS\Microsoft Web Deploy V3\log4net.exe" を考慮しましたが、存在しませんでした。
          "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\log4net.winmd" を考慮しましたが、存在しませんでした。
          "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\log4net.dll" を考慮しましたが、存在しませんでした。
          "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\log4net.exe" を考慮しましたが、存在しませんでした。
          検索パスは "{GAC}" です。
          GAC で見つからなかった "log4net" を考慮しました。
          検索パスは "{RawFileName}" です。
          "log4net" をファイル名として扱いましたが、存在しませんでした。
          検索パスは "bin\x86\Release\" です。
          "bin\x86\Release\log4net.winmd" を考慮しましたが、存在しませんでした。
          "bin\x86\Release\log4net.dll" を考慮しましたが、存在しませんでした。
          "bin\x86\Release\log4net.exe" を考慮しましたが、存在しませんでした。
  AssemblyFoldersEx の場所:"{Registry:Software\Microsoft\.NETFramework,v4.0,AssemblyFoldersEx}"
          C:\Program Files\NUnit 2.6.3\bin\framework\
          C:\Program Files\Microsoft Visual Studio 14.0\Common7\IDE\ReferenceAssemblies\v4.0\
          C:\Program Files\Microsoft Visual Studio 11.0\Common7\IDE\ReferenceAssemblies\v4.0\
          
          C:\Program Files\Reference Assemblies\Microsoft\VBPowerPacks\v10.0\
          C:\Program Files\Microsoft SDKs\Expression\Blend\.NETFramework\v4.0\Prototyping\Libraries\
          C:\Program Files\Microsoft SDKs\Expression\Extensions\FXG\Libraries\.NETFramework\v4.0\
          C:\Program Files\Microsoft SDKs\Expression\Blend\.NETFramework\v4.0\Libraries\
          C:\Program Files\Microsoft Visual Studio 14.0\Common7\IDE\ReferenceAssemblies\v2.0\
          C:\Program Files\Microsoft Visual Studio 11.0\Common7\IDE\ReferenceAssemblies\v2.0\
          C:\Program Files\Reference Assemblies\Microsoft\VBPowerPacks\v10.0\
          C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Desktop
          C:\Program Files\Common Files\Microsoft Shared\MSEnv\PublicAssemblies\
          C:\Program Files\Microsoft Chart Controls\Assemblies
GenerateTargetFrameworkMonikerAttribute:
すべての出力ファイルが入力ファイルに対して最新なので、ターゲット "GenerateTargetFrameworkMonikerAttribute" を省略します。
CoreCompile:
  C:\Program Files\MSBuild\14.0\bin\csc.exe /noconfig /nowarn:1701,1702 /nostdlib+ /platform:x86 /errorreport:prompt /define:TRACE /highentropyva- /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Configuration.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Core.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Xml.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Xml.Linq.dll" /filealign:512 /optimize+ /out:obj\x86\Release\bar.dll /ruleset:"C:\Program Files\Microsoft Visual Studio 14.0\Team Tools\Static Analysis Tools\\Rule Sets\ManagedMinimumRules.ruleset" /target:library /utf8output Properties\AssemblyInfo.cs src\Ibar.cs src\bar4net.cs src\barBase.cs src\barManager.cs "C:\Users\jenkins\AppData\Local\Temp\.NETFramework,Version=v4.0.AssemblyAttributes.cs"
  Using shared compilation with compiler from directory: C:\Program Files\MSBuild\14.0\bin
src\bar4net.cs(11,17): error CS0246: 型または名前空間の名前 'log4net' が見つかりませんでした (using ディレクティブまたはアセンブリ参照が指定されていることを確認してください)。 [c:\jenkins\workspace\Foo_bar_develop-CTIV4IL2JPHXPYVJDTYNNVX42T665ZR7U5MNMTNIGCKMRODFHMAA\src\bar\bar.csproj]
プロジェクト "c:\jenkins\workspace\Foo_bar_develop-CTIV4IL2JPHXPYVJDTYNNVX42T665ZR7U5MNMTNIGCKMRODFHMAA\src\bar\bar.csproj" (Rebuild ターゲット) のビルドが終了しました -- 失敗。
プロジェクト "c:\jenkins\workspace\Foo_bar_develop-CTIV4IL2JPHXPYVJDTYNNVX42T665ZR7U5MNMTNIGCKMRODFHMAA\src\bar.sln" (Rebuild ターゲット) のビルドが終了しました -- 失敗。

ビルドに失敗しました。

Jenkinsのビルド用スレーブでVisual Studioを起動してからUpdate-Package -reinstallすれば直った。
が、CI的にはVS開いてゴニョゴニョしたくないのでスレーブのcsprojファイルを参考に以下のように元ファイルを修正したら、nuget restoreで参照設定が壊れなくなった!

  <ItemGroup>
    <Reference Include="log4net">
      <HintPath>..\packages\log4net.2.0.7\lib\net40-full\log4net.dll</HintPath>
      <Private>True</Private>
    </Reference>
  </ItemGroup>

でもこれってファイルの数が増えたらたまんないな。。。
もっといいやり方がありそうだけど。いや、あるべきだ!

Visual Studio 2015 で古いプロジェクトを開いた時に「参照」が壊れた

現象

Visual Studio 2012のプロジェクトを2015で開いたら、参照が全部壊れているプロジェクトがあった。(全部ではない)

  • SystemとかSystem.Coreとか基本的なやつやlog4netといったnuget管理の物も黄色の!がでて参照できなくなっている
    • 参照からランタイムを選んでプロパティを表示するとバージョンが0.0.0.0になっている
  • 参照の追加で選び直しても駄目
  • 対象のランタイムを切り替えても駄目

解消方法

結局、csprojファイルを直接エディタで開いて直しました。
以下の部分を削除します。

  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
  </Target>

ちなみにソリューションファイル(sln)の変換は上手くいってました。

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Express 2012 for Windows Desktop
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Express 14 for Windows Desktop
VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1

C#でWindowsのシステム環境変数を取得するときに値として埋め込まれている環境変数を展開しないで取得する

題名長い (;´д`)

環境変数を取得して改変してセットしたいときに値として埋め込まれた環境変数が展開されてしまうと不都合があると思います。

システム環境変数Pathを取得して変更する例

システム環境変数(例えばPath)を取得したい場合、いくつかやり方があるけど以下のようにすると簡単ですよね。

string env = "Path";
string value = Environment.GetEnvironmentVariable(env, EnvironmentVariableTarget.Machine);
Console.WriteLine(string.Format("{0}={1}", env, value);

以下のような値が取れたとします。

Path=C:\Program Files\Java\jre1.8.0_111\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\ProgramData\chocolatey\bin

ただ環境変数GUIから確認すると、以下のようになっています。

Path=%JAVA_HOME%\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\ProgramData\chocolatey\bin

取得した値に追加のパスを入れて保存したら%JAVA_HOME%\binC:\Program Files\Java\jre1.8.0_111\binに変わってしまいますよね。これは嬉しくありません。

というわけで、レジストリから取得すれば展開前の値が取れました。

using Microsoft.Win32;

string env = "Path";
RegistryKey reg = Registry.LocalMachine.OpenSubKey(@"System\CurrentControlSet\Control\Session Manager\Environment");
string value = (String)reg.GetValue(env, "", RegistryValueOptions.DoNotExpandEnvironmentNames);
Console.WriteLine(string.Format("{0}={1}", env, value);

GetValueの第3引数にRegistryValueOptions.DoNotExpandEnvironmentNames渡すと展開されずに取得できます。

意外と手こずったのでφ(..)メモメモ