<commit_before>---
published: false
layout: post
title: Jenkinsで
category: tech
tags: [jenkins,slave,jnlp]
---



# これを読んで得られるもの

- Jenkins + Windows + PipelineScript にて「ジョブが何時までたっても止まってる」ハマリの回避
- Jenkinsにてjnlp(WebStart)Slave作る場合のトラブルシュート手順をある程度

# 前提

- Jenkins(master)
  - CentOS6(in AWS)
  - [本家の入れ方](https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Red+Hat+distributions)したJenkins使用
  - Jenkins ver. 2.34
- Jenkins(slave)
  - Windows Server2012 R2(in AWS)
    - AWSでくれる状態ほぼデフォルト
    - 日本語言語パックすら入れず、ロケール/タイムゾーンも用意されたまま
  - jnlpでコネクション張る(java -jar slave.jar起動)

# 事象

JenkinsのPipelineScriptでWindows対象の `bat` 構文を使った時、「無言で永久に止まる」という問題に当たりました。


「ログにも何も出ず」「ただ止まってるだけ」なので、何が起こってるかわかりません。


# やったこと

## 問題の切り分け

とりあえず

- 構成(JNLP使用slave)のせいなのか
- 単一環境(Windowsだから)のせいなのか

とかを切り分けたかったので、Slaveのマシンに同一VerのJenkinsを入れ、「同じ構文のPipelineスクリプトのジョブ」を作成し、実行しました。


一緒だ…。

## どんなメカニズムなのかをみていく

## Jenkinsにより生成されたバッチを実行してみる

## 解決

アルファベットだけのジョブ名に変えると…


---

# 小並感

スレーブなのだから「あまり手を入れずに、通信の仕込みだけして…」という状況になりやすいし、そうしたいことがほとんどなのではないかと。

そういう時に、こういう「得体のしれないハマり」をしたくないものです。

消極的ではありますが、「多OSのSlave抱えるMaster構成時にはジョブに日本語使わないのが無難」かな？という教訓を得ました。
<commit_msg>記事追記。<commit_after>---
published: false
layout: post
title: Jenkinsで「パイプラインスクリプトでWindowsのコマンド叩く」時ジョブが延々と止まる感じになる場合
category: tech
tags: [jenkins,slave,jnlp]
---

色々書きますけど、結論的には「JenkinsとWindowsでハマる」です。(slave nodeとか構成関係ないです)

ま、自分用なので読みにくくとも「やったこと順」で書きますかね。

# これを読んで得られるもの

- Jenkins + Windows + パイプラインスクリプト にて「ジョブが何時までたっても止まってる」ハマリの回避
- Jenkinsにてjnlp(WebStart)Slave作る場合のトラブルシュート手順をある程度

# 前提

Jenkinsのnodeをmaster/slaveで組んでいました。

- Jenkins(master)
  - CentOS6(in AWS)
  - [本家の入れ方](https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Red+Hat+distributions)したJenkins使用
  - Jenkins ver. 2.34
- Jenkins(slave)
  - Windows Server2012 R2(in AWS)
    - AWSでくれる状態ほぼデフォルト
    - 日本語言語パックすら入れず、ロケール/タイムゾーンも用意されたまま
  - jnlpでコネクション張る(java -jar slave.jar起動)


# 事象

Jenkinsのパイプラインスクリプト(Jenkinsfileに書くアレ)でWindows対象の `bat` 構文を使った時、「無言で永久に止まる」という問題に当たりました。

![全体の感とnodeの構成](./images/2016-12-03-outline.png)

スクリプト自体は「指定したノードでechoするだけ」の簡単なワンライナー。

![echoするだけの簡単なパイプラインスクリプト](./images/2016-12-03-pipelinescript.png)

実行するも「ログにも何も出ず」「ただ止まってるだけ」なので、何が起こってるかわかりません。

![20分以上動かないジョブ](./images/2016-12-03-infinity.png)

これ…「めちゃめちゃ待ったら終わったり」しない？止めて良いのかな？

# やったこと

## slave側の状態を見る

WindowsのSlave側を確認します。

masterのJenkinsの方で「Widndowsのslaveで使うのは `C:\jenkins_node` というフォルダ」と設定してあるので、そこがどうなってるのか眺めます。

![Windowsのslave側のフォルダ状態](./images/2016-12-03-winslave-folders.png)

`bat`ステートメントの詳しい仕様は知らないのですが、「ジョブ名のフォルダ」も出来ているし、「実行すべきコマンド」もbatファイルで放り込めてるように思えます。…なぜ止まるんだ。

## 問題の切り分け

とりあえず

- 構成(JNLP使用slave)のせいなのか
- 単一環境(Windowsだから)のせいなのか

とかを切り分けに行きます。

Slaveのマシンに同一VerのJenkinsを入れ、「同じ構文のPipelineスクリプトのジョブ」を作成し、実行しました。

![Windowsのslave側でJenkins起動](./images/2016-12-03-win-standalone-jenkins-script.png)

![WindowsのJenkinsでJob実行](./images/2016-12-03-win-standalone-jenkins-stay.png)

一緒だ…。

これにより「構成は関係ない」で、「Windows + Jenkins + パイプラインスクリプト(bat)の問題」に絞れました。

## 実際に「Jenkinsに作られたbatファイル」を叩いてみる

ローカルに入れたJenkinsは「 `[ユーザのカレントフォルダ]\.jenkins` にデータを貯め」ます。

上の検証から「問題はローカルJenkinsでも起こる」と考え、このフォルダを見ていきます。

パイプラインスクリプトかつ`bat`で在る限りは、`workspace`とかに同じようにバッチを作って…

![WindowsのJenkinsで吐かれたbat](./images/2016-12-03-win-standalone-jenkins-bat.png)

ましたね。ではコレを叩いてみます。

![WindowsのJenkinsで吐かれたbatを叩く](./images/2016-12-03-win-standalone-jenkins-bat-exec.png)

`jenkins-main.bat` というバッチは成功しますが、 (おそらくそれを呼び出すラッパーバッチであろう) `jenkins-wrap.bat` というバッチが失敗します。

おそらく、コレですね！

バッチの内容は正しいのですが「そんなpathない」と言ってます。

## 解決

「日本語が問題かなー？」と決め打って、元のSlave/Master構成で、「アルファベットだけのジョブ名」に変えると…






---

# 小並感

スレーブなのだから「あまり手を入れずに、通信の仕込みだけして…」という状況になりやすいし、そうしたいことがほとんどなのではないかと。

そういう時に、こういう「得体のしれないハマり」をしたくないものです。

消極的ではありますが、「多OSのSlave抱えるMaster構成時にはジョブに日本語使わないのが無難」かな？という教訓を得ました。

{'fraction_non_alphanumeric': 0.12450013329778725, 'fraction_numerical': 0.022394028259130897, 'mean_word_length': 7.034261241970022, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3626877', 'n_tokens_mistral': 2780, 'n_tokens_neox': 2548, 'n_words': 146}