В этой статье объясняется, как использоватьDocker+Jenkins
выполнитьGo
Непрерывная интеграция для языковых проектов.
Сначала поговорим об общей идее реализации:
推送代码至Git服务器 => 触发Jenkins服务器配置的Git Web Hooks => 从Git服务器中pull或clone代码 => 将代码编译成二进制可执行文件 => 构建docker镜像 => 上传docker镜像至镜像仓库 => 从Jenkins服务器进入远程应用服务器 => 从docker镜像仓库中拉取镜像 => 停止并删除该项目正在运行的docker容器 => 使用该新镜像构建并启动docker容器 => 删除其他旧版本镜像 => 完成
Затем поговорим о некоторых технических моментах, используемых в процессе практики:
-
Docker
использовать
Docker
Основные причины заключаются в том, что приложение легко трансплантировать, и оно может эффективно решать экологические проблемы, вызванные развертыванием одного и того же приложения на разных серверах. -
Docker Compose
docker-compose
такжеDocker
Предоставляется инструмент командной строки, который в основном используется здесь для упрощенияJenkins
Работа контейнера на сервере, не более того, можно использовать напрямуюshell
сценарий вместо этого. -
Jenkins
Jenkins
это сервер автоматизации, который также можно использовать как простойCI/CD
сервер. -
Git
Git
Предположительно все знакомы с ним, он также используется здесь как склад управления кодом проекта, и егоWeb Hooks
, в видеJenkins
Триггеры для сборки задач. -
зеркальный репозиторий
Здесь мы выбираем контейнерный сервис, предоставляемый Alibaba Cloud, в качестве нашего репозитория изображений, и вы можете выбрать свой собственный подходящий репозиторий образов.
В конце статьи перечислены проблемы, которые могут возникнуть в процессе практики, и приведено практическое использование.Go
Репозиторий кода проекта.
Установить Дженкинс
Запустить контейнер Jenkins
-
Потяните зеркало Jenkins
docker pull jenkins/jenkins:latest
-
Напишите файл docker-compose.yml
version: "2" services: jks: image: jenkins/jenkins:latest ports: - 8080:8080 - 50000:50000 volumes: - /data/jenkins:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock - /bin/docker:/bin/docker container_name: jks user: root
-
Создать для маунта
/data/jenkins
папку и измените владельца папки на пользователя с ID=1000mkdir -p /data/jenkins chown -R 1000:1000 /data/jenkins
-
Запустите контейнер jenkins с помощью docker-compose
docker-compose -f /data/compose/docker-compose.yml up -d jks
Установите плагин Дженкинс
-
Введите в браузере
http://IP:8080
Введите страницу управления Дженкинсом -
по команде
cat /data/jenkins/secrets/initialAdminPassword
Получите начальный пароль, разблокируйте Jenkins и пропустите установку плагина после разблокировки (не нужно беспокоиться об отсутствии рекомендуемых плагинов, в последующем процессе установки плагина все плагины, рекомендованные после разблокировки, будут установлены автоматически) -
(Необязательно) Измените файл конфигурации и перезапустите контейнер Jenkins, чтобы ускорить установку плагина.
# 编辑jenkins配置文件 vim /data/jenkins/updates/default.json # 执行ex命令, 替换所有插件下载URL :1,$s/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g # 执行ex命令, 替换连接测试URL :1,$s/http:\/\/www.google.com/https:\/\/www.baidu.com/g # 重启jenkins容器 docker-compose -f /data/compose/docker-compose.yml restart jks
-
Входить
Jenkins -> Plugin Manager
Установите следующие плагины на страницу- Localization: Chinese (Simplified)
- Publish Over SSH
- Gitee
- Go
Настроить Дженкинс
Глобальная конфигурация инструмента
ВходитьJenkins -> 系统管理 -> 全局工具配置
страница, даGit
иGo
Сделать соответствующую конфигурацию
Конфигурация дома
в установленномGitee 插件
под предлогом вступленияJenkins -> 系统管理 -> 系统配置
,оказатьсяGitee 配置
, настройте его, содержимое после настройки примерно такое:
Настроить публикацию через SSH
в установленномPublish over SSH 插件
под предлогом вступленияJenkins -> 系统管理 -> 系统配置
,оказатьсяPublish over SSH
конфигурации, как показано на следующем рисунке:
Passphrase: Зашифрованный пароль, используемый при генерации ключа, если он пуст, значит нет
Path to key: расположение сгенерированного закрытого ключа, которое совпадает сKey
Требуется только один из вариантов
Key: содержимое сгенерированного закрытого ключа, такое же, какPath to key
Требуется только один из вариантов
Name: Имя ремарки удаленного сервера (настраиваемое)
Hostname: адрес удаленного сервера
Username: имя пользователя удаленного сервера
Remote Directory: Расположение после входа на удаленный сервер
Существует два основных метода настройки: первый — напрямую использовать учетную запись и пароль удаленного сервера, а второй — использовать ключ.
-
Метод пароля учетной записи
Использование метода пароля учетной записи не требует настройки параметров, связанных с открытым и закрытым ключами.
SSH Server
содержимое для настройки и нажмите高级
Кнопка, проверитьUse password authentication, or use a different key
и введите пароль, соответствующий пользователю удаленного сервера.Passphrase / Password
, нажмите ниже, когда закончитеTest Configuration
кнопку для проверки соединения. -
ключевой метод
-
Войдите в контейнер Jenkins
docker exec -it jks /bin/bash
-
сгенерировать ключ
ssh-keygen -t rsa
-
Скопируйте открытый ключ на удаленный сервер
ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.56.101
-
настроить
Path to key
Значение параметра/root/.ssh/id_rsa
-
настроить
SSH Server
-
тест соединения
-
построить задачу
-
нажмите
Jenkins -> 新建任务
создать задачу Дженкинса -
General
Заполнить проект
Gitee 链接
и проверить丢弃旧的构建
. -
управление исходным кодом
выберите
Git
варианты, заполнитеRepositories
информацию и создаватьGitee 账号密码凭据
. -
триггер сборки
чек
Gitee webhook 触发构建
, выберите в соответствии с вашими потребностями允许触发构建的分支
, а нижеGitee WebHook 密码
Опции справа, нажмите生成
кнопка, спусковой крючокWebHook URL
иWebHook 密码
ЗаполнитеGitee WebHooks管理
середина. -
среда сборки
в установленном
Go 插件
под посылкой выберитеSet up Go programming language tools
Поле параметров и введите номер версии Go, используемый проектом под ним, как показано ниже: -
Построить
в
Jenkins
Возьмите контейнер в качестве примера, текущее местоположение во время сборки/var/jenkins_home/workspace/构建任务名
.Процесс строительства можно условно разделить на следующие этапы:
- использовать
go build
Скомпилируйте команду в двоичный исполняемый файл - выполнить заранее написанное
docker-push
скрипт, компилироватьdocker镜像
и загрузить вdocker仓库
# 1.编译生成可执行文件 go build -o app # 2.执行shell脚本,上传docker镜像 chmod +x docker-push && ./docker-push
Dockerfile
Содержимое файла следующее:FROM golang:1.14.2 COPY app . COPY conf/conf.toml ./conf/ ENTRYPOINT ["./app"]
docker-push
Содержание скрипта следующее:# 容器名 name=`cat version | awk '{print $1}'` # 容器标签 tag=`cat version | awk '{print $2}'` # 仓库域名 domain=registry-vpc.cn-shenzhen.aliyuncs.com # 仓库URL url=colehuang/coletest # 构建Docker镜像 docker build -t $name:$tag . # 获取镜像ID id=`docker images | grep $name | grep $tag | awk '{ print $3 }'` # 镜像上传至Docker镜像仓库 docker login --username=xxx --password=xxx $domain docker tag $id $domain/$url:$tag docker push $domain/$url:$tag
version
Содержимое файла следующее:gdd 1.1.2
- использовать
-
Действия после сборки
Процесс работы после сборки можно условно разделить на следующие этапы:
- в проекте
version
иdocker-pull
Передача файлов на удаленный сервер - войти
Publish over SSH
каталог удаленного сервера, настроенный и выполняемыйdocker-pull
сценарий, изdocker镜像仓库
Извлеките отправленную новую версию образа и используйте образ для созданияdocker容器
docker-pull
Содержание скрипта следующее:# 容器名 name=`cat version | awk '{print $1}'` # 容器标签 tag=`cat version | awk '{print $2}'` # 仓库域名 domain=registry.cn-shenzhen.aliyuncs.com # 仓库URL url=colehuang/coletest # 从Docker镜像仓库中拉取镜像 docker login --username=xxx --password=xxx $domain docker pull $domain/$url:$tag # 停止该镜像正在运行的Docker容器 line=`docker ps | grep $name` if [ -n "$line" ]; then echo "存在正在运行的$name容器, 正在使其停止运行..." docker stop $name echo "$name容器, 已停止运行" fi # 删除该镜像的Docker容器 line=`docker ps -a | grep $name` if [ -n "$line" ]; then echo "存在$name容器, 对其进行删除..." docker rm $name echo "$name容器, 已被删除" fi # 启动容器 docker run --rm --name $name -p 8008:8006 -d $domain/$url:$tag IFS=$'\n' # 删除多余镜像 images=`docker images | grep $domain/$url` for i in $images do echo $i t=`echo "$i" | awk '{print $2}'` if [ "$t" != "$tag" ]; then id=`echo "$i" | awk '{print $3}'` docker rmi $id fi done
- в проекте
-
почти готово
После выполнения всех вышеуказанных конфигураций, когда код размещается локально
push
прибытьGit 远程仓库
, это вызоветGit WebHooks
, чтобы автоматически реализовать автоматическое обновление и развертывание серверного проекта.
Краткое содержание
Как использовать эту статьюDocker
комбинироватьJenkins
выполнитьGo
Кратко объясняется непрерывная интеграция языковых проектов, а в конце я расскажу о моментах, на которые необходимо обратить внимание в процессе практики.
первый вJenkins服务器
передайgit pull
Когда команда извлекает код удаленного репозитория, если это частный репозиторий, вам может потребоваться ввестиGit
Учетная запись и пароль, метод, используемый здесь, заключается в установкеGit
способ глобальных переменных, ведение журналаGit
Номер счета и пароль.
git config --global credential.helper store
тогда последний构建后操作
В процессе у самого автора будет явление, когда удаленный серверdocker镜像仓库
При получении образа скорость извлечения низкая, и возникает тайм-аут, поскольку нет другого образа, от которого этот образ зависит локально на удаленном сервере. Решение этой проблемы может состоять в том, чтобы изменить период ожидания или вручную получить его с удаленного сервера.
Наконец, репозиторий кода, соответствующий содержимому демонстрационного проекта, прилагается:git ee.com/flowers/go-do…
Содержание, которое необходимо изменить на практике, может включать:
docker-push
В файле скрипта:domain
доменное имя склада,url
URL репозитория,docker login
Логин и пароль после команды
docker-pull
В файле скрипта: то же самоеdocker-pull
файл сценария,docker run
Номер отображаемого порта после команды
Наконец, спасибо за ваше терпение в чтении ~