基于 Docker 和 GitLab 的前端自动化部署

实践笔记

随着接触的项目越来越多,在部署测试流程上重复耗时工作也越来越多,所以对前端工作的CI/CD实现愈发迫在眉睫。

前端开发由于三大框架的崛起,基于 webpack 的自动化构建被广大开发者所熟识。而一整套 DevOps 工作流包括 Auto Build、Auto Test、Auto Code Quality、Auto Deploy 等,这里主要是解决 Auto Deploy 部分。

主要实现思路是,指定部署分支,比如 master,每次有代码/Tag被推送到 master,会触发 git hook 或者基于 GitLab 的 gitlab-runner ,然后执行拉取代码、安装依赖并打包的脚本,然后将打包后的文件拷贝至目标服务器的流程。前端的方便之处在于打包文件只需要备份并替换就可以了,无需重启服务等。

1. 环境配置

1.1 前言

现在假设有两台centos7服务器,一台用作代码托管,一台用作测试。每次有代码被推送到master上,就自动将代码打包并部署到测试服务器。

1.2 安装 Git

在代码托管服务器上安装git。并生成秘钥保存到gitlab上,用于免密拉取代码。

yum -y install git

# 查看有无ssh文件
ls -al ~/.ssh # 如果total为0 生成秘钥和公钥
ssh-keygen -t rsa -C "注释" # 将公钥复制到gitlab账号的ssh key中
cat ~/.ssh/id_rsa.pub # 配置当前机器用户信息
git config --global user.name "用户名"
git config --global user.email "用户邮箱"

1.3 安装 Gitlab 和 git-runner

代码托管服务器安装 GitLab 参见《Linux 环境安装》。以下是docker-compose安装方式。

# 拉取gitlab镜像
docker pull gitlab/gitlab-ce # 新建文件夹
mkdir /home/docker
# 新建配置文件
vim ./docker-compose.yml version: '3'
services:
gitlab:
image: gitlab/gitlab-ce # 这里使用的之前pull的镜像
restart: always
hostname: '127.0.0.1'
container_name: gitlab # 注意名字不能重复
ports:
- '8020:443'
- '8021:80'
- '222:22'
- '25:25'
volumes:
- /home/docker/gitlab/config:/etc/gitlab
- /home/docker/gitlab/logs:/var/log/gitlab
- /home/docker/gitlab/data:/var/opt/gitlab2
gitlab-runner:
image: gitlab/gitlab-runner
restart: always
hostname: '127.0.0.1'
container_name: gitlab-runner
extra_hosts:
- git.imlcs.top:127.0.0.1
depends_on:
- gitlab
volumes:
- /home/docker/gitlab-runner:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock # 创建容器并启动
docker-compose up -d # 修改配置之后重启
docker restart gitlab

安装完成后需要注册runner

# 进入gitlab
docker exec -it gitlab-runner bash # 注册runner
gitlab-runner register # Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
https://git.example.com
# Please enter the gitlab-ci token for this runner:
# 这个去https://git.example.com/root/ci-demo/-/settings/ci_cd的Runners中查看
dnqLAVf52xpz6HfLxwmc
# Please enter the gitlab-ci description for this runner:
[127.0.0.1]: test080701
# Please enter the gitlab-ci tags for this runner (comma separated):
# 作为gitlab-ci.yml的标识
test
# Registering runner... succeeded runner=dnqLAVf5
# Please enter the executor: kubernetes, docker, docker-ssh, parallels, shell, ssh, virtualbox, docker+machine, custom, docker-ssh+machine:
docker
# Please enter the default Docker image (e.g. ruby:2.6):
docker:stable
# Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

注册完成之后,可以在gitlab的Runners中看到刚刚注册的runner:

同时在/home/docker/gitlab-runner下可以看到一个config.toml文件:

concurrent = 1
check_interval = 0 [session_server]
session_timeout = 1800 [[runners]]
name = "test080701"
url = "https://git.example.com"
token = "Rca9DJgx78NJkPzqxQUy"
executor = "docker"
[runners.custom_build_dir]
[runners.docker]
tls_verify = false
image = "docker:stable"
rivileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/var/run/docker.sock:/var/run/docker.sock","/cache"]
shm_size = 0
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.custom]
run_exec = ""

如果直接配置好这个文件,gitlab-runner运行时会自动加载这个文件。

接下来就需要配置 gitlab-ci.yml,语法可以参考这篇文章

为了方便在代码托管服务器登录部署服务器,这里使用部署服务器的root用户。

1.4 编写脚本和.gitlab-ci.yml

在项目根目录下编写脚本。

首先配置gitlab-ci.yml在项目根目录下,注意tags,这里是对应之前配置的runner的tags,只有加了这个,runner才会执行这个配置文件的script。

vim gitlab-ci.yml

stages:
- dev
services:
- docker:dind
before_script:
- apt-get update -qq && apt-get install -y -qq sshpass
deploy_dev:
image: node:10.15.0 # 这里注意切合你本地开发版本
stage: dev
cache:
paths:
- code/node_modules/
script:
- chmod +x ci/start.sh
- sh ci/start.sh
only:
- master
tags:
- dev
# 新建ci文件夹
mkdir ci && cd ci
# 新建部署脚本
vim start.sh #!/bin/bash
# 本地服务器部署文件绝对路径
LOCAL_PATH=`pwd`
echo "shell start! $LOCAL_PATH"
cd ${LOCAL_PATH}/code # 这里根据自身项目结构确定
# 1.安装依赖
npm install --unsafe -perm
# 2.打包
npm run build --unsafe -perm
echo "build done!"
# 4.远程部署目录备份并部署新文件
cd ${LOCAL_PATH}/code/pm
sshpass -p ${DEPLOY_LOCAL_PASS} ssh -o stricthostkeychecking=no ${DEPLOY_LOCAL_USR}@${DEPLOY_LOCAL_SERVER} 'bash -s' < ${LOCAL_PATH}/ci/backup.sh ${DEPLOY_LOCAL_PATH}
echo "execute remote done!"
sshpass -p ${DEPLOY_LOCAL_PASS} scp -o stricthostkeychecking=no -r ./* ${DEPLOY_LOCAL_USR}@${DEPLOY_LOCAL_SERVER}:${DEPLOY_LOCAL_PATH}
echo "scp done!"
# 新建远程执行脚本
vim backup.sh #!/bin/bash
echo "logged in success!"
cd $1
FILE_NAME=`mktemp -u pm.dev.XXXXX`
DATE=`date +"%Y%m%d%H%M%S"`
BACKUP="backup"
tar -zcvf ${FILE_NAME}.${DATE}.tar.gz ./* --exclude="$BACKUP"
# 移动备份文件到备份文件夹
if [ ! -d "$BACKUP" ]; then
mkdir "$BACKUP"
fi
mv ${FILE_NAME}.${DATE}.tar.gz "$BACKUP"
# 删除远程服务器部署目录中除backup外所有文件
ls|egrep -v "$BACKUP"|xargs rm -rf
echo "remote shell done at `pwd`! `ls`"

注意上面定义的常量(密码、服务器等)是抽离到gitlab的:

1.6 提交代码

push代码带master,查看CI/CD中如果发现passed表示已经成功调用。

The End

2019-8-14 11:20:57

参考文章《GitLab Build and Deploy to a Server via SSH》

基于 Docker 和 GitLab 的前端自动化部署实践笔记的更多相关文章

  1. 基于docker的gitlab+gitlabrunner+ansible自动部署

    系统架构图 网络架构 一.安装docker,确保hostname没有问题 ,查看/etc/hostname./etc/hosts. https://docs.docker.com/engine/ins ...

  2. 云端基于Docker的微服务与持续交付实践

    云端基于Docker的微服务与持续交付实践笔记,是基于易立老师在阿里巴巴首届在线技术峰会上<云端基于Docker的微服务与持续交付实践>总结而出的. 本次主要讲了什么? Docker Sw ...

  3. 基于AWS的自动化部署实践

    过年前,我给InfoQ写了篇文章详细介绍我们团队在过去4年基于AWS的自动化部署实践.文章包括了:为什么选择AWS.AWS上自动化部署的优势和挑战.我们的解决方案,以及和AWS DevOps方案(Op ...

  4. 如何搭建基于Docker的gitlab服务器集成CI/CD实现DEVOPS(完整版)

    From this lesson you will learn about 1,How to install and configure a docker based gitlab server 2, ...

  5. 庐山真面目之九微服务架构 NetCore 基于 Docker 基础镜像和挂载文件部署

    庐山真面目之九微服务架构 NetCore 基于 Docker 基础镜像和挂载文件部署 一.简介      我们在上一篇文章<庐山真面目之八微服务架构 NetCore 基于 Dockerfile ...

  6. [置顶] Docker学习总结(7)——云端基于Docker的微服务与持续交付实践

    本文根据[2016 全球运维大会•深圳站]现场演讲嘉宾分享内容整理而成 讲师简介 易立 毕业于北京大学,获得学士学位和硕士学位:目前负责阿里云容器技术相关的产品的研发工作. 加入阿里之前,曾在IBM中 ...

  7. Jenkins+SVN+Maven+shell 自动化部署实践

      JAVA环境中利用Jenkins+svn+maven进行自动化部署实践   一. 前言2 1.介绍jenkins2 1.本地项目打包2 2.通过secureCRT工具,手动传输到服务器2 3.然后 ...

  8. Kubernetes笔记(三):Gitlab+Jenkins Pipeline+Docker+k8s+Helm自动化部署实践(干货分享!)

    通过前面两篇文章,我们已经有了一个"嗷嗷待哺"的K8s集群环境,也对相关的概念与组件有了一个基本了解(前期对概念有个印象即可,因为只有实践了才能对其有深入理解,所谓"纸上 ...

  9. SpringCloud+Docker+Jenkins+GitLab+Maven实现自动化构建与部署实战

    1.前言与初衷 本文章会涉及Docker常见命令基础知识点结合不同场景实操一起使用. 本文章会涉及结合工作过程中部署不同环境服务器的项目案例场景为初心进行实际细讲. 本文章主要讲述Docker.Jen ...

随机推荐

  1. 关于System.BadImageFormatException

    什么是BadImageFormatException BadImageFormatException是当动态链接库 (DLL) 或可执行程序的文件映像无效时引发的异常. 可能的原因 如果动态链接库 ( ...

  2. dinoql 使用graphql 语法查询javascript objects

    dinoql 是一个不错的基于graphql 语法查询javascript objects 的工具包,包含以下特性 graphql 语法(很灵活) 安全的访问(当keys 不存在的时候,不会抛出运行时 ...

  3. Linux 系统管理——文件系统与LVM、磁盘配额实例

    1.为主机增加80G SCSI 接口硬盘 2.划分三个各20G的主分区 3.将三个主分区转换为物理卷(pvcreate),扫描系统中的物理卷 4.使用两个物理卷创建卷组,名字为myvg,查看卷组大小 ...

  4. 市场细分(Market Segmentation)

    什么是市场细分? 市场细分其实就是把拥有共同特征的人分在一起.这些共同特征可以是:喜欢喝某个牌子的红酒,飞机总是做头等舱,习惯用windows系统等等. 市场细分有什么用? 1,不同细分市场的需求存在 ...

  5. uni-app快速上手

    uni-app支持通过 可视化界面.vue-cli命令行 两种方式快速创建项目. 通过 HBuilderX 可视化界面可视化的方式比较简单,HBuilderX内置相关环境,开箱即用,无需配置nodej ...

  6. Noip2019暑期训练2

      题目名称 骑士遍历 和谐俱乐部 农场派对 对称二叉树 存盘文件名 knight Beautiful party tree 输入文件名 knight.in Beautiful.in party.in ...

  7. 微众银行Java面试-社招-一面(2019/07)

    个人情况 2017年毕业,普通本科,计算机科学与技术专业,毕业后在一个二三线小城市从事Java开发,2年Java开发经验.做过分布式开发,没有高并发的处理经验,平时做To G的项目居多.写下面经是希望 ...

  8. ldap和phpldapadmin的安装部署

    LDAP 安装 一.安装LDAP 1. 安装包 yum install openssl-devel gcc libtool-ltdl-devel -y yum install openldap-ser ...

  9. #C++初学记录(动态规划 被3整除的子序列)

    原题:牛客网 动态规划dynamic programming 的入门级题目 题目描述 : 给你一个长度为50的数字串,问你有多少个子序列构成的数字可以被3整除 答案对1e9+7取模 输入描述: 输入一 ...

  10. 文件分片 浏览器文件大小限制 自定义请求头 在一个资源的加载进度停止之后被触发 arrayBuffer 异步 二进制数据缓存区

    js 整数限制 浏览器文件大小限制 https://w3c.github.io/FileAPI/#dom-blob-arraybuffer https://developer.mozilla.org/ ...