Habré には Jenkins に関する記事がたくさんありますが、Jenkins と Docker エージェントがどのように機能するかの例を説明している記事はほとんどありません。 次のようなすべての一般的なプロジェクト構築ツール
今日、この問題に対する解決策があります。Jenkins 2 は連携に優れています。
なぜこの問題を解決し始めたのでしょうか?
私たちは会社にいるので
- 開発者がクリーンアップするのを忘れた大量のランタイム。
- 同じランタイムの異なるバージョン間で競合が発生します。
- すべての開発者は、異なるコンポーネントのセットを必要とします。
他にも問題はありますが、解決策をお話します。
Docker のジェンキンス
現在、Docker は開発の世界で十分に確立されているため、Docker を使用すればほとんどすべてのものを実行できます。 私の解決策は、Jenkins を Docker に入れて、他の Docker コンテナを実行できるようにすることです。 この質問は 2013 年に記事「
つまり、Docker 自体を動作中のコンテナにインストールし、ファイルをマウントするだけです。 /var/run/docker.sock
.
Jenkins 用に判明した Dockerfile の例を次に示します。
FROM jenkins/jenkins:lts
USER root
RUN apt-get update &&
apt-get -y install apt-transport-https
ca-certificates
curl
gnupg2
git
software-properties-common &&
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey &&
add-apt-repository
"deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")
$(lsb_release -cs)
stable" &&
apt-get update &&
apt-get -y install docker-ce &&
usermod -aG docker jenkins
RUN curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose
RUN apt-get clean autoclean && apt-get autoremove —yes && rm -rf /var/lib/{apt,dpkg,cache,log}/
USER jenkins
このようにして、ホスト マシン上で Docker コマンドを実行できる Docker コンテナを取得しました。
ビルドセットアップ
少し前に、Jenkins は次を使用してルールを記述する機会を得ました。
そこで、ビルドに必要なすべてのライブラリを含む特別な Dockerfile をリポジトリ自体に配置しましょう。 こうすることで、開発者自身が再現可能な環境を準備できるため、OPS に特定のバージョンの Node.JS をホストにインストールするよう依頼する必要がなくなります。
FROM node:12.10.0-alpine
RUN npm install yarn -g
このビルド イメージは、ほとんどの Node.JS アプリケーションに適しています。 たとえば、Sonar スキャナーが組み込まれた JVM プロジェクトのイメージが必要な場合はどうなるでしょうか? 組み立てに必要なコンポーネントを自由に選択できます。
FROM adoptopenjdk/openjdk12:latest
RUN apt update
&& apt install -y
bash unzip wget
RUN mkdir -p /usr/local/sonarscanner
&& cd /usr/local/sonarscanner
&& wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.3.0.1492-linux.zip
&& unzip sonar-scanner-cli-3.3.0.1492-linux.zip
&& mv sonar-scanner-3.3.0.1492-linux/* ./
&& rm sonar-scanner-cli-3.3.0.1492-linux.zip
&& rm -rf sonar-scanner-3.3.0.1492-linux
&& ln -s /usr/local/sonarscanner/bin/sonar-scanner /usr/local/bin/sonar-scanner
ENV PATH $PATH:/usr/local/sonarscanner/bin/
ENV SONAR_RUNNER_HOME /usr/local/sonarscanner/bin/
アセンブリ環境について説明しましたが、Jenkins はアセンブリ環境とどのような関係があるのでしょうか? また、Jenkins エージェントはそのような Docker イメージを操作して内部で構築できます。
stage("Build project") {
agent {
docker {
image "project-build:${DOCKER_IMAGE_BRANCH}"
args "-v ${PWD}:/usr/src/app -w /usr/src/app"
reuseNode true
label "build-image"
}
}
steps {
sh "yarn"
sh "yarn build"
}
}
指令 agent
プロパティを使用します docker
ここで次のように指定できます。
- 命名ポリシーに従ったアセンブリ コンテナーの名前。
- ビルドコンテナを実行するために必要な引数。この場合、現在のディレクトリをコンテナ内のディレクトリとしてマウントします。
そして、すでにビルド ステップで、Docker ビルド エージェント内で実行するコマンドを示しています。 これは何でもよいので、ansible を使用してアプリケーションのデプロイメントも起動します。
以下に、単純な Node.JS アプリケーションで構築できる汎用の Jenkinsfile を示します。
def DOCKER_IMAGE_BRANCH = ""
def GIT_COMMIT_HASH = ""
pipeline {
options {
buildDiscarder(
logRotator(
artifactDaysToKeepStr: "",
artifactNumToKeepStr: "",
daysToKeepStr: "",
numToKeepStr: "10"
)
)
disableConcurrentBuilds()
}
agent any
stages {
stage("Prepare build image") {
steps {
sh "docker build -f Dockerfile.build . -t project-build:${DOCKER_IMAGE_BRANCH}"
}
}
stage("Build project") {
agent {
docker {
image "project-build:${DOCKER_IMAGE_BRANCH}"
args "-v ${PWD}:/usr/src/app -w /usr/src/app"
reuseNode true
label "build-image"
}
}
steps {
sh "yarn"
sh "yarn build"
}
}
post {
always {
step([$class: "WsCleanup"])
cleanWs()
}
}
}
どうしたの?
この方法のおかげで、次の問題が解決されました。
- 環境アセンブリの構成時間はプロジェクトごとに 10 ~ 15 分に短縮されます。
- この方法でローカル コンピューター上でビルドできるため、完全に再現可能なアプリケーション ビルド環境。
- 異なるバージョンのアセンブリ ツール間の競合の問題は発生しません。
- 常に目詰まりのないきれいな作業空間を実現します。
解決策自体はシンプルかつ明白であり、いくつかの利点を得ることができます。 はい、アセンブリの単純なコマンドに比べて、エントリのしきい値は少し高くなりましたが、常にビルドされるという保証があり、開発者自身がビルド プロセスに必要なものすべてを選択できるようになりました。
私が集めた画像も使えます
この記事を書いているときに、プラグインを使用してマスター ノードをロードしないようにリモート サーバーでエージェントを使用することについて議論が起こりました。
出所: habr.com