以前总听说过CI/CD,那什么是CI/CD呢?平时开发过程中,使用到流水线,对项目进行构建,构建完成后,就能直接发布到测试环境,这个是如何实现的呢?
持续集成
什么是CI/CD
CI/CD是Continuous Integration and Continuous Delivery/Deployment的缩写,意思是持续集成和持续交付/部署。CI/CD是一种软件开发流程模型,旨在通过自动化和持续性的构建、测试、部署和交付过程,来提高软件开发和发布的效率和质量。CI/CD的目标是缩短软件开发和发布的周期,降低开发和发布的成本和风险,以满足快速变化和不断迭代的业务需求。
CI/CD主要包括三个环节:
本次,我们就需要自己实现一套 CI/CD 环境,实现前端页面快速集成、快速部署。
JENKINS环境配置
JENKINS基于Docker安装
详细步骤及介绍,还请查阅
JENKINS官方文档
以下摘录了,主要安装步骤:
docker network create jenkins
docker run --name jenkins-docker --rm --detach
--privileged --network jenkins --network-alias docker
--env DOCKER_TLS_CERTDIR=/certs
--volume jenkins-docker-certs:/certs/client
--volume jenkins-data:/var/jenkins_home
--publish 2376:2376
docker:dind --storage-driver overlay2
本地创建 Dockerfile 文件,文件内容如下
FROM jenkins/jenkins:2.414.1-jdk17
USER root
RUN apt-get update && apt-get install -y lsb-release
RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc
https://download.docker.com/linux/debian/gpg
RUN echo "deb [arch=$(dpkg --print-architecture)
signed-by=/usr/share/keyrings/docker-archive-keyring.asc]
https://download.docker.com/linux/debian
$(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
RUN apt-get update && apt-get install -y docker-ce-cli
USER jenkins
RUN jenkins-plugin-cli --plugins "blueocean docker-workflow"
docker build -t myjenkins-blueocean:2.414.1-1 .
使用以下 docker run 命令在 Docker
中将自己的映像作为容器运行:myjenkins-blueocean:2.414.1-1
docker run --name jenkins-blueocean --restart=on-failure --detach
--network jenkins --env DOCKER_HOST=tcp://docker:2376
--env DOCKER_CERT_PATH=/certs/client --env DOCKER_TLS_VERIFY=1
--publish 8080:8080 --publish 50000:50000
--volume jenkins-data:/var/jenkins_home
--volume jenkins-docker-certs:/certs/client:ro
myjenkins-blueocean:2.414.1-1
JENKINS页面配置
点击8080进入Jenkins的页面,进行Jenkins的安装
安装过程中,遇到jenkins需要输入管理员密码,该密码在log日志里面,可以通过页面进行查看:
也可以通过命令行查看
sudo docker logs -f jenkins-blueocean
安装推荐的插件就可以了
这个时候,就只要耐心的等待
安装完成后,需要对用户信息,实例进行配置,这就完成了。
终于看到,我们的Jenkins的页面了
可以看出Docker安装Jenkins非常简单,减少了很多环境的配置工作。
关于,如何安装Docker环境,可以参照我的另外一篇文章如何通过Docker部署Vue项目?
流水线配置
由于,我们版本管理使用ssh方式,因此,需要先进行公私钥生成
ssh-keygen -t rsa
我们将公钥
配置到gitLib
中,私钥
配置到jenkins
中
在gitLib
中,进行公钥
配置
在jenkins
中,进行私钥
的配置
下面就是进行流水线的配置了
新建一个Item
使用freeStyle project
导入源码时,遇到了问题。
由于没有配置域名,需要设置主机IP。在docker的jenkins容器中,做如下配置
/etc/gitlab/gitlab.rb
在 gitlab.rb中,添加主机ip(自己电脑)
external_url 'http://172.31.136.104'
添加之后,继续报错
...
stderr: No ED25519 host key
...
需要修改安全策略,将Host Key Verification Strategy
,设置为 No verification
在线打包配置
添加node支持,需要安装nodeJS。我这边是安装好的,还没有安装的,需要在可用插件
去下载
接下来,需要在全局工具配置中,添加node的版本。下次使用的时候,会自动进行下载安装
添加构建脚本,这个和我们本地开发的保持一致就可以
最后,添加归档文件,就是build产生的文件
构建完成后,我们可以看到产物了
构建完成后,我们希望可以自动部署。下面看下如何进行自动部署吧
自动发布
自动化部署,主要是使用Publish Over SSH
进行发布。首先,进行Publish Over SSH
的安装
进行Publish Over SSH
的配置。
前端服务器配置,详见
# 如何通过Docker部署Vue项目?但是,这里缺少ssh服务,因此,需要修改Dockerfile
文件。完整的Dockerfile
文件显示如下:
# 使用基础镜像
FROM centos:7.9.2009
# 安装SSH
RUN yum install -y openssh-server sudo
RUN sed -i 's/usepam yes/usepam no/g' /etc/ssh/sshd_config
RUN useradd admin
RUN echo "admin:admin" | chpasswd
RUN echo "admin all=(all) all" >> /etc/sudoers
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN mkdir /var/run/sshd
# 安装nginx epel-release 为额外软件包的仓库
RUN yum install -y epel-release
RUN yum install -y nginx
# 配置nginx
COPY nginx.conf /etc/nginx/nginx.conf
RUN mkdir /app && chmod -R 777 /app
# 启动nginx服务 和 SSH服务
# 创建启动脚本
COPY start.sh /start.sh
RUN chmod +x /start.sh
# 在容器启动时运行启动脚本
CMD ["/start.sh"]
# 对外暴露 22 和 80
EXPOSE 22 80
运行下,我们来验证下。ssh连接,我这边设置的映射端口是1
,密码是admin
。成功连接!
➜ Demo ssh admin@xxx.31.136.104 -p 1
admin@xxx.31.136.104's password:
Environment:
LANG=zh_CN.UTF-8
LC_CTYPE=zh_CN.UTF-8
USER=admin
LOGNAME=admin
HOME=/home/admin
PATH=/usr/local/bin:/usr/bin
MAIL=/var/mail/admin
SHELL=/bin/bash
SSH_CLIENT=172.17.0.1 47998 22
SSH_CONNECTION=172.17.0.1 47998 172.17.0.3 22
SSH_TTY=/dev/pts/0
TERM=xterm-256color
[admin@c07141bd2b3b ~]$
80端口的情况,是可以访问的。内容还没有,所以现在显示的是500
现在,就可以在Jenkins进行配置了,要实现Jenkins的制品能够自动推送到前端服务器中。
打包流水的配置,编译后添加部署模块。其中,Verbose output in console
一定要勾上,不然ssh日志不会展示,影响异常定位。
Source files:Jenkins打包后的文件,这里使用通配符,所有vue-project/dist/
下的文件,包含vue-project/dist/
Remove prefix: 删除vue-project/dist/
保留vue-project/dist/
下的所有文件
Remote directory:目标服务器的目录,即上面配置的web
服务器的目录(nginx配置的文件根目录)。
这里需要注意的是文件的权限。我们将/app/
文件夹,使用chmod -R 777
赋予所有用户对/app
目录的读写执行权限。
现在就构建成功了,前端页面可以正常显示。
好了,现在就可以看到,通过Jenkins编译,部署,实现页面显示。这种方式也是现在Devops非常重要的一环。针对前端开发的好处是,实现前端的自动化部署,不需要后端开发,手动部署了。非常棒~