Дорога к интерфейсу: как создать проект развертывания с помощью jenkins

Jenkins

.github-corner:hover .octo-arm{animation:octocat-wave 560ms ease-in-out}@keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave 560ms ease-in-out}}

Дженкинс (Создавайте великие вещи в любом масштабе)

что такое Дженкинс?

JenkinsЭто программное обеспечение с открытым исходным кодом CI (непрерывная интеграция: непрерывная интеграция) и CD (непрерывная доставка: непрерывная доставка), предоставляющее более 1000 подключаемых модулей для поддержки построения, развертывания, автоматизации, удовлетворения потребностей любого проекта, поддержки различные методы работы, через системный пакет, Docker или через автономную программу Java.

принцип:Посмотрите на картинку (чертежное оборудование)img

зачем использовать Дженкинс?

  • Непрерывная интеграция и непрерывная доставка: В качестве масштабируемого сервера автоматизации Jenkins можно использовать как простой CI-сервер или превратить в центр непрерывной доставки для любого проекта.
  • Простая установка: Jenkins — это отдельная программа на основе Java, которая сразу запускается с Windows, Mac OS X и другими Unix-подобными операционными системами.
  • Простая конфигурация: Jenkins можно легко установить и настроить через веб-интерфейс, который включает в себя мгновенную проверку ошибок и встроенную справку.
  • плагин: Имея более 1000 подключаемых модулей в Центре обновлений, Jenkins интегрируется практически со всеми инструментами в цепочке инструментов непрерывной интеграции и непрерывной доставки.
  • расширять: Jenkins расширяется благодаря своей архитектуре плагинов, предоставляя почти безграничные возможности для того, что может делать Jenkins.
  • распределенный: Jenkins может легко распределять работу между несколькими машинами, помогая быстрее запускать сборки, тесты и развертывания на нескольких платформах.

Install

Окружение: ubuntu, докер, git

$ cat /etc/issue
Ubuntu 16.04.6 LTS \n \l

На основе докера, если вы не знакомы, вы можете взглянуть на мою предыдущую статьюПередняя дорога: идти в ногу с трендом, простое применение докера

  • тянуть зеркало

    • $ docker pull jenkinsci/blueocean
  • Запустите контейнер на основе полученного изображения Jenkins.

      $ docker run \
      -d \
      --name jenkins \
      -u root \
      -p 49001:8080 \
      -v /var/jenkins_home:/var/jenkins_home \
      -v /var/jenkins_ssh:/root/.ssh \
      -v /var/run/docker.sock:/var/run/docker.sock \
      jenkinsci/blueocean
    
    

    объяснять:

    • -d: режим демона, работающий в фоновом режиме.
    • -p: сопоставление портов, 49001 — порт сервера (вы можете изменить его в соответствии со своей ситуацией, не забудьте открыть порт группы безопасности), 8080 — порт контейнера (порт по умолчанию для программы jenkins).
    • -v: смонтировать том данных,/var/jenkins_home:/var/jenkins_home: смонтировать каталог Jenkins на хост;/var/jenkins_ssh:/root/.ssh: подключите ssh Дженкинса к хосту для резервного копирования, чтобы предотвратить его потерю после перезапуска.
  • Проверьте статус работы контейнера:

      $ docker ps
      CONTAINER ID      IMAGE                COMMAND                  CREATED        STATUS           PORTS                                NAMES
      08a54d4a804a      jenkinsci/blueocean  "/sbin/tini -- /usr/…"   7 days ago     Up 7 days        50000/tcp, 0.0.0.0:49001->8080/tcp   jenkins
    

    Прикрепил:img

    Приведенные выше инструкции были выполнены успешно. Если контейнер неожиданно завершает работу, удалите параметр -d для выполнения и проверьте журнал для устранения неполадок.

  • Теперь приступайте к настройке Jenkins, зайдите в браузере你的服务器ip:49001, появится следующий интерфейс:img

    • Если вы хотите войти, вам нужно сначала разблокировать, пароль находится в/var/jenkins_home/secrets/initialAdminPasswordВ файле как это проверить? Два варианта:

      1. Сначала войдите в только что запущенный контейнер jenkins и выполните$ docker exec -it jenkins bash,Потом$ cat /var/jenkins_home/secrets/initialAdminPassword.
      2. Поскольку каталог Jenkins был смонтирован на хосте при запуске контейнера, его можно выполнить прямо на хосте, не входя в контейнер.$ sudo cat /var/jenkins_home/secrets/initialAdminPassword.
    • Скопируйте пароль с предыдущего шага в браузер и нажмите кнопку «Продолжить», чтобы перейти к следующему шагу. Прикрепил:img

    • Чтобы установить плагин, выберите «Рекомендуется для установки».

=================================================

Выше приведена базовая установка. Я использую официальную документацию или английский язык. В настоящее время он поддерживает китайский язык. Для получения более подробной информации перейдите по ссылкеОфициальный сайт, давайте начнем учить вас создавать новыйБесплатные задачи сборки(Ввиду того, что большинство онлайн туториалов многомашинные, то есть проект и дженкинс находятся не на одном сервере, и учитывая, что у друзей может быть только одна своя машина, о чем я и буду говорить нижеЗапуск проекта и Jenkins на одной машине)

=================================================

  • Открытьip:49001Войдите на домашнюю страницу, нажмите «Управление системой»:

img

  • Сначала нажмите на управление плагинами, найдите и установите плагин (если список установленных уже существует, его можно игнорировать):

    • Build Name Setter
    • Плагин Dingding[Dingding]
    • Build Timestamp Plugin
    • Git Parameter Plug-In
    • Publish Over SSH
    • SSH Slaves plugin
    • Timestamper
  • Затем нажмите Системные настройки:

    • оказатьсяBuild Timestamp(предоставляется плагином выше), выполните следующие настройки:

      • Asia/Shanghai
      • yyyy-MM-dd-HH-mm-ss-SSS

      img

    • оказатьсяPublish over SSH, это относительно хлопотно, установите следующим образом:

      img

      проиллюстрировать:

      • Парольная фраза: пароль SSH. Возможны два случая: 1. При использовании имени пользователя/пароля для входа в систему используется пароль имени пользователя 2. При использовании закрытого ключа для входа в систему используется пароль закрытого ключа.
      • Путь к ключу: путь к файлу закрытого ключа SSH. Может быть абсолютным путем или относительным путем относительно $JENKINS_HOME.
      • Ключ: закрытый ключ, экспортируется текстовое содержимое после закрытого ключа. При условии, что заданы и «Ключ», и «Путь к ключу», приоритет «Ключа» выше. В настоящее время содержимое, заданное в «Парольной фразе», должен быть таким же, как у закрытого ключа.
      • Disable exec: отключает выполнение команды на целевой машине. Если этот флажок установлен, команда, заданная в параметре «Exec command» в конфигурации задания, будет игнорироваться.

      Дополнение: поскольку Jenkins работает в контейнере докеров, приведенная выше конфигурация должна быть конфигурацией ssh ​​контейнера, а не хост-компьютера. Как показано на рисунке выше, я вхожу через закрытый ключ ssh.

      шаг:

      • $ docker exec -it jenkins sh, в контейнер.
      • $ ssh-keygen -m PEM -t rsa -b 4096, сгенерируйте закрытый ключ ssh и открытый ключ (по умолчанию в~/.sshкоторый/root/.sshDirectory), можно нажать Enter до упора, если вы установили пароль, то нужно заполнить «Passphrase».
      • $ cat ~/.ssh/id_rsa, проверьте закрытый ключ и скопируйте закрытый ключ в параметр «ключ» на рисунке выше.
      • $ cat ~/.ssh/id_rsa.pub, просмотреть открытый ключ, скопировать открытый ключ на хост~/.ssh/authorized_keysсередина.

      На этом настройка ssh Jenkins завершена, и следующим шагом будет настройка SSH-серверов удаленной машины (мы — одна машина, поэтому хост-машина настроена как удаленная машина):img

      проиллюстрировать:

      • Имя: Имя конфигурации узла SSH, можно задать по желанию, оно будет в выпадающем списке "SSH Server" в конфигурации задания, как показано на рисунке:img
      • Имя хоста: имя хоста или IP-адрес машины для подключения через SSH.
      • Имя пользователя: имя пользователя, используемое службой SSH, и имя пользователя, указанное для ключа при использовании ключа для подключения.
      • Удаленная Derictory: Папка, которая фактически существует на удаленной машине, и пользователь, указанный в поле «Имя пользователя», имеет разрешение на доступ к этой папке. Плагин будет передавать файлы в эту папку. Обычно это каталог, в котором хранится проект.
  • Тест, нажмите кнопку «Проверить конфигурацию», например, успех, конфигурация прошла успешно, перейдите к следующему шагу и создайте новую задачу.

Начнем новую задачу:

  • Нажмите «Новая задача» на главной странице, введите имя (рекомендуется, чтобы оно соответствовало названию проекта на github), выберите первый «Создать проект программного обеспечения в свободном стиле», а затем нажмите «ОК»:img

  • Вернитесь на домашнюю страницу, вы увидите только что созданную задачу в списке, щелкните имя, чтобы ввести сведения о задаче:img

  • На странице сведений о задаче нажмите «Настроить», чтобы настроить проект:imgКонфигурация:img img img img imgДобавлено: (скрипты оболочки все впроектв каталоге развертывания)

    • Исполнительная команда:

      #!/usr/bin/env bash
      echo '************************************** 发送至服务器成功 **********************************************'
      
      # 项目名,取自环境变量
      projectName="${JOB_NAME}"
      dockerImageName=${projectName}-${BUILD_TIMESTAMP}
      
      # step1 解压源代码
      echo " ************************************* 解压源代码${dockerImageName}.tar.gz start *************************************"
      
      projectPath='/var/nodejs/' # 需要单独给用户赋目录/var/nodejs/的权限 sudo chown ubuntu /var/nodejs/
      sudo mkdir -p ${projectPath}${projectName} || true \
      && cd ${projectPath}${projectName} \
      && sudo rm -rf *  # 删除里面的数据
      
      sudo tar -zxf ../${dockerImageName}.tar.gz -C ./ \
      && sudo rm  ../${dockerImageName}.tar.gz   # 删除发布过来的包
      
      echo " ************************************* 解压源代码${dockerImageName}.tar.gz finish *************************************"
      
      # step2 构建docker镜像
      echo " ************************************* 构建docker镜像${dockerImageName} start *************************************"
      sudo docker build -t ${dockerImageName} --force-rm .
      echo ' ************************************* 构建docker镜像 finish *************************************'
      
      # step3 重启容器
      echo "************************************* 使用镜像${dockerImageName}启动容器${projectName}  start *************************************"
      # 错误日志统一存放在/var/nodejs/logs/${projectName}
      sudo mkdir -p /var/nodejs/logs/${projectName} || true \
      && sudo docker stop ${projectName} || true \
      && sudo docker rm ${projectName} || true \
      && sudo docker run -d --net=host --name ${projectName} -v /var/nodejs/logs/${projectName}:/var/nodejs/${projectName}/logs ${dockerImageName}
      
      echo "************************************* 使用镜像${dockerImageName}启动容器${projectName}  finish *************************************"
      
      echo '************************************************ 查看docker容器情况: ************************************************ '
      sudo docker ps -a
      echo '************************************************ 查看docker容器情况: ************************************************ '
      
    • Если проект необходимо собрать в контейнере, начальное время сборки обычно относительно велико, поэтому вы можете установить «Время ожидания выполнения» в дополнительных настройках немного больше.

    • построить-выполнить команду оболочки:

      #!/usr/bin/env sh
      projectName="${JOB_NAME}"
      dockerImageName=${projectName}-${BUILD_TIMESTAMP}
      
      echo '*********************************** 准备打包从Github仓库拉取的代码...*********************************************'
      echo "**********${WORKSPACE}**********"
      tar --exclude=node_modules --exclude=.git --exclude='*.tar.gz'  -vzcf /tmp/${dockerImageName}.tar.gz -C  ${WORKSPACE} .  \
      && mv /tmp/${dockerImageName}.tar.gz  ${WORKSPACE} \
      && echo '*********************************** 打包成功 *********************************************' \
      && echo '************************************** 准备发送至服务器... **********************************************'
      
    • постмонтажные операции,Руководство по настройке уведомлений Dinging

  • После завершения настройки задачи проекта нажмите Сохранить.

  • Вернитесь также к деталям задачи, нажмите «Построить с параметрами», выберите ветку, нажмите «Начать сборку»:img

  • В списке истории сборки щелкните последнюю запись сборки, а затем нажмите «Консольный вывод», чтобы просмотреть журнал сборки:imgОкончательный вывод журнала: Завершено: УСПЕХ, успешно. в

Dingding будет уведомлен, когда он будет построен.

Что делать, если возникла проблема и нужно откатить версию?

Мы можем создать новую задачу для отката версии:

  • Вернитесь на домашнюю страницу, нажмите «Создать» и дайте ей имя, например: newblog-rollback.

  • Нажмите newblog-rollback в списке, чтобы ввести сведения о задаче, нажмите «Настроить», чтобы перейти на страницу конфигурации:img img imgДобавлено: (скрипты оболочки все впроектв каталоге развертывания)

    • Исполнительная команда:

      #!/usr/bin/env sh
      
      trim()
      {
          trimmed=$1
          trimmed=${trimmed%% }
          trimmed=${trimmed## }
          echo "$trimmed"
      }
      
      # projectName=$(trim "${container_name}")
      projectName="newblog"
      
      dockerImageName=$(trim "${image_name}")
      
      echo "******************************************* 回退到镜像${image_name} ,并启动容器${container_name} **************** *******************************"
      sudo mkdir -p /var/nodejs/logs/${projectName} || true \
      && sudo docker stop ${projectName} || true \
      && sudo docker rm ${projectName} || true \
      && sudo docker run -d --net=host --name ${projectName} -v /var/nodejs/logs/${projectName}:/var/nodejs/${projectName}/logs ${dockerImageName}
      echo "************************************* 使用镜像${dockerImageName}启动容器${projectName}  finish *************************************"
      
  • Тестовая версия откатывается. Во-первых, вам нужно знать, на какую версию вы хотите откатиться. Скопируйте имя зеркала, которое вы хотите откатить, в список задач нового блога:img img img imgОкончательный вывод журнала: Завершено: УСПЕХ, успешно.

Конечный результат:http://140.143.0.171:8080

【Ссылаться на】:

  1. jenkins.io/
  2. N-blog

===🧐🧐Недостаточно в тексте, прошу исправить🤪🤪 ===.

=== Контента немного больше, самоощущение не очень хорошее, но я не знаю, как оптимизировать, приветствуются хорошие предложения ===