Jenkisジョブ作成について

↓ Jenkins の使い方については ↓
↓ 以下にまとめ直しましたのでこちらをご利用ください ↓

> [Jenkins による リリース & Git操作 & build 入門](https://qiita.com/sekiyaeiji/items/5a09cd926b88d63b6490)


以下は古い内容になります


# Jenkisジョブ作成について　



## Jenkinsとは

- 継続的インテグレーション（continuous integration）ツール
- アジャイル型開発での利用を前提に設計された
- 日本製で、作者は川口耕介氏 
- "ジョブ"と呼ばれる用途単位の機能を順次実行していくことで**Git操作**や**ファイル転送**を実行する
- 1つのジョブは、対象Gitブランチ設定やGitコマンド、シェルコマンドなどを設定することで1つの機能を担う構造になっている
- ジョブを一度作成すると実行時に機能の詳細内容を意識することなく反復利用できる
- 初期状態では、ジョブが何も与えられてない"からっぽのハコ"のようなもの

## なぜCIツール

- 機械が得意なことを機械に任せる
  - 差分抽出
  - 反復作業
  - 転送設定
  - 高速リリース
- ローカルルールの撲滅

## ジョブ画面の構成

ジョブ画面のなかでフロントエンドデプロイのためによく利用する機能は以下のとおり

- 基本情報
  - プロジェクト名
  - 説明
  - **ビルドのパラメーター化**
      - 文字列
      - 真偽値
      - 選択
      - Git Parameter
- ソースコード管理
  - **Git**
- ビルド・トリガ
  - SCMをポーリング
- ビルド
  - **シェルスクリプト**
- ビルド後の処理
  - E-mail通知

## ジョブ画面 ： 基本情報

### プロジェクト名

- 必須入力項目
- 半角英数字で命名する
- プロジェクト名がURIとして利用されるため「%20」に変換される半角スペースも使わないほうが望ましい

### 説明

- 一部のHTML要素に対応
- プロジェクトの名前やジョブの内容などを記載する
- deployの場合、本番向けかSTG向けかDEV向けかなどのdeploy先を記載する
- deploy元のgitリポジトリURIやdeploy先のURIなど記載しておくと便利

### ビルドのパラメーター化 ： 文字列

- 自由入力文字列を設定する場合に利用
- 同期するbranchの選択などに利用

### ビルドのパラメーター化 ： 真偽値

- チェックボックスによる選択に利用
- DRYRUNのオン／オフの選択などに利用

### ビルドのパラメーター化 ： 選択

- プルダウンによる選択に利用
- 複数項目の選択に利用

### ビルドのパラメーター化 ： Git Parameter

- Gitリポジトリを参照することで取得できる項目の選択に利用
- Tagやブランチの選択に利用

### ソースコード管理 ： Git

- 読み取り、書き込み対象とするGitリポジトリを設定する

### ビルド・トリガ ： SCMをポーリング

- GitのWebHooks機能によるGitとJenkinsの自動同期を設定する際にオンにする

### ビルド ： シェルスクリプト

- ジョブのメインタスクのほぼすべてをここに記載、あるいはここから呼び出す

### ビルド後の処理 ： E-mail通知

- ビルド完了を記録、共有しておきたいメールアドレスがある場合に設定する

## ジョブに追加する主なコマンド

---

上記の「ビルド ： シェルスクリプト」項目に設定するタスクは、おもに以下のようなコマンドで構成される

- `rsync` ： ファイル転送
- `rm` ： 削除
- `echo` ： 文字列表示
- `mkdir` ： ディレクトリ作成
- `#!/bin/bash`
- gitコマンド

### rsync

---

テストサーバーや本番サーバーへのファイルアップロードにはおもに`rsync`を利用する

- UNIXソフトウェアの1つ
- 「remote sync」の意味
- パスの「/」の有無が挙動に影響するので**注意**が必要
- 「/hoge」はディレクトリ自身を含み、「/hoge/」はディレクトリの中身だけに作用する

#### よく使うrsyncコマンドオプション

|option|内容|
|:--|:--|
|`-r`|指定したディレクトリの下層のディレクトリにも再帰的に実行する|
|`-l`|ローカルのシステムと同様にリモートのシステムでシンボリック・リンクを再作成する|
|`-c`|コピー先に同じチェックサムとサイズを持つ同名のファイルをスキップする|
|`-v`|転送中の情報を詳しく表示する|
|`-n`|実際には実行しないで実行した場合の情報だけを表示する|
|`--delete`|コピー先に存在してコピー元に存在しないファイルを削除する|
|`--ignore-existing`|コピー先に存在するファイルは更新しない|

#### rsyncのサンプルコード

    REMOTE_PATH=/hoge/
    LOCAL_PATH=${WORKSPACE}/_src/
    
    rsync -rlcv --delete $LOCAL_PATH $REMOTE_PATH

### rm

---

指定したディレクトリ以下の全ディレクトリツリーを削除する

- UNIXコマンドの1つ
- 「remove」の意味

#### よく使うrmコマンドオプション

|option|内容|
|:--|:--|
|`-r`|指定したディレクトリの下層のディレクトリにも再帰的に実行する|
|`-f`|警告メッセージを表示せずに実行する|

#### rmのサンプルコード

    BACKUP_PATH=${WORKSPACE}/_backup/
    
    if test -d $BACKUP_PATH ; then
        rm -rf $BACKUP_PATH
    fi

### mkdir

---

新しいディレクトリを作成する

- UNIXコマンドの1つ
- 「make directory」の意味

#### よく使うmkdirコマンドオプション

|option|内容|
|:--|:--|
|`-p`|親ディレクトリも同時に作成する|

#### mkdirのサンプルコード

    BACKUP_PATH=/hoge/
    
    mkdir $BACKUP_PATH

### echo

---

文字列や変数の内容を表示する

- UNIXコマンドの1つ

#### よく使うechoコマンドオプション

|option|内容|
|:--|:--|
|`-e`|エスケープ文字を有効にして表示する|

#### echoのサンプルコード

    echo -e "\n\n*** deploy ***"

### #!/bin/bash

---

- UNIXシェルスクリプトの先頭に書くUNIX命令
- この命令のことをシバン、シェバン（shebang）と呼ぶ
- インタプリタを起動する命令
- シェバン以下に書くコマンドの種類を指定している
- `#!/bin/bash`、`#!/bin/sh`、`#!/bin/csh -f`、`#!/usr/bin/perl`、`#!/usr/bin/ruby`などがある

### gitコマンド

---

gitコマンドによって任意のリポジトリを操作可能

### gitコマンドのサンプルコード ： Tag作成

    if git branch | grep -q master; then
        DATE=`date +%Y-%m-%d-%H-%M-%S`
        git tag -a $DATE -m "version : $DATE"
        git push --tag
        git tag -d $DATE
    fi

　

## ワークスペース

- Jenkinsジョブはジョブ毎に１つのワークスペースが存在する
- Gitブランチから取得したりタスクランナーによってビルド出力するファイルはワークスペースに展開される
- 各ワークスペースのパスはそのジョブ内において「**${WORKSPACE}/**」と指定する
- インスタンス内の各ワークスペースのパスはジョブ外からは「**/home/jenkins_path/workspace/［ジョブ名］/**」などのように指定する

　

## タスク実行

- ［ビルド］ボタンによる手動実行
- Web hooksによる自動実行

### [ビルド]ボタンによる手動実行

- ジョブ画面において、左メニューの［パラメーター付きビルド］からジョブ実行画面に遷移
- 選択項目など設定の後、［ビルド］ボタンを押下することでジョブを実行する
- 左メニューの「ビルド履歴」より最新の日付のリンクに遷移
- 左メニューの［Console Output］によりジョブの内容を確認する
- 転送されたファイルのリストや、末尾の「SUCCESS」のメッセージなどを確認し、問題なければ転送先の表示確認などの作業に移行する

### Web hooksによる自動実行

- 開発フローの中で、常に同じ手順で実行しているGit操作とJenkinsジョブの組み合わせが存在する場合にWeb hooks機能の導入を検討する
- developブランチへのマージリクエストがAcceptされた時に、developブランチの内容をSTG環境に自動デプロイする、などのように利用する

### GitlabからのWeb hooksの設定方法

- Gitlabリポジトリにおいて、［Settings］→［Web Hooks］に遷移する
- 同期するタイミングを［Trigger］の４項目から選択する
- 「［同期するJenkins URL］/git/notifyCommit?url=［Gitlabリポジトリのhttpパス］」を［URL］に設定する
- Web hooksに入力する［URL］は例えば以下のようになる

```
http://xx.xx.xx.xx:xxxx/jenkins/git/notifyCommit?url=http://glab.yyyy/yyyyyy.git
```

## ジョブ応用編

### ビルドジョブを含む実装例

ジョブの中でGulpやGruntのビルド実行も可能

#### ビルドジョブのサンプルコード

    # 変数
    SYMBOLIC_LINK=/home/node_package/xxxxx/node_modules
    
    # 指定領域のnode_modulesにシンボリックリンクを張る
    if test -d node_modules ; then
        echo "node_module is exist."
    else
        ln -s $SYMBOLIC_LINK
    fi
    
    # ビルド
    grunt