さまざまな環境が必要な場合に Jenkins でプロジェクトを収集する方法

さまざまな環境が必要な場合に Jenkins でプロジェクトを収集する方法

Habré には Jenkins に関する記事がたくさんありますが、Jenkins と Docker エージェントがどのように機能するかの例を説明している記事はほとんどありません。 次のようなすべての一般的なプロジェクト構築ツール Drone.io, Bitbucket パイプライン, GitLab, GitHub のアクション など、あらゆるものをコンテナに収集できます。 しかし、ジェンキンスはどうでしょうか?

今日、この問題に対する解決策があります。Jenkins 2 は連携に優れています。 Docker エージェント。 この記事では、私の経験を共有し、自分で行う方法を示したいと思います。

なぜこの問題を解決し始めたのでしょうか?

私たちは会社にいるので シトロニウム 私たちはさまざまなテクノロジを使用しているため、アセンブリ マシン上に Node.JS、Gradle、Ruby、JDK などのさまざまなバージョンを保持する必要があります。 ただし、多くの場合、バージョンの競合は避けられません。 はい、nvm、rvm などのさまざまなバージョン マネージャーがあると言われれば、その通りです。しかし、すべてがそれほどスムーズに行われるわけではなく、これらのソリューションには問題があります。

  • 開発者がクリーンアップするのを忘れた大量のランタイム。
  • 同じランタイムの異なるバージョン間で競合が発生します。
  • すべての開発者は、異なるコンポーネントのセットを必要とします。

他にも問題はありますが、解決策をお話します。

Docker のジェンキンス

現在、Docker は開発の世界で十分に確立されているため、Docker を使用すればほとんどすべてのものを実行できます。 私の解決策は、Jenkins を Docker に入れて、他の Docker コンテナを実行できるようにすることです。 この質問は 2013 年に記事「Docker 内で Docker を実行できるようになりました"

つまり、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 分に短縮されます。
  • この方法でローカル コンピューター上でビルドできるため、完全に再現可能なアプリケーション ビルド環境。
  • 異なるバージョンのアセンブリ ツール間の競合の問題は発生しません。
  • 常に目詰まりのないきれいな作業空間を実現します。

解決策自体はシンプルかつ明白であり、いくつかの利点を得ることができます。 はい、アセンブリの単純なコマンドに比べて、エントリのしきい値は少し高くなりましたが、常にビルドされるという保証があり、開発者自身がビルド プロセスに必要なものすべてを選択できるようになりました。

私が集めた画像も使えます ジェンキンス + ドッカー。 すべてのソースはオープンであり、次の場所にあります。 rmuhamedgaliev/jenkins_docker.

この記事を書いているときに、プラグインを使用してマスター ノードをロードしないようにリモート サーバーでエージェントを使用することについて議論が起こりました。 ドッカープラグイン。 しかし、これについては将来お話します。

出所: habr.com

コメントを追加します