1 安装jdk和maven,并配置环境变量 vi /etc/profile
M2_HOME=/usr/local/maven3
JAVA_HOME=/usr/local/jdk1.8
JRE_HOME=/usr/local/jdk1.8/jre
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:/usr/local/git/bin:$M2_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH M2_HOME PATH
2 安装git
2.1 git本地安装
# 下载git2.17.0到本地文件
#安装依赖
yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
#删除yum安装git
yum remove git
#入解压后的文件夹,命令 cd git-2.17.0 ,然后执行编译,命令为
make prefix=/usr/local/git all
#安装Git至/usr/local/git路径
make prefix=/usr/local/git install
#打开环境变量配置文件,命令 vim /etc/profile ,在底部加上Git相关配置信息
PATH=/usr/local/git/bin:$PATH
#查看安装的git版本
git --version
- git常用命令
git config --global user.name "admin"
git config --global user.email "[email protected]"
2.2 在线安装
# 先将原本的git卸载了
[root@node1 ~]# rpm -qa|grep git
net-tools-2.0-0.25.20131004git.el7.x86_64
crontabs-1.11-6.20121102git.el7.noarch
linux-firmware-20200421-80.git78c0348.el7_9.noarch
[root@node1 ~]# yum remove -y crontabs-1.11-6.20121102git.el7.noarch linux-firmware-20200421-80.git78c0348.el7_9.noarch
[root@node1 ~]# rpm -qa|grep git
net-tools-2.0-0.25.20131004git.el7.x86_64
# 安装git
[root@node1 ~]# yum -y install git
[root@node1 ~]# rpm -qa|grep git
net-tools-2.0-0.25.20131004git.el7.x86_64
git-1.8.3.1-23.el7_8.x86_64
# 创建Jenkins的映射目录
[root@node1 ~]# mkdir -p /usr/local/jenkins/workspace
# 创建Jenkins容器并运行
docker run -uroot -d --restart=always -p 9001:8080 \
-v /usr/local/jenkins/:/var/jenkins_home/ \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/git:/usr/bin/git \
-v /usr/local/jdk1.8/:/usr/local/jdk1.8/ \
-v /usr/local/maven3/:/usr/local/maven3/ --name jenkins jenkins/jenkins:2.356
bf5659973f89a77dd6b3cefa6c250679437cc3f153a60d3042cf62ded0f7e2c5
[root@node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bf5659973f89 jenkins/jenkins:lts "/sbin/tini -- /usr/…" About a minute ago Up About a minute 50000/tcp, 0.0.0.0:9001->8080/tcp, :::9001->8080/tcp jenkins
a8eac9ac773b gitlab/gitlab-ce "/assets/wrapper" About an hour ago Up About an hour (healthy) 0.0.0.0:7003->22/tcp, :::7003->22/tcp, 0.0.0.0:7002->80/tcp, :::7002->80/tcp, 0.0.0.0:7001->443/tcp, :::7001->443/tcp gitlab
# 配置libpcre.so.3的软连接并生成Jenkins的秘钥和公钥
[root@node1 ~]# docker exec -it -uroot jenkins /bin/bash
root@bf5659973f89:/# git
git: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory
root@bf5659973f89:/# ldd $(which /usr/bin/git)
linux-vdso.so.1 (0x00007ffd5c0b1000)
libpcre.so.1 => not found
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f62ce68b000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f62ce669000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f62ce4a4000)
/lib64/ld-linux-x86-64.so.2 (0x00007f62ce6ad000)
root@bf5659973f89:/# cd /lib/x86_64-linux-gnu/
root@bf5659973f89:/lib/x86_64-linux-gnu# ln -s libpcre.so.3 libpcre.so.1
root@bf5659973f89:/lib/x86_64-linux-gnu# ssh-keygen -t rsa -C "root"
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:sNKM/ch97SBbKP8L/eCK3ip07qPQIVQWZ21Y737knAk root
The key's randomart image is:
+---[RSA 3072]----+
| +.o+. |
| o o. o. |
| . .. . |
| . = o . |
| . + = S E . |
| o.+.+ + * o |
| ...o+ * B B |
| .. o= B * |
| .==o=o+.o |
+----[SHA256]-----+
root@bf5659973f89:/lib/x86_64-linux-gnu# cd
root@bf5659973f89:~# cd /root/.ssh/
root@bf5659973f89:~/.ssh# ls
id_rsa id_rsa.pub known_hosts
root@bf5659973f89:~/.ssh# cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCtCOXBcIb6piqYG5o41eQkPwhsxr6Zu7/uZhopfKfleAL4/h9FdXNumLeVGzPUf6Zpub+Ei7AcMjX6jZvGuaWNwlHzFRIEOYk3HvDWkYxcsjA/j/NMANveEKPcK6j9W8PR5idJTN8AC1U6nDy2YYoioLsCMmJT/qydNdLe9nB+5k0i59J2l/eCXTVv3j2qpP1L9AvEFamlpHYEYhOtqeBlnANPl4sgcSmaBLpOh9XJcolZ64BVSAo6w36gvRMc48/dFUcbO3rY5K+aCbDhB6m2BkukmpHBkIpf5u/xKyuqrN6EryxHqVUpL3WBvvGfCnCRphfpm4LXwXzgAJuAIoTSi5SRU22y/oJ8rcbpXiYhqlUHIPdSV/xDei0q9+1fRABLNEadPVCetC2+UxRsQnFAXGxkcomj4BVht7jI6MNM+02h/nx1FkqxKYVVT7w8avMXky+A020FVNjhKMu9JQthZz21uguDIP4btHj0dr8arV6cHh07ItEh0EEnK23FMpE= root
3 docker安装nexus
Nexus([ˈneksəs]) 是一个强大的 Maven 仓库管理器,它极大地简化了自己内部仓库的维护和外部仓库的访问。利用 Nexus 你可以只在一个地方就能够完全控制访问 和部署在你所维护仓库中的每个 Artifact
- 创建映射目录
mkdir -p -m 777 /home/nexus
- docker安装
docker run -d --name nexus --restart always --net=host --privileged -v /home/nexus:/nexus-data sonatype/nexus3
默认端口为8081
- admin账号,初始化密码文件
cat /home/nexus/admin.password
-
增加aliyun代理仓库,创建一个仓库
阿里云代理,从maven-public拉取依赖就可以走阿里云先拉提高速度
点击“create repsitory”按钮,弹出窗口
-
创建aliyun仓库信息
-
修改maven-public的一个顺序位置
-
maven-release默认是不可以多次deploy的,为了方便,这里也可以修改配置为Allow redeploy
- 修改maven的配置文件settings.xml
alimaven
admin
12345678
alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
central
- 修改springcloud项目的pom.xml文件
# 添加拉取仓库地址、插件地址和上传仓库地址
alimaven
http://192.168.101.138:8081/repository/maven-public/
true
always
always
true
alimaven
http://192.168.101.138:8081/repository/maven-public/
always
true
always
true
alimaven
http://192.168.101.138:8081/repository/maven-releases/
alimaven
http://192.168.101.138:8081/repository/maven-snapshots/
4 创建方式maven jar仓库
创建一个maven-repo仓库,类型为Mixed,Allow redeploy
5 docker镜像私服仓库
5.1 新建docker-central仓库阿里云代理
5.2 新建docker-repo仓库,用于上传镜像
这样就可以使用192.168.101.138:8082来进行镜像的上传或者拉取
5.3 新建docker-public组,用于拉取镜像
5.4 设置docker的deamon.json文件
- 打开docker配置文件
vi /etc/docker/daemon.json
- 添加内容
"insecure-registries":["192.168.101.138:8082","192.168.101.138:8083"]
- 重启docker
systemctl restart docker
-
测试8082和8083端口是否能够连通
docker登录之后,就可以进行相应的私服的拉取和上传操作了
6 docker安装sonarqube8.9
6.1 docker安装postgis12
sonarqube:8.9.8-community版本postgreSQL数据的版本为:9–12。最高支持13版本。
docker pull postgres:12.4-alpine
# 安装postgresql数据库
docker run --name postgresql -e POSTGRES_USER=root --restart always -e POSTGRES_PASSWORD=12345678 -p 5432:5432 -v /data/postgresql/data:/var/lib/postgresql/data -d postgres:12.4-alpine
# 在root用户下创建sonar库
5.5 Nexus手动添加jar
-
选中maven-releases
-
点击“upload component”按钮准备上传本地jar
-
填写必填项,完成上传
6.2 docker安装sonarqube8.9.8
- 拉取sonarqube8.9.8镜像
docker pull sonarqube:8.9.8-community
- 创建sonarqube容器
docker run -d --name sonarqube \
--restart always \
-p 9000:9000 \
-v /data/sonarqube/data:/opt/sonarqube/data \
-v /data/sonarqube/extensions:/opt/sonarqube/extensions \
-v /data/sonarqube/bundled-plugins:/opt/sonarqube/lib/bundled-plugins \
-e SONARQUBE_JDBC_URL=jdbc:postgresql://192.168.232.129:5432/sonar \
-e SONARQUBE_JDBC_USERNAME=root \
-e SONARQUBE_JDBC_PASSWORD=12345678 \
sonarqube:8.9.8-community
- 浏览器访问sonarqube
访问地址:http://localhost:9000/
默认账号:admin:admin
7 docker安装registry
registry能有效保护内部代码, 防止放到公网泄漏出去;
- 拉取 registry 镜像
docker pull registry:2
- 创建registry容器
docker run -d \
--restart=always -p 5000:5000 \
--name registry -v /usr/local/docker/data/registry:/var/lib/registry registry:2
- 修改 daemon.json 文件
# 编辑文件 /etc/docker/daemon.json
# insecure-registries 表示私服的路径
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries":["192.168.1.235:5000"]
}
- 重新加载 daemon 文件&重启 docker
systemctl daemon-reload
systemctl restart docker
- 浏览器验证是否成功
http://192.168.101.145:5000/v2/
http://192.168.101.145:5000/v2/_catalog
8 docker安装gitlab
- 获取 gitlab 镜像包
docker pull gitlab/gitlab-ce
- 准备 gitlab 工作目录
# 创建 config 目录
mkdir -p /usr/local/gitlab/config
# 创建 logs 目录
mkdir -p /usr/local/gitlab/logs
# 创建 data 目录
mkdir -p /usr/local/gitlab/data
- 启动 GitLab
docker run --detach \
--privileged=true \
--hostname 192.168.101.145 \
--publish 7001:443 --publish 7002:80 --publish 7003:22 \
--name gitlab --restart always \
--volume /usr/local/gitlab/config:/etc/gitlab \
--volume /usr/local/gitlab/logs:/var/log/gitlab \
--volume /usr/local/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce
参数名称 | 参数说明 |
---|---|
detach | 指定容器运行于前台还是后台 |
hostname | 指定主机地址, 如果有域名可以指向域名 |
publish | 指定容器暴露的端口,左边的端口代表宿主机的端口, 右边的是代表容器的端口 |
name | 给容器起一个名字, |
restart always | 重启, 只要 docker 自动重启, 容器就会自动重启.减少人工重启工作。 |
volume | 数据卷, 在 docker 中是最重要的一个知识点. |
--privileged=true | 解 决 Docker 挂 载主 机目 录 Docker 访 问出 现 cannot open directory .:Permission denied |
- 修改 gitlab.rb 配置文件
external_url 和 gitlab_rails 这两个 ip 参数, 建议固定操作系统的静态不变的 IP 或说是域名进行配置, 假设 IP 变得的话在 GitLab 新建项目的时候, 生成的 IP 还是原来的 IP, 此时就无法推送代码在 Gitlab里面。
宿主机路径: /usr/local/gitlab/config/gitlab.rb
external_url 'http://192.168.101.145'
gitlab_rails['gitlab_ssh_host'] = '192.168.101.145'
gitlab_rails['gitlab_shell_ssh_port'] = 7003
- 去 gitlab 容器重启服务
由于运行是使用数据卷参数进行运行的, 宿主机的 gitlab.rb 文件修改了, gitlab 容器里面的文件会跟着改, 但是容器的文件不会跟着生效, 必须要进去容器里面进行命令执行
# 进去 gitlab 容器的命令
docker exec -it gitlab /bin/bash
# 重置 gitlab 客户端的命令,执行命令后,按ctrl+p,ctrl+q退出
gitlab-ctl reconfigure
- 在容器中修改gitlab密码
# 出现这个界面说明安装成功,接下来需要进到容器里重置密码
[root@node1 ~]# docker exec -it gitlab /bin/bash
root@192:/# gitlab-rails console -e production
--------------------------------------------------------------------------------
Ruby: ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]
GitLab: 14.4.1 (1a23d731c9f) FOSS
GitLab Shell: 13.21.1
PostgreSQL: 12.7
--------------------------------------------------------------------------------
Loading production environment (Rails 6.1.4.1)
irb(main):001:0> user = User.where(id: 1).first
=> #
irb(main):002:0> user.password = '12345678'
=> "12345678"
irb(main):003:0> user.password_confirmation = '12345678'
=> "12345678"
irb(main):004:0> user.save!
Enqueued ActionMailer::MailDeliveryJob (Job ID: 5f22b4b1-1534-482a-88c1-40b8a947cf2d) to Sidekiq(mailers) with arguments: "DeviseMailer", "password_change", "deliver_now", {:args=>[#>]}
=> true
# 重置密码成功,密码为:12345678,接下来重新访问网址,用户:root;密码:12345678
- 重启 gitlab 容器命令
docker restart gitlab
- 浏览器输入地址
http://192.168.101.145:7002
- 修改初始化密码
# 用户名 root
cat /usr/local/gitlab/config/initial_root_password
9 docker安装Jenkins
- 拉取jenkins镜像
docker pull jenkins/jenkins:2.356
- 创建jenkins容器
- docker 脚本安装, 指定 Jenkins 默认路径/root/.jenkins/workspace 拉取代码的路径同步到
宿主机路径/usr/local/jenkins/workspace. - 由于 jdk 和 maven,git 都在宿主机, 所以要 v(数据卷参数) 指定 jenkins 容器的路径把
宿主机的软件同步到容器
docker run -uroot -d --restart=always -p 9001:8080 \
-v /usr/local/jenkins/:/var/jenkins_home/ \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/git:/usr/bin/git \
-v /usr/local/jdk1.8/:/usr/local/jdk1.8/ \
-v /usr/local/maven3/:/usr/local/maven3/ --name jenkins jenkins/jenkins:2.356
命令 | 描述 |
---|---|
-d | 后台运行容器,并返回容器ID |
-p 9001:8080 | 将容器内8080端口映射至宿主机9095端口,这个是访问jenkins的端口 |
--name jenkins | 设置容器名称为jenkins |
- 浏览器输入网址 http://192.168.101.145:9001
- 设置密码
# 进入 Jenkins 容器
docker exec -it jenkins /bin/bash
# 查看密码
cat /usr/local/jenkins/secrets/initialAdminPassword
- 设置国内源
升级站点网址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
# 修改配置文件,/var/jenkins_home/updates目录
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
- 重启jenkins服务
浏览器中输入: http://192.168.101.145:9001/restart
- docker启动出现Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?错误
# 检查/etc/docker/daemon.json 配置文件内容是否正确
# 视图重启服务
systemctl daemon-reload
# 重启docker服务
systemctl restart docker.service
- 安装如下插件
SSH 用于 SSH 连接服务器
Publish Over SSH 用于 SSH 发布
Maven Integration 用于maven集成
git
pipeline
10 开发环境与gitlab实现免密登录
- 在开发环境的git bash中输入命令
# 使用ssh-keygen -t rsa -C "root" 生成Windows本机秘钥和公钥
- 复制C:\Users\Administrator.ssh路径下公钥文件
id_rsa.pub
-
打开gitlab添加ssh
- 配置libpcre.so.3的软连接并生成Jenkins的秘钥和公钥
docker exec -it -uroot jenkins /bin/bash
# 容器内生成ssh key
ssh-keygen -t rsa -C "root"
cd /root/.ssh/
# 目录下文件如下
id_rsa id_rsa.pub
-
到这里就将这个SSH公钥添加到gitlab上,之后做项目拉取
11 配置jenkins全局凭证
使用pipeline结合gitlab拉取代码时,需要在jenkins上配置gitlab的用户名密码,为全局ID,以便使用
-
选择“Manage Credentials”项
-
在“全局”按钮处,点击并选中“添加凭证”按钮
-
输入用户名和密码
-
在“系统配置”中设置SSH远程主机
-
配置SSH远程主机信息
-
配置GitLab所在主机信息
12 全局工具配置
-
配置maven
-
配置jdk
-
配置git
-
本地maven配置
13 添加dockerfile文件
-
当前项目下创建docker目录,在docker目录下创建Dockerfile文件
-
项目打包
- 编写Dockerfile文件
FROM java
WORKDIR /home
ADD /apptest1.jar //
ENTRYPOINT ["java","-jar","/apptest1.jar"]
CMD ["java","-version"]
-
提交项目到gitlab
出现错误:Push main to origin/main was rejected by remote
默认 master 分支是处于被保护状态下的,develop 角色是没有权限提交到 master 分支的。这是全局配置的分支保护
14 项目在Jenkins自动化部署
-
新建项目
-
创建maven构建项目
-
配置git源码管理
-
post steps
#/bin/bash
echo "进入项目..."
cd /usr/local/jenkins/workspace/hellospringboot
echo "停止已有容器..."
docker stop apptest1
echo "删除已有容器..."
docker rm apptest1
echo "删除已有镜像..."
docker rmi ping/apptest1
echo "制作镜像..."
docker build -f Dockerfile -t ping/apptest1 .
echo "启动容器..."
docker run -p 8001:8001 --name apptest1 -d ping/apptest1
echo "自动部署完成..."