Jenkins. Початок роботи.

Встановити контейнер Dosker.

Створимо docker-compose.yaml.

version: '3.7'
services:
  jenkins:
    image: jenkins/jenkins:lts
    privileged: true
    user: root
    ports:
      - 8081:8080
      - 50000:50000
    container_name: jenkins
    volumes:
      - .data:/var/jenkins_home

Встановлюємо.

docker-compose up --build

Start page

Заходимо на сторінку http://localhost:8081/

start page

Копіюємо та вставляємо пароль з файлу .data/secrets/initialAdminPassword

Далі потрапляємо на сторінку встановлення плагінів.

start page

Вся робота в Jenkins зводиться до створення так званих конвейєрів (Pipeline).

Вони є послідовністю дій для деплою та тестування вашої програми.

Ця послідовність міститься у файлі Jenkinsfile та написана на мові Groovy.

Groovy — об’єктно-орієнтована мова програмування, розроблена для платформи Java як альтернатива мові Java з можливостями Python, Ruby та Smalltalk.

Можливості Groovy (що відрізняють його від Java):

— Статична та динамічна типізація

— Вбудований синтаксис для списків, асоціативних масивів, масивів та регулярних виразів

  • Замикання

— Перевантаження операцій

Більше того, майже завжди java-код – це валідний groovy-код.

Установка groovy.

Насамперед необхідно поставити java.

Потім запускаємо наступні команди.

curl -s get.sdkman.io | bash

source "$HOME/.sdkman/bin/sdkman-init.sh"

Створити образ для jenkins з Docker.

Створюємо файл Dockerfile з установкою всього необхідного для Docker у контейнер.

FROM jenkins/jenkins:lts

ARG DOCKER_COMPOSE_VERSION=1.25.0

USER root
RUN apt-get update && \
   apt-get upgrade -y && \
   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 && \
   apt-get clean autoclean && apt-get autoremove && rm -rf /var/lib/{apt,dpkg,cache,log}/

RUN curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose

RUN usermod -aG docker jenkins && gpasswd -a jenkins docker
USER jenkins

Збираємо образ.

docker build.

Змінюємо файл docker-compose.yaml

image: jenkins/jenkins:lts

Замінимо на

build: .

Також додамо два volumes в яких перенаправимо бінарники докера зсередини контейнера на локальну машину.

volumes:
  - ./data:/var/jenkins_home
  - /var/run/docker.sock:/var/run/docker.sock
  - /usr/local/bin/docker:/usr/local/bin/docker

Перезапускаємо контейнер.

docker-compose up --build

Отримуємо проблему у правах.

Start page

Справа в тому, що користувач усередині контейнера має відмінні від локальних UID і GID і отже не може писати в папку data.

Існує варіант усі команди пропускати через скрипт entry-point.sh

#!/bin/sh
set -e

# first arg is `-f` or `--some-option`
# or first arg is `something.conf`
if [ "${1#-}" != "$1" ] || [ "${1%.conf}" != "$1" ]; then
    set -- redis-server "$@"
fi

# allow the container to be started with `--user`
if [ "$1" = 'redis-server' -a "$(id -u)" = '0' ]; then
    find . \! -user redis -exec chown redis '{}' +
    exec gosu redis "$0" "$@"
fi

exec "$@"

В якому перебиватиме права на потрібного користувача.

COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]

джерело

обговорення в StackOverflow

Ручне встановлення.

Для роботи необхідна Java машина

java -version

Додаємо ключ репозиторію до системи.

wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -

Потім додайте на адресу репозиторію пакетів Debian у sources.list сервера:

sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'

Оновлюємо список репозиторіїв.

sudo apt update

Встановлення

sudo apt install jenkins

Старт сервера.

sudo systemctl start jenkins

Перевірка сервера.

sudo systemctl status jenkins

start page

Налаштовуємо віртуальний хост nginx.

server {
        listen 80;
        server_name jenkins.wezom.webmonstr.com;
        location / { 
                proxy_pass http://localhost:8080;
        }
}

Завдання.

Припустимо, що у нас є віддалена машина з середовищем розробки якого-небудь проекту та командами для тестування.

Ми хочемо періодично запускати тести на віддаленій машині.

Для того, щоб jenkins міг успішно встановити свого агента на віддаленому хості має стояти java.

Поставимо варіант headless без жодних зайвих графічних “прибамбасів”.

sudo apt install openjdk-8-jre-headless

Додавання нового користувача з правами заходу на віддалений хост по ssh.

start page

start page

start page

start page

start page

Ми вибираємо спосіб доступу за ключом ssh.

Тому в jenkins копіюємо приватний ключ із файлу ~/.ssh/id_rsa

А на віддаленій машині додаємо публічний ключ у файл .ssh/authorized_keys, який беремо з ~/.ssh/id_rsa.pub

Після додавання користувача можна приступити до створення нового середовища збирання (складача) і прив’язати його до віддаленого хоста, на якому ми збираємося запускати тести.

start page

start page

start page

При створенні середовища (Ноди) необхідно вказати робочий каталог, IP-адресу та порт у вкладці Додатково якщо він відрізняється від стандартного 22-го.

Також необхідно вибрати користувача, під яким буде виконано вхід на віддалену машину.

І вказати мітку для зручного прив’язування до нього завдань.

Також можна вказати кількість вокеров в пулі збирача на той випадок, якщо на віддаленій машині є додатковий. ресурси у вигляді простаюючих ядер процесора.

Start page

Нарешті можна розпочати створення нового завдання.

start page

Насамперед прив’язуємо завдання до збирача за його міткою.

start page

Далі вибираємо тип дії збирача.

У найпростішому випадку виконання команди BASH.

start page

start page

start page

У команді ми спочатку стрибаємо всередину домашньої директорії для того, щоб вийти за межі робочого каталогу jenkins, який він створює для того, щоб не “засірати” робочу область проекту.

Запускаємо складання.

start page

Перевіряємо результат.

start page

start page