Jenkins」カテゴリーアーカイブ

Jenkinsのプラグインにログを埋めてみる

Jenkinsプラグインのエラーがなかなかわからなかった(こちら)のでとりあえずログだしするために微妙に改造。

対象はssh-agent。

とりいそぎレポジトリからクローン

STSにインポートしたかったけどMavenのライフサイクル周りが色々エラーを出していたのでVSCode(実質ターミナルしか使っていないのでコマンドラインと同じ程度)で作業。

Java/Mavenもなかったりパス通っていなかったのでダウンロード&パス通し(こちらの感じ)

C:\Users\kitam\git\ssh-agent-plugin> mvn install  

おもむろにパッケージ化したくて上記コマンドを打ったがテストでひっかかった。

とりいそぎログ出しが目標なのでテストケースをコメントアウト(クラスは残し殻だけの状態)し再度実行。

targetディレクトリにssh-agent.hpiができている

これをジェンキンス管理画面のプラグイン->高度な設定->ファイルを指定->デプロイ

でインストールできることを確認

とりあえず動くこと確認したので次はログの埋め込み。

            launcher.launch().stdout(listener.getLogger()).cmds("id").quiet(true).start().joinWithTimeout(1, TimeUnit.MINUTES, listener);
            launcher.launch().stdout(listener.getLogger()).cmds("env").quiet(true).start().joinWithTimeout(1, TimeUnit.MINUTES, listener);
            int status = launcher.launch().stdout(listener.getLogger()).cmds("ssh-agent", "-k").quiet(true).start().joinWithTimeout(1, TimeUnit.MINUTES, listener);
            listener.getLogger().println("status: " + status);

hudson.Launcherやhudson.model.TaskListenerにログ出し機能、パイプ機能的なものがあるので適宜埋め込んでもう一回ビルド~デプロイ。

(デフォルト設定だと?)管理画面のコンソールに出力される。

jenkins pipeline内のpostgresにてDBダンプ取得

環境

CentOS Linux release 7.5.1804 (Core) DockerのHostマシン
Jenkins 2.138.1
Docker Commons Plugin
Docker Pipeline
postgres 11(公式のdocker-image latest)

やりたかったこと

他のDBサーバからデータを持って来てダンプファイルを作りたかった。

動いたJenkinsfile設定

.pgpassを任意のパス(ここではhostの/ci/app/hoge)に置き、そのパスをvオプションでマウント、さらにマウントしたファイル(ここでは/root/.pgpass)をeオプションで指定。

    
pipeline {
  agent none
  stages{
    stage('DBコピーフェーズ') {
      agent {
        docker {
          image 'postgres'
          args '-v /ci/app/hoge:/root -e PGPASSFILE=/root/.pgpass'
        }
      }
  
      steps {
        sh 'pg_dump -h ホスト名 -p 5432 -U ユーザ名 DB名 > /root/test.sql'
        sh 'echo DBコピー'
      }
    }
  }
}

動かなかった設定

.pgpassを任意のパス(ここではhostの/ci/app/hoge)に置き、そのパスをホームディレクトリとして環境変数で指定。

args '-v /ci/app/hoge:/home/ciuser -e HOME=/home/ciuser'

postgresコンテナ内の環境変数にはHOMEが反映されているが.pgpassは読み込まれなかった。
多分
getpwuidで実行ユーザ(uid1000)で環境変数ではなく/etc/passwdからホームを取得しようとする
postgresコンテナにはuid1000のユーザはいないからホームディレクトリが取得できない(echoしてみたら/で表示されてはいた)
/には.pgpassが無いからエラー
という流れと思うが調査は途中でやめた。

awscliを使えるJenkinsの(Docker)agent

Jenkinsのpipelineからawscliを使えるエージェントを呼び出して使おうと思ったら結構てまどったのでそのメモ。

環境

その時の最新

CentOS Linux release 7.5.1804 (Core) DockerのHostマシン
Jenkins 2.138.1
Pipeline 2.5
Pipeline: SCM Step 2.6
Git plugin 3.9.1
docker-machine version 0.11.0, build 5b27455
DOCKER v18.06.1-ce

awscliの入ったイメージ

こちら
dockerfileにあるユーザ名は任意で良いけれども、uid/gidはDockerのユーザが基本的に1000なので1000にあわせておかないとややこしい。

Jenkinsfile

pipeline {
	agent none
    
	stages{
		stage('コピーフェーズ') {
			agent {
				docker {
			  		image 'kyoshitake/awscli'
             		args '-v /path/to/.awsconfの親:/home/ciuser:rw -e HOME=/home/ciuser'
             	}
			}
			
			steps {
				sh 'echo コピーフェーズ'
				sh 'aws s3 ls lwo > /home/ciuser/hoge.txt'
				sh 'echo 試験でls'
			}
		}
    }
}

agentに作ったイメージを指定。

hostにawsの認証ファイルを配置しておき、認証情報ファイルのあるディレクトリ(.aws)の親ディレクトリをマウント(/home/hoge/.awsとあるとすると/home/hogeをマウント)。なお、環境変数等で指定してもOKのはずだが試してはいない。

ハマリポイントとしてjenkinsのagentとして動かす場合は明示的にホームディレクトリを(環境変数で)指定しないと”/”がホームディレクトリになった。
明示的にホームを指定するのでawscliのイメージで指定したユーザの/home/ciuserに拘らず任意の名前でOKのはず。(なのでawscliのユーザ名と一致させる必要もないはず。)

Jenkins

Docker-compose

version: '3'
services:
jenkins:
build: ./jenkins
restart: always
container_name: jenkins
environment:
VIRTUAL_HOST: hoge.huga.co.jp
VIRTUAL_PORT: 8080
LETSENCRYPT_HOST: hoge.huga.co.jp
LETSENCRYPT_EMAIL: kitamura@epea.co.jp
volumes:
- jenkins_data:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
- /etc/localtime:/etc/localtime:ro
- /ci:/ci:ro
networks:
- default
- proxy_default

data:
image: busybox
volumes:
- jenkins_data:/var/jenkins_home

volumes:
jenkins_data:

volumesにある/var/run/docker.sock:/var/run/docker.sockでJenkinsイメージのhostにあるDockerを使用。
/ci:/ci:roはjenkinsが読み込みたいファイル類の置き場(このブログだと関係ないはず)

dockerhubにあるnginx-proxyとletsencrypt-nginx-proxy-companionでssl化していてnetworksにあるproxy_defaultはそちらのネットワーク。

取消線入れてあるところは、多分無くても動くはずの今回のブログでは必須では無い物。(だが、自分の環境ではそれでやっていて最低限の設定は確認していないのでのせておく。)

Dockerfile

FROM jenkins/jenkins:lts
USER root
RUN apt-get update && apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg2 \
software-properties-common
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN apt-key fingerprint 0EBFCD88
RUN add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/debian \
$(lsb_release -cs) \
stable"
RUN apt-get update && apt-get install -y docker-ce

ARG DOCKER_GID=991
RUN groupmod -g ${DOCKER_GID} docker && adduser jenkins docker

RUN mkdir -p /ci

USER jenkins

公式のJenkinsイメージにdockerをインストールしたもの。

gidはhostのJenkinsユーザに合わせたもの。多分docker-machineでいれたら991になっていると思うが、各自で要確認。