インフラ屋にJenkinsってどうなん?〜言うてるオレもわからんわ〜 

3月 5日 @ 10:00 PM - 11:23 PM

議事録ページ

まえおき

  • ゆうてる俺もわからんわシリーズ第一回
  • ジェンキンス詳しくない
  • 使い勝手は自分で判断してね

なぜやるのか

  • インフラ屋にジェンキンスを紹介したら「はよ教えろ」と怒られたので。

ジェンキンスとは

  • Jenkins (ジェンキンス) とは、Javaで書かれたオープンソースの継続的インテグレーションツールである。
  • ソフトウェアのビルド、検証、サーバへのインストール等の一連作業を自動化する事が出来る。  → Wikipediaから抜粋

kazuhito的特徴

  • 様々なシチュエーションに応じた「トリガー」
  • いくつかの「ジョブ種」でつくる「ジョブ」
  • わかりやすい「見える化」と「履歴蓄積」
  • 豊富なプラグイン
  • お手軽かつ閉鎖空間にもOKな「Jenkinsエージェント(ノード)」
  • 「え、こんなことにも?」で使われてる汎用性
    • 開発者日本人だよ!

本来は…

  • 本来
    • ソースのテスト・ビルドに関する自動化に使う(ことが主目的)
  • 現状
    • 「タイマー実行」「バッチ処理」絡みの、ありとあらゆることに使われている

他人に説明するときの「てきとーな文句」

「Jenkins? ああ、 visual cron みたいなもんっすよーHAHAHA!!!」

  • ころしもんく。

インスコのデモ

CentOS編

  • こんなところにバニラなCentOSが~

    • 先にJavaだけ必要だったわすまんな
  • yumのリポジトリ追加だけでいけまっせ

  • だいたいWgetだけど入ってないからcurlでいくぜ

    • CentOS7からはcurl使う風潮
  • 2.0系からは、JenkinsのUnlockが必須

    • サーバー見ないとわからんコードが必要
  • SuggestPlugin一択や!

    • いろんなところで使うプラグインがあるよ
  • インスコ終わったら最初のユーザー作成

  • ほんならJenkins使えまっせ!

    • 日本語でようこそキター!

Ubuntuサーバー編

  • こんなところに綺麗なUbuntu17.04が~
  • 他はだいたい一緒らしいので。

Docker編

  • jenkinsのコンテナを取ってくる
  • docker logs jenkins-container すると過去のログが見えるので、Passwordはそこから取ってくる
  • jenkinsをコンテナで動かすとそのJenkinsからDockerコンテナが使えないので、横に並べるイメージでコンテナを立てる
    • Hostのdocker.sockをマウントする

ジョブの種類

フリースタイル

  • 最もシンプルかつ原始的なジョブ
  • とはいえ、ビルド・トリガーは豊富
  • cron形式でのスケジュールも可能
  • シェルスクリプトが書ける
  • コンソール出力画面がリアルタイムで見れる!
    • ビルドの実行でスタート
    • 書き換えることができるパラメーターをつけたパラメーター付きビルド
    • パラメーター付きビルドなら実行前にパラメータ入力画面が入る

フォルダ

  • ジョブの入れ物(ディレクトリ)

パイプライン

  • ジョブの流れをパイプラインスクリプトでプログラムチックに書ける
    • Groovy言語(Java)というDSL
    • ifやloopもできる
  • ステージ単位で進捗やログが見れる
  • スラスラかけないウチでもPipeline Syntaxから種類を選んでコピペできる
  • パイプラインスクリプト自体がSCM(Gitなど)に対応している
    • リポジトリ直下のJenkinsfileというファイル名
    • メンテ性・可搬性高い
  • Dockerの中でジョブを実行したりもできる
    • Docker imageのpullからやったり・・・

その他のジョブ種

  • MultiBranch
    • Master以外の更新でもjob実行
  • GitHub Organization
    • 配下の複数リポジトリに対してjob実行

JenkinsAgent

  • 他のマシンをワーカーにできる
  • ノードを登録してやるだけ
  • pipelineならnodeの名前をAgentの名前にしてあげる

インフラエンジニアにとっての重要度

  • Jenkins を「他者が使う」ための「ただインストール・運用する」という知見
  • Jenkins を「インフラ(自分たち用)の自動化・メンテナンス用」として使う
    • AWSで「最新のOSイメージ」出るたびに、自動でプロビジョニングしてAMIビルドする
    • 本来の使い方として「インフラで使うツールのソースをCI(継続的インテグレーション)してテスト回す
    • インフラのツール等の「CD(継続的デリバリ/デプロイ)」

取扱い注意

  • 餅は餅屋
  • 色々できるけど、全てJenkinsでやろうとするのはよろしくない
    • 業務用ジョブスケジューラ
    • 運用自動化
    • 監視系

ベネフィット(ご利益)

  • インフラの仕事の「可視性/見える化」「いろんな人を巻き込める」
    • コンソール/Cronではなく「Web画面で」というところ
      • 出力を見やすくする・残す
    • 複数のロールの方が「レビュー」できるDSL(PipelineScript)
    • 「不定期だが人間の判断で定型文を打つ必要」の1クリック化
  • 本気でDevOpsするなら「Container/クラウドのAsCodeされたサーバ構成のCI」
    • DockerfileやAnsibleのymlとかのビルドやServerSpecテストをCIしてみたり

困りごと

  • 容量わりかし要る問題
    • バックアップどうしょう?履歴どこまで残そう?
  • Jenkins自体のSPOF化と冗長化コスト
  • 「いろんなUpdate」で「事故死」問題

InfrastructureAsCodeとCI

  • 「クラウドの意義」(の一つ)
    • インフラ(という物理前提の世界)のソフトウェア化
  • 転じて「"環境"は"コードからビルドするもの"」という概念になる
    • コードは「ビルド」し「テストし続け」る対象に
  • 「リソース」と「コード」を使って「成果物」をビルド
    • ディストリイメージは「リソース」、これを使って「コード」がビルド
  • 構成物の「何かが変化」したら「ビルド」して「テストする必要が在る
    • 例えば「ディストリイメージ」「ソース」のどちらが変化してもビルドテストする必要
  • つまり「環境作成のCI」が当然になる

参考