前言
随着前后端拆散利用模式的推广,前端我的项目可独立部署保护上线,不再仅仅将前端开发后打包的文件间接丢到一个文件目录下就完事大吉了,当初对前端来说也须要理解运维的相干常识,本文旨在介绍一些相干的运维概念以及一些前端运维的实际。
CI/CD
继续集成
continuous integration 继续集成是一种软件实际,流程为:开发 => 打包 => 集成 => 测试
继续交付
continuous delivery 继续交付是一种软件工程手法,流程为:测试 => 公布
继续部署
continous deployment 继续部署是在继续交付的管道中公布版本给最终用户的一种软件工程流程,流程为:公布 => 部署上线
继续集成、继续交付、继续部署是公布流程的不同阶段
Docker
容器 + 镜像
docker 是一个开源的利用容器引擎。开发者能够打包本人的利用到容器外面,而后迁徙到其余机器的 docker 利用中;开发者能够疾速制作一个本人自定义的镜像,疾速分享,也能够上传到镜像库进行存取和治理;容器之间互相隔离不抵触,硬件资源共享。
Docker in Docker
容器内仅部署 docker 命令行工具(作为客户端),理论执行交由宿主机内的 docker-engine(服务器)
Jenkins
概念
Jenkins 是一个基于Java语言开发的CI继续构建工具,次要用于继续、主动的构建/测试软件我的项目。它能够执行你事后设定好的设置和脚本,也能够和 Git工具做集成,实现主动触发和定时触发器构建。
Gitlab
概念
gitlab既是一种服务,也是一种软件。既能够在gitlab.com下来租用服务,也能够下载gitlab阮籍你本人搭建服务
Nginx
概念
Nginx采纳C进行编写,解决动态文件,索引文件以及主动索引;关上文件描述符缓冲。无缓存的反向代理减速,简略的负载平衡和容错。FastCGI,简略的负载平衡和容错。模块化的构造。
Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务
Nexus
概念
制品仓库: 构建过程的输入物,包含软件包,测试报告,利用配置文件等可在服务器上间接 运行或可查看二进制模式的文件,通常称之为二进制软件制品。具备版本治理,历史治理,权限校验等性能。
Nexus可在本人的局域网内搭建本人的近程仓库服务器,称为私服,私服服务器即是公司外部的maven近程仓库,私服还充当一个代理服务器,可从互联网地方仓库主动下载
- proxy 本地仓库,通常咱们会部署本人的构件到这一类型的仓库。比方公司的第二方库
- hosted 代理仓库,它们被用来代理近程的公共仓库,如maven地方仓库
- group 仓库组,用来合并多个hosted/proxy仓库,当你的我的项目心愿在多个repository应用资源时就不须要屡次援用了,只须要援用一个group即可
Ansible
概念
ansible是基于Python开发的自动化运维工具。其劣势在于能够批量操作,基本原理是通过ansible的外围进行通过ssh传输的通信进行相干的散发解决,进行user与host的通信
Modules
执行命令的功能模块,Ansible2.3版本为止,共有1039个模块。还能够自定义模块
Inventory
治理主机的清单,默认是/etc/ansible/hosts文件
Playbook
工作剧本(又称工作集),编排定义Ansible工作集的配置文件,由Ansible程序顺次执行,yaml格局
Plugins
插件,模块性能的补充,常有连贯类型插件,循环插件,变量插件,过滤插件,插件性能用的较少
API
提供给第三方程序调用的应用程序编程接口
实际
操作环境: linux/centos7
操作内容: 一台 gitlab + jenkins + ansible 服务器推送多台 nginx 服务器
docker
- 装置依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
- 应用阿里云源装置
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum install docker-ce
- 启动docker
systemctl start dockersystemctl enable docker
- 可配置阿里云容器镜像加速器
阿里云容器镜像服务
gitlab + jenkins + ansible
装置jenkins
- 装置防火墙
yum install firewalld systemd -yservice firewalld startfirewall-cmd --permanent --add-service=httpfirewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="xxx.xx.x.x/16" accept"systemctl reload firewalld
- 编写Dockerfile
FROM jenkins/jenkinsUSER root# 革除了根底镜像设置的源,切换成阿里云源RUN echo '' > /etc/apt/sources.list.d/jessie-backports.list \ && echo "deb http://mirrors.aliyun.com/debian jessie main contrib non-free" > /etc/apt/sources.list \ && echo "deb http://mirrors.aliyun.com/debian jessie-updates main contrib non-free" >> /etc/apt/sources.list \ && echo "deb http://mirrors.aliyun.com/debian-security jessie/updates main contrib non-free" >> /etc/apt/sources.list# 更新源并装置短少的包RUN apt-get update && apt-get install -y libltdl7ARG dockerGid=999RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group
- 构建jenkins镜像
docker build -t local/jenkins .
- 启动镜像
新建/home/jenkins/目录,将jenkins目录外挂到宿主机内
mkdir /home/jenkinschown -R 1000 /home/jenkins/
镜像创立容器并启动
docker run -itd --name jenkins -p 8080:8080 -p 50000:50000 \-v /var/run/docker.sock:/var/run/docker.sock \-v /usr/bin/docker:/usr/bin/docker \-v /home/jenkins:/var/jenkins_home \--restart always \--user root local/jenkins
- 启动jenkins
开释8080和50000端口
firewall-cmd --zone=public --add-port=8080/tcp --permanentfirewall-cmd --zone=public --add-port=50000/tcp --permanentsystemctl reload firewalld
- 初始化jenkins配置
批改明码 => 下载插件 => 重启容器
初始化jenkins后会有一个初始密码,可通过docker exec -it jenkins /bin/bash
进入容器后查看cat /var/jenkins_home/secrets/initialAdminPassword
- 配置公钥私钥
进入jenkins容器,通过ssh-keygen生成公钥私钥
docker exec -it jenkins /bin/bashssh-keygen -t rsa
进入~/.ssh查看id_rsa和id_rsa.pub,为jenkins配置
系统管理 => 平安 => Manage Credentials => 全局 => 增加凭据 => 抉择SSH Username with private key
- 配置node环境
系统管理 => 全局工具配置 => NodeJS
- 新建工作
首页 => 左侧导航 => 新建工作 => 源码治理 + 构建环境 + 构建
构建这里抉择执行shell,可将命令写入其中,这里镜像名称通常为jenkins服务器地址,后边加工夫戳能够防止重名
set -etimestamp=`date '+%Y%m%d%H%M%S'`node -vnpm -vrm -rf node_modules package-lock.jsonnpm installnpm run build(docker ps | grep ansible) && (docker rm -f ansible)# 编译docker镜像docker build -t xxx.xx.xx.xxx:8082/fe/nginx-fe-$timestamp .# 推送docker镜像到制品库docker push xxx.xx.xx.xxx:8082/fe/nginx-fe-$timestampdocker run -id --name ansible ansible:t1docker exec -i ansible ansible-playbook --syntax-check /root/playbook.ymldocker exec -i ansible ansible-playbook -e "timestamp=$timestamp" /root/playbook.ymldocker rm -f ansible
- 登录制品库
批改daemon.json
vi /etc/docker/daemon.json{ "insecure-registries": [ "xxx.xx.xx.xxx:8082", "xxx.xx.xx.xxx:8081" ]}
重启docker
systemctl daemon-reloadsystemctl restart docker
docker login登录
docker exec -it jenkins /bin/bashdocker login 服务器ip:端口exit
装置gitlab
- 拉取gitlab镜像
docker pull gitlab/gitlab-ce
- 创立gitlab容器
创立gitlab工作目录
mkdir /home/gitlab
启动gitlab容器
docker run -itd -p 443:443 \-p 8899:8899 \-p 333:333 \--name gitlab \--restart always \-v /home/gitlab/config:/etc/gitlab \-v /home/gitlab/logs:/var/log/gitlab \-v /home/gitlab/data:/var/opt/gitlab \gitlab/gitlab-ce
- 批改防火墙
firewall-cmd --zone=public --add-port=333/tcp --permanentfirewall-cmd --zone=public --add-port=8899/tcp --permanentsystemctl reload firewalld
- 批改gitlab配置文件
批改配置文件
vi /home/gitlab/config/gitlab.rbexteranl_url 'http://内部拜访域名/地址:端口'gitlab_rails['gitlab_ssh_host'] = 'SSH内部拜访域名/地址'gitlab_rails['gitlab_shell_ssh_port'] = SSH端口
批改ssh端口
docker exec -it gitlab /bin/bashvi /assets/sshd_configvi /etc/ssh/sshd_config
重启gitlab
docker restart gitlab
- 启动gitlab
宿主机:端口 => 批改明码
批改gitlab明码
docker exec -it gitlab /bin/bashgitlab-rails console productionuser = Uer.where(id:1).firstuser.password = "xxxxx"user.password_confirmation = "xxxxx"user.save!quit
- 配置jenkins的公钥
登录gitlab => 点击头像 => 设置 => SSH密钥
将jenkins中查到的~/.ssh/id_rsa.pub
增加到gitlab的ssh密钥中
- 在前端我的项目根目录下增加Dockerfile
FROM nginx:1.15-alpineCOPY dist /usr/share/nginx/htmlWORKDIR /usr/share/nginx/html
- 新建仓库 + 配置webhook
新建仓库后,配置webhook,可通过git相干命令进行自动化部署,可参考这篇文章[[后端]gitlab之webhook主动部署](https://www.jianshu.com/p/00b...,github的webhook配置可参考这篇Jenkins与Github集成 webhook配置
装置nexus
- 拉取nexus镜像
docker pull sonatype/nexus3
- 创立nexus容器
创立nexus工作目录
mkdir /home/nexus && chown -R 200 /home/nexus
启动容器
docker run -d -p 8081:8081 -P 8082:8082 \--name nexus \-v /home/nexus:/nexus-data \--restart always \sonatype/nexus3
- 批改防火墙
firewall-cmd --zone=public --add-port=8081/tcp --permanentfirewall-cmd --zone=public --add-port=8082/tcp --permanent
- 启动nexus
查看日志
docker logs -f nexus
- 批改配置
进入nexus => 批改明码
- 创立私服
齿轮图标 => Repositories => Create repository => 填写表单
装置ansible
- 创立ansible工作目录
mkdir /home/ansible-file && cd /home/ansible-filemkdir sshtouch Dockerfiletouch hoststouch playbook.yml
- 将配置的公钥私钥放入ssh文件夹下
cp -r ~/.ssh/* /home/ansible-file/ssh/
- 编辑Dockerfile
FROM centos:7RUN yum -y install wget curl vim openssh-clientsRUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repoRUN yum clean allRUN yum makecacheCOPY ssh /root/.ssh/RUN chmod 755 ~/.ssh/RUN chmod 600 ~/.ssh/id_rsa ~/.ssh/id_rsa.pubRUN yum -y install ansibleCOPY hosts /etc/ansible/RUN sed -i 's/^#host_key_checking = False/host_key_checking = False/' /etc/ansible/ansible.cfgRUN ansible --versionCOPY playbook.yml /root/
- 编辑hosts 多台服务器ip
[fe-servers]xxx.xx.xx.xxxxxx.xx.xx.xxxxxx.xx.xx.xxx
- 编辑playbook
---- hosts: all remote_user: root vars: timestamp: 20200806165833 tasks: - name: docker pull new images shell: 'chdir=~ docker pull xxx.xx.xx.xxx:8082/fe/nginx-fe-{{timestamp}} - name: docker rmf shell: 'chdir=~ docker ps | grep xxx && docker rm -f xxx' ignore_errors: true - name: docker run shell: 'chdir=~ docker run -p 80:80 -itd --name xxx xxx.xx.xx.xxx:8082/fe/nginx-fe-{{timestamp}}'
nginx
- 拉取nginx镜像
docker pull nginx
- 创立nginx容器
创立nginx工作目录
mkdir /home/nginx
启动容器
docker run -itd -p 80:80 --name xxx \-v /home/nginx/html:/usr/share/nginx/html \-v /home/nginx/logs:/var/log/nginx \--restart always \nginx
- 公钥私钥
应用ssh-keygen创立公钥私钥
ssh-keygen -t rsa
在.ssh文件夹下创立authorized_keys,将jenkins的公钥放入其中
cd .ssh/touch authorized_keysvi authorized_keys
- 登录制品库
批改daemon.json
vi /etc/docker/daemon.json{ "insecure-registries": [ "xxx.xx.xx.xxx:8082", "xxx.xx.xx.xxx:8081" ]}
重启docker
systemctl daemon-reloadsystemctl restart docker
docker login登录
docker exec -it nginx /bin/bashdocker login 服务器ip:端口exit
后果
总结
前端自动化部署可在外部开发及后续上线工程中进行运维管制,对前端来说也是越来越重要的能力,整体流程:
前端git提交 => gitlab/github更新 => 触发webhook命令 => jenkins构建 => nexus制品库生成 => ansible散发 => 多台nginx交付
对于gitlab来说还有不同stage进行的不同阶段的cicd全流程服务,具体可依据团队的需要进行个性化的定制,如果前期我的项目宏大,比方采纳了微前端架构对不同框架如angular、react、vue进行不同档次部署交付,可配合k8s(ps: 感兴趣的同学,可参看这篇文章[]())等进行更为严格的开发上线流程管制。
总之,在大前端的趋势下,前端延长的方向也更为多样,对于咱们的要求也会越来越多,工程化、智能化、可视化等等,要在某一畛域有所建树,咱们都还要一直致力才行,加油!与君共勉!
参考
- [[后端]gitlab之webhook主动部署](https://www.jianshu.com/p/00b...
- Jenkins与Github集成 webhook配置
- k8s部署Vue前端
- 云前端新物种-微前端体系
感激
在此,特别感谢码云前端王圣松大佬的分享,此为其集体历程分享一位00后前端2年教训的成长历程,感兴趣的同学能够关注一波