从零自动化部署CI/CD(Docker+nginx+gitlab+gitlab-runner)
linux服务器
已经有云主机的无视服务器安装步骤(建议最小2核4线程)
-
准备本地虚拟机系统为Centos7
-
centos下载地址 阿里Centos镜像站
-
虚拟机VMware14,吾爱破解下载安装。
(装系统怎么装就不多赘述了,很easy)
虚拟机网卡设置
本地虚拟机, 默认是访问不了网络的,所以需要进行配置。网络适配器选择NAT
模式,编辑网卡配置文件ONBOOT=yes
。
shell
# 编辑
vi /etc/sysconfig/network-scripts/ifcfg-ens33
接着把,ONBOOT=no
改成 ONBOOT=yes
,然后保存,接着运行下面的命令
shell
# 重启网络
systemctl restart network.service
# ping 一下,能通就证明虚拟可以访问网络了。
ping www.baidu.com
一些必须得配置和软件
- 吾爱破解去下载一个
Xshell
工具
服务器执行下面的命令
- net-tools: ifconfig 查看 ip 时需要
- vim: vi 的升级版 vim,文件编辑时候需要
shell
# 启用 ssh , 使用 Xshell 时需要
systemctl start sshd.service
# 安装相关依赖
yum -y install net-tools vim
# 重启系统,生效
reboot
本地虚拟机执行向命令 ifconfig
来查看服务器的IP
Xshell连接主机
准备系统环境
下载安装nodejs
检索并且安装指定版本的node(这里pub_16.x)就是你想要的版本可以替换。
shell
#通过这两个命令安装node
sudo yum install https://rpm.nodesource.com/pub_16.x/nodistro/repo/nodesource-release-nodistro-1.noarch.rpm -y
sudo yum install nodejs -y --setopt=nodesource-nodejs.module_hotfixes=1
#检查node有没有安装好
node -v
安装docker
linux
服务器使用curl
下载快速安装的shell
脚本
shell
curl -fsSL get.docker.com -o get-docker.sh
下载完成后,可以ls
命令查看一下。已经存在的话,使用sh
命令执行这个脚本
shell
sh get-docker.sh
注意如果不是root
用户,需要使用sudo su
获取超级管理员权限。
安装完成后启动一下Docker Server
shell
systemctl start docker
使用docker version
命令能看到Client
和Server
就启动成功了。
使用docker 安装运行Gitlab
使用docker拉取gitlab最新版本(如果想要指定版本去dockerHub可以查看)
shell
docker pull gitlab/gitlab-ce:latest
hostname
: 这里改成你自己的域名(域名要设置解析)或服务器ip
publish
: 端口映射(服务器端口:容器内端口)
restart
: 重启方式
volume
: 目录挂载,把容器内目录挂载到服务器本地(服务器本地目录:容器内目录)
gitlab/gitlab-ce:latest
镜像名称
shell
#d 后台运行
docker run --detach \
--hostname localhost \
--publish 443:443 --publish 80:80 --publish 222:22 \
--name gitlab \
--restart always \
--volume /home/gitlab/config:/etc/gitlab \
--volume /home/gitlab/logs:/var/log/gitlab \
--volume /home/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
运行成功后修改gitlab的默认密码
进入GitLab容器。使用以下命令来进入容器的shell:
shell
#进入gitlab容器
docker exec -it gitlab bash
在容器内部,运行以下命令来进入GitLab Rails Console:
shell
gitlab-rails console
使用GitLab Rails Console,你可以修改GitLab用户的密码。
shell
#获取root用户
user = User.find_by(username: 'root')
#new_password是你的新密码,密码要求8位并且不能纯数字
user.password = 'new_password'
#保存密码
user.save!
#退出容器
exit
这个方法是在容器内直接操作GitLab数据库的一种方式
别忘记开放服务器80端口
css
# 开放 80 端口
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --reload
访问gitlab主页
输入我们刚才设置的密码登录
进入主页创建一个仓库Project
按照提示把本地仓库 push到服务器。(Git怎么用这里就不多做介绍了)
shell
git remote add origin http://192.168.223.128/root/test.git
git branch -M main
git push -uf origin main
配置里面关闭main分支的推送保护,不然代码推送不到仓库。
基于DOkcer安装Gitlab Runner
GitLab Runner是GitLab CI/CD系统的一部分,它的主要作用是执行自动化构建和部署任务。
使用docker拉取gitlab-runnner最新版本
shell
docker pull gitlab/gitlab-runner:latest
-d
: 后台运行
--name
: 指定运行后的容器名
restart
: 重启方式
-v
: 目录挂载
shell
docker run -d --name gitlab-runner --restart always \
-v /home/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
在Gitlab面板中找到Runners 复制注册token以及url (Registration token)。(找半天才找到runner选项卡在哪里藏得真深!!!)
注册GItlab Runner
--url: 后面改成刚才你
gitlab上的
url
registration-token: 后面改成
gitlab上查看的
token
其他配置项都是些基本信息,如tag
、description
等。
注册成功后在gitlab
刷新就可以看到
shell
docker run --rm -v /home/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register \
--non-interactive \
--executor "docker" \
--docker-image alpine:latest \
--url "http://localhost/" \
--registration-token "xxxxxx" \
--description "runner" \
--tag-list "build" \
--run-untagged="true" \
--locked="false" \
--access-level="not_protected"
重新打开GItlab上的Runner选项就可以看到我们刚才注册好的Runner已经准备就绪了。
编写 .gitlab-ci.yml 提供CI、CD配置项
-
image
: 指定基础镜像环境,前端就是
node、docker等,后端有
java、python、docker -
stages
: 指定执行的阶段有哪些,流水线执行时会按照这个阶段顺序执行 -
cache
: 针对哪些目录启用缓存 -
job
: 指定每个阶段执行的任务,tags
就是使用的runner
,stage
指定阶段,script
指定相应执行的shell
命令 -
deploy:
script第一行
: 根据我们项目目录下的Dockerfile
文件创建一个docker
镜像script第二行
: 判断name=app-container
这个容器是否在运行,在运行的话就进行销毁script第三行
: 根据我们打包出来的镜像启动一个app-container
的容器
-
代码
push
之后流水线就会自动根据这个文件执行,执行的情况可以在下图地方查看
yml
#安装的node镜像版本
image: node:16.20.2-slim
stages: # 分段
- install
- build
- deploy
cache: # 缓存
paths:
- node_modules
- dist
job_install:
tags:
- build
stage: install
script:
- npm install
job_build:
tags:
- build
stage: build
script:
- npm run build
job_deploy:
image: docker
stage: deploy
script:
- docker build -t appimages .
- if [ $(docker ps -aq --filter name=app-container) ]; then docker rm -f app-container;fi
- docker run -d -p 8080:80 --name app-container appimages
.gitlab-ci.yml
文件放在我们项目根目录下面,源码项目上传到gitlab后。runner会根据这个文件的stages来一步一步来自动构建我们的项目。
nginx配置文件
在项目根目录创建nginx.conf
文件,把这个文件复制到容器内作为nginx配置文件,配置我们的端口号和主机地址。
json
server {
#端口和主机 替换成自己想要的项目地址
listen 82;
server_name 192.168.223.128;
#charset koi8-r;
access_log /var/log/nginx/host.access.log main;
error_log /var/log/nginx/error.log error;
#配置 vue 路由 history模式
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
别忘记开放端口号
shell
# 开放 82 端口
firewall-cmd --permanent --zone=public --add-port=82/tcp
firewall-cmd --reload
Dockerfile文件
在项目根目录下创建Dockerfile文件,runner会根据这个文件创建一个的docker镜像。在docker启动我们的项目的时候会把上面容器外的nginx.conf文件放进docker容器内的nginx配置中去。
shell
FROM nginx
COPY dist/ /usr/share/nginx/html/
COPY nginx.conf /etc/nginx/conf.d/default.conf
更改runner配置项
我们已经基本完成了配置但是在编译链接可能遇到错误
shell
vi /home/gitlab-runner/config/config.toml
修改runner
的配置项,对相应的runner
内容卷这加"/usr/bin/docker:/usr/bin/docker", "/var/run/docker.sock:/var/run/docker.sock"
提交自动打包我们的项目
把我们本地的源码push到gitlab仓库即可开始自动打包发布。
到此,所有的流程都已经完成,我们完成了代码提交后,自动去执行打包编译,部署到相应的容器的操作
输入我们的地址查看是不是可以访问