ひとまずテストを走らせることができたのでメモ.
TL;DR
- RoswellはCommon Lispの処理系などの便利なラッパー.
- root権限でJenkinsコンテナを動かすこと
- Alpineはユーザまわりが弱い
- JenkinsfileからDockerクライアントを起動させる
- DockerはRoswellが動くコンテナを(ホストDockerで)ビルドする
- Roswellがテストを走らせる
Jenkins側
- Docker環境を構築しておく
Dockerを使ってJenkinsを走らせる.だいたい下記と同じだが,コンテナの中でdockerクライアントを動かすようになっている. Jenkinsセットアップ後にDocker pipeline pluginをインストールしておくこと.プロジェクト側の設定が済んだら,pipelineジョブを作成してJenkinsfileを読み込ませる.
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
すればよしなにやってくれるはず.
プロジェクト側
Jenkinsfile
とDockerfile.build
とMakefile
が必須.
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)