CD 持续部署Continuous Integration 持续集成
- 在CI环境中,开发人员将会频繁地向主干提交代码。这些新提交的代码在最终合并到主干前,需要经过编译和自动化测试流进行验证
- 持续集成过程中很重视自动化测试验证结果,以保障所有的提交在合并主线之后的质量问题,对可能出现的一些问题进行预警。
- 优点
- 通过自动化测试可以提早拿到回归测试的结果,避免将一些问题提交到交付生产中。
- 发布编译将会更加容易,因为合并之初已经将所有问题都规避了。
- 减少工作问题切换,研发可以很快获得构建失败的消息,在开始下一个任务之前就可以很快解决。
- 测试成本大幅降低,你的CI服务器可以在几秒钟之内运行上百条测试。
- 需要具备的条件
- 需要一个持续集成服务器,它可以监控代码提交情况,对每个新的提交进行自动化测试
- 团队需要为每个新功能、代码改进、或者问题修复创建自动化测试用例
- 需要编写可执行的命令脚本
GitHub ActionsContinuous Deployment 持续部署/持续交付
- 在CD环境中,通过自动化的构建、测试和部署循环来快速交付高质量的产品。某种程度上代表了一个开发团队工程化的程度,任何修改通过了所有已有的工作流就会直接和客户见面,只有当一个修改在工作流中构建失败才能阻止它部署到产品线。
- 持续部署是一个很优秀的方式,可以加速与客户的反馈循环,但是会给团队带来压力,因为不再有“发布日”了。开发人员可以专注于构建软件,他们看到他们的修改在他们完成工作后几分钟就上线了。
- 优点
- 简化发布流程 每一次提交都会自动部署
- 能持续查看团队每天发布的代码 及时的进行审查
- 提交了发布的稳定性 因为每次发布都经过的CI测试
- 发布频率高 问题能及时发现
- 需要具备的条件
- 团队需要在每次部署后及时的测试和发现问题
- 对团队技术水平有要求 由于发布过于频繁 需要保证每次发布的质量
完成此次内容 您需要准备以下环境GitHub Actions 帮助您自动完成软件开发周期内的任务。 GitHub Actions 是事件驱动的,意味着您可以在指定事件发生后运行一系列命令。 例如,每次有人为仓库创建拉取请求时,您都可以自动运行命令来执行软件测试脚本。
注册DockerHub账号
- linux系统机器 用来部署服务
- docker 运行服务 隔离环境
- dockerhub账户 存放和管理镜像
- nodejs js运行时
- npm js包管理仓库
DockerHub官网
创建镜像仓储 安装dockerubuntu机器安装docker官方教程
# 安装docker存储库 sudo apt-get update # 添加Docker官方的GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 使用以下命令设置稳定存储库 echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装 Docker 引擎 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io # 列出您的存储库中可用的版本 apt-cache madison docker-ce # 安装指定版本 例如5:18.09.1~3-0~ubuntu-xenial sudo apt-get install docker-ce=安装nodejsdocker-ce-cli= containerd.io # 测试镜像 sudo docker run hello-world # 查看docker版本 sudo docker --version
nodejs官方版本列表
# 创建nodejs包目录 mkdir node # 进入目录安装nodejs压缩包 cd node wget https://nodejs.org/download/release/v12.18.3/node-v12.22.4-linux-x64.tar.gz # 解压压缩包 tar -zxvf node-v12.22.4-linux-x64.tar.gz # 做软连接 ln -s bin/npm /usr/local/bin/ ln -s bin/node /usr/local/bin/ # 验证版本 npm -v node -v配置工作流密钥变量
编写github cicd yml文件在这里添加的变量 在后续的github流水线中会被加密
actions工作流程相关官方文档
先创建.github/workflows/github.yml文件 用于每次提交时 github工作流读取文件
## 官方文档 https://docs.github.com/cn/actions/learn-github-actions/workflow-syntax-for-github-actions
name: node # 工作流程的名称
on: # 触发工作流程的 GitHub 事件的名称
push: # 使用单一事件
branches: # 设置触发的分支
- master
- v-*
tags: # 设置触发的标签
- v-*
env: # 作业变量
UBUNTU_USER: ${{ secrets.UBUNTU_USER }} # 登录机器用户名
UBUNTU_PASS: ${{ secrets.UBUNTU_PASS }} # 登录机器用户密码
UBUNTU_IP: ${{ secrets.UBUNTU_IP }} # 登录机器ip
UBUNTU_PORT: ${{ secrets.UBUNTU_PORT }} # 登录机器ip端口
DOCKER_USER: ${{ secrets.DOCKER_USER }} # docker用户名
DOCKER_PASS: ${{ secrets.DOCKER_PASS }} # docker用户密码
DOCKER_HUB_URL: ${{ secrets.DOCKER_HUB_URL }} # dockerhub 地址
DOCKER_HUB_NAMESPACE: ${{ secrets.DOCKER_HUB_NAMESPACE }} # dockerhub 仓储命名空间
DOCKER_CONTAINER_ID: ${{ secrets.DOCKER_CONTAINER_ID }} # 容器id
DOCKER_IMAGE_ID: node-${GITHUB_REF#refs/heads/}-${GITHUB_SHA} # docker镜像id-commit的sha值
DOCKER_CONTAINER_PORT: 3000 # 容器端口
LOCAL_PORT: 3000 # 机器端口
jobs: # 工作流作业
build: # 自定义作业名称
name: build # 作业显示在 GitHub 上的名称
runs-on: ubuntu-18.04 # 要运行作业的机器类型
concurrency: "1" # 并发
steps: # 作业包含一系列任务
- uses: actions/checkout@v2 # 选择要作为作业中步骤的一部分运行的操作
- name: login-docker-setp
run: |
docker login -u ${{env.DOCKER_USER}} -p ${{env.DOCKER_PASS}} ${{env.DOCKER_HUB_URL}}
- name: build-docker-step # 步骤显示在 GitHub 上的名称
run: |
docker build -t ${{env.DOCKER_HUB_NAMESPACE}}:${{env.DOCKER_IMAGE_ID}} .
- name: release-docker-step
run: |
docker push ${{env.DOCKER_HUB_NAMESPACE}}:${{env.DOCKER_IMAGE_ID}}
release:
needs: [build] # 识别在此作业运行之前必须成功完成的任何作业
name: release
runs-on: ubuntu-18.04
steps:
- name: release
uses: appleboy/ssh-action@master
with:
host: ${{env.UBUNTU_IP}}
username: ${{env.UBUNTU_USER}}
password: ${{env.UBUNTU_PASS}}
port: ${{env.UBUNTU_PORT}}
script: |
sudo docker stop ${{env.DOCKER_CONTAINER_ID}}
sudo docker rm ${{env.DOCKER_CONTAINER_ID}}
sudo docker login -u ${{env.DOCKER_USER}} -p ${{env.DOCKER_PASS}} ${{env.DOCKER_HUB_URL}}
BRANCH_NAME=${{github.ref}}
DOCKER_IMAGE_ID=node-${BRANCH_NAME#refs/heads/}-${{github.sha}}
sudo docker pull ${{env.DOCKER_HUB_NAMESPACE}}:${DOCKER_IMAGE_ID}
sudo docker images
sudo docker run -d -p ${{env.LOCAL_PORT}}:${{env.DOCKER_CONTAINER_PORT}} --name=${{env.DOCKER_CONTAINER_ID}} ${{env.DOCKER_HUB_NAMESPACE}}:${DOCKER_IMAGE_ID}
sudo docker ps -a
free -m
push后会触发github的actions工作流 即可完成持续集成和部署



