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: ./jenkinsrestart: always container_name: jenkinsenvironment: VIRTUAL_HOST: hoge.huga.co.jp VIRTUAL_PORT: 8080 LETSENCRYPT_HOST: hoge.huga.co.jp LETSENCRYPT_EMAIL: kitamura@epea.co.jpvolumes:- jenkins_data:/var/jenkins_home- /var/run/docker.sock:/var/run/docker.sock- /etc/localtime:/etc/localtime:ro - /ci:/ci:ronetworks: - default - proxy_defaultdata: 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になっていると思うが、各自で要確認。