もりはやメモφ(・ω・ )

インフラなエンジニアからSREへ

Jenkinsfileでタイムスケジュール実行

Jenkinsfileでcron定期実行指定

v2になってから久しい*1Jenkinsですが、Jenkinsfileによるジョブのコード化がとても良いです。

小ネタでJenkinsfileでのcron実行の方法を調べたのでメモです。

Documentのcron-syntaxに書いてある通りなのですが、以下のようにcronでかけます。

Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any
    triggers {
        cron('H */4 * * 1-5')   <-ここ
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

ここで面白いのが H の部分。 これは標準のcronには無いパラメタで、乱数的な意味になります。具体的にはサンプルの例だと、分に H が指定あるため 00-59 のどこか、となります。

しかし注意点として、ドキュメントにも以下のように記載があり、乱数(random)では無いとのことです。ジョブ名からハッシュで数値が決定され、毎回変動するわけではありません。

The H symbol can be thought of as a random value over a range, but it actually is a hash of the job name, not a random function, so that the value remains stable for any given project.

おまけ

簡単だと思って追加したところ、以下のエラーが発生しました。 これは読んで字のごとくなのですが、trigger句が複数回出ているぞ!というエラーです。

WorkflowScript: 23: Multiple occurrences of the triggers section @ line 23, column 5.

というのもサンプルを見てagent anyの下に以下を追加したのですが

   ...略...
    agent any
    triggers {
       cron('H 22 * * *')
    }
   ...略...

実はJenkinsfileの下の方にGitLab連携用にtriggersが記載されており、重複していたというお粗末な理由でした。これはサンプルをそのまま使うとありそうな内容なので、自戒として記載しておきます。

    triggers {
        cron('H 22 * * *')   <-ここに追加するのが正しかった
        gitlab(
            triggerOnPush: true,
            triggerOnMergeRequest: true,
            branchFilterType: 'All',
            addNoteOnMergeRequest: true,
            addCiMessage: true
        )
    }

参考までにエラー全文を記載すると以下(マスクしてます)。 Multiple occurrences of ther xxxxx section が出たら今後は一発でわかりますね。

Branch indexing
 > git rev-parse --is-inside-work-tree # timeout=10
Setting origin to https://mygitlab/oreno/project.git
 > git config remote.origin.url https://mygitlab/oreno/project.git # timeout=10
Fetching origin...
Fetching upstream changes from origin
 > git --version # timeout=10
 > git config --get remote.origin.url # timeout=10
using GIT_ASKPASS to set credentials Git username/password for https://mygitlab/oreno/project.git
 > git fetch --tags --progress origin +refs/heads/*:refs/remotes/origin/* # timeout=10
Seen branch in repository origin/master
Seen 1 remote branch
Obtained Jenkinsfile from e294460e7fba067df5a48f5faaf2e45780ba6187
Running in Durability level: MAX_SURVIVABILITY
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 23: Multiple occurrences of the triggers section @ line 23, column 5.
       triggers {
       ^

1 error

    at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
    at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1085)
    at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:603)
    at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581)
    at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558)
    at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
    at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
    at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
    at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
    at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:131)
    at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:125)
    at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:560)
    at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:521)
    at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:320)
    at hudson.model.ResourceController.execute(ResourceController.java:97)
    at hudson.model.Executor.run(Executor.java:429)
Finished: FAILURE

*1:2016/04/20らしい

ブースから見た光景@デブサミ2019

f:id:morihaya:20190218022706j:plain:w30
morihaya

デブサミ2019に「健康スポンサー」として弊社(オイラ大地)もブースを出す幸運に恵まれ、加えて中の人をやってきましたのでその感想を綴ります。

event.shoeisha.jp

  • デブサミとは
  • 豪華なスポンサー陣
    • We are "健康スポンサー" !!
  • ブースから見える風景
    • 意外と人はひっきりなし
    • 当たり前だけど十人十色
    • もうちょっと良くするには
  • 余談
  • 総括すると最高だった
続きを読む

pyenvのpython環境で'_lzma'が存在しなかった時の対応メモ

pyenvのpython環境で'_lzma'が存在しなかった時の対応メモです。分析チームメンバの一人から「 _lzma が無いよ助けてー」と言われて対応しました。

  • 対象環境
  • 対応方法
  • 解決に到るまでの経緯メモ
    • CIrcleCIのフォーラムに目を通したけど
    • 流石の もみじあめ さんのサイトで解決への道が
      • 実際にWikiのコマンドを打つが改善されない
      • 改めてWikiのドキュメントを読む
      • 勘でxz-develも入れてみる
      • pyenvで再インストールしてlzmaのimportに成功!
  • 余談、stanfordnlp をimportするためPythonを3.5.6 -> 3.6.8 へアップ
続きを読む

AWS S3でバケット自体も中身も削除禁止のバケットを作る

「Glueを使ってRDSからS3にコールドデータを出力し、Athenaでクエリ実行できるようにする」みたいな検証を行なっていて、間違ってもS3のデータを削除されては困るという要件が出てきて調べたのでメモ。

  • S3のPolicyでできる
  • ポイント
  • その他
  • Glueのロールだけには許可をする必要があった
続きを読む

Backlog World 2019に参加してLTもしてきた

本日Backlog World 2019に参加して非常にエモみを充電してきたのでテンションとアルコールが抜け切らないうちに感想を書きなぐります。

backlogworld2019.jbug.info

  • はじめに
  • 会場について
  • セッションについて
    • 基調講演 「田舎の木材工場で起きた奇跡」と、その後
    • Good Project Award 2019ピッチコンテスト
      • 株式会社あしたのチーム
      • ウォンテッドリー株式会社
      • Classi株式会社
      • シタテル株式会社
      • パワーママプロジェクト
    • 男女不問?!女性脳を活かしたプロジェクトマネジメント
    • スーパーマリオで学ぶプロジェクトマネジメント
    • LT
  • まとめ

はじめに

Backlog Worldはその名の通り、タスク管理SaaSのBacklogの年1回の大イベントで、去年第一回であるBacklog World 2018が2018-02-18に開催されました。 参加者も100人は余裕で超える大きな規模で、前回の会場は吹き抜けのフロアを螺旋階段がつなぐという代官山の結婚式ができるようなシャレオツ会場でした。

その時期のことはよく覚えていて、私は転職が確定し会社にも退職を告げ、引き継ぎのためにRedmine*1にタスクを作りまくって引き継ぎドキュメントを書きまくるという一人プロジェクトをガンガン回していました。そしてその時のGood Project Awardに選ばれたdiffeasy西さんの「田舎の木材工場」の話を聞いてモチベーションが爆上がりしたのでした。

そして今回2019にも開催されると発表があり、しかも基調講演として「田舎の木材工場のその後」というテーマでdiffeasy西さんが話されるということで、すぐさま前売りチケットを購入したのです。

その後年末の頃、イベント運営の方から"LT募集!!"というメールを頂きまして勢いで応募し、今回LTする運びとなりました(緊張したけどやってよかった)

それでは本日聞いてきた各セッションについて感想をつらつらと。

*1:当時はSaaSを気軽に使えない会社にいたのでBacklogを使えなかった。ので憧れてBacklogWorldに参加した。Redmineもpluginでのカスタマイズ性好きだけど運用...

続きを読む

Neo4j ユーザー勉強会 #19 に参加して挨拶がてらLTもしてきました

Neo4j ユーザー勉強会 #19に参加してきたので感想メモです。

  • はじめに
  • イベント
    • yFiles Programming Libraries Overview (Short Video)
    • Graph Based AI/ML
    • グラフデータの視覚化について
    • ライトニングトーク(Lightning Talks)
    • 懇親を通してのメモ

はじめに

Neo4j、私は"グラフ・データベース完全入門!"というイベントでちょっと触っただけなのですが、それ以来魅力を感じていて情報収集はしたいなと思っている勢でして、その流れで先日Neo4jUGの勉強会に参加してきました、というお話です。

イベント

当日は以下の流れで進みました。

  1. yFiles Programming Libraries Overview (Short Video)
  2. Graph Based AI/ML
  3. グラフデータの視覚化について
  4. ライトニングトーク(Lightning Talks) <-やってきた><
続きを読む

Ansibleのエラー結果を見やすくする"ANSIBLE_STDOUT_CALLBACK=yaml"が良いです

Ansibleのエラー結果、デフォルトだと以下のように1行で表示されて大変読みづらいです。

結論を先に言ってしまうと以下コマンドを実行してからansibleしましょう、という話です。

export ANSIBLE_STDOUT_CALLBACK=yaml

読みづらいエラーの具体例としては以下のような感じ。 改行コードが \n と出ているのがわかります。

TASK [Install chromedriver] *******************************************************************************************************************
******
fatal: [aws-test-analytics]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no at
tribute 'content'\n\nThe error appears to have been in '/home/morihaya/go/src/myrepo/Infrastructure/infra-ansible
/testplay.yml': line 15, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be
:\n\n\n  - name: Install chromedriver\n    ^ here\n"}
        to retry, use: --limit @/home/morihaya/go/src/myrepo/Infrastructure/infra-ansible/testplay.retry
続きを読む