Lambdaカクテル

Common LISPが好きなWeb屋さんです 自宅サーバやフロントエンドもできます

Docker環境のJenkinsの中でDockerコンテナを立ててRoswell(on Alpine Linux)を動かす

ひとまずテストを走らせることができたのでメモ.

TL;DR

  • RoswellCommon Lispの処理系などの便利なラッパー.
  • root権限でJenkinsコンテナを動かすこと
    • Alpineはユーザまわりが弱い
  • JenkinsfileからDockerクライアントを起動させる
  • DockerはRoswellが動くコンテナを(ホストDockerで)ビルドする
  • Roswellがテストを走らせる

Jenkins側

  • Docker環境を構築しておく

Dockerを使ってJenkinsを走らせる.だいたい下記と同じだが,コンテナの中でdockerクライアントを動かすようになっている. Jenkinsセットアップ後にDocker pipeline pluginをインストールしておくこと.プロジェクト側の設定が済んだら,pipelineジョブを作成してJenkinsfileを読み込ませる.

windymelt.hatenablog.com

Dockerfile

コンテナ内のユーザがrootのままになっているが,理由は後ほど述べる.

FROM jenkins/jenkins:lts
USER root
RUN apt-get update && apt-get install -y make
RUN apt-get remove docker
RUN apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
RUN curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | apt-key add -
RUN add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
   $(lsb_release -cs) \
   stable"
RUN apt-get update && apt-get install -y docker-ce

docker-compose.yml

ホストのdockerソケットを共有していることに注意.これにアクセスするためにパーミッションの関係でJenkinsコンテナ内部ではrootで動作させる.

version: '3'
services:
  jenkins:
    build: .
    volumes:
       - /jenkins_home:/var/jenkins_home
       - /var/run/docker.sock:/var/run/docker.sock
    ports:
       - 8080:8080
       - 50000:50000

あとはdocker-compose up -dすればよしなにやってくれるはず.

プロジェクト側

JenkinsfileDockerfile.buildMakefileが必須.

Jenkinsfile

pipeline {
    agent {
        dockerfile {
            filename 'Dockerfile.build'
        }
    }
    stages() {
        stage('build') {
            steps() {
              sh 'make build'
            }
        }
    }
}

Dockerfile.build

Roswell環境を作成するためのDockerfile.事情で名前がへんなことになっている

FROM eshamster/cl-base:2.1

RUN ros setup
RUN ros install ccl-bin/1.11
RUN ros use ccl-bin/1.11
COPY ccl-init.lisp ~/.ccl-init.lisp
COPY sbclrc ~/.sbclrc
RUN ros install qlot

WORKDIR /build
COPY . /build

ENTRYPOINT ["make"]
CMD ["help"]

Makefile

代替ツールがありそうだが,ひとまずmake

setup:
    $(HOME)/.roswell/bin/qlot install
    ros install clack
test: setup
    $(HOME)/.roswell/bin/qlot exec ros -S . -Q -e '(ql:quickload :HOGEHOGE-test)' -q
build: test

ccl-init.lisp

ただの言語設定.不要かも.

(setf ccl:*default-external-format*
      (ccl:make-external-format :character-encoding :utf-8
                                :line-termination :unix)
      ccl:*default-file-character-encoding* :utf-8
      ccl:*default-socket-character-encoding* :utf-8)

sbclrc

ただの言語設定.不要かも.

(setf sb-impl::*default-external-format* :utf-8)
(setf sb-alien::*default-c-string-external-format* :utf-8)