Система управления проектами от 0 до 1 узла: строительные статьи - jenkins

Node.js

предисловие

Базовая конструкция платформы, часть 1Представьте дизайн процесса проекта, создание базы данных, вход в систему jwt и другие модули.

Базовая конструкция платформы, часть IIПредставляем дизайн управления филиалами, базовый модуль webSocket

Базовая конструкция платформы ДалееПознакомить с основными модулями, связанными с управлением процессами и тестированием.

Основная часть в основном знакомит с проектированием инфраструктуры процесса управления проектами и разработкой некоторых базовых узлов.Эта статья начинает серию систем и кратко описывает сотрудничество между jenkins и системой управления проектами.

Jenkins

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

Jenkins — это инструмент непрерывной интеграции (CI) с открытым исходным кодом, обеспечивающий дружественный рабочий интерфейс, созданный в Hudson (Hudson является коммерческим) и в основном используемый для непрерывного и автоматического построения/тестирования программных проектов и мониторинга выполнения внешних задач. Jenkins написан на языке Java и может работать как в популярных контейнерах сервлетов, таких как Tomcat, так и автономно. Обычно используется в сочетании с инструментами управления версиями (SCM), инструментами сборки. Общие инструменты контроля версий включают SVN и GIT, а инструменты сборки включают Maven, Ant и Gradle.

В этом проекте в качестве основного инструмента сборки используется Jenkins.

Установка Дженкинса (наступая на сбор ямы)

В общем, мой блог не будет представлять конкретный процесс установки, но этот заставил меня наступить на яму на один день, так что давайте перечислим его (в основном окна наступают на яму)

Среда Windows

СкачатьJenkinsУстановите пакет и загрузите другойJAVA SDK, нажмите прямо, чтобы установить шаттл.

После установки требуется пароль.Для студентов, изучающих 64-разрядную систему, не забудьте не переходить в каталог sys32, чтобы найти его, хотя путь, отображаемый на веб-странице, — sys32.

ноC:\Windows\SysWOW64\config\systemprofile\AppData\Local\Jenkins.jenkinsЭто правильный путь

Не рекомендуется использовать версию для Windows, если у вас нет виртуальной машины, опыт будет удвоен.

среда Mac

Рекомендуется использоватьbrewПрямая загрузка, проще управлять

Решение для медленной установки brew:кликните сюда

Установка плагина слишком медленная

  1. войти первымhttp://ip:10086/pluginManager/advancedСтраница управления плагином, измените адрес сupdate.Jenkins.IO/update-cent…заменитьзеркало.X Mission.com/Jenkins/USB…

  2. Изменить конфигурацию Jenkins/updates/default.json

Замените update.jenkins-ci.org/download на mirrors.tuna.tsinghua.edu.cn/jenkins.

заменятьwww.google.comдляwww.baidu.com

закончено непосредственноhttp://ip:10086/restartперезагружать

Установка Docer не рекомендуется, а зенитки реже борются с комарами

сценарий конвейера

Кратко представить

Контакт: узел, агент и ведомое устройство используются для обращения к главному серверу управления Jenkins для выполнения заданий Jenkins.

Отличие: агенты используются в экспрессивных пайплайнах, не только в нодах, но и в док-контейнерах и т.д. node (это не тот js-узел) используется в скриптовых пайплайнах.

Перейдите непосредственно к сценарию конвейера узла и попробуйте его (просто сначала запустите его, позже еще много мест для оптимизации)

Параметры конфигурации:

имя описывать
PROJECT_NAME название проекта
PROJECT_VERSION Номер версии проекта
PROJECT_GIT_PATH Адрес проекта
BRANCH_NAME Инженерная отрасль
BUILD_PATH каталог сборки
CACHE Следует ли кэшировать
node {
    stage('Pre Git') {
        echo "${params.PROJECT_NAME},${params.PROJECT_VSERSION},${params.PROJECT_GIT_PATH}"
        dir("D:/jenkins/build") {
            if(fileExists("${params.PROJECT_NAME}")) {
                echo " git exit"
                dir("D:/jenkins/build/${params.PROJECT_NAME}") {
                    powershell " git fetch --all && git reset --hard origin/${params.BRANCH_NAME} && git pull"
                    powershell " git checkout ${params.BRANCH_NAME}"
                }
            } else {
                echo " git is not exit"
                powershell " git clone ${params.PROJECT_GIT_PATH}"
            }
        }
    }
    stage('Pre Env') {
        echo "check node_modules,${params.CACHE}"
        dir("D:/jenkins/build/${params.PROJECT_NAME}") { 
            if(!fileExists("node_modules")) {
                powershell "cnpm i"
            }
            if(!params.CACHE) {
                echo "CACHE --- ${params.CACHE}"
                powershell "rimraf node_modules"
                powershell "cnpm i"
            }
        }
    }
    stage('build') {
        echo "check node_modules"
        dir("D:/jenkins/build/${params.PROJECT_NAME}") { 
            bat "npm run build"
        }
    }
    stage('test') {
        echo "test case"
    }
    stage('deploy') {
        echo "deploy project"
        if(!fileExists("D:/jenkins/deploy/${params.PROJECT_NAME}")) { 
            powershell " mkdir D:/jenkins/deploy/${params.PROJECT_NAME}"
        }
        if(!fileExists("D:/jenkins/deploy/${params.PROJECT_NAME}/${params.PROJECT_VERSION}")) { 
            powershell " mkdir D:/jenkins/deploy/${params.PROJECT_NAME}/${params.PROJECT_VERSION}"
        }
        powershell "cp D:/jenkins/build/${params.PROJECT_NAME}/${params.BUILD_PATH}/* D:/jenkins/deploy/${params.PROJECT_NAME}/${params.PROJECT_VERSION} -Recurse"
    }
}

Приведенный выше скрипт создает 5 этапов, разбивая процесс сборки на 5 шагов:

  1. Извлечение проекта: оценка того, существует ли проект локально, если он существует, извлечение и клонирование напрямую, если он не существует.
  2. Установите зависимости проекта: определите, установлены ли зависимости проекта.Если они не установлены, а кэш очищается принудительно, сначала установите зависимости.
  3. Сборка проекта: запустите сборку проекта, из которой позже можно будет извлечь скрипт.
  4. Тест проекта: зарезервирован, позже используется для точек карты процесса проекта.
  5. Релиз проекта: загрузите его прямо туда, где вы его публикуете, по cp или ssh (среда Nginx создается локально, поэтому скопируйте его в соответствующий каталог)

Конечно, вышеприведенный сценарий выполняет только простые задачи по конструированию и сразу же встает на колени при столкновении со сложной системой и кратко перечисляет проблемы, с которыми, вероятно, придется столкнуться.

  1. Многотерминальное строительство, например, проект должен напрямую создавать многотерминальные продукты.
  2. Различать несколько сред, таких как разработка, тестирование, предварительная версия и онлайн.
  3. Многокомандная сборка, сложные проекты могут потребовать выполнения нескольких команд для завершения сборки продукта.
  4. Неопределенность относительно выходного каталога сборки, каталога выпуска и т. д.
  5. так далее…………………………

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

Поскольку я использую систему Windows, обработка файлов относительно сложна, скорость работы низкая, а сценарий написать сложно.Если вы хотите его использовать,настоятельно рекомендую линукс.

Приведенный выше рисунок построен в общей сложности 5 раз.Из-за добавления оценки кеша при первой сборке будут установлены соответствующие зависимости, что занимает много времени.

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

Выбор за вами, и вы также можете переустанавливать все зависимости каждый раз при сборке.Быть человеком, быть счастливым - это самое главное!

Построить демонстрацию продукта

Обратите внимание, что ссылка на картинке выше имеет номер версии, который необходимо преобразовать вместе с лесами, он будет подробно описан в главе о строительных лесах.

Nginx

Nginx — это легкий веб-сервер/обратный прокси-сервер и прокси-сервер электронной почты (IMAP/POP3), выпущенный по протоколу, подобному BSD, доступный в UNIX, GNU/Linux, BSD, Mac OS X, Solaris и операционных системах, таких как Microsoft. Окна.

В реальных условиях он может поддерживать от 20 000 до 40 000 одновременных подключений, а эффективность затрат чрезвычайно высока. Если у вас нет денег, вы можете построить его сами, если есть деньги, вы можете пойти напрямую в cos, CDN и купить облачные сервисы, разве это не вкусно? PS:Приятно быть богатым!

server {  #这里是我自己配置服务端口
    listen       10010;
    server_name resouce;
    root  D:/jenkins/deploy;  #访问文件根目录
    autoindex on;  #是否浏览文件下的列表
    location / {  #是否允许跨域
        add_header Access-Control-Allow-Origin *;
    }
    add_header Cache-Control "no-cache,must-revalidate";# 是否缓存
}

В соответствии с приведенной выше конфигурацией вы можете просто настроить статический сервер. Добавьте интерфейсный проект и напрямую получите доступ к соответствующему порту.

Приведенный выше код можно скопировать прямо в nginx.config, а затем перезапустить.

DevOps Jenkins Coding

Упаковка базового Jenkins Api

Выбор проектаjenkinsБиблиотеки для расширения, обратите внимание, что если вы используете режим TS, вам необходимо установить зависимости @types/jenkins.

import * as jenkins from "jenkins";

/**
 * Jenkins连接
 * @param type
 */
const getJenkins = function (
  type: "h5" | "node" | "nodeProduct" | "android" | "java"
) {
  const jenkinsConfig = {
    h5: {
      baseUrl: "http://devOps:118844ffb045d994acf8bb353e8d7b34f0@localhost:9001",
      crumbIssuer: true,
    },
    node: {
      baseUrl:
        "http://devOps:118844ffb045d994acf8bb353e8d7b34f0@localhost:9001",
      crumbIssuer: true,
    },
  };
  return jenkins(jenkinsConfig[type]);
};
/**
 * @description: 触发jenkins流水线
 */
const buildJenkins = async ({ type, job, params }) => {
  const jenkinsCallback: any = await new Promise((resolve) => {
    getJenkins(type).job.build(
      { name: job, parameters: params },
      (err: any, data: any) => {
        if (err) {
          console.log("err: ", err);
          throw err;
        }
        resolve({ queueId: data });
      }
    );
  });
  return { data: jenkinsCallback };
};
/**
 * @description: 获取当前节点信息
 */
const getQueuedInfo = async ({ type, queueId }) => {
  const jenkinsCallback: any = await new Promise((resolve) => {
    getJenkins(type).queue.item(queueId, (err: any, data: any) => {
      if (err) {
        console.log("err---->", err);
        throw err;
      }
      resolve(data);
    });
  });
  return { data: jenkinsCallback };
};
/**
 * @description: 获取当前构建信息
 */
const getJenkinsInfo = async ({ type, job, buildNumber }) => {
  console.log(type, job, buildNumber);
  const jenkinsCallback: any = await new Promise((resolve) => {
    getJenkins(type).build.get(job, buildNumber, (err: any, data: any) => {
      console.log("data: ", data);
      console.log("err: ", err);
      if (err) {
        console.log("err---->", err);
        throw err;
      }
      resolve(data);
    });
  });
  const { statusCode } = jenkinsCallback;
  if (jenkinsCallback && statusCode !== 404) {
    return { data: jenkinsCallback };
  } else {
    return { data: jenkinsCallback };
  }
};
/**
 * @description: 获取jenkins console.log 信息
 */
const getJenkinsConsole = async ({ type, job, buildId }) => {
  const jenkinsCallback: any = await new Promise((resolve) => {
    getJenkins(type).build.log(job, buildId, (err: any, data: any) => {
      if (err) {
        return console.log("err---->", err);
      }
      resolve(data);
    });
  });
  return { data: jenkinsCallback };
};

export default {
  buildJenkins,
  getQueuedInfo,
  getJenkinsInfo,
  getJenkinsConsole,
};

Вышеприведенное является базовой инкапсуляцией Jenkins, которая просто инкапсулирует некоторые из методов, которые нам нужно использовать.Конкретная настройка может быть разработана в сочетании с бизнесом.

Строительство бизнеса на каждом конце, вы можете выбратьНесколько проектов Дженкинсаилиразные работыЧтобы отличиться, не рекомендуется сразу бить работу в черный цвет, поэтому сценарий будет очень сложным.

На самом деле человек, у которого есть работа до черного, уважаю тебя за то, что ты мужчина

// Controller
import { Post, Prefix, Get } from "egg-shell-decorators";
import BaseController from "./base";
@Prefix("build")
export default class BuildController extends BaseController {
  /**
   * @description: 创建构建任务
   */
  @Post("/creatJob")
  public async getUserToken({
    request: {
      body: { params },
    },
  }) {
    const { ctx, app } = this;
    const { access_token: accessToken } = this.user;
    const {
      projectId,
      branchName,
      projectVersion,
      buildPath,
      type,
      cache,
    } = params;
    const project = await ctx.service.project.getProject({ projectId });
    let projectGitPath = project.projectUrl.replace(
      "http://",
      `https://oauth2:${accessToken}@`
    );
    const callBack = await ctx.service.build.buildProject({
      type,
      projectName: project.projectGitName,
      projectVersion,
      projectGitPath: `${projectGitPath}.git`,
      branchName,
      buildPath,
      cache,
    });
    this.success(callBack);
  }
}

// Service 
import { Service } from "egg";
export default class Build extends Service {
  /**
   * @description: 构建项目
   */
  public async buildProject({
    type = "h5",
    projectName,
    projectVersion,
    projectGitPath,
    branchName,
    buildPath,
    cache,
  }) {
    const { ctx } = this;
    const callBack = await ctx.helper.api.jenkins.index.buildJenkins({
      type,
      job: "fe-base-h5",
      params: {
        PROJECT_NAME: projectName,
        PROJECT_VERSION: projectVersion,
        PROJECT_GIT_PATH: projectGitPath,
        BRANCH_NAME: branchName,
        BUILD_PATH: buildPath,
        CACHE: cache,
      },
    });
    return callBack;
  }
}

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

Как показано на рисунке выше, Jenkins объединяется с системой управления проектами для облегчения операций пользователей.

Построить информационный толчок

Внешний опрос

Вы можете напрямую использовать возвращенный идентификатор очереди для опроса Jenkins Api, чтобы получить информацию напрямую.

преимущество:жестокий, простой, самая быстрая скорость разработки, более быстрая

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

Фоновый опрос + сокет

Фон узла опрашивает Jenkins Api напрямую через queueId и отправляет его на интерфейсный дисплей через веб-сокет.

Преимущества: агрессивный, умеренная скорость разработки, умеренная сложность, даже если пользователь покидает страницу, данные все еще могут храниться в базе данных и могут быть переданы нескольким пользователям одновременно.

Недостатки: Увеличивается потребление производительности фона Node, фронт и фон нужно разрабатывать вместе, нужно хранить большое количество бесполезных сообщений, а узлы не могут воспринимать

webhook + socket

Node открывает интерфейс веб-перехватчика, и конвейер Jenkins отправляет сообщения в фоновый режим Node на каждом этапе, а затем отправляет их на интерфейсный дисплей через сокеты.

Преимущества: максимальная экономия ресурсов и возможность настройки эффективного восприятия данных и узлов с максимальной своевременностью.

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

Студенты могут выбрать недорогой и высокодоходный способ сотрудничества с разработкой в ​​реальном процессе разработки.

Лучший способ не обязательно является вашим лучшим выбором, наиболее важным является эффективность затрат.

предложение

Студенты, которые читают этот блог с первой статьи, если команде не хватает подходящего управления проектами или они хотят попрактиковаться в узле, вы можете попробовать его.Как правило, я разместил ключевой код прямо в блоге (большую часть копии просто можно использовал).

Глава строительства официально открыт, и сообщение в блоге главы строительства будет постепенно запускаться на более позднем этапе, что может быть более склонно к развитию эксплуатации и технического обслуживания.Если передние студенты борются, они могут попросить обратно - конец или эксплуатации и обслуживания студентов за советом.

Передняя часть, которая не берет на себя работу всех, не является хорошей передней частью, ручная собачья голова.

Полный спектр сообщений в блоге

внутренний модуль

  1. DevOps — использование Gitlab Api (завершено, нажмите, чтобы перейти)
  2. DevOps — создание базовой платформы DevOpsБазовая конструкция платформы, часть 1 | Базовая конструкция платформы, часть II | Базовая конструкция платформы Далее
  3. DevOps — сборка конвейера Gitlab CI
  4. DevOps — Jenkins Pipeline Builds
  5. DevOps — использование Docker
  6. DevOps — проектирование задач по выпуску
  7. DevOps — проверка кода застряла
  8. DevOps — мониторинг качества обслуживания узлов

Интерфейсный модуль

  1. DevOps — основные шаблоны H5
  2. DevOps — разработка React-проектов

Вышеуказанная серия может быть скорректирована позже в соответствии с фактическим ходом разработки проекта DevOps.

конец

Этот проект разработан с нуля, и последующая серия блогов будет запущена в соответствии с фактическим ходом разработки (TMD действительно устал), После того, как проект будет завершен, он откроет часть исходного кода для справки выпускников.

Почему часть исходного кода открыта, потому что некоторые бизнесы нужно разрабатывать в соответствии с реальным проектом, а открытые публичные модули написаны аккуратно.

Для того, чтобы написать серию блогов, я фактически сломал всю систему (не обычный уставший(Нравится, подписывайтесь, делайте репост).

Если у вас есть какие-либо вопросы по содержанию статьи, пожалуйста, оставьте сообщение