从零开始自动化部署CI/CD(Docker+nginx+gitlab+gitlab-runner)

从零自动化部署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命令能看到ClientServer就启动成功了。

使用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

其他配置项都是些基本信息,如tagdescription等。

注册成功后在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就是使用的runnerstage指定阶段,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仓库即可开始自动打包发布。

到此,所有的流程都已经完成,我们完成了代码提交后,自动去执行打包编译,部署到相应的容器的操作

输入我们的地址查看是不是可以访问

相关推荐
浮华似水21 分钟前
Javascirpt时区——脱坑指南
前端
王二端茶倒水23 分钟前
大龄程序员兼职跑外卖第五周之亲身感悟
前端·后端·程序员
_oP_i28 分钟前
Web 与 Unity 之间的交互
前端·unity·交互
钢铁小狗侠30 分钟前
前端(1)——快速入门HTML
前端·html
凹凸曼打不赢小怪兽1 小时前
react 受控组件和非受控组件
前端·javascript·react.js
狂奔solar1 小时前
分享个好玩的,在k8s上部署web版macos
前端·macos·kubernetes
qiyi.sky1 小时前
JavaWeb——Web入门(8/9)- Tomcat:基本使用(下载与安装、目录结构介绍、启动与关闭、可能出现的问题及解决方案、总结)
java·前端·笔记·学习·tomcat
清云随笔1 小时前
axios 实现 无感刷新方案
前端
鑫宝Code2 小时前
【React】状态管理之Redux
前端·react.js·前端框架
忠实米线2 小时前
使用pdf-lib.js实现pdf添加自定义水印功能
前端·javascript·pdf