-
Notifications
You must be signed in to change notification settings - Fork 22
137 lines (130 loc) · 4.28 KB
/
main.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
name: CI
on:
push:
branches:
- "master"
pull_request:
release:
types: [published]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
test:
name: Test
runs-on: ubuntu-latest
outputs:
environment: ${{ steps.setVersion.outputs.environment }}
version: ${{ steps.setVersion.outputs.version }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set timezone
run: sudo timedatectl set-timezone 'Asia/Shanghai'
- name: Set up Python
uses: he0119/setup-python@main
with:
python-version: "3.11"
- name: Install prerequisites
run: |
poetry config installer.modern-installation false
poetry install
- name: Run tests
run: poetry run pytest --cov=src --cov-report xml -n auto
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
- name: Set build version
id: setVersion
run: |
VERSION=$(poetry version -s)
COMMIT_ID=$(git rev-parse --short HEAD)
if [[ "${{github.event_name}}" == "release" && "${{github.event.action}}" == "published" ]]; then
echo "environment=prod" >> $GITHUB_OUTPUT
echo "version=$VERSION" >> $GITHUB_OUTPUT
else
echo "environment=dev" >> $GITHUB_OUTPUT
echo "version=$VERSION-git.$COMMIT_ID" >> $GITHUB_OUTPUT
fi
docker:
name: Docker
runs-on: ubuntu-latest
needs: test
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set version
run: sed -ri "s#SENTRY_RELEASE=version#SENTRY_RELEASE=$VERSION#g" Dockerfile
env:
VERSION: ${{ needs.test.outputs.version }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v4
with:
images: he0119/coolqbot
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to DockerHub
if: github.event_name != 'pull_request'
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
deploy_dev:
name: Deploy Dev
runs-on: ubuntu-latest
environment: dev
needs: docker
if: ${{ github.event_name != 'pull_request' }}
steps:
- name: Tailscale
uses: tailscale/github-action@4e4c49acaa9818630ce0bd7a564372c17e33fb4d
with:
oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }}
oauth-secret: ${{ secrets.TS_OAUTH_SECRET }}
tags: tag:ci
- name: Deploy to server
run: tailscale ssh ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_HOST }} "${{ secrets.COOLQBOT_ROOT }}/deploy.sh"
deploy_prod:
name: Deploy Prod
runs-on: ubuntu-latest
environment: prod
needs: docker
if: ${{ github.event_name == 'release' && github.event.action == 'published' }}
steps:
- name: Deploy to server
uses: appleboy/ssh-action@55dabf81b49d4120609345970c91507e2d734799
with:
host: ${{ secrets.SSH_HOST }}
port: ${{ secrets.SSH_PORT }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_KEY }}
script_stop: true
script: sudo ${{ secrets.COOLQBOT_ROOT }}/deploy.sh
sentry_release:
name: Sentry Release
runs-on: ubuntu-latest
needs: [test, docker]
if: github.event_name != 'pull_request'
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Create Sentry release
uses: getsentry/action-release@v1
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
with:
environment: ${{ needs.test.outputs.environment }}
version: ${{ needs.test.outputs.version }}