CICD持续集成部署使用

774 阅读2分钟

docker

先删除之前旧版本

$ sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

安装必须的依赖

$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
// 添加stable的Docker-ce的源
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

安装docker-ce

$ sudo yum install docker-ce docker-ce-cli containerd.io

切换镜像安装源(加速)

$ vim /ect/docker/daemon.json

// 配置以下内容
{
  "registry-mirrors": ["https://registry.docker-ce.com"]
}

$ systemctl daemon-reload
$ systemctl restart docker

jenkins

安装

// 拉取镜像
docker pull jenkins/jenkins:lts

// 创建并运行容器,需要映射内部到外部的docker,不然内部使用不了docker,映射文件后内部的docker命令作用到外部
// 这里映射docker后,可能存在在jenkins容器内部没有权限使用docker命令的情况,需要修改容器内/var/run/docker.sock
// 文件的权限给jenkins
docker run -itd --name jenkins -p 8000:8080 -p 50000:50000 -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins:lts

// 查看运行信息,拿到初始密码
docker logs -f jenkins_pjm

配置jenkins

打开IP:8080,进入jenkins

输入初始密码

点击安装推荐的插件,等待完成

创建用户

配置实例,默认就行,完成后即可进入主界面

配置加速

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

安装插件

  • Generic Webhook Trigger(webhook钩子,当git或者gitlab提交触发事件)

  • Build With Parameters(参数化构建)

  • Role-based Authorization Strategy(用户-角色权限)

  • ThinBackup(备份)

添加ssh凭据(通过github拉取代码)

// 生成公密钥对
$ ssh-keygen -t rsa -b 4096 -C '728494186@qq.com'
// 公钥为生成文件夹下的id_rsa.pub,密钥为id_rsa

生成个人账户token(webhook调用使用)

nginx

安装时会在Dockerfile中设定安装镜像,安装后的访问的默认目录为/usr/share/nginx/html

关闭防火墙

// 整体关闭
systemctl stop firewalld.service
systemctl disable firewalld.service

// 关闭某个端口的防火墙
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload

整体流程

代码push -> 触发webhook -> jenkins接受到开始触发流程 -> jenkins拉取代码到本地工作目录 -> 在本地工作目录执行shell -> 通过拉取到的代码的Dockerfile构建镜像 -> 判断docker是否有用该镜像正在运行的容器 -> 有的话删除,没有的话直接通过该镜像创建容器,将镜像中nginx暴露的80端口(docker中),映射到外面自定义端口 -> 完成整个流程,通过ip:端口即可访问

jenkins创建任务

shell代码

#!/bin/bash
# 根据当前目录的Dockerfile构建webapp镜像
docker build --no-cache -t webapp .

# 获取容器webapp-container的运行状态是否在运行
docker ps -a | grep webapp-container &> /dev/null

# 如果没有在运行
if [ $? -ne 0 ]; then
	echo "webapp-container is not running"
# 在运行则删除之前容器
else
	echo "webapp-container is running"
    # 找到正在运行的webapp-container容器并停止它
    matchingStarted=$(docker ps --filter="name=webapp-container" -q | xargs)
    if [ -n $matchingStarted ]; then
    	docker stop $matchingStarted
    fi
    # 找到所有webapp-container容器并删除它
    matching=$(docker ps -a --filter="name=webapp-container" -q | xargs)
    if [ -n $matching ]; then
    	docker rm $matching
    fi
fi

# 创建并运行镜像为webapp的webapp-container容器,内部nginx暴露的80端口映射到外部3333端口
docker run -itd --name webapp-container -p 3333:80 webapp

github配置webhook

项目配置Dockerfile

# build stage
# 创建构建依赖的基础镜像,该阶段生成的镜像命名为build-stage
# 之后COPY --FROM=<name>可以引用此阶段生成的镜像
FROM node:lts-alpine as build-stage

# 将源文件.拷贝到app下(没有则创建)
COPY . /app

# 指定app为工作目录(只有WORKDIR指定的目录会一直存在)
WORKDIR /app

# Dockerfile 的指令每执行一次都会在 docker 上新建一层
RUN npm install --registry=https://registry.npm.taobao.org

RUN npm run build

# production stage
# 拉取nginx镜像
FROM nginx:stable-alpine as production-stage
# 将上面生成镜像中构建好的文件复制到nginx内容的默认目录上
COPY --from=build-stage /app/dist /usr/share/nginx/html
# nginx暴露80端口
EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

项目配置.dockerignore(生成镜像忽略)

node_modules
.DS_Store

# node-waf configuration
.lock-wscript

build/Release
.dockerignore
Dockerfile
*docker-compose*

# Logs
Logs
*.log

# Runtime data
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw*
pdis
*.pdi
*.seed
.git
.hg
.svn

区分环境构建(从节点)

新服务器需要配置环境才能连接成功

// JDK环境
yum search jdk
装 1.8版本的:yum install -y java-1.8.0-openjdk

jenkins从节点配置

新服务器配置公钥

vim /root/.ssh/authorized_keys

加上配置保存即可