docker jenkins ci/cd

4606 ワード

Jenkinsは古いci/cdサービスですが、今まで時代遅れではなく、ほとんどの会社の第一選択であり、機能が強いことがわかります.
最近dockerでJenkinsサービスを構築し、コードの提出後に自動的にテストと配置をトリガし、手動で発表する必要がなくなり、多くの時間を節約しました.

dockerミラーの作成

FROM jenkins/jenkins:2.191
COPY executors.groovy /usr/share/jenkins/ref/init.groovy.d/executors.groovy
USER root
RUN apt-get update
RUN apt-get install -y build-essential

ここでは、ほとんどのプロジェクトがmakeで構築されているため、ベースミラーにmakeツールをインストールしました.

jenkinsをdocker swarmに配備


jenkinsサービス自体もdockerクラスタに導入しました.composeファイルの内容は次のとおりです.
version: "3.5"
services:
  jenkins:
    image: hatlonely/jenkins:${version}
    hostname: jenkins
    user: root
    ports:
      - "8080:8080"
      - "50000:50000"
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
    volumes:
      - "/var/docker/jenkins/data:/var/jenkins_home"
      - "/var/docker:/var/docker"
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "/bin/docker:/usr/bin/docker"
    networks:
      - jenkinsnet

networks:
  jenkinsnet:
    name: jenkinsnet

ここでは主に2つの問題を解決します.
  • jenkins自体がコンテナとしてdockerクラスタ環境で動作し、外部docker環境
  • にアクセスする方法
    volumes:
        - "/var/run/docker.sock:/var/run/docker.sock"
        - "/bin/docker:/usr/bin/docker"
    

    dockerはc/sアーキテクチャで、ローカルバックグラウンドでコンテナの管理とメンテナンスのためにサービスを開始します.クライアントはソケットとサービス通信を通じてソケットをコンテナ内部にマッピングし、コンテナもホストのdockerにアクセスできるようにします.また、dockerコマンド自体をコンテナ内部にマッピングすると、コンテナ内部にdockerをインストールする必要はありません.
  • 導入サービスのデータマウント、ホスト
  • のマウント方法
    volumes:
        - "/var/docker/jenkins/data:/var/jenkins_home"
        - "/var/docker:/var/docker"
    

    ここでは、すべてのdockerコンテナの状態をホストの/var/docker/{service}の下にマッピングし、Jenkinsの状態を/var/jenkins_に保存する実践的な約束があります.ホームでは、ここでは/var/docker/jenkins/dataに直接マッピングします.また、他のサービスはコンテナ内のJenkinsを介して配置する必要があります.volumeにマウントされたデータはJenkinsコンテナの内部にしかマッピングできません.これらのデータは/var/dockerにしかマッピングできません.そのため、このディレクトリをマウントするだけで、他のサービスの状態はホストに永続化できます.
    完全なコードリファレンス:https://github.com/hpifu/docker-jenkins
    make buildを実行してミラーの作成を完了(Dockerfileのポートマッピングを注釈しました.私の環境ではすべてのサービスがnginxを逆エージェントとして統一されているからです)make deployを実行すればJenkinsの導入を完了できます.

    Jenkinsサービス自体を導入するパイプラインプロジェクト


    導入が完了したら、http://127.0.0.1:8080、ヒントに従って簡単に初期化が完了し、/var/jenkins_ホームには多くのデータが生成されます.これらのデータはJenkinsの状態です.前にこのディレクトリをホストの/var/docker/jenkins/dataにマッピングしました.これでJenkinsデータを再起動しても失われません.
    初期化が完了してからやっとタスクを作成できます.それに比べて、このプロセスは最も簡単かもしれません.
    【新規タスク】→【パイプライン】(名前はdocker-jenkins)→【OK】
    General
    ✔️ githubプロジェクト:[email protected]:hpifu/docker-jenkins.git ✔️ 同時構築トリガは許可されていません
    ✔️ GitHub hook trigger for GITScm polling流水ライン
    ✔️ Pipeline script
    pipeline {
        agent any
        stages {
            stage('image') {
                steps {
                    sh 'make build'
                }
            }
            stage('deploy') {
                steps {
                    sh 'make deploy'
                }
            }
        }
    }
    

    ポイントを保存した後、ポイントを構築します.

    github webhook


    github push後に自動トリガを実現するにはgithubでwebhook(owner権限が必要)を設定する必要があります.またJenkinsには外部ネットワークに表示されるアドレスが必要です.
  • 本プロジェクトのホームページにアクセスします.https://github.com/hpifu/docker-jenkins
  • [Settings]→[Webhooks]→[Add webhook]
  • をクリック
    Payload URL: /github-webhook/>
    Content type:
    

    構成が完了したら、送信してみてください.webhooksページには構成したばかりのhookが表示され、一番下にドラッグすると最近のhookトリガレコードが表示されます.
    Jenkinsの最初の構築には手動でトリガする必要があります.その後の構築は自動的にトリガされます.たまにトリガされません.githubとあなたのサービス間のネットワークの問題かもしれません.github webhookページに行ってhookトリガ記録をチェックすることができます.

    ベストプラクティス


    プロジェクトに対していくつかの簡単な規範を作って、大いに全体の配置の流れを簡略化することができて、前にプロジェクトを作成する時私達はPipeline scriptを使って、もう一つのオプションPipeline script from SCMが直接1つのgitアドレスからこのスクリプトを取得することを支持することを見ることができて、一般的にJenkinsfileと呼ばれて、これも私の推薦する1つの方式で、Jenkinsfileはコードと一緒に維持して、このような異なるプロジェクト、異なるJenkins環境では、作成されたJenkinsタスクは同じであり、作成されたタスクの複雑さを大幅に簡素化します.
    一方、プロジェクトの構築、コンパイル、実行、パッケージング、導入、テストなどはすべてMakefileによって実現され、実行されたすべての動作がmakeコマンドになり、Jenkinsfileの論理は非常に簡単になり、汎用的になります.以下の例を示します.
    goプロジェクト:https://github.com/hpifu/go-tech/blob/master/Jenkinsfilevueプロジェクト:https://github.com/hpifu/vue-tech/blob/master/Jenkinsfileこれらの例では、複雑な構築プロセスはすべてMakefileによって遮断され、Makefile、異なるタイプ、異なる言語のプロジェクトの構築プロセスもJenkinsによって遮断され、統一されていることがわかります.
    リンク参照コード:https://github.com/hpifu/docker-jenkins docker hub: https://hub.docker.com/_/jenkins転載は出典を明記してください.https://tech.hatlonely.com/article/57Golang課程の熱い学生募集の資料はWeChat:17812796384を探します