-
Notifications
You must be signed in to change notification settings - Fork 2
123 lines (117 loc) · 4.71 KB
/
Copy pathci.yml
File metadata and controls
123 lines (117 loc) · 4.71 KB
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
name: CI
on:
push:
branches: ["**"]
pull_request:
jobs:
test:
name: fmt + vet + test (domínio puro, sem .so)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/setup-go@v7
with:
go-version: "1.27.0"
cache: true
# Gate de formatação: falha se algum .go rastreado não estiver gofmt-limpo.
- name: gofmt
run: |
fora=$(gofmt -l $(git ls-files '*.go'))
if [ -n "$fora" ]; then
echo "Arquivos fora do gofmt (rode 'make fmt'):"; echo "$fora"; exit 1
fi
# CGO desligado: compila o binding stub. O domínio inteiro, que é o ativo
# do projeto: é testável sem a lib nativa E sem certificado, porque a fase
# 1 do contrato não assina. É o que torna este job barato e honesto.
- run: CGO_ENABLED=0 go vet ./...
- run: CGO_ENABLED=0 go test ./...
# A spec é gerada dos modelos Go. Este gate impede que ela envelheça: sem
# ele, o campo que alguém adicionar hoje some da documentação amanhã.
# Regenera a spec e confere que ela é YAML válido. O segundo já pegou uma
# quebra: descrição com ": " sem aspas vira escalar inválido, e o Swagger
# deixa de renderizar sem erro nenhum no build.
- run: make openapi-check
# YAML quebrado não avisa: o GitHub ignora o arquivo em silêncio. Um
# workflow que não parseia nunca roda. Aconteceu com publicar.yml e com
# ISSUE_TEMPLATE/config.yml, os dois por escalar sem aspas com ": ".
- run: make yaml-valida
cgo:
name: type-check + link do binding contra as .so reais
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/setup-go@v7
with:
go-version: "1.27.0"
cache: true
# As libs NEEDED pelo .so: o linker precisa delas para resolver as
# referências transitivas.
- name: dependências nativas
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
libcairo2 libpango-1.0-0 libpangocairo-1.0-0 libglib2.0-0 libgtk2.0-0
- name: baixa as libs nativas
run: make acbr-libs-baixar
# Este job pega o que o job acima NÃO pega: assinatura C errada no header.
# Um argumento a menos desloca os registradores e vira corrupção de memória
# em runtime, já aconteceu com CTE_Enviar.
- run: make test-cgo
- run: make build-cgo
govulncheck:
name: govulncheck (CVEs alcançadas pelo código)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/setup-go@v7
with:
go-version: "1.27.0"
cache: true
- run: go install golang.org/x/vuln/cmd/govulncheck@latest
- run: CGO_ENABLED=0 govulncheck ./...
lint:
name: golangci-lint
runs-on: ubuntu-latest
env:
CGO_ENABLED: "0"
steps:
- uses: actions/checkout@v7
- uses: actions/setup-go@v7
with:
go-version: "1.27.0"
cache: true
- uses: golangci/golangci-lint-action@v9
with:
version: v2.13.1
# verify baixa o JSON Schema do site do golangci a cada run só para
# validar o .golangci.yml: dependência de rede externa que já derrubou
# CI por timeout, sem nada a ver com o código.
verify: false
segredo:
name: nenhum segredo no repositório
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
# Este projeto recebe certificado alheio por payload. Um .pfx ou .env que
# escape para o repositório PÚBLICO é irreversível: vale um gate barato.
- name: procura certificados, chaves e .env
run: |
# O -v '.example' é essencial: .env.example É para ser versionado, e
# sem ele este gate reprova todo push.
achados=$(git ls-files \
| grep -iE '\.(pfx|p12|pem|key|crt|cer)$|(^|/)\.env($|\.)' \
| grep -v '\.example$' || true)
if [ -n "$achados" ]; then
echo "::error::arquivos sensíveis rastreados:"; echo "$achados"; exit 1
fi
echo "nenhum arquivo sensível rastreado"
# Um `go build ./cmd/<x>` distraído deixa o binário na raiz e ele entra no
# commit seguinte. Aconteceu uma vez, com 3 MB.
- name: nenhum binário grande rastreado
run: |
grandes=$(git ls-files -z | xargs -0 -r du -k 2>/dev/null \
| awk '$1 > 500 {print $2}' | grep -vE 'testdata/|\.tsv$|^LICENSE$|swagger|openapi' || true)
if [ -n "$grandes" ]; then
echo "::error::arquivos acima de 500 KB rastreados:"; echo "$grandes"; exit 1
fi
echo "nenhum binário grande rastreado"