Skip to content

Commit ce31138

Browse files
committed
Merge remote-tracking branch 'upstream/main'
* upstream/main: (30 commits) Don't filter action runs based on state (go-gitea#24711) Add Go package registry (go-gitea#24687) Fix flash of unstyled content in action view page (go-gitea#24712) Clean up various avatar dimensions (go-gitea#24701) Remove the parallelizing when loading repo for dashboard (go-gitea#24705) Optimize actions list by removing an unnecessary `git` call (go-gitea#24710) Update cron-translations.yml (go-gitea#24708) Fix run list broken when trigger user deleted (go-gitea#24706) Remove Fomantic comment module (go-gitea#24703) Update to Alpine 3.18 (go-gitea#24700) fix minio storage iterator path (go-gitea#24691) Add status indicator on main home screen for each repo (go-gitea#24638) Add test for api team orgnization (go-gitea#24699) Improve button-ghost, remove tertiary button (go-gitea#24692) Add icon support for safari (go-gitea#24697) Improve avatar uploading / resizing / compressing, remove Fomantic card module (go-gitea#24653) Fix docs documenting invalid `@every` for `OLDER_THAN` cron settings (go-gitea#24695) Fix `organization` field being `null` in `GET /api/v1/teams/{id}` (go-gitea#24694) Use standard HTTP library to serve files (go-gitea#24693) Add `eslint-plugin-eslint-comments` (go-gitea#24690) ...
2 parents f53b33b + 6d2c63f commit ce31138

File tree

125 files changed

+3590
-2551
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

125 files changed

+3590
-2551
lines changed

.eslintrc.yaml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ plugins:
1616
- eslint-plugin-sonarjs
1717
- eslint-plugin-custom-elements
1818
- eslint-plugin-regexp
19+
- eslint-plugin-wc
20+
- eslint-plugin-eslint-comments
1921

2022
env:
2123
es2022: true
@@ -85,6 +87,15 @@ rules:
8587
dot-notation: [0]
8688
eol-last: [2]
8789
eqeqeq: [2]
90+
eslint-comments/disable-enable-pair: [2]
91+
eslint-comments/no-aggregating-enable: [2]
92+
eslint-comments/no-duplicate-disable: [2]
93+
eslint-comments/no-restricted-disable: [0]
94+
eslint-comments/no-unlimited-disable: [2]
95+
eslint-comments/no-unused-disable: [2]
96+
eslint-comments/no-unused-enable: [2]
97+
eslint-comments/no-use: [0]
98+
eslint-comments/require-description: [0]
8899
for-direction: [2]
89100
func-call-spacing: [2, never]
90101
func-name-matching: [2]
@@ -717,6 +728,15 @@ rules:
717728
use-isnan: [2]
718729
valid-typeof: [2, {requireStringLiterals: true}]
719730
vars-on-top: [0]
731+
wc/attach-shadow-constructor: [2]
732+
wc/guard-super-call: [2]
733+
wc/no-closed-shadow-root: [2]
734+
wc/no-constructor-attributes: [2]
735+
wc/no-constructor-params: [2]
736+
wc/no-invalid-element-name: [0] # covered by custom-elements/valid-tag-name
737+
wc/no-self-class: [2]
738+
wc/no-typos: [2]
739+
wc/require-listener-teardown: [2]
720740
wrap-iife: [2, inside]
721741
wrap-regex: [0]
722742
yield-star-spacing: [2, after]

.github/workflows/cron-translations.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ jobs:
3838
env:
3939
CROWDIN_KEY: ${{ secrets.CROWDIN_KEY }}
4040
PLUGIN_UPLOAD: true
41+
PLUGIN_EXPORT_DIR: options/locale/
4142
PLUGIN_IGNORE_BRANCH: true
4243
PLUGIN_PROJECT_IDENTIFIER: gitea
4344
PLUGIN_FILES: |

.github/workflows/pull-db-tests.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,13 @@ jobs:
102102
--health-retries 10
103103
ports:
104104
- 6379:6379
105+
minio:
106+
image: bitnami/minio:2021.3.17
107+
env:
108+
MINIO_ACCESS_KEY: 123456
109+
MINIO_SECRET_KEY: 12345678
110+
ports:
111+
- "9000:9000"
105112
steps:
106113
- uses: actions/checkout@v3
107114
- uses: actions/setup-go@v4

Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#Build stage
2-
FROM docker.io/library/golang:1.20-alpine3.17 AS build-env
2+
FROM docker.io/library/golang:1.20-alpine3.18 AS build-env
33

44
ARG GOPROXY
55
ENV GOPROXY ${GOPROXY:-direct}
@@ -23,7 +23,7 @@ RUN if [ -n "${GITEA_VERSION}" ]; then git checkout "${GITEA_VERSION}"; fi \
2323
# Begin env-to-ini build
2424
RUN go build contrib/environment-to-ini/environment-to-ini.go
2525

26-
FROM docker.io/library/alpine:3.17
26+
FROM docker.io/library/alpine:3.18
2727
LABEL maintainer="[email protected]"
2828

2929
EXPOSE 22 3000

Dockerfile.rootless

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#Build stage
2-
FROM docker.io/library/golang:1.20-alpine3.17 AS build-env
2+
FROM docker.io/library/golang:1.20-alpine3.18 AS build-env
33

44
ARG GOPROXY
55
ENV GOPROXY ${GOPROXY:-direct}
@@ -23,7 +23,7 @@ RUN if [ -n "${GITEA_VERSION}" ]; then git checkout "${GITEA_VERSION}"; fi \
2323
# Begin env-to-ini build
2424
RUN go build contrib/environment-to-ini/environment-to-ini.go
2525

26-
FROM docker.io/library/alpine:3.17
26+
FROM docker.io/library/alpine:3.18
2727
LABEL maintainer="[email protected]"
2828

2929
EXPOSE 2222 3000

cmd/migrate_storage.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"fmt"
99
"strings"
1010

11+
actions_model "code.gitea.io/gitea/models/actions"
1112
"code.gitea.io/gitea/models/db"
1213
git_model "code.gitea.io/gitea/models/git"
1314
"code.gitea.io/gitea/models/migrations"
@@ -32,7 +33,7 @@ var CmdMigrateStorage = cli.Command{
3233
cli.StringFlag{
3334
Name: "type, t",
3435
Value: "",
35-
Usage: "Type of stored files to copy. Allowed types: 'attachments', 'lfs', 'avatars', 'repo-avatars', 'repo-archivers', 'packages'",
36+
Usage: "Type of stored files to copy. Allowed types: 'attachments', 'lfs', 'avatars', 'repo-avatars', 'repo-archivers', 'packages', 'actions-log'",
3637
},
3738
cli.StringFlag{
3839
Name: "storage, s",
@@ -134,6 +135,22 @@ func migratePackages(ctx context.Context, dstStorage storage.ObjectStorage) erro
134135
})
135136
}
136137

138+
func migrateActionsLog(ctx context.Context, dstStorage storage.ObjectStorage) error {
139+
return db.Iterate(ctx, nil, func(ctx context.Context, task *actions_model.ActionTask) error {
140+
if task.LogExpired {
141+
// the log has been cleared
142+
return nil
143+
}
144+
if !task.LogInStorage {
145+
// running tasks store logs in DBFS
146+
return nil
147+
}
148+
p := task.LogFilename
149+
_, err := storage.Copy(dstStorage, p, storage.Actions, p)
150+
return err
151+
})
152+
}
153+
137154
func runMigrateStorage(ctx *cli.Context) error {
138155
stdCtx, cancel := installSignals()
139156
defer cancel()
@@ -201,6 +218,7 @@ func runMigrateStorage(ctx *cli.Context) error {
201218
"repo-avatars": migrateRepoAvatars,
202219
"repo-archivers": migrateRepoArchivers,
203220
"packages": migratePackages,
221+
"actions-log": migrateActionsLog,
204222
}
205223

206224
tp := strings.ToLower(ctx.String("type"))

custom/conf/app.example.ini

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -940,6 +940,9 @@ ROUTER = console
940940
;; Force ssh:// clone url instead of scp-style uri when default SSH port is used
941941
;USE_COMPAT_SSH_URI = false
942942
;;
943+
;; Value for the "go get" request returns the repository url as https or ssh, default is https
944+
;GO_GET_CLONE_URL_PROTOCOL = https
945+
;;
943946
;; Close issues as long as a commit on any branch marks it as fixed
944947
;; Comma separated list of globally disabled repo units. Allowed values: repo.issues, repo.ext_issues, repo.pulls, repo.wiki, repo.ext_wiki, repo.projects, repo.packages, repo.actions.
945948
;DISABLED_REPO_UNITS =
@@ -1770,16 +1773,19 @@ ROUTER = console
17701773
;; Max Width and Height of uploaded avatars.
17711774
;; This is to limit the amount of RAM used when resizing the image.
17721775
;AVATAR_MAX_WIDTH = 4096
1773-
;AVATAR_MAX_HEIGHT = 3072
1776+
;AVATAR_MAX_HEIGHT = 4096
17741777
;;
17751778
;; The multiplication factor for rendered avatar images.
17761779
;; Larger values result in finer rendering on HiDPI devices.
1777-
;AVATAR_RENDERED_SIZE_FACTOR = 3
1780+
;AVATAR_RENDERED_SIZE_FACTOR = 2
17781781
;;
17791782
;; Maximum allowed file size for uploaded avatars.
17801783
;; This is to limit the amount of RAM used when resizing the image.
17811784
;AVATAR_MAX_FILE_SIZE = 1048576
17821785
;;
1786+
;; If the uploaded file is not larger than this byte size, the image will be used as is, without resizing/converting.
1787+
;AVATAR_MAX_ORIGIN_SIZE = 262144
1788+
;;
17831789
;; Chinese users can choose "duoshuo"
17841790
;; or a custom avatar source, like: http://cn.gravatar.com/avatar/
17851791
;GRAVATAR_SOURCE = gravatar
@@ -2439,6 +2445,8 @@ ROUTER = console
24392445
;LIMIT_TOTAL_OWNER_COUNT = -1
24402446
;; Maximum size of packages a single owner can use (`-1` means no limits, format `1000`, `1 MB`, `1 GiB`)
24412447
;LIMIT_TOTAL_OWNER_SIZE = -1
2448+
;; Maximum size of an Alpine upload (`-1` means no limits, format `1000`, `1 MB`, `1 GiB`)
2449+
;LIMIT_SIZE_ALPINE = -1
24422450
;; Maximum size of a Cargo upload (`-1` means no limits, format `1000`, `1 MB`, `1 GiB`)
24432451
;LIMIT_SIZE_CARGO = -1
24442452
;; Maximum size of a Chef upload (`-1` means no limits, format `1000`, `1 MB`, `1 GiB`)
@@ -2455,6 +2463,8 @@ ROUTER = console
24552463
;LIMIT_SIZE_DEBIAN = -1
24562464
;; Maximum size of a Generic upload (`-1` means no limits, format `1000`, `1 MB`, `1 GiB`)
24572465
;LIMIT_SIZE_GENERIC = -1
2466+
;; Maximum size of a Go upload (`-1` means no limits, format `1000`, `1 MB`, `1 GiB`)
2467+
;LIMIT_SIZE_GO = -1
24582468
;; Maximum size of a Helm upload (`-1` means no limits, format `1000`, `1 MB`, `1 GiB`)
24592469
;LIMIT_SIZE_HELM = -1
24602470
;; Maximum size of a Maven upload (`-1` means no limits, format `1000`, `1 MB`, `1 GiB`)

docs/content/doc/administration/config-cheat-sheet.en-us.md

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ In addition there is _`StaticRootPath`_ which can be set as a built-in at build
9595
HTTP protocol.
9696
- `USE_COMPAT_SSH_URI`: **false**: Force ssh:// clone url instead of scp-style uri when
9797
default SSH port is used.
98+
- `GO_GET_CLONE_URL_PROTOCOL`: **https**: Value for the "go get" request returns the repository url as https or ssh
99+
default is https.
98100
- `ACCESS_CONTROL_ALLOW_ORIGIN`: **\<empty\>**: Value for Access-Control-Allow-Origin header,
99101
default is not to present. **WARNING**: This maybe harmful to you website if you do not
100102
give it a right value.
@@ -790,9 +792,10 @@ and
790792
- `AVATAR_STORAGE_TYPE`: **default**: Storage type defined in `[storage.xxx]`. Default is `default` which will read `[storage]` if no section `[storage]` will be a type `local`.
791793
- `AVATAR_UPLOAD_PATH`: **data/avatars**: Path to store user avatar image files.
792794
- `AVATAR_MAX_WIDTH`: **4096**: Maximum avatar image width in pixels.
793-
- `AVATAR_MAX_HEIGHT`: **3072**: Maximum avatar image height in pixels.
794-
- `AVATAR_MAX_FILE_SIZE`: **1048576** (1Mb): Maximum avatar image file size in bytes.
795-
- `AVATAR_RENDERED_SIZE_FACTOR`: **3**: The multiplication factor for rendered avatar images. Larger values result in finer rendering on HiDPI devices.
795+
- `AVATAR_MAX_HEIGHT`: **4096**: Maximum avatar image height in pixels.
796+
- `AVATAR_MAX_FILE_SIZE`: **1048576** (1MiB): Maximum avatar image file size in bytes.
797+
- `AVATAR_MAX_ORIGIN_SIZE`: **262144** (256KiB): If the uploaded file is not larger than this byte size, the image will be used as is, without resizing/converting.
798+
- `AVATAR_RENDERED_SIZE_FACTOR`: **2**: The multiplication factor for rendered avatar images. Larger values result in finer rendering on HiDPI devices.
796799

797800
- `REPOSITORY_AVATAR_STORAGE_TYPE`: **default**: Storage type defined in `[storage.xxx]`. Default is `default` which will read `[storage]` if no section `[storage]` will be a type `local`.
798801
- `REPOSITORY_AVATAR_UPLOAD_PATH`: **data/repo-avatars**: Path to store repository avatar image files.
@@ -1016,7 +1019,7 @@ Default templates for project boards:
10161019
- `RUN_AT_START`: **false**: Run tasks at start up time (if ENABLED).
10171020
- `NOTICE_ON_SUCCESS`: **false**: Set to true to switch on success notices.
10181021
- `SCHEDULE`: **@every 168h**: Cron syntax to set how often to check.
1019-
- `OLDER_THAN`: **@every 8760h**: any action older than this expression will be deleted from database, suggest using `8760h` (1 year) because that's the max length of heatmap.
1022+
- `OLDER_THAN`: **8760h**: any action older than this expression will be deleted from database, suggest using `8760h` (1 year) because that's the max length of heatmap.
10201023

10211024
#### Cron - Check for new Gitea versions (`cron.update_checker`)
10221025

@@ -1032,7 +1035,7 @@ Default templates for project boards:
10321035
- `RUN_AT_START`: **false**: Run tasks at start up time (if ENABLED).
10331036
- `NO_SUCCESS_NOTICE`: **false**: Set to true to switch off success notices.
10341037
- `SCHEDULE`: **@every 168h**: Cron syntax to set how often to check.
1035-
- `OLDER_THAN`: **@every 8760h**: any system notice older than this expression will be deleted from database.
1038+
- `OLDER_THAN`: **8760h**: any system notice older than this expression will be deleted from database.
10361039

10371040
#### Cron - Garbage collect LFS pointers in repositories (`cron.gc_lfs`)
10381041

@@ -1211,6 +1214,7 @@ Task queue configuration has been moved to `queue.task`. However, the below conf
12111214
- `CHUNKED_UPLOAD_PATH`: **tmp/package-upload**: Path for chunked uploads. Defaults to `APP_DATA_PATH` + `tmp/package-upload`
12121215
- `LIMIT_TOTAL_OWNER_COUNT`: **-1**: Maximum count of package versions a single owner can have (`-1` means no limits)
12131216
- `LIMIT_TOTAL_OWNER_SIZE`: **-1**: Maximum size of packages a single owner can use (`-1` means no limits, format `1000`, `1 MB`, `1 GiB`)
1217+
- `LIMIT_SIZE_ALPINE`: **-1**: Maximum size of an Alpine upload (`-1` means no limits, format `1000`, `1 MB`, `1 GiB`)
12141218
- `LIMIT_SIZE_CARGO`: **-1**: Maximum size of a Cargo upload (`-1` means no limits, format `1000`, `1 MB`, `1 GiB`)
12151219
- `LIMIT_SIZE_CHEF`: **-1**: Maximum size of a Chef upload (`-1` means no limits, format `1000`, `1 MB`, `1 GiB`)
12161220
- `LIMIT_SIZE_COMPOSER`: **-1**: Maximum size of a Composer upload (`-1` means no limits, format `1000`, `1 MB`, `1 GiB`)
@@ -1219,6 +1223,7 @@ Task queue configuration has been moved to `queue.task`. However, the below conf
12191223
- `LIMIT_SIZE_CONTAINER`: **-1**: Maximum size of a Container upload (`-1` means no limits, format `1000`, `1 MB`, `1 GiB`)
12201224
- `LIMIT_SIZE_DEBIAN`: **-1**: Maximum size of a Debian upload (`-1` means no limits, format `1000`, `1 MB`, `1 GiB`)
12211225
- `LIMIT_SIZE_GENERIC`: **-1**: Maximum size of a Generic upload (`-1` means no limits, format `1000`, `1 MB`, `1 GiB`)
1226+
- `LIMIT_SIZE_GO`: **-1**: Maximum size of a Go upload (`-1` means no limits, format `1000`, `1 MB`, `1 GiB`)
12221227
- `LIMIT_SIZE_HELM`: **-1**: Maximum size of a Helm upload (`-1` means no limits, format `1000`, `1 MB`, `1 GiB`)
12231228
- `LIMIT_SIZE_MAVEN`: **-1**: Maximum size of a Maven upload (`-1` means no limits, format `1000`, `1 MB`, `1 GiB`)
12241229
- `LIMIT_SIZE_NPM`: **-1**: Maximum size of a npm upload (`-1` means no limits, format `1000`, `1 MB`, `1 GiB`)

docs/content/doc/administration/config-cheat-sheet.zh-cn.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,8 @@ menu:
214214
- `AVATAR_STORAGE_TYPE`: **local**: 头像存储类型,可以为 `local``minio`,分别支持本地文件系统和 minio 兼容的API。
215215
- `AVATAR_UPLOAD_PATH`: **data/avatars**: 存储头像的文件系统路径。
216216
- `AVATAR_MAX_WIDTH`: **4096**: 头像最大宽度,单位像素。
217-
- `AVATAR_MAX_HEIGHT`: **3072**: 头像最大高度,单位像素。
218-
- `AVATAR_MAX_FILE_SIZE`: **1048576** (1Mb): 头像最大大小。
217+
- `AVATAR_MAX_HEIGHT`: **4096**: 头像最大高度,单位像素。
218+
- `AVATAR_MAX_FILE_SIZE`: **1048576** (1MiB): 头像最大大小。
219219

220220
- `REPOSITORY_AVATAR_STORAGE_TYPE`: **local**: 仓库头像存储类型,可以为 `local``minio`,分别支持本地文件系统和 minio 兼容的API。
221221
- `REPOSITORY_AVATAR_UPLOAD_PATH`: **data/repo-avatars**: 存储仓库头像的路径。
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
---
2+
date: "2023-03-25T00:00:00+00:00"
3+
title: "Alpine Packages Repository"
4+
slug: "packages/alpine"
5+
draft: false
6+
toc: false
7+
menu:
8+
sidebar:
9+
parent: "packages"
10+
name: "Alpine"
11+
weight: 4
12+
identifier: "alpine"
13+
---
14+
15+
# Alpine Packages Repository
16+
17+
Publish [Alpine](https://pkgs.alpinelinux.org/) packages for your user or organization.
18+
19+
**Table of Contents**
20+
21+
{{< toc >}}
22+
23+
## Requirements
24+
25+
To work with the Alpine registry, you need to use a HTTP client like `curl` to upload and a package manager like `apk` to consume packages.
26+
27+
The following examples use `apk`.
28+
29+
## Configuring the package registry
30+
31+
To register the Alpine registry add the url to the list of known apk sources (`/etc/apk/repositories`):
32+
33+
```
34+
https://gitea.example.com/api/packages/{owner}/alpine/<branch>/<repository>
35+
```
36+
37+
| Placeholder | Description |
38+
| ------------ | ----------- |
39+
| `owner` | The owner of the packages. |
40+
| `branch` | The branch to use. |
41+
| `repository` | The repository to use. |
42+
43+
If the registry is private, provide credentials in the url. You can use a password or a [personal access token]({{< relref "doc/development/api-usage.en-us.md#authentication" >}}):
44+
45+
```
46+
https://{username}:{your_password_or_token}@gitea.example.com/api/packages/{owner}/alpine/<branch>/<repository>
47+
```
48+
49+
The Alpine registry files are signed with a RSA key which must be known to apk. Download the public key and store it in `/etc/apk/keys/`:
50+
51+
```shell
52+
curl -JO https://gitea.example.com/api/packages/{owner}/alpine/key
53+
```
54+
55+
Afterwards update the local package index:
56+
57+
```shell
58+
apk update
59+
```
60+
61+
## Publish a package
62+
63+
To publish an Alpine package (`*.apk`), perform a HTTP `PUT` operation with the package content in the request body.
64+
65+
```
66+
PUT https://gitea.example.com/api/packages/{owner}/alpine/{branch}/{repository}
67+
```
68+
69+
| Parameter | Description |
70+
| ------------ | ----------- |
71+
| `owner` | The owner of the package. |
72+
| `branch` | The branch may match the release version of the OS, ex: `v3.17`. |
73+
| `repository` | The repository can be used [to group packages](https://wiki.alpinelinux.org/wiki/Repositories) or just `main` or similar. |
74+
75+
Example request using HTTP Basic authentication:
76+
77+
```shell
78+
curl --user your_username:your_password_or_token \
79+
--upload-file path/to/file.apk \
80+
https://gitea.example.com/api/packages/testuser/alpine/v3.17/main
81+
```
82+
83+
If you are using 2FA or OAuth use a [personal access token]({{< relref "doc/development/api-usage.en-us.md#authentication" >}}) instead of the password.
84+
You cannot publish a file with the same name twice to a package. You must delete the existing package file first.
85+
86+
The server responds with the following HTTP Status codes.
87+
88+
| HTTP Status Code | Meaning |
89+
| ----------------- | ------- |
90+
| `201 Created` | The package has been published. |
91+
| `400 Bad Request` | The package name, version, branch, repository or architecture are invalid. |
92+
| `409 Conflict` | A package file with the same combination of parameters exist already in the package. |
93+
94+
## Delete a package
95+
96+
To delete an Alpine package perform a HTTP `DELETE` operation. This will delete the package version too if there is no file left.
97+
98+
```
99+
DELETE https://gitea.example.com/api/packages/{owner}/alpine/{branch}/{repository}/{architecture}/{filename}
100+
```
101+
102+
| Parameter | Description |
103+
| -------------- | ----------- |
104+
| `owner` | The owner of the package. |
105+
| `branch` | The branch to use. |
106+
| `repository` | The repository to use. |
107+
| `architecture` | The package architecture. |
108+
| `filename` | The file to delete.
109+
110+
Example request using HTTP Basic authentication:
111+
112+
```shell
113+
curl --user your_username:your_token_or_password -X DELETE \
114+
https://gitea.example.com/api/packages/testuser/alpine/v3.17/main/test-package-1.0.0.apk
115+
```
116+
117+
The server responds with the following HTTP Status codes.
118+
119+
| HTTP Status Code | Meaning |
120+
| ----------------- | ------- |
121+
| `204 No Content` | Success |
122+
| `404 Not Found` | The package or file was not found. |
123+
124+
## Install a package
125+
126+
To install a package from the Alpine registry, execute the following commands:
127+
128+
```shell
129+
# use latest version
130+
apk add {package_name}
131+
# use specific version
132+
apk add {package_name}={package_version}
133+
```

0 commit comments

Comments
 (0)