Page_c76a3fcf https://linux-notes.org Unix/ Linux блог, на котором можно найти полезную информацию по настройке ОС и ПО. Sat, 23 Nov 2019 16:11:59 +0000 ru-RU hourly 1 https://wordpress.org/?v=6.7.2 Page_c76a3fcf https://linux-notes.org/udalit-vse-jenkins-offline-nodes-slaves-v-unix-linux/ https://linux-notes.org/udalit-vse-jenkins-offline-nodes-slaves-v-unix-linux/#respond Sat, 23 Nov 2019 16:11:56 +0000 https://linux-notes.org/?p=17572 При использовании слейвов в дженкинсе, всегда есть вероятность что какая-то из нод, — отпадет из-за какой-то из причин (Например: проблемы с сетью; закрылся порт). А если это ПРОД сервер и там должны собираться проекты. То за некоторый промежуток времени у вас может собраться большое количество выключенных машин. Полезное чтиво: Установка Jenkins и Jenkins-slave в Unix/Linux […]

The post Удалить все Jenkins offline nodes/slaves в Unix/Linux first appeared on linux-notes.org.]]>

При использовании слейвов в дженкинсе, всегда есть вероятность что какая-то из нод, — отпадет из-за какой-то из причин (Например: проблемы с сетью; закрылся порт). А если это ПРОД сервер и там должны собираться проекты. То за некоторый промежуток времени у вас может собраться большое количество выключенных машин.

Полезное чтиво:

Установка Jenkins и Jenkins-slave в Unix/Linux

Автосборка Java проектов через Jenkins в Unix/Linux

Настройка языка в Jenkins

Разграничение прав доступа в Jenkins

Мониторинг места на сервере через Jenkins

Настройка темы для Jenkins

Изменить/Поменять пароль для пользователя Jenkins

Создание Jenkins backup/restore в Unix/Linux

Автосборка Java проектов через Jenkins в Unix/Linux

Я нашел пару решений как это можно сделать. Покажу на наглядных примера как мне удалось убить больше 1.5к зомби-нод.

Удалить все Jenkins offline nodes

Так, одним из способов удалить все офлайн-хосты — это выполнить груви-скрипт через дженкинс консоль. Для этого, нужно зологиниться в сам дженкинс, затем кликнуть по «Manage Jenkins» и перейти в «script Console»:

В само поле со скриптом, вставить:

Closure query = { it.name ==~ /^.*$/  }
Closure action = {
  println('====================')
  println("Name: ${it.name}")
  println("LabelString: ${it.labelString}")
  println("NumExectutors: ${it.numExecutors}")
  println("RemoteFS: ${it.remoteFS}")
  println("Mode: ${it.mode}")
  println("RootPath: ${it.rootPath}")
  println("Offline: ${it.computer.offline}")
  
  if (it.computer.offline) {
    println("Deleting node: ${it.name}")
    it.computer.doDoDelete()
  }
}

Jenkins.instance.slaves.findAll(query).each(action)
return

Нажимаем на «RUN» и если много хостов, — это занимает некоторое время. Данный пример — полностью использовался на ПРОД серверах компании где работаю.

Удалить все Jenkins offline slaves

Проверил другой подход скрипта на груви. Полностью рабочий вариант. Чтобы удалить все офлайн-слейвы, нужно зологиниться в сам дженкинс, затем кликнуть по «Manage Jenkins» и перейти в «script Console»:

В само поле со скриптом, вставить:

for (aSlave in hudson.model.Hudson.instance.slaves) {
    if (aSlave.getComputer().isOffline()) {
        aSlave.getComputer().setTemporarilyOffline(true,null);
        aSlave.getComputer().doDoDelete();
    }
}

Нажимаем на «RUN» и если много хостов, — это занимает некоторое время. Данный пример — полностью использовался на ПРОД серверах компании где работаю.

Мне данные решения помогли и они полностью рабочие. Еси будут еще идеи чем можно дополнить — обязательно дополню данную тему.

Вот и все, статья «Удалить все Jenkins offline nodes/slaves в Unix/Linux» завершена.

The post Удалить все Jenkins offline nodes/slaves в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/udalit-vse-jenkins-offline-nodes-slaves-v-unix-linux/feed/ 0
Page_c76a3fcf https://linux-notes.org/avtosborka-java-proektov-cherez-jenkins-v-unix-linux/ https://linux-notes.org/avtosborka-java-proektov-cherez-jenkins-v-unix-linux/#respond Sun, 10 Feb 2019 16:50:11 +0000 https://linux-notes.org/?p=16413 Набрался немного опыта по установке и настройке Jenkins-а. Разобрался как писать свои собственные pipelin-ы и пришло время сделать билд и собрать что-то на Java. Для своего примера, я возьму код с Github-а и залью в гитлаб-сервер (локальный).

The post Автосборка Java проектов через Jenkins в Unix/Linux first appeared on linux-notes.org.]]>

Набрался немного опыта по установке и настройке Jenkins-а. Разобрался как писать свои собственные pipelin-ы и пришло время сделать билд и собрать что-то на Java. Для своего примера, я возьму код с Github-а и залью в гитлаб-сервер (локальный).

Полезное чтиво:

Установка Jenkins в Unix/Linux

Работа с Jenkins-CLI в Unix/Linux

Установка Docker в Debian’s

Установка Docker в RedHat’s

Установка Docker-compose в Unix/Linux

Установка Jenkins и Jenkins-slave в Unix/Linux

Установка Jenkins в Unix/Linux

Буду использовать докер для установки дженкинса. ОС которую я использую — Mac OS X. Мой docker-compose.yml файл выглядит следующим образом:

---
version: '3.5'
services:
    gitlab:
        image: gitlab/gitlab-ce:latest
        container_name: gitlab
        hostname: gitlab.local
        labels:
            local.gitlab.description: "Gitlab server"
        ports:
            - "443:443"
            - "80:80"
            - "2222:22"
        dns:
            - 10.17.0.3
            - 1.1.1.1
            - 74.82.42.42
        volumes:
            - "/usr/local/gitlab/config:/etc/gitlab:rw"
            - "/usr/local/gitlab/logs:/var/log/gitlab:rw"
            - "/usr/local/gitlab/data:/var/opt/gitlab:rw"
        extra_hosts:
            jenkins_local_docker: 172.6.6.20
            socat_container: 172.6.6.2
        restart: always
        environment:
            - GITLAB_OMNIBUS_CONFIG="external_url 'http://gitlab.local:80'; gitlab_rails['gitlab_shell_ssh_port']=2222; gitlab_rails['lfs_enabled'] = true;"
        networks:
            network0:
                ipv4_address: 172.6.6.10
        healthcheck:
            test: ["CMD", "curl", "-f", "http://gitlab.local"]
            interval: 5m
            timeout: 30s
            retries: 3
            start_period: 5m
    jenkins:
        image: jenkins/jenkins:latest
        container_name: jenkins
        hostname: jenkins.local
        ports:
            - "8080:8080"
            - "50000:50000"
        dns:
            - 10.17.0.3
            - 1.1.1.1
            - 74.82.42.42
        volumes:
            - "/usr/local/jenkins/data:/var/jenkins_home:rw"
            - "/usr/local/jenkins/backups:/backups:rw"
            - "/var/run/docker.sock:/var/run/docker.sock:rw"
            - "/usr/local/bin/docker:/bin/docker"
        extra_hosts:
            gitlab_local_docker: 172.6.6.10
            socat_container: 172.6.6.2
        restart: always
        privileged: true
        environment:
            - DOCKER_HOST=tcp://socat:2375
            - JAVA_OPTS="-Xmx2048M"
              #- JAVA_OPTS="-Xms512M -Xmn512m -Xmx1024m -Duser.timezone=Europe/Kiev -Dfile.encoding=UTF-8"
              #- JENKINS_OPTS=""
        links:
            - socat
        depends_on:
            - gitlab
        networks:
            network0:
                ipv4_address: 172.6.6.20
        pid: host
    socat:
        image: bpack/socat
        container_name: socat
        hostname: socat_container
        restart: "always"
        privileged: true
        ports:
            - "2375:2375"
        dns:
            - 10.17.0.3
            - 1.1.1.1
            - 74.82.42.42
        command: "TCP4-LISTEN:2375,fork,reuseaddr unix-connect:/var/run/docker.sock"
        volumes:
            - "/var/run/docker.sock:/var/run/docker.sock"
        networks:
            network0:
                ipv4_address: 172.6.6.2
#volumes:
    #docker_socket:
        #driver_opts:
        #   type: none
        #   device:  "/var/run/docker.sock"
        #   o: bind
networks:
  network0:
      ipam:
          driver: default
          config:
              - subnet: 172.6.6.0/24

Запустить стек можно следующим образом:

$ docker-compose -f /Users/captain/Projects/docker/jenkins_gitlab/docker-compose.yml up -d
Creating network "jenkins_gitlab_network0" with the default driver
Creating gitlab ... done
Creating socat  ... done
Creating jenkins ... done

Стек запущен и через несколько минут будет готов к использованию.

Работоспособность стека можно поглядеть:

$ docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS                             PORTS                                                            NAMES
0cde5390a8d1        jenkins/jenkins:latest    "/sbin/tini -- /usr/…"   51 seconds ago      Up 50 seconds                      0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp                 jenkins
a89eaa4bd873        bpack/socat               "socat TCP4-LISTEN:2…"   52 seconds ago      Up 50 seconds                      0.0.0.0:2375->2375/tcp                                           socat
447dcb1faa0a        gitlab/gitlab-ce:latest   "/assets/wrapper"        52 seconds ago      Up 50 seconds (health: starting)   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:2222->22/tcp   gitlab

Как видно с вывода, gitlab все еще стартует. Ему потребуется 1-3 минуты (а поменяет свое состояние через 5 минут, т.к я создал свой хелз_чек) на то, чтобы запустится (healthy) чтобы запустится и работать.

Настройка Gitlab-сервера в Unix/Linux

Под настройкой гитлаб-сервера, я подразумеваю некоторые моменты, — например создания вебхука для дженкинса + добавления открытого ключа для пользователя git. Открываем УРЛ и переходим в админ-панель (http://gitlab.local/admin):

Нажимаем на «New user» (Это сразу под «Users») чтобы создать пользователя git. В этом нет ничего сложного. После того как создали, клацаем на «USERS:» (как на картинке, у меня всего 3 пользователя). Находим «git» пользователя которого создали и нажемаем по нему (Можно не логинится в данного юзера, а просто нажать на «impersonate» чтобы «стать им»). Затем, открываем профиль самого пользователя и переходим в поле «SSH Keys». Собственно в поле вставляем публичный\открытый ключ для подключения к гитлаб-серверу.

PS: я генерировал в 2048 битный ключ (если использовать 4096-битный, будет ошибка):

$ ssh-keygen -t rsa -C "The key for gitlab server" -f gitlab

Т.е вот так не сработает:

$ ssh-keygen -t rsa -b 4096 -C "The key for gitlab server" -f ~/.ssh/gitlab

PS: Конечно странно что нельзя использовать 4096-битный ключ. Возможно кто-то знает причину и поделится знаниями в коментариях.

Я создавал еще «Personal Access Tokens» не помню уже зачем, и нужно ли это вообще. Но оставил чтобы не забыть в случае надобности… Все это были настройки для git-юзера в его юзер-спейсе. Можно закрыть и перейти в админ-спейс, а именно в меню «System Hooks».

В поле URL, я вставил:

http://jenkins_local_docker:8080/generic-webhook-trigger/invoke?token=jenkins_token_to_gitlab

Где:

  • http://jenkins_local_docker:8080 — Ссылка на дженкинс-сервер.
  • generic-webhook-trigger/invoke — Плагин который устанавливали недавно (в дженкинсе).
  • token=jenkins_token_to_gitlab — собственно сам токен, по которому будет происходить веб-хук. Выбрал простое название для токена (конечно не очень безопасное, но сойдет для локальной лабы).

В поле «Secret Token» собственно прописал токен, например у меня это:

jenkins_token_to_gitlab

В поле «Trigger» стоит отметить на что нужно реагировать. Я отметил все (не знаю зачем, но пусть будет), но можно было только «Repository update events», «Push events» и «Enable SSL verification», так же, если используете теги, то включаем «Tag push events», для мерджей стоит включить «Merge request events». Если нажать на «TEST», то можно проверить работоспособность вашего созданного веб-хука. У меня все огонь и я могу использовать его.

И да, нужно для юзера от которого будут идти коммиты в гитлаб-сервер, добавить открытый ключ. Собственно кто работает с гит-ом не один раз, помнит об этом…

В качестве примера сборки, я зашел на гитхаб и нашел «simple-java-maven-app» проект для моей сборки. Код содержит обычный «Hello world» и тесты для него + Pipelinefile + сборочный файл для maven-а (pom.xml). Код скачал на свою машину и выполнил пуш в свой гитлаб-сервер.

И так, теперь все готово к сборке!

Автосборка Java проектов через Jenkins в Unix/Linux

Если делали по моему docker-compose файлу, то я в /etc/hosts добавил (привел к виду):

#
#
#
127.0.0.1	localhost gitlab.local jenkins.local
255.255.255.255	broadcasthost
::1             localhost
#
#
#

Можно конечно и не делать и юзать localhost или 127.0.0.1 для входа на ресурсы, но так нагляднее и удобнее (как по мне).

Тогда гитлаб будет доступен по — http://gitlab.local:80/ , а дженкинс по — http://jenkins.local:8080. Это так, короткое отступление, если кто-то не знает как сделать или запустить. Сейчас тосит установить пару плагинов которые нам понадобяться. Чтобы это сделать, открываем «Manage Jenkins» -> «Manage Plugins» и переходим во «Available» вкладку. Потом можно использовать «Filter:» для поиска нужного плагина. Стоит установить — Gitlab Authentication plugin, GitLab Plugin, Generic Webhook Trigger Plugin. Почитать про них можно в интернете, моя статья заключается не в этом, по этому идем дельше.

Переходим на главную страницу и нажимаем на «New Item» чтобы создать проекты под себя. Я создал структуру которая имеет вид:

Projects->Java

Т.е в проектах будут лежать разные проекты для сборок (Java, Python, Go, PHP и может что-то еще). В папке с Java, создадим «Pipeline», названия могут быть любые, например — «simple-java-maven-app». Стоит перейти во вкладку «Pipeline» и заполнить все необходимые поля, у меня это выглядит вот так:

Pipeline скрипт с SCM
Pipeline скрипт с SCM

Я выбрал «Pipeline script from SCM», затем в поле SCM выбрал «Git». В поля репозиторий — я добавил урл на мой локальный гитлаб репозиторий с кодом, выглядит он вот так — git@gitlab_local_docker:java/simple-java-maven-app.git. В поле «Credentials» я добавил закрытый ключь от Gitlab-а (На гитлабе собственно положил открытый, для пользователя git). Конечно можно заполнять и другие вкладки руками, но я все необходимое вшил в свой пайплайн (Тем самым автоматизировал процесс) и данное действие необходимо только для 1-го запуска.

Гитлаб репозиторий с файлами выглядит следующим образом:

┌(captain@Macbook)─(✓)─(10:46 PM Sat Feb 09)
└─(~/Projects/gitlab/repos/simple-java-maven-app)─(6 files, 16b)─> tree
.
├── CHANGELOG
├── CONTRIBUTING.md
├── README.md
├── jenkins
│   ├── Jenkinsfile
│   ├── Jenkinsfile2
│   └── scripts
│       └── deliver.sh
├── pom.xml
└── src
    ├── main
    │   └── java
    │       └── com
    │           └── mycompany
    │               └── app
    │                   └── App.java
    └── test
        └── java
            └── com
                └── mycompany
                    └── app
                        └── AppTest.java

13 directories, 9 files

В «jenkins» папке лежат два Jenkinsfil-а (Jenkinsfile, Jenkinsfile2). Первый pipeline — это не измененный файл, т.е склонировал с проекта (все что шло в комплекте). А Jenkinsfile2 — это мой груви-код, который выглядит следующим образом:

#!/usr/bin/env groovy

properties([
    parameters([
        choice(name: 'GITLAB_PROTOCOL', choices: ['SSH', 'HTTP', 'HTTPS'],
            description: 'Set protocol for Gitlab usage (SSH, HTTP, HTTPS).'),
        string(name: 'GITLAB_SERVER', defaultValue: 'gitlab_local_docker'.toLowerCase(),
            description: 'Set GITLAB server or URL. I use hostname of my gilab docker container which linked to jenkins'),
        string(name: 'GITLAB_PROJECT', defaultValue: 'java'.toLowerCase(),
            description: 'Set GITLAB project.'),
        string(name: 'BRANCH_NAME', defaultValue: 'master',
               description: 'Service branch. Modify the build job config and change the Pipeline SCM branch to build using branch scripts.'),
        string(name: 'REPO_NAME', defaultValue: 'simple-java-maven-app'.toLowerCase(),
            description: 'Repo name')
    ]),
    //gitLabConnection('gitlab-private-key'),
    pipelineTriggers([
        [
            $class: 'GitLabPushTrigger',
            branchFilterType: 'All',
            triggerOnPush: true,
            triggerOnMergeRequest: false,
            triggerOpenMergeRequestOnPush: "never",
            triggerOnNoteRequest: true,
            noteRegex: "Jenkins please retry a build",
            skipWorkInProgressMergeRequest: true,
            secretToken: "jenkins_token_to_gitlab",
            ciSkip: false,
            setBuildDescription: true,
            addNoteOnMergeRequest: true,
            addCiMessage: true,
            addVoteOnMergeRequest: true,
            acceptMergeRequestOnSuccess: false,
            branchFilterType: "NameBasedFilter",
            includeBranchesSpec: "release/qat",
            excludeBranchesSpec: "",
        ],
        [
         $class: 'GenericTrigger',
         genericVariables: [
                  [key: 'ref', value: '$.ref'],
                  [key: 'before', value: '$.before',
                    expressionType: 'JSONPath', //Optional, defaults to JSONPath
                    regexpFilter: '', //Optional, defaults to empty string
                    defaultValue: '' //Optional, defaults to empty string
                  ]
        ],
        genericRequestVariables: [
                  [key: 'requestWithNumber', regexpFilter: '[^0-9]'],
                  [key: 'requestWithString', regexpFilter: '']
        ],
        genericHeaderVariables: [
                  [key: 'headerWithNumber', regexpFilter: '[^0-9]'],
                  [key: 'headerWithString', regexpFilter: '']
        ],
        causeString: 'Triggered on $ref',
        token: 'jenkins_token_to_gitlab',
        printContributedVariables: true,
        printPostContent: true,
        silentResponse: false,
        regexpFilterText: '$ref',
        regexpFilterExpression: 'refs/heads/' + env.BRANCH_NAME
        ]
    ])
])


pipeline {
    //tools {
    //    maven 'apache-maven-3.0.1'
    //    jdk "default"
    //}
    options {
        buildDiscarder(logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '5', daysToKeepStr: '', numToKeepStr: '5'))
        timeout(time: 60, unit: 'MINUTES')
        ansiColor('xterm')
        retry(1)
        timestamps()
        skipDefaultCheckout(true)
        parallelsAlwaysFailFast()
        disableConcurrentBuilds()
    }
    environment {
        SCM_URL = ""
        CREDS_ID = ""
    }
    agent {
        docker {
            image 'maven:3-alpine'
            args '-u root -v /tmp:/tmp -v $HOME/.m2:/root/.m2'
            reuseNode true
            // executes on an executor with the label 'some-label' or 'docker'
            //label "some-label || docker"
        }
    }
    stages {
        stage("Check_java_version") {
            steps {
                script {
                    try {
                        sh "java -version"
                        currentBuild.result = 'SUCCESS'
                    } catch(Exception err) {
                        currentBuild.result = 'FAILURE'
                        ansiColor('xterm') {
                            echo "\033[1;31mCaught exception: ${err}\033[0m"
                        }
                        throw err
                    }
                    echo "\033[0;31m RESULT: ${currentBuild.result} \033[0m"
                }
            }
        }
        stage("Check_mvn_version") {
            when {
                expression {
                    currentBuild.result != 'FAILURE'
                }
            }
            steps {
                sh "mvn -version"
            }
        }
        stage('Gitlab_get_repo') {
            steps {
                script {
                    if ("${env.GITLAB_PROTOCOL}".toLowerCase() == null) {
                        env.GITLAB_PROTOCOL = 'ssh'
                    }
                    if ("${env.GITLAB_SERVER}".toLowerCase() == null) {
                        env.GITLAB_SERVER = 'gitlab_local_docker'
                    }
                    if ("${env.GITLAB_PROJECT}".toLowerCase() == null) {
                        env.GITLAB_PROJECT = 'java'
                    }
                    if ("${env.REPO_NAME}".toLowerCase() == null) {
                        env.REPO_NAME = 'simple-java-maven-app'
                    }
                    if ("${env.BRANCH_NAME}".toLowerCase() == null) {
                        env.BRANCH_NAME = 'master'
                    }

                    if ("${env.GITLAB_PROTOCOL}".toLowerCase() == 'ssh') {
                        SCM_URL = "git@${env.GITLAB_SERVER}:${env.GITLAB_PROJECT}/${env.REPO_NAME}.git"
                        CREDS_ID = 'gitlab-private-key'
                    }else if ("${env.GITLAB_PROTOCOL}".toLowerCase() == 'http') {
                        SCM_URL = "http://gitlab_local_docker/${env.GITLAB_PROJECT}/${env.REPO_NAME}"
                        CREDS_ID = 'gitlab-login'
                    }else {
                        SCM_URL = "https://${env.GITLAB_SERVER}/${env.GITLAB_PROJECT}/${env.REPO_NAME}"
                        CREDS_ID = 'gitlab-login'
                    }
                }
                checkout([$class: 'GitSCM', branches: [[name: "*/${env.BRANCH_NAME}"]],
                        doGenerateSubmoduleConfigurations: false,
                        extensions: [[$class: 'CloneOption', noTags: false, reference: '', shallow: true]],
                        submoduleCfg: [],
                        userRemoteConfigs: [[credentialsId: CREDS_ID, url: SCM_URL]]])
            }
        }
        stage('Build') {
            steps {
                sh 'mvn -B -DskipTests clean package'
            }
        }
        stage('Test') {
            steps {
                sh 'mvn test'
            }
            post {
                always {
                    junit 'target/surefire-reports/*.xml'
                }
            }
        }
        stage('Deliver') {
            steps {
                sh './jenkins/scripts/deliver.sh'
            }
        }
    }
    post {
        always {
            echo 'This will always run'
        }
        success {
            echo "success"
            // notify users when the Pipeline success
            //mail to: 'team@example.com',
            //    subject: "The Pipeline: ${currentBuild.fullDisplayName} has been finished successfully",
            //    body: "The job ${env.BUILD_URL}"
        }
        failure {
            echo 'failure'
            // notify users when the Pipeline fails
            //mail to: 'team@example.com',
            //    subject: "Failed Pipeline: ${currentBuild.fullDisplayName}",
            //    body: "Something is wrong with ${env.BUILD_URL}",
            //    from: 'xxxx@yyyy.com',
            //    replyTo: 'yyyy@yyyy.com',
        }
        unstable {
            echo 'This will run only if the run was marked as unstable'
        }
        changed {
            echo 'This will run only if the state of the Pipeline has changed'
            echo 'For example, if the Pipeline was previously failing but is now successful'
        }
    }
}

Т.е в данном файле предусмотрена вся логика для создания/сборки проекта. Я предусмотрел сборку проектов, по двум критериям:

  • Автосборка проекта по пушу кода в гитлаб репозиторий (Используется master бранч).
  • Если нужно собрать проект с другими параметрами, можно выполнить сборку «Build with Parameters».

И так, если кто-то запушит свой код в master-branch, то выполнится автосборка проекта по заданному пайплайну. Как по мне, — это очень логично выполнять все автоматом именно с мастер-ветки. Для остальных сборок (кастомных), можно собрать с некоторыми параметрами, выглядит это вот так:

Кастомный билд с заданными параметрами
Кастомный билд с заданными параметрами

Вот собственно и все, статья «Автосборка Java проектов через Jenkins в Unix/Linux» завершена.

The post Автосборка Java проектов через Jenkins в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/avtosborka-java-proektov-cherez-jenkins-v-unix-linux/feed/ 0
Page_c76a3fcf https://linux-notes.org/ustanovka-jenkins-i-jenkins-slave-v-unix-linux/ https://linux-notes.org/ustanovka-jenkins-i-jenkins-slave-v-unix-linux/#respond Mon, 04 Feb 2019 13:45:03 +0000 https://linux-notes.org/?p=16432 Я ранее рассказывал как можно установить Jenkins на сервер. Сейчас, я хотел бы поделится своей заметкой по установке Jenkins-а и Jenkins-slave. Я для своего примера, буду использовать Docker + docker-compose чтобы поднять все необходимое. Конечно, это не самый хороший способ сделать отказоустойчевый сервер. Но тем не менее — у меня на маке все работает. Тем […]

The post Установка Jenkins и Jenkins-slave в Unix/Linux first appeared on linux-notes.org.]]>

Я ранее рассказывал как можно установить Jenkins на сервер. Сейчас, я хотел бы поделится своей заметкой по установке Jenkins-а и Jenkins-slave. Я для своего примера, буду использовать Docker + docker-compose чтобы поднять все необходимое. Конечно, это не самый хороший способ сделать отказоустойчевый сервер. Но тем не менее — у меня на маке все работает. Тем более, я настроил данное чудо не для ПРОД-а, а для локальной лабы. Чтобы более поробно изучить дженкинс. Хотелось бы сказать, ребят, если вы будете выбирать между CI/CD — не берите дженкинс (ИМХО). Есть ума других крутых тулов. Я хочу многие из них попробовать и конечно же — написать статейку в виде заметки.

Полезное чтиво:

Установка Jenkins в Unix/Linux

Работа с Jenkins-CLI в Unix/Linux

Установка Docker в Debian’s

Установка Docker в RedHat’s

Установка Docker-compose в Unix/Linux

Установка Jenkins в Unix/Linux

Как я говорил ранее, я буду использовать докер для установки дженкинса. ОС которую я использую — Mac OS X. Многие скажует, да какая разница, ты же запускаешь в докере. Но на самом деле — докер немного по разному работает на разных Unix/Linux ОС. Немного пришлось поплясать с бубном, чтобы зависти все это чудо на маке.

Мой docker-compose.yml файл выглядит следующим образом:

---
version: '3.5'
services:
    gitlab:
        image: gitlab/gitlab-ce:latest
        container_name: gitlab
        hostname: gitlab.local
        labels:
            com.example.description: "Accounting webapp"
        ports:
            - "443:443"
            - "80:80"
            - "2222:22"
        dns:
            - 10.17.0.3
            - 1.1.1.1
            - 74.82.42.42
        volumes:
            - "/usr/local/gitlab/config:/etc/gitlab:rw"
            - "/usr/local/gitlab/logs:/var/log/gitlab:rw"
            - "/usr/local/gitlab/data:/var/opt/gitlab:rw"
        extra_hosts:
            jenkins_local_docker: 172.6.6.20
            socat_container: 172.6.6.2
        restart: always
        environment:
            - GITLAB_OMNIBUS_CONFIG="external_url 'http://gitlab.local:80'; gitlab_rails['gitlab_shell_ssh_port']=2222; gitlab_rails['lfs_enabled'] = true;"
        networks:
            network0:
                ipv4_address: 172.6.6.10
        healthcheck:
            test: ["CMD", "curl", "-f", "http://gitlab.local"]
            interval: 1m30s
            timeout: 10s
            retries: 3
            start_period: 5m
    jenkins:
        image: jenkins/jenkins:latest
        container_name: jenkins
        hostname: jenkins.local
        ports:
            - "8080:8080"
            - "50000:50000"
        dns:
            - 10.17.0.3
            - 1.1.1.1
            - 74.82.42.42
        volumes:
            - "/usr/local/jenkins/data_2:/var/jenkins_home:rw"
            - "/var/run/docker.sock:/var/run/docker.sock:rw"
            - "/usr/local/bin/docker:/bin/docker"
        extra_hosts:
            gitlab_local_docker: 172.6.6.10
            socat_container: 172.6.6.2
        restart: always
        privileged: true
        environment:
            - DOCKER_HOST=tcp://socat:2375
        links:
            - socat
        depends_on:
            - gitlab
        networks:
            network0:
                ipv4_address: 172.6.6.20
        pid: host
    socat:
        image: bpack/socat
        container_name: socat
        hostname: socat_container
        restart: "always"
        privileged: true
        ports:
            - "2375:2375"
        dns:
            - 10.17.0.3
            - 1.1.1.1
            - 74.82.42.42
        command: "TCP4-LISTEN:2375,fork,reuseaddr unix-connect:/var/run/docker.sock"
        volumes:
            - "/var/run/docker.sock:/var/run/docker.sock"
        networks:
            network0:
                ipv4_address: 172.6.6.2
#volumes:
    #docker_socket:
        #driver_opts:
        #   type: none
        #   device:  "/var/run/docker.sock"
        #   o: bind
networks:
  network0:
      ipam:
          driver: default
          config:
              - subnet: 172.6.6.0/24

Кто работает с докер-компос, тот сможет прочитать данный файл и понять в чем дело. Но если кто-то не знает, я немного расскажу на что стоит заострить внимание. И так:

Я данным сервисом запускаю 3 контейнера, — gitlab, jenkins (master) и socat. Gitlab — система управления репозиториями кода для Git. данные конфиг делался универсальным и чтобы он работал в любом месте и на Unix/Linux системах. Если что-то не будет работать, то стоит рассмотреть поле DNS (в данном поле прописаны ДНС-ы которые служат резолвом в самих докер-контейнера. Иногда это уместно, когда на работе или дома используются свои ДНС, а остальные блокируются).

Можно заюзать статью чтобы проверить, какие ДНС-ы используются:

Работа с DNS в Unix/Linux

PS: Для данного поля стоит использовать, ТОЛЬКО 3 DNS ЗАПИСИ, не более! Иначе, они просто не будут работать и моугт сломать контейнер(ы).

Многие посмотрет на «socat» конейнер и спросят, а зачем он тут вообще упал? Так вот, он тут служит перенаправлением данных с порта (2375) на Unix сокет (/var/run/docker.sock). И сново могут полететь вопросы, а зачем?

Да дело в том, что докер-прогеры «не смогли» запилить «docker_opts»/»hosts» переменную в докер под Mac OS X. Данная переменная выполняет собственно аналогичные действия, но нативным спообом. Выглядит это вот так (на стороне Linux):

 DOCKER_OPTS="-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock"

Т.е данную команду нужно прописать в конфиг докера, или можно запустить демон следующим образом:

$ sudo docker -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock -d 

Мне не совсем понятно почему нельзя было добавить такое в поддержку мака, но воркераунд найден и он работает. Вообще, такое чудо должно работать и на линуксе, но я не проверял. Если кому-то будет интересно, проверьте и напишите в комментариях результат.

На все это дело, я потратил около 7 часов времени и мне не очень было понятно почему не работает. Но в интернете нашелся пример моего бедствия. Я взял идею и опробовал ее — костыльненько, но а что поделать!

Самое интересно, то, что я в своей реализации заюзал «Docker in Docker», т.е пробросил Docker с Mac OS X на Docker хост с jenkins. Иначе , я хз как это должно работать. Если кто-то знает — расскажите 🙂

Собственно, gitlab + jenkins — готовы к использованию. Перейдем к настройке jenkins-slave.

Установка Jenkins-Slave в Unix/Linux

Стоит поставить: Docker Plugin плагин. Я еще ставил — Docker Slaves Plugin плагин, но не понял как он работает. Я покажу какие плагины у меня имеются в дженкинсе, возможно кому-то пригодится, но для начала, скачаем CLI для Jenkins:

$ cd ~ && curl 'localhost:8080/jnlpJars/jenkins-cli.jar' > ~/jenkins-cli.jar

Мои установленные плагины:

# java -jar ~/jenkins-cli.jar -s http://localhost:8080/ -auth captain:captain list-plugins
jsch                               JSch dependency plugin                                           0.1.55
ws-cleanup                         Workspace Cleanup Plugin                                         0.37
blueocean-commons                  Common API for Blue Ocean                                        1.10.2
mercurial                          Mercurial plugin                                                 2.5
structs                            Structs Plugin                                                   1.17
jira                               JIRA plugin                                                      3.0.5
sse-gateway                        Server Sent Events (SSE) Gateway Plugin                          1.17
gitlab-oauth                       Gitlab Authentication plugin                                     1.4
conditional-buildstep              Conditional BuildStep                                            1.3.6
greenballs                         Green Balls                                                      1.15
apache-httpcomponents-client-4-api Apache HttpComponents Client 4.x API Plugin                      4.5.5-3.0
subversion                         Subversion Plug-in                                               2.12.1
parameterized-trigger              Parameterized Trigger plugin                                     2.35.2
pipeline-model-extensions          Pipeline: Declarative Extension Points API                       1.3.4.1
build-with-parameters              Build With Parameters                                            1.4
external-monitor-job               External Monitor Job Type Plugin                                 1.7
kubernetes                         Kubernetes plugin                                                1.14.3
workflow-aggregator                Pipeline                                                         2.6
mailer                             Mailer Plugin                                                    1.23
git                                Git plugin                                                       4.0.0-rc
handy-uri-templates-2-api          Handy Uri Templates 2.x API Plugin                               2.1.6-1.0
blueocean-jira                     JIRA Integration for Blue Ocean                                  1.10.2
kubernetes-pipeline-steps          Kubernetes :: Pipeline :: Kubernetes Steps                       1.6
command-launcher                   Command Agent Launcher Plugin                                    1.3
workflow-api                       Pipeline: API                                                    2.33
workflow-job                       Pipeline: Job                                                    2.31
ssh-credentials                    SSH Credentials Plugin                                           1.14
authentication-tokens              Authentication Tokens API Plugin                                 1.3
blueocean-rest-impl                REST Implementation for Blue Ocean                               1.10.2
github-branch-source               GitHub Branch Source Plugin                                      2.4.2
htmlpublisher                      HTML Publisher plugin                                            1.18
simple-theme-plugin                Simple Theme Plugin                                              0.5.1
javadoc                            Javadoc Plugin                                                   1.4
workflow-cps-global-lib            Pipeline: Shared Groovy Libraries                                2.13
blueocean-web                      Web for Blue Ocean                                               1.10.2
jackson2-api                       Jackson 2 API Plugin                                             2.9.8
ssh-slaves                         SSH Slaves plugin                                                1.29.4
gitlab-plugin                      GitLab Plugin                                                    1.5.11
generic-webhook-trigger            Generic Webhook Trigger Plugin                                   1.52
docker-workflow                    Docker Pipeline                                                  1.17
pipeline-stage-tags-metadata       Pipeline: Stage Tags Metadata                                    1.3.4.1
blueocean-pipeline-scm-api         Pipeline SCM API for Blue Ocean                                  1.10.2
pipeline-milestone-step            Pipeline: Milestone Step                                         1.3.1
credentials                        Credentials Plugin                                               2.1.18
docker-java-api                    Docker API Plugin                                                3.0.14
cloudbees-bitbucket-branch-source  Bitbucket Branch Source Plugin                                   2.4.1
github                             GitHub plugin                                                    1.29.3
lockable-resources                 Lockable Resources plugin                                        2.4
jquery-detached                    JavaScript GUI Lib: jQuery bundles (jQuery and jQuery UI) plugin 1.2.1
blueocean-personalization          Personalization for Blue Ocean                                   1.10.2
workflow-scm-step                  Pipeline: SCM Step                                               2.7
ansicolor                          AnsiColor                                                        0.6.2
matrix-auth                        Matrix Authorization Strategy Plugin                             2.3
matrix-project                     Matrix Project Plugin                                            1.13
pipeline-stage-step                Pipeline: Stage Step                                             2.3
pipeline-build-step                Pipeline: Build Step                                             2.7
antisamy-markup-formatter          OWASP Markup Formatter Plugin                                    1.5
pipeline-maven                     Pipeline Maven Integration Plugin                                3.6.7
pipeline-input-step                Pipeline: Input Step                                             2.9
ant                                Ant Plugin                                                       1.9
bouncycastle-api                   bouncycastle API Plugin                                          2.17
handlebars                         JavaScript GUI Lib: Handlebars bundle plugin                     1.1.1
blueocean                          Blue Ocean                                                       1.10.2
pipeline-github-lib                Pipeline: GitHub Groovy Libraries                                1.0
variant                            Variant Plugin                                                   1.1
momentjs                           JavaScript GUI Lib: Moment.js bundle plugin                      1.1.1
blueocean-jwt                      JWT for Blue Ocean                                               1.10.2
plain-credentials                  Plain Credentials Plugin                                         1.5
docker-commons                     Docker Commons Plugin                                            1.13
docker-plugin                      Docker plugin                                                    1.1.5
git-client                         Git client plugin                                                3.0.0-rc
timestamper                        Timestamper                                                      1.8.10
gradle                             Gradle Plugin                                                    1.30
pipeline-rest-api                  Pipeline: REST API Plugin                                        2.10
workflow-basic-steps               Pipeline: Basic Steps                                            2.14
github-api                         GitHub API Plugin                                                1.95
blueocean-i18n                     i18n for Blue Ocean                                              1.10.2
ldap                               LDAP Plugin                                                      1.20
blueocean-events                   Events API for Blue Ocean                                        1.10.2
blueocean-core-js                  Blue Ocean Core JS                                               1.10.2
maven-plugin                       Maven Integration plugin                                         3.2
oki-docki                          oki-docki                                                        1.1
blueocean-config                   Config API for Blue Ocean                                        1.10.2
blueocean-github-pipeline          GitHub Pipeline for Blue Ocean                                   1.10.2
kubernetes-credentials             Kubernetes Credentials Plugin                                    0.4.0
credentials-binding                Credentials Binding Plugin                                       1.17
pipeline-model-definition          Pipeline: Declarative                                            1.3.4.1
config-file-provider               Config File Provider Plugin                                      3.5
pipeline-stage-view                Pipeline: Stage View Plugin                                      2.10
token-macro                        Token Macro Plugin                                               2.6
blueocean-display-url              Display URL for Blue Ocean                                       2.2.0
workflow-multibranch               Pipeline: Multibranch                                            2.20
script-security                    Script Security Plugin                                           1.51
git-server                         GIT server Plugin                                                1.7
pipeline-model-declarative-agent   Pipeline: Declarative Agent API                                  1.1.1
workflow-step-api                  Pipeline: Step API                                               2.19
run-condition                      Run Condition Plugin                                             1.2
pipeline-graph-analysis            Pipeline Graph Analysis Plugin                                   1.9
blueocean-git-pipeline             Git Pipeline for Blue Ocean                                      1.10.2
pipeline-model-api                 Pipeline: Model API                                              1.3.4.1
jenkins-design-language            Design Language                                                  1.10.2
disk-usage                         disk-usage plugin                                                0.28
windows-slaves                     WMI Windows Agents Plugin                                        1.4
workflow-cps                       Pipeline: Groovy                                                 2.63
blueocean-autofavorite             Autofavorite for Blue Ocean                                      1.2.3
workflow-durable-task-step         Pipeline: Nodes and Processes                                    2.29
email-ext                          Email Extension Plugin                                           2.63
branch-api                         Branch API Plugin                                                2.1.2
jdk-tool                           JDK Tool Plugin                                                  1.2
cloudbees-folder                   Folders Plugin                                                   6.7
blueocean-pipeline-editor          Blue Ocean Pipeline Editor                                       1.10.2
blueocean-dashboard                Dashboard for Blue Ocean                                         1.10.2
docker-slaves                      Docker Slaves Plugin                                             1.0.7
durable-task                       Durable Task Plugin                                              1.29
github-oauth                       GitHub Authentication plugin                                     0.31
junit                              JUnit Plugin                                                     1.26.1
pam-auth                           PAM Authentication plugin                                        1.4
pubsub-light                       Pub-Sub "light" Bus                                              1.12
scm-api                            SCM API Plugin                                                   2.3.0
blueocean-pipeline-api-impl        Pipeline implementation for Blue Ocean                           1.10.2
ace-editor                         JavaScript GUI Lib: ACE Editor bundle plugin                     1.1
display-url-api                    Display URL API                                                  2.3.0
workflow-support                   Pipeline: Supporting APIs                                        3.2
locale                             Locale plugin                                                    1.4
resource-disposer                  Resource Disposer Plugin                                         0.12
blueocean-rest                     REST API for Blue Ocean                                          1.10.2
gitlab-merge-request-jenkins       Gitlab Merge Request Builder                                     2.0.0
cloudbees-disk-usage-simple        CloudBees Disk Usage Simple Plugin                               0.9
build-timeout                      Build Timeout                                                    1.19
favorite                           Favorite                                                         2.3.2
blueocean-bitbucket-pipeline       Bitbucket Pipeline for Blue Ocean                                1.10.2
mapdb-api                          MapDB API Plugin                                                 1.0.9.0

После того как плагины поставились, открываем дженкинс и переходим:

«Manage Jenkins» -> «Configure System» и ищем поле «Cloud»:

Кликаем по «Docker Cloud Details» чтобы ввести необходимые данные:

Задаем имя, у меня это — Docker. В поле «Docker Host URI» прописываем хост и порт который юзает докер. У меня — «tcp://172.6.6.2:2375». Почему-то, не прокатило использование хостнейма от соката в этом случае. Может исправлю попозже или на крайний случай — можно оставить как есть, т.к эта лаба служит в качестве примера. Стоит отметить, если у вас используется авторизация к докер хосту, то стоит заполнить «Server credentials». Если нажать на «Advanced», то выпадет список дополнительных параметров которые можно заполить тоже:

Нажмите на «Test connection» чтобы получить тестовое подключение (чтобы убедится что коннекшен работает как нужно).

Идем дальше, клацаем по «DOCKER AGENT TEMPLATES…» Я привел к виду:

Заполнил поле и лейблу как мне угодно. В поле «Docker image» я прописал Jenkins-Slave образ, который я взял с официального докер-регистра — «jenkinsci/slave». Так же, по необходимости заполните все необходимые поля (креденшелы, дополнительные опции).

Первый билд (джоба) на Jenkins-е

Создаем проект под свои нужды. Потом, создаем «Pipeline» проект, например:

Тестовый pipeline projec для Java
Тестовый pipeline projec для Java

Нажимаем на «OK» и сейчас создадим все необходимое.

Находим «Run the build inside Docker containers» и ставим чекбокс. В поле «Docker Image» ставим наш образ, у меня — «jenkinsci/jnlp-slave:latest». Так же, можно прописать «Advanced settings» опции и выставить использовании по памяти. У меня все имеет вид:

Идем дальше, находим «Pipeline» вкладку и заполняем ее под свои нужды. У меня все приведено и имеет вид:

Т.е я заюзал свой гитлаб сервер. В нем есть репозиторий с проектом. Так же, добавил подключение к гитлабу. Собственно, все готово, можно нажимать на «SAVE»!

Слева вверху, нажимаем на «Build Now» и смотрим что получилось!

Если открыть «Manage Jenkins» -> «Manage Nodes», то появится jenkins-slave:

Видно что поднялся слейв и запустил джобу. Можно открыть ее и поглядеть статус выполнения:

Я думаю что на этом пока все, статья «Установка Jenkins и Jenkins-slave в Unix/Linux» завершена.

The post Установка Jenkins и Jenkins-slave в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/ustanovka-jenkins-i-jenkins-slave-v-unix-linux/feed/ 0
Page_c76a3fcf https://linux-notes.org/nastrojka-yazyka-v-jenkins/ https://linux-notes.org/nastrojka-yazyka-v-jenkins/#respond Sat, 02 Feb 2019 16:29:42 +0000 https://linux-notes.org/?p=16416 Года 4 назад, я пытался использовать дженкинс для CI/CD. Но честно говоря, он мне не зашел вообще (по некоторым причинам). Ни для кого не секрет, что данное ПО, используется в 90% случаях не только где я работаю, но и в целом мире (хотя еть много других, крутых альтернатив). Мои друзья и колеги знают как я […]

The post Настройка языка в Jenkins first appeared on linux-notes.org.]]>

Года 4 назад, я пытался использовать дженкинс для CI/CD. Но честно говоря, он мне не зашел вообще (по некоторым причинам). Ни для кого не секрет, что данное ПО, используется в 90% случаях не только где я работаю, но и в целом мире (хотя еть много других, крутых альтернатив). Мои друзья и колеги знают как я к нему отношусь, но работа — есть работа, нужно юзать дженкинс на проекте как бы я этого не хотел…

Как по мне, дженкинс очень сырой чтобы его юзать в ПРОД-е и данная технология была прорывным решением тех времен, но не сейчас! Почему я так думаю? Да собственно статья будет об этом. Разрабы не додумались написать стандартное решение для переключения языка. «Удобненько»! Решение конечно есть — это заюзать плагин (конечно, может у разработчиков другой взгляд и они все плагинами дополняют, но я не думаю что это уместно при этом примере). Но честно говоря — это хрень, а не решение как по мне. Ну да ладно, мне надоело терпеть полу-перевод страниц в дженкинсе и хочу юзать чисто анг яз — будет лучше, чем половина ломаного русского языка который дженкинс берет с настроек браузера.

Ну, собственно нам потребуется «Locale Plugin» плагин. Чтобы его установить, перейдите:

«Manage Jenkins» -> «Manage Plugins» и переходим во вкладку «Available». В поле «Filter» вводим название плагина, в данном случае — это «Locale plugin». Нажимаем установить, ставим и перезапускаем дженкинс для того, чтобы он начал работать.

Плагин поставили, теперь открываем «Manage Jenkins» -> «Configure System» и находим «Locale» секцию. В поле «Default Language» нужно прописать язык, например «en_US»:

Вот собсвенно и все решение. Поставил нативный, английский язык и даже очень доволен.

А на этом, у меня все, статья «Настройка языка в Jenkins» завершена.

The post Настройка языка в Jenkins first appeared on linux-notes.org.]]>
https://linux-notes.org/nastrojka-yazyka-v-jenkins/feed/ 0