Используйте Docker+Jenkins для реализации непрерывной интеграции языковых проектов Go.

Docker
Используйте Docker+Jenkins для реализации непрерывной интеграции языковых проектов Go.

В этой статье объясняется, как использовать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

  1. Потяните зеркало Jenkins

    docker pull jenkins/jenkins:latest
    
  2. Напишите файл 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
    
  3. Создать для маунта/data/jenkinsпапку и измените владельца папки на пользователя с ID=1000

    mkdir -p /data/jenkins
    chown -R 1000:1000 /data/jenkins
    
  4. Запустите контейнер jenkins с помощью docker-compose

    docker-compose -f /data/compose/docker-compose.yml up -d jks
    

Установите плагин Дженкинс

  1. Введите в браузереhttp://IP:8080Введите страницу управления Дженкинсом

  2. по командеcat /data/jenkins/secrets/initialAdminPasswordПолучите начальный пароль, разблокируйте Jenkins и пропустите установку плагина после разблокировки (не нужно беспокоиться об отсутствии рекомендуемых плагинов, в последующем процессе установки плагина все плагины, рекомендованные после разблокировки, будут установлены автоматически)

  3. (Необязательно) Измените файл конфигурации и перезапустите контейнер 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
    
  4. Входить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кнопку для проверки соединения.

  • ключевой метод

    1. Войдите в контейнер Jenkins

      docker exec -it jks /bin/bash
      
    2. сгенерировать ключ

      ssh-keygen -t rsa
      
    3. Скопируйте открытый ключ на удаленный сервер

      ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.56.101
      
    4. настроитьPath to keyЗначение параметра/root/.ssh/id_rsa

    5. настроитьSSH Server

    6. тест соединения

построить задачу

  1. нажмитеJenkins -> 新建任务создать задачу Дженкинса

  2. General

    Заполнить проектGitee 链接и проверить丢弃旧的构建.

  3. управление исходным кодом

    выберитеGitварианты, заполнитеRepositoriesинформацию и создаватьGitee 账号密码凭据.

  4. триггер сборки

    чекGitee webhook 触发构建, выберите в соответствии с вашими потребностями允许触发构建的分支, а нижеGitee WebHook 密码Опции справа, нажмите生成кнопка, спусковой крючокWebHook URLиWebHook 密码ЗаполнитеGitee WebHooks管理середина.

  5. среда сборки

    в установленномGo 插件под посылкой выберитеSet up Go programming language toolsПоле параметров и введите номер версии Go, используемый проектом под ним, как показано ниже:

  6. Построить

    в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
    
  7. Действия после сборки

    Процесс работы после сборки можно условно разделить на следующие этапы:

    • в проекте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
    
  8. почти готово

    После выполнения всех вышеуказанных конфигураций, когда код размещается локально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Номер отображаемого порта после команды

Наконец, спасибо за ваше терпение в чтении ~