服务器性能不足时,可在虚拟机编译,再通过 SSH 推送到服务器。

安装 Jenkins

mkdir -p /root/docker/jenkins && cd /root/docker/jenkins

docker-compose.yml

version: "2"
services:
  jenkins:
    image: jenkins/jenkins:lts
    container_name: jenkins
    restart: always
    ports:
      - 19280:8080
      - 19281:50000
    volumes:
      - ./data:/var/jenkins_home
      - /etc/localtime:/etc/localtime
docker-compose up -d

初始密码:cat data/secrets/initialAdminPassword

安装插件

中文插件:Manage → Plugin Manager → Available → 搜索"中文" → 安装 → 重启

docker-compose restart

必装插件

  • GitHub plugin
  • Git Parameter
  • NodeJS Plugin
  • Publish Over SSH
  • SSH server

配置

Node.js 版本:Manage → Global Tool Configuration → 底部 NodeJS → 填写别名和版本

GitHub Token

  1. GitHub → Settings → Developer settings → Personal access tokens → New classic token
  2. Manage → System → GitHub → 添加凭据(Secret text)→ 粘贴 token
  3. Manage → Security → Git Host Key Verification → No verification
  4. Manage → System → Publish over SSH → 配置远程服务器

配置 SSH Key

docker exec -it jenkins bash
ssh-keygen   # 一路回车
cat .ssh/id_rsa.pub   # 复制公钥到 GitHub SSH Keys

创建流水线

  1. Dashboard → New Item → 输入名称 → Freestyle project
  2. 参数化构建:Git Parameter,名称 BRANCH,类型"分支",默认值 */master
  3. 源码管理:Git → 填写仓库地址和 SSH 凭据(私钥在容器 ~/.ssh/id_rsa
  4. Build Steps:Execute shell
rm -rf node_modules package-lock.json *.tar.gz out
npm config set registry https://registry.npmmirror.com
npm install
npm run export
cd out && tar -zcvf $WORKSPACE/$BUILD_ID-$JOB_NAME.tar.gz *
  1. Send files over SSH
    • Source files: *.tar.gz
    • Remote directory: /home/wwwroot/bak/

Exec command(保留最近 5 次备份)

BAKDIR=/home/wwwroot/bak/
WORKDIR=/home/wwwroot/项目目录/

rm -rf $WORKDIR/*
cd $WORKDIR
cp $BAKDIR/$BUILD_ID-$JOB_NAME.tar.gz ./
tar -zxvf $BUILD_ID-$JOB_NAME.tar.gz
rm -f $BUILD_ID-$JOB_NAME.tar.gz
chown -R root:root * && chmod -R 777 *

cd $BAKDIR
FILENUM=$(ls -lrt ./ | grep $JOB_NAME.tar.gz | wc -l)
while [ $FILENUM -gt 5 ]; do
    OLDEST=$(ls -lrt ./ | grep $JOB_NAME.tar.gz | awk '{print $9}' | head -1)
    rm -rf $OLDEST
    let FILENUM--
done