🍔描述
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 }}