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
138
139
140
141
142
|
name: Publish docker image
on:
schedule:
- cron: "0 3 * * *"
workflow_dispatch:
inputs:
git_ref:
type: string
required: true
default: main
description: "Git branch/tag revision to build"
image_tag:
type: string
required: true
default: trunk
description: "docker image tag"
local_ydb_ref:
type: string
required: true
default: main
description: "Git branch/tag revision to builld local_ydb"
jobs:
provide-runner:
name: Start self-hosted YC runner
timeout-minutes: 5
runs-on: ubuntu-latest
outputs:
label: ${{steps.start-yc-runner.outputs.label}}
instance-id: ${{steps.start-yc-runner.outputs.instance-id}}
steps:
- name: Start YC runner
id: start-yc-runner
uses: yc-actions/yc-github-runner@v1
with:
mode: start
yc-sa-json-credentials: ${{ secrets.YC_SA_JSON_CREDENTIALS }}
github-token: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}
folder-id: ${{secrets.YC_FOLDER}}
image-id: fd8earpjmhevh8h6ug5o # TODO: create constant
disk-size: ${{vars.DISK_SIZE && vars.DISK_SIZE || '1023GB'}}
disk-type: network-ssd-nonreplicated
cores: 32
memory: 64GB
core-fraction: 100
zone-id: ru-central1-b
subnet-id: ${{secrets.YC_SUBNET}}
prepare-vm:
name: Prepare runner
needs: provide-runner
runs-on: [ self-hosted, "${{ needs.provide-runner.outputs.label }}" ]
steps:
- name: install docker
shell: bash
run: |
apt-get update
apt-get install -y --no-install-recommends docker.io
build:
needs:
- provide-runner
- prepare-vm
runs-on: "${{ needs.provide-runner.outputs.label }}"
steps:
- name: Checkout .github and local_ydb
uses: actions/checkout@v4
with:
ref: main
path: main
sparse-checkout: |
.github
ydb/public/tools/local_ydb/
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ inputs.git_ref || 'main' }}
path: ydb
- name: get revision
shell: bash
id: get-sha
working-directory: ydb
run: |
echo "SHA=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Log in to the Container registry
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v4
with:
images: |
ghcr.io/${{ github.repository_owner }}/local-ydb
labels: |
ydb.revision=${{ steps.get-sha.outputs.SHA }}
org.opencontainers.image.revision=${{ steps.get-sha.outputs.SHA }}
tags: |
type=schedule,pattern=nightly
type=raw,value=${{ inputs.image_tag || 'trunk' }}
- name: Build and push docker image
uses: docker/build-push-action@v4
with:
push: true
context: .
file: main/.github/docker/Dockerfile
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
platforms: linux/amd64
provenance: false
cache-from: type=s3,name=local_ydb,region=ru-central1,bucket=${{ vars.AWS_BUCKET }},endpoint_url=${{ vars.AWS_ENDPOINT }},access_key_id=${{ secrets.AWS_KEY_ID }},secret_access_key=${{ secrets.AWS_KEY_VALUE }}
cache-to: type=s3,name=local_ydb,region=ru-central1,bucket=${{ vars.AWS_BUCKET }},endpoint_url=${{ vars.AWS_ENDPOINT }},access_key_id=${{ secrets.AWS_KEY_ID }},secret_access_key=${{ secrets.AWS_KEY_VALUE }},mode=max
secrets: |
"ccache_remote_storage=${{ vars.REMOTE_CACHE_URL && format('http://{0}{1}', secrets.REMOTE_CACHE_AUTH, vars.REMOTE_CACHE_URL) || ''}}"
release-runner:
name: Release self-hosted YC runner if provided on-demand
needs:
- provide-runner
- build
runs-on: ubuntu-latest
if: always()
steps:
- name: Stop YC runner
uses: yc-actions/yc-github-runner@v1
with:
mode: stop
yc-sa-json-credentials: ${{ secrets.YC_SA_JSON_CREDENTIALS }}
github-token: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}
label: ${{ needs.provide-runner.outputs.label }}
instance-id: ${{ needs.provide-runner.outputs.instance-id }}
|