🍔描述

GitHub Actions 是 GitHub 推出了一款持续集成服务

🍟作用

监听git版本变化操作数据中心或云基础架构中托管自己的自托管运行器

🌭基本概念

workflow: 一个 workflow 就是一个完整的工作流过程,每个workflow 包含一组 jobs任务。
job : jobs任务包含一个或多个job ,每个 job包含一系列的 steps 步骤。
step : 每个 step 步骤可以执行指令或者使用一个 action 动作。
action : 每个 action 动作就是一个通用的基本单元。

Actions常用属性

属性名 作用
name 名称
on: [push, pull_request] 可选择push或者pull_request 指定触发 workflow 的条件,通常是某些事件。
on: [schedule] cron 定时任务触发[push, pull_request]与[schedule]二选一
on: [push:pull_request] branches:[master] 指定触发事件时,可以限定分支或标签。
jobs: [job_id] 一个 CI/CD 的工作流有许多 jobs 组成,lint,test,build 或者 deploy 可自定义
jobs: [job_id] name 任务名称
jobs: [job_id] runs-on 指定运行所需要的虚拟机环境。ubuntu-latest, windows-latest, macOS-latest. 必填字段
jobs: [job_id] needs needs字段指定当前任务的依赖关系,即运行顺序
jobs: [job_id] steps steps字段指定每个 Job 的运行步骤,可以包含一个或多个步骤。每个步骤都可以指定以下三个字段。
jobs: [job_id] steps [name] 名称
jobs: [job_id] steps [uses] 引用github环境
jobs: [job_id] steps [with] 设置uses引用环境的参数

🙄 使用前提 : 服务主机须开启私钥登陆

在远程服务器上生成密钥对

 ssh-keygen -t rsa

一路回车

cd .ssh
mv id_rsa.pub authorized_keys
chmod 600 authorized_keys #修改公钥为只有属主有读写权限(安全考虑)
chmod 700 ~/.ssh #修改.SSH目录为只有属主有读、写、执行权限(安全考虑)

执行一下命令显示私钥文件内容

cat /root/.ssh/id_rsa

开启SSH+Key登录,用vi打开SSH的配制文件

vi /etc/ssh/sshd_config

此时终端中显示sshd_config配制文件内容,找到一下两个参数,将yes两个参数后的no改为yes,输入wq,回车保存退出vi

RSAAuthentication yes
PubkeyAuthentication yes

如果有需要可以关闭密码登陆,注释PasswordAuthentication

#PasswordAuthentication yes

然后重启sshd服务

#重启sshd服务
systemctl restart sshd.service

#更多sshd命令:
#开机自启:
#systemctl enable sshd.service

#查看状态:
#systemctl status sshd.service

#启动服务:
#systemctl start sshd.service

🤦‍♂️GitHub Actions 中使用密文

在持续集成的过程中,我们可能会使用到自己的敏感数据,这些数据不应该被开源并泄露。GithubActions提供了Secrets变量来实现这一效果。我们可以在 github repo 上依次点击 Settings -> Secrets-> Actions->New repository secret创建一个敏感数据例如:HOST,PORT, 然后我们就可以在GithubAction脚本中使用这些变量

🍳示意

Actions 基于maven打包部署Spring Boot 演示代码

name: Java CI with Maven

on:
  push:
    # 分支
    branches: [ master ]
jobs:
  compile:
    runs-on: ubuntu-latest
    name: Running Java ${{ matrix.java }} compile
    steps:
      - uses: actions/checkout@v2
      - name: Set up JDK 1.8
        uses: actions/setup-java@v1
        with:
          java-version: 1.8
      - name: 缓存 Maven 依赖
        uses: actions/cache@v2
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: |
            ${{ runner.os }}-maven-
      - name: 编译代码
        run: mvn compile
      - name: Deploy the JAR file to the remote server
        uses: actions/checkout@v2
      - name: Set up JDK 1.8
        uses: actions/setup-java@v1
        with:
          java-version: 1.8
      - name: Generate the package
        run: mvn -B package --file pom.xml -Dmaven.test.skip=true
      - name: 将 JAR 包部署到服务器
        uses: garygrossgarten/github-action-scp@release
        with:
	  #github容器打包的文件 文件名在pom.xml修改
          local: target/demo-1.0.jar
	  #指定服务器地址 /tmp 开头不加"/" 标识上传到当前权限目录下
          remote: /tmp/jar/demo-1.0.jar
	  #在github setting中 secrets 设置全局变量 KEY 为私钥
          host: ${{ secrets.HOST}}
          port: ${{ secrets.PORT}}
          username: ${{ secrets.USERNAME }}
          privateKey: ${{ secrets.KEY }}
      - name: 在服务器上执行 java -jar,请确保服务器安装了 JDK
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST}}
          port: ${{ secrets.PORT}}
          username: ${{ secrets.USERNAME }}
          key: ${{ secrets.KEY }}
          script: |
	    #执行脚本
            sh /home/index/restart.sh 8989

🍻服务器主机自动化脚本

#!/bin/bash
#jar包名称
JAR_FILE_NAME="demo-1.0.jar"
#github上传地址 与actions配置一样
TEMP_PATH="/tmp/jar/"
#正在运行的jar包位置
LOCAl_PATH_PATH="/home/index/"
#本地log日志名称
LOG_FILE_NAME="demo.log"

if [ -z $1 ]; then
        echo "请输入当前服务的端口号!"
        exit 0
fi

PID=$(netstat -nlp | grep ":$1" | awk '{print $7}' | awk -F '[ / ]' '{print $1}')

#判断用户输入的端口是否存在
if [ $? == 0 ]; then
        echo "进程 id is:${PID}"
else
        echo "端口号 $1 no exit"
        exit 0
fi

kill -9 ${PID}
echo $?

echo "kill $1 success"

#判断github Actions 是否上传文件
if [ ! -f ${TEMP_PATH}${JAR_FILE_NAME} ]; then 
        echo "TEMP_PATH: ${TEMP_PATH}${JAR_FILE_NAME} 文件不存在!"
        exit 0
fi

#判断本地jar是否存在
if [ ! -f ${LOCAl_PATH_PATH}${JAR_FILE_NAME} ]; then 
        echo "LOCAl_PATH_PATH: ${LOCAl_PATH_PATH}${JAR_FILE_NAME} 文件不存在!"
        exit 0
fi

#修改本地jar包名称
OLD_JAR_PATH="${LOCAl_PATH_PATH}old_jar$(date "+%Y-%m-%d-%H:%M:%S").jar"

mv ${LOCAl_PATH_PATH}${JAR_FILE_NAME} ${OLD_JAR_PATH}

#修改本地日志文件名称
OLD_LOG_PATH="${LOCAl_PATH_PATH}old_log$(date "+%Y-%m-%d-%H:%M:%S").log"

mv ${LOCAl_PATH_PATH}${LOG_FILE_NAME} ${OLD_LOG_PATH}

echo $?
echo "重名被迭代jar文件位置------->${OLD_JAR_PATH}"
echo "重名被迭代日志文件位置------->${OLD_LOG_PATH}"

#移动新的jar到本地
mv ${TEMP_PATH}${JAR_FILE_NAME} ${LOCAl_PATH_PATH}${JAR_FILE_NAME}


nohup java -jar ${LOCAl_PATH_PATH}${JAR_FILE_NAME} > ${LOCAl_PATH_PATH}${LOG_FILE_NAME} 2>&1 &
echo "应用启动success"

Action 基于Node打包 Nginx部署Vue项目演示代码

name: Vue CI
on:
 push:
   branches: [ master ]
jobs:
 build:
   runs-on: ubuntu-latest
   strategy:
     matrix:
       node-version: [16.x]
   steps:
   - uses: actions/checkout@v2
   - name: Use Node.js ${{ matrix.node-version }}
     uses: actions/setup-node@v2
     with:
       node-version: ${{ matrix.node-version }}
       cache: 'npm'
   - run: npm ci
   - run: npm run build --if-present
   - name: 将静态资源上传到服务器
     uses: appleboy/scp-action@master
     with:
       host: ${{ secrets.HOST }}
       port: ${{ secrets.PORT }}
       username: ${{ secrets.USERNAME }}
       key: ${{ secrets.KEY }}
       source: dist/*
       target: ${{ secrets.TARGET }}
   - name: 运行服务器脚本
     uses: appleboy/ssh-action@master
     with:
       host: ${{ secrets.HOST }}
       port: ${{ secrets.PORT }}
       username: ${{ secrets.USERNAME }}
       key: ${{ secrets.KEY }}
       script: |
        sh ${{ secrets.SHELL_SCRIPT }}

🙃总结

由于github间歇性被墙 , 所以以上简介均为参考