首页 > 其他分享 >使用docker部署jenkins和gitlab

使用docker部署jenkins和gitlab

时间:2023-10-04 13:33:25浏览次数:56  
标签:容器 GitLab -- gitlab Jenkins jenkins docker

万字干货! 使用docker部署jenkins和gitlab

  万字干货! 使用docker部署jenkins和gitlab 万字原创文章! 本文将实现通过docker部署Jenkins与GitLab, 并自动化发布应用: 本地机器将代码推送到GitLab, GitLab通过web hook触发Jenkins流水线, Jenkins获取GitLab的代码并生成jar包, 将jar包推送到应用服务器, 并运行jar包.

阅读本文, 需要有基础的Git, Linux, Docker, Java, Maven, shell知识, 并最少有一台内存16G以上并已经安装好了Docker的机器.

1. 概述

Jenkins是是一个CI/CD工具, GitLab是一个类似与GitHub代码托管平台, 本文将实现通过docker部署Jenkins与GitLab, 并自动化发布应用: 本地机器将代码推送到GitLab, GitLab通过web hook触发Jenkins流水线, Jenkins获取GitLab的代码并生成jar包, 将jar包推送到应用服务器, 并运行jar包. 只需一个push操作, 即可自动发布应用.

综上, 我们需要三个容器, 一个Jenkins容器, 一个GitLab容器, 一个运行jar包的容器(本文称其为应用容器, 即运行java应用的容器), 以及还要有一台写Java代码的个人电脑. 部署容器的电脑(本文称其为服务器)可以是同一个个人电脑, 也可以是其他电脑或服务器, 部署容器的电脑的内存推荐16G以上, 因为GitLab比较吃内存, 配置不够可能带不动. 本文是一台个人电脑写代码, 一台服务器部署三个容器.

为了方便大家理解与阅读, 在个人电脑执行的命令, 其命令提示符为$$; 服务器的命令提示符为$; 容器内的命令提示符为>.

2. 容器互联

因为Jenkins需要从GitLab中拉取代码, Jenkins也需要向应用服务器上传jar包, 即容器间需要通信, 所以我们需要创建一个桥接网络, 将容器都部署在桥接网络上, 容器间就可以互联互通了.

通过下面的命令, 创建一个名为my-bridge的桥接网络:

  $ docker network create --driver bridge --subnet 172.12.0.0/16 --gateway 172.12.0.1 my-bridge

3. 应用容器

3.1 部署应用容器

执行下面的命令运行应用容器, 这里我们选择Ubuntu 20.04作为基础镜像, 使用其他的发行版也可以, 这里使用Ubuntu只是因为我对Ubuntu最了解.

  $ docker run --interactive --tty --detach \
  --name app \
  --hostname app \
  --restart on-failure \
  --network my-bridge \
  --publish 31022:22 \
  --publish 31808:8080 \
  --volume $PWD/app:/root/app \
  ubuntu:20.04

3.2 配置SSH

Jenkins向服务器传输jar包一般是通过SSH, 所以我们还需要在应用容器中安装SSH. 运行应用也需要java, 没装java也需要安装java.

  # 进入应用容器
  $ docker exec -it app bash
   
  # 修改apt源之前, 备份apt源
  > cp /etc/apt/sources.list /etc/apt/sources.list.org
   
  # 更换apt源(默认的apt源非常慢)
  > echo "
  deb http://archive.canonical.com/ubuntu focal partner
  deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
  deb http://mirrors.aliyun.com/ubuntu/ focal main restricted
  deb http://mirrors.aliyun.com/ubuntu/ focal multiverse
  deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted
  deb http://mirrors.aliyun.com/ubuntu/ focal-security multiverse
  deb http://mirrors.aliyun.com/ubuntu/ focal-security universe
  deb http://mirrors.aliyun.com/ubuntu/ focal universe
  deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted
  deb http://mirrors.aliyun.com/ubuntu/ focal-updates multiverse
  deb http://mirrors.aliyun.com/ubuntu/ focal-updates universe
  " > /etc/apt/source.list
   
  # 安装SSH和java
  > apt update && apt install -y openssh-server openjdk-8-jdk-headless

平时我们用的服务器, SSH一般都是开机自启动, 所以我们几乎不会去启动SSH, 但是容器中都没有SSH, 更别说开机自启了, 所以安装好之后还要启动SSH.

注意: 容器内一般直接使用root用户, 默认情况下SSH不允许root用户使用密码登录, 我们需要将PermitRootLogin yes加入到SSH配置文件中, 使root用户可以通过密码登录.

  # 备份ssh配置
  > cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org
   
  # 使root可以用密码登录
  > echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
   
  # 启动ssh
  > /sbin/sshd
   
  # 第一次启动可能会报错, 显示/run/sshd不存在, 不存在手动新建就好了
  > mkdir /run/sshd
   
  # 再次启动ssh
  > /sbin/sshd
   
  # 修改root密码
  > passwd

4. Jenkins

4.1 部署Jenkins

使用docker部署Jenkins, 我们当然需要Jenkins的容器, 但是请注意, jenkins有两个官方容器: jenkinsjenkins/jenkins. jenkins在2018年就已经弃用, 不再更新, 现在应该使用jenkins/jenkins, 现在大部分镜像的命名都采用组织名称/镜像名称的格式了.

使用如下命令来启动Jenkins:

  $ docker run --detach \
  --user root \
  --name jenkins \
  --hostname jenkins \
  --restart on-failure \
  --network my-bridge \
  --publish 37808:8080 \
  --publish 37500:50000 \
  --volume $PWD/jenkins:/var/jenkins_home \
  jenkins/jenkins:2.385

4.2 安装插件

启动Jenkins后, 使用浏览器输入服务器地址:37808进入Jenkins界面, 默认的用户为admin, 密码的话我们有两种方式知道密码

  • 网页会提示我们密码储存在/var/jenkins_home/secrets/initialAdminPassword, 所以我们查看这个文件就行了, 使用docker exec -t jenkins cat /var/jenkins_home/secrets/initialAdminPassword即不进入容器查看文件
  • Jenkins的启动日志中也有密码所在文件的路径以及密码, 使用docker logs jenkins查看Jenkins的日志, 也能找到密码

接下来选择安装推荐的插件就好了

然后点击右下角的使用admin账户继续

接下来我们还要做一些准备工作, 比如安装插件, 配置mavan, 配置ssh...... 配置好之后我们才会正式的构建项目.

进入主页后, 点击 Manage Jenkins -> Manage Plugins -> Available plugins, 安装以下三个插件:

  • Publish Over SSH
  • Maven Integration
  • Build Authorization Token Root


4.3 安装maven

Jenkins默认是没有maven的, 所以我们还需要安装maven, 使用docker exec -it jenkins bash进入到容器, 再查看下系统

  > cat /etc/*release
  PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
  NAME="Debian GNU/Linux"
  VERSION_ID="11"
  VERSION="11 (bullseye)"
  VERSION_CODENAME=bullseye
  ID=debian
  HOME_URL="https://www.debian.org/"
  SUPPORT_URL="https://www.debian.org/support"
  BUG_REPORT_URL="https://bugs.debian.org/"

这里使用的是Debian, 先换下apt源, 不然会很慢

  # 备份apt源
  > cp /etc/apt/sources.list /etc/apt/sources.list.org
   
  # 更换apt源
  > echo "
  deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
  deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
  deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
  deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
  " > /etc/apt/sources.list

然后执行apt update && apt install maven安装maven, 安装好后运行mvn -v查看maven版本, 有对应的输出说明已经安装好了

  # 注意, 此处显示了 Maven home
  > mvn -v
  Apache Maven 3.6.3
  Maven home: /usr/share/maven
  Java version: 11.0.17, vendor: Eclipse Adoptium, runtime: /opt/java/openjdk
  Default locale: en, platform encoding: UTF-8
  OS name: "linux", version: "3.10.0-1160.80.1.el7.x86_64", arch: "amd64", family: "unix"

4.4 配置maven

安装好之后, 还要告诉Jenkins安装好了Maven, 点击主页的 Manage Jenkins -> Global Tool Configuration -> Maven -> 新增Maven 新增一个maven

  • Name 只是一个标识, 可以随便取. 假如安装了多个版本的maven的话, 在Name上有所区分就好了
  • Maven home 填写mvn -v的输出
  • 取消勾选自动安装

4.5 配置远程服务器

远程服务器指的是, Jenkins构建好jar包之后, 上传jar到的服务器, 同样也需要配置, 在主页点击Manage Jenkins -> Configure System

找到 Publish over SSH, 点击新增

  • Name 随便取, 只是一个标识
  • Hostname 为应用服务器地址, 因为我们用的是docker桥接网络, 所以不需要输入IP, 直接填应用容器的名字即可
  • Username 为应用服务器用户名
  • Remote Directory 表示远程目录(应用服务器), 默认为/root,
  • 勾选上 Use password authentication, or use a different key, 不然没地方输密码
  • Passphrase/Password 表示应用服务器密码

右下角有个Test Connecttion, 可以测试连接, 能看到Success就说明配置没问题了

5. GitLab

5.1 部署GitLab

执行下面的命令运行GitLab容器. 请注意, 如果不使用默认的端口, 除了使用--publish映射端口外, 还需要在环境变量GITLAB_OMNIBUS_CONFIG中注明端口.

  $ docker run --detach \
  --env GITLAB_OMNIBUS_CONFIG="external_url='http://127.0.0.1:35080'; gitlab_rails['gitlab_ssh_host'] = '127.0.0.1'; gitlab_rails['gitlab_shell_ssh_port'] = 35022" \
  --memory 12GB \
  --memory-swap 16GB \
  --name gitlab \
  --hostname gitlab \
  --restart on-failure \
  --network my-bridge \
  --publish 35080:80 \
  --publish 35022:22 \
  --volume $PWD/gitlab/config:/etc/gitlab \
  --volume $PWD/gitlab/logs:/var/log/gitlab \
  --volume $PWD/gitlab/data:/var/opt/gitlab \
  gitlab/gitlab-ce:15.6.3-ce.0

5.2 配置GitLab

Gitlab启动需要几分钟, 启动好之后浏览器输入 http://服务器地址:35080 进入Gitlab的登录页面, 默认用户名为root, 密码通过docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password查看.

在主页点击 头像 -> Preferences -> SSH Keys 可以配置SSH密钥.

在主页点击 头像 -> Preferences -> Password 可以修改密码.

5.3 上传项目

GitLab配置好之后就可以推送代码了, 在推送代码前, 需要GitLab有对应的项目, 我们先来新建一个项目,
点击主页右上角加号 -> New project -> Create blank project新建一个项目.

接下来推送代码. 大家可以推送自己的项目; 我也准备了一个简单的Spring Boot项目, 地址为 https://github.com/yuanpeilin/spring-boot-demo, 项目比较简单, 就一个类, 访问URL:8080/hello就能返回当前时间.

这里比较简单不做过多描述, 唯一需要注意的是, 我给了一个GitHub地址, 如果用的是我的GitHub项目, 不注意的话推送到GitLab会失败, 因为从GitHub clone已经用了origin这个名字了, 推送到GitLab要换个名字, 下述三条命令中的origin随便改个名字, 把三条命令的origin改成一样的就行.

  $$ git remote add origin ssh://[email protected]:35022/root/gitlab-test.git
   
  $$ git remote set-url origin ssh://[email protected]:35022/root/gitlab-test.git
   
  $$ git push -u origin HEAD

6. 联动

6.1 手动触发Jenkins

在Jenkins主页点击 新建项目 -> 构建一个maven项目

接下来就到了配置界面模块

  • 源码管理要选择Git
  • Repository URL要填从GitLab复制来的HTTP形式URL, 例如http://gitlab/root/spring-boot-demo.git, 填完之后点击下空白的地方, 可能会有报错, 这是因为git仓库可能被设置为私有的, 要有权限才能访问
  • 点击下方的Credentials模块的添加GitLab的用户名和密码, 再次点击空白处, 红色的报错已经消失了


下一步配置post step模块, 这是在Jenkins构建好jar包后执行的操作, 点击Add post-build step选择Send build artifacts over SSH

  • SSH Server选择配置远程服务器配置的应用服务器, jar包会传到这个服务器上
  • Source files选择jar包相对路径, 用我的项目的话是target/spring-boot-demo-1.0.jar
  • Remove prefix填入target, 就会自动移除target目录, 之上传jar包, 不然传到应用服务器会将target目录也一起上传, 且jar包也在target目录下
  • Remote directory填入/app, 会在配置远程服务器配置的Remote Directory的基础上追加, 本文中最终的路径为/root/app/, jar包在应用服务器的路径为/root/app/spring-boot-demo-1.0.jar
  • Exec command填入 bash /root/app/start.sh, 这是在执行了上面的步骤后会执行的命令

在到应用容器中写入以下内容到 /root/app/start.sh

  #!/bin/bash
   
  BASE_HOME=/root/app
  JAR_NAME=spring-boot-demo-1.0.jar
  LOG_NAME=app.log
  # 停止应用
  ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}' | xargs -i kill {}
  # 备份日志
  if [ -f $BASE_HOME/$LOG_NAME ]; then
  mv $BASE_HOME/$LOG_NAME $BASE_HOME/$LOG_NAME.`date +%Y%m%d%H%M%S`
  fi
  # 备份jar包
  if [ -f $BASE_HOME/$JAR_NAME ]; then
  cp $BASE_HOME/$JAR_NAME $BASE_HOME/$JAR_NAME.`date +%Y%m%d%H%M%S`
  fi
  # 启动应用
  nohup java -jar $BASE_HOME/$JAR_NAME &>$BASE_HOME/$LOG_NAME &

点击保存后, 点击左边的立即构建, 再到浏览器里面输入 http://服务器地址/hello , 能看到返回了, 就说明应用已经启动好了.

6.2 通过GitLab自动出发Jenkins构建

点击Jenkins主页的 Item -> 配置 -> 构建触发器, 勾选上触发远程构建, 填入token, 随便填入一个值就可以, 这里设置为aabbcc

配置Token的下方提示了我们可以用JENKINS_URL/job/spring-boot-demo/build?token=TOKEN_NAME触发, 现在我们再开启一个无痕窗口, 输入服务器地址:37808/job/spring-boot-demo/build?token=aabbcc, 发现要登录?!

之前我们安装了一个Build Authorization Token Root插件, 这是因为默认情况下远程出发jenkins需要登录, 有了这个插件不需要登录也可以出发Jenkins构建. 再到浏览器开个无痕窗口, 根据这个插件的文档, 我们访问的地址与上面有所区别, 访问 http://服务器地址:37808/buildByToken/build?job=spring-boot-demo&token=aabbcc , 然后我们回到Jenkins会发现已经在构建项目了.

现在就简单了, 回到Gitlab, 在主页点击头像 -> Settings -> Web Hooks, 在URL中填入http://服务器地址:37808/buildByToken/build?job=spring-boot-demo&token=aabbcc, 并取消勾选 Enable SSL verification, 点击保存就可以了.

现在再随便改点代码, 执行git push 远程仓库名, 将代码推送到GitLab后, GitLab会自动往配置的地址发生请求, Jenkins就会出发构建, 构建好了后就会自动换包并重启应用, 至此, 大功告成!!!

7. 参考

  1. 【尚硅谷】Jenkins教程(从配置到实战) https://www.bilibili.com/video/BV1bS4y1471A/?p=16&share_source=copy_web&vd_source=1df973656734dfeb952c3969e308a1d1
  2. Build Authorization Token Root插件文档 https://plugins.jenkins.io/build-token-root/
  3. GitLab官方文档 https://docs.gitlab.com/ee/install/docker.html
  分类: Linux 好文要顶 关注我 收藏该文 王bourne
粉丝 - 1 关注 - 0
    +加关注 0 0     升级成为会员   « 上一篇: 如何设置一台新的云服务器? 以 CentOS7 为例
» 下一篇: 解决IDEA无法识别SpringBoot项目 posted @ 2023-01-11 22:14  王bourne  阅读(2182)  评论(1)  编辑  收藏  举报     弹尽粮绝,会员救园:会员上线,命悬一线 刷新页面返回顶部 登录后才能查看或发表评论,立即 登录 或者 逛逛 博客园首页   【推荐】阿里云-云服务器省钱攻略 :五种权益,限时发放,不容错过   <iframe data-google-container-id="1" data-load-complete="true" frameborder="0" height="250" id="google_ads_iframe_/1090369/C1_0" marginheight="0" marginwidth="0" name="google_ads_iframe_/1090369/C1_0" scrolling="no" style="border: 0; vertical-align: bottom" title="3rd party ad content" width="300"></iframe> 编辑推荐:
· 一个混乱千万级软件项目
· 新零售 SaaS 架构:面向中小连锁的 SaaS 系统整体规划
· 日常 Bug 排查-读从库没有原子性?
· 记一次 .NET 某拍摄监控软件 卡死分析
· 数据库连接池用不了,结果是防火墙的锅
阅读排行:
· 【故障公告】遭遇用心良苦的疯狂攻击:DDoS + CC攻击
· 本计划在 .NET 8 中推出的 WASI 推迟到 .NET 9
· 彻底弄懂ip掩码中的网络地址、广播地址、主机地址
· 上周热点回顾(9.25-10.1)
· Vue框架快速上手
 

标签:容器,GitLab,--,gitlab,Jenkins,jenkins,docker
From: https://www.cnblogs.com/fanwenyan/p/17742178.html

相关文章

  • dockerfile 由于公钥不可用,无法验证以下签名
    报错当我在打包docker镜像时,发生了报错$sudodockerbuild-tdcgm-exporter:3.2.5.1.772Thefollowingsignaturescouldn'tbeverifiedbecausethepublickeyisnotavailable:NO_PUBKEYA4B469963BF863CC……42.77W:GPGerror:https://developer.download.......
  • Jenkins List Git Branches插件 构建选择指定git分支
    ListGitBranchesParameter|JenkinspluginAddsabilitytochoosefromgitrepositoryrevisionsortagshttps://plugins.jenkins.io/list-git-branches-parameter/1、安装组件  ListGitBranches2、验证功能1)新建任务 2)新增构建参数 3)选择git仓库我这里选择gitee,其他......
  • gitlab安装
    #参考官网#1.Installandconfigurethenecessarydependenciessudoyuminstall-yhttps://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpmsudoyumcleanallsudoyummakecachesudoyuminstall-ypostfixcurlpolicycoreutils-pythonopenss......
  • docker 安装
    通过阿里云的DockerCE镜像源站进行安装.1.使用官方安装脚本自动安装(仅适用于公网环境):curl-fsSLhttps://get.docker.com|bash-sdocker--mirrorAliyun2.手动安装帮助(阿里云ECS可以通过内网安装,见注释部分内容):2.1Ubuntu14.04/16.04(使用apt-get进行安装):#step1......
  • jenkins教程:Publish Over SSH插件远程ssh执行命令
    PublishOverSSHjenkins构建完成后需要一键发布,结构如下A服务器svnB服务器jenkinsC服务器应用服务器B从A拉取代码后打包成war,然后向C服务器拷贝war包这里解决的就是远程拷贝问题1.首先安装jenkinsSSH插件打开Jenkins的“系统管理>管理插件”,选择“可选插件”,在输入框中输入“......
  • Docker V24 及 Docker Compose V2 的安装及使用
    前言Docker是一款流行的开源容器化平台,使用Docker可以有效地隔离应用程序和系统环境,使得应用程序在不同的环境中具有相同的行为DockerCompose是一个用于定义和管理多个Docker容器的工具Docker官方文档:文档地址DockerHub:容器镜像库和社区作者:易墨发布时间:2023.1......
  • 【Docker】镜像的创建、管理与发布
    镜像的获取镜像可以从以下方式获得:从远程镜像仓库拉取,可以是公有仓库,也可以是私有仓库从Dockerfile构建从文件导入(离线)从容器提交镜像的基本操作跟镜像相关的命令如下:$dockerimage--helpUsage:dockerimageCOMMANDManageimagesCommands:buildBuildanimage......
  • 【尚硅谷】Jenkins教程(从配置到实战)
    课程链接:01-Jenkins教程简介_哔哩哔哩_bilibili课程笔记:https://files.cnblogs.com/files/henuliulei/Jenkins.zip?t=1696162767&download=trueJenkinsJenkins,原名Hudson,2011年改为现在的名字。它是一个开源的实现持续集成的软件工具。官方网站https://www.jenkins.io/j......
  • Nginx简介与Docker Compose部署指南
    Nginx是一款高性能的开源Web服务器和反向代-理服务器,以其卓越的性能、可伸缩性和灵活性而闻名。它在全球范围内广泛用于托管Web应用程序、负载均衡、反向代-理和更多场景中。在本文中,我们将首先介绍Nginx的基本概念,然后演示如何使用DockerCompose轻松部署Nginx服务器。什么是Nginx......
  • 联想个人云开启Docker并安装常用的Docker
    联想个人云开启Docker并安装常用的Docker启用Docker利用联想个人云的远程协助功能开启SSH并提升普通用户权限后,可安装(开启Docker)新版的固件docker已经安装了,不知道出于什么原因没有启动:[~]#dockerimagelsCannotconnecttotheDockerdaemonatunix:///var/run/docker.s......