В этой статье объясняется, как использовать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-pushDockerfileСодержимое файла следующее: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:$tagversionСодержимое файла следующее: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доменное имя склада,urlURL репозитория,docker loginЛогин и пароль после команды
docker-pullВ файле скрипта: то же самоеdocker-pullфайл сценария,docker runНомер отображаемого порта после команды
Наконец, спасибо за ваше терпение в чтении ~