3 Commits

Author SHA1 Message Date
6a7f53f842 push release to local gitea instance
Some checks failed
release-nightly / goreleaser (push) Has been skipped
release-tag / goreleaser (push) Has been skipped
checks / check and test (push) Successful in 17s
release-nightly / release-image (push) Failing after 5m0s
release-tag / release-image (push) Failing after 5m0s
2024-09-06 16:11:58 +02:00
db2c4d3a44 update go version for Dockerfile
Some checks failed
release-nightly / goreleaser (push) Failing after 11s
release-nightly / release-image (push) Failing after 17s
release-tag / goreleaser (push) Failing after 18s
checks / check and test (push) Successful in 16s
release-tag / release-image (push) Failing after 24s
2024-09-06 14:10:41 +02:00
b6ddf0dce2 implement cache.advertise_url 2024-09-06 14:10:34 +02:00
23 changed files with 85 additions and 196 deletions

View File

@@ -18,9 +18,10 @@ jobs:
with: with:
go-version-file: "go.mod" go-version-file: "go.mod"
- name: goreleaser - name: goreleaser
uses: goreleaser/goreleaser-action@v6 uses: goreleaser/goreleaser-action@v5
with: with:
distribution: goreleaser-pro distribution: goreleaser-pro
version: latest
args: release --nightly args: release --nightly
env: env:
GORELEASER_KEY: ${{ secrets.GORELEASER_KEY }} GORELEASER_KEY: ${{ secrets.GORELEASER_KEY }}
@@ -68,7 +69,6 @@ jobs:
with: with:
context: . context: .
file: ./Dockerfile file: ./Dockerfile
target: basic
platforms: | platforms: |
linux/amd64 linux/amd64
linux/arm64 linux/arm64
@@ -76,25 +76,13 @@ jobs:
tags: | tags: |
${{ env.REGISTRY }}/${{ github.repository }}:${{ env.DOCKER_LATEST }} ${{ env.REGISTRY }}/${{ github.repository }}:${{ env.DOCKER_LATEST }}
- name: Build and push dind
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
target: dind
platforms: |
linux/amd64
linux/arm64
push: true
tags: |
${{ env.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}:${{ env.DOCKER_LATEST }}-dind
- name: Build and push dind-rootless - name: Build and push dind-rootless
uses: docker/build-push-action@v5 uses: docker/build-push-action@v5
env:
ACTIONS_RUNTIME_TOKEN: "" # See https://gitea.com/gitea/act_runner/issues/119
with: with:
context: . context: .
file: ./Dockerfile file: ./Dockerfile.rootless
target: dind-rootless
platforms: | platforms: |
linux/amd64 linux/amd64
linux/arm64 linux/arm64

View File

@@ -24,9 +24,10 @@ jobs:
passphrase: ${{ secrets.PASSPHRASE }} passphrase: ${{ secrets.PASSPHRASE }}
fingerprint: CC64B1DB67ABBEECAB24B6455FC346329753F4B0 fingerprint: CC64B1DB67ABBEECAB24B6455FC346329753F4B0
- name: goreleaser - name: goreleaser
uses: goreleaser/goreleaser-action@v6 uses: goreleaser/goreleaser-action@v5
with: with:
distribution: goreleaser-pro distribution: goreleaser-pro
version: latest
args: release args: release
env: env:
GORELEASER_KEY: ${{ secrets.GORELEASER_KEY }} GORELEASER_KEY: ${{ secrets.GORELEASER_KEY }}
@@ -75,7 +76,6 @@ jobs:
with: with:
context: . context: .
file: ./Dockerfile file: ./Dockerfile
target: basic
platforms: | platforms: |
linux/amd64 linux/amd64
linux/arm64 linux/arm64
@@ -84,26 +84,13 @@ jobs:
${{ env.REGISTRY }}/${{ github.repository }}:${{ steps.meta.outputs.REPO_VERSION }} ${{ env.REGISTRY }}/${{ github.repository }}:${{ steps.meta.outputs.REPO_VERSION }}
${{ env.REGISTRY }}/${{ github.repository }}:${{ env.DOCKER_LATEST }} ${{ env.REGISTRY }}/${{ github.repository }}:${{ env.DOCKER_LATEST }}
- name: Build and push dind
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
target: dind
platforms: |
linux/amd64
linux/arm64
push: true
tags: |
${{ env.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}:${{ steps.meta.outputs.REPO_VERSION }}-dind
${{ env.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}:${{ env.DOCKER_LATEST }}-dind
- name: Build and push dind-rootless - name: Build and push dind-rootless
uses: docker/build-push-action@v5 uses: docker/build-push-action@v5
env:
ACTIONS_RUNTIME_TOKEN: "" # See https://gitea.com/gitea/act_runner/issues/119
with: with:
context: . context: .
file: ./Dockerfile file: ./Dockerfile.rootless
target: dind-rootless
platforms: | platforms: |
linux/amd64 linux/amd64
linux/arm64 linux/arm64

2
.gitignore vendored
View File

@@ -1,4 +1,4 @@
/act_runner act_runner
.env .env
.runner .runner
coverage.txt coverage.txt

View File

@@ -1,5 +1,3 @@
version: 2
before: before:
hooks: hooks:
- go mod tidy - go mod tidy
@@ -16,8 +14,6 @@ builds:
- amd64 - amd64
- arm - arm
- arm64 - arm64
- s390x
- riscv64
goarm: goarm:
- "5" - "5"
- "6" - "6"
@@ -85,7 +81,7 @@ blobs:
provider: s3 provider: s3
bucket: "{{ .Env.S3_BUCKET }}" bucket: "{{ .Env.S3_BUCKET }}"
region: "{{ .Env.S3_REGION }}" region: "{{ .Env.S3_REGION }}"
directory: "act_runner/{{.Version}}" folder: "act_runner/{{.Version}}"
extra_files: extra_files:
- glob: ./**.xz - glob: ./**.xz
- glob: ./**.sha256 - glob: ./**.sha256
@@ -101,10 +97,10 @@ checksum:
- glob: ./**.xz - glob: ./**.xz
snapshot: snapshot:
version_template: "{{ .Branch }}-devel" name_template: "{{ .Branch }}-devel"
nightly: nightly:
version_template: "nightly" name_template: "nightly"
gitea_urls: gitea_urls:
api: https://gitea.com/api/v1 api: https://gitea.com/api/v1

View File

@@ -1,52 +1,16 @@
FROM golang:1.23-alpine3.21 as builder FROM golang:1.23-alpine3.20 as builder
# Do not remove `git` here, it is required for getting runner version when executing `make build` # Do not remove `git` here, it is required for getting runner version when executing `make build`
RUN apk add --no-cache make git RUN apk add --no-cache make git
ARG GOPROXY
ENV GOPROXY=${GOPROXY:-}
COPY . /opt/src/act_runner COPY . /opt/src/act_runner
WORKDIR /opt/src/act_runner WORKDIR /opt/src/act_runner
RUN make clean && make build RUN make clean && make build
FROM alpine:3.21 FROM alpine:3.20
RUN apk add --no-cache git bash tini RUN apk add --no-cache git bash tini
COPY --from=builder /opt/src/act_runner/act_runner /usr/local/bin/act_runner COPY --from=builder /opt/src/act_runner/act_runner /usr/local/bin/act_runner
COPY scripts/run.sh /usr/local/bin/run.sh COPY scripts/run.sh /opt/act/run.sh
COPY scripts/s6 /etc/s6
VOLUME /data ENTRYPOINT ["/sbin/tini","--","/opt/act/run.sh"]
ENTRYPOINT ["s6-svscan","/etc/s6"]
FROM docker:dind-rootless AS dind-rootless
USER root
RUN apk add --no-cache s6 bash git
COPY --from=builder /opt/src/act_runner/act_runner /usr/local/bin/act_runner
COPY scripts/run.sh /usr/local/bin/run.sh
COPY scripts/s6 /etc/s6
VOLUME /data
RUN mkdir -p /data && chown -R rootless:rootless /etc/s6 /data
ENV DOCKER_HOST=unix:///run/user/1000/docker.sock
USER rootless
ENTRYPOINT ["s6-svscan","/etc/s6"]
FROM alpine AS basic
RUN apk add --no-cache tini bash git
COPY --from=builder /opt/src/act_runner/act_runner /usr/local/bin/act_runner
COPY scripts/run.sh /usr/local/bin/run.sh
VOLUME /var/run/docker.sock
VOLUME /data
ENTRYPOINT ["/sbin/tini","--","run.sh"]

24
Dockerfile.rootless Normal file
View File

@@ -0,0 +1,24 @@
FROM golang:1.21-alpine3.18 as builder
# Do not remove `git` here, it is required for getting runner version when executing `make build`
RUN apk add --no-cache make git
COPY . /opt/src/act_runner
WORKDIR /opt/src/act_runner
RUN make clean && make build
FROM docker:dind-rootless
USER root
RUN apk add --no-cache \
git bash supervisor
COPY --from=builder /opt/src/act_runner/act_runner /usr/local/bin/act_runner
COPY /scripts/supervisord.conf /etc/supervisord.conf
COPY /scripts/run.sh /opt/act/run.sh
COPY /scripts/rootless.sh /opt/act/rootless.sh
RUN mkdir /data \
&& chown rootless:rootless /data
USER rootless
ENTRYPOINT ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]

View File

@@ -5,27 +5,12 @@
gitea: gitea:
image: gitea/gitea image: gitea/gitea
... ...
healthcheck:
# checks availability of Gitea's front-end with curl
test: ["CMD", "curl", "-f", "<instance_url>"]
interval: 10s
retries: 3
start_period: 30s
timeout: 10s
environment:
# GITEA_RUNNER_REGISTRATION_TOKEN can be used to set a global runner registration token.
# The Gitea version must be v1.23 or higher.
# It's also possible to use GITEA_RUNNER_REGISTRATION_TOKEN_FILE to pass the location.
# - GITEA_RUNNER_REGISTRATION_TOKEN=<user-defined registration token>
runner: runner:
image: gitea/act_runner image: gitea/act_runner
restart: always restart: always
depends_on: depends_on:
gitea: - gitea
# required so runner can attach to gitea, see "healthcheck"
condition: service_healthy
restart: true
volumes: volumes:
- ./data/act_runner:/data - ./data/act_runner:/data
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock

View File

@@ -12,9 +12,6 @@ spec:
--- ---
apiVersion: v1 apiVersion: v1
data: data:
# The registration token can be obtained from the web UI, API or command-line.
# You can also set a pre-defined global runner registration token for the Gitea instance via
# `GITEA_RUNNER_REGISTRATION_TOKEN`/`GITEA_RUNNER_REGISTRATION_TOKEN_FILE` environment variable.
token: << base64 encoded registration token >> token: << base64 encoded registration token >>
kind: Secret kind: Secret
metadata: metadata:

View File

@@ -12,10 +12,7 @@ spec:
--- ---
apiVersion: v1 apiVersion: v1
data: data:
# The registration token can be obtained from the web UI, API or command-line. token: << runner registration token goes here >>
# You can also set a pre-defined global runner registration token for the Gitea instance via
# `GITEA_RUNNER_REGISTRATION_TOKEN`/`GITEA_RUNNER_REGISTRATION_TOKEN_FILE` environment variable.
token: << base64 encoded registration token >>
kind: Secret kind: Secret
metadata: metadata:
name: runner-secret name: runner-secret

View File

@@ -11,7 +11,6 @@ As `root`:
```bash ```bash
useradd -m rootless useradd -m rootless
passwd rootless passwd rootless
apt-get install -y uidmap # Not mentioned but needed for docker rootless.
``` ```
- Install [`docker-ce`](https://docs.docker.com/engine/install/) - Install [`docker-ce`](https://docs.docker.com/engine/install/)
@@ -22,19 +21,12 @@ As `root`:
As the `rootless` user: As the `rootless` user:
- Follow the instructions for [enabling rootless mode](https://docs.docker.com/engine/security/rootless/) - Follow the instructions for [enabling rootless mode](https://docs.docker.com/engine/security/rootless/)
- Add the following line to the `/home/rootless/.bashrc`: - Add the following lines to the `/home/rootless/.bashrc`:
```bash
for f in ./.bashrc.d/*.bash; do echo "Processing $f file..."; . "$f"; done
```
- Create the .bashrc.d directory `mkdir ~/.bashrc.d`
- Add the following lines to the `/home/rootless/.bashrc.d/rootless-docker.bash`:
```bash ```bash
export XDG_RUNTIME_DIR=/home/rootless/.docker/run export XDG_RUNTIME_DIR=/home/rootless/.docker/run
export PATH=/home/rootless/bin:$PATH export PATH=/home/rootless/bin:$PATH
export DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock export DOCKER_HOST=unix:///run/user/1001/docker.sock
``` ```
- Reboot. Ensure that the Docker process is working. - Reboot. Ensure that the Docker process is working.

6
go.mod
View File

@@ -1,6 +1,6 @@
module gitea.com/gitea/act_runner module gitea.com/gitea/act_runner
go 1.23 go 1.22
require ( require (
code.gitea.io/actions-proto-go v0.4.0 code.gitea.io/actions-proto-go v0.4.0
@@ -98,5 +98,5 @@ require (
gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect
) )
// replace github.com/nektos/act => gitea.com/gitea/act v0.261.3 // replace github.com/nektos/act => gitea.com/gitea/act v0.261.1
replace github.com/nektos/act => gitea.krombel.de/krombel/act v0.261.3-1 replace github.com/nektos/act => gitea.krombel.de/krombel/act v0.261.1-1

4
go.sum
View File

@@ -6,8 +6,8 @@ connectrpc.com/connect v1.16.2 h1:ybd6y+ls7GOlb7Bh5C8+ghA6SvCBajHwxssO2CGFjqE=
connectrpc.com/connect v1.16.2/go.mod h1:n2kgwskMHXC+lVqb18wngEpF95ldBHXjZYJussz5FRc= connectrpc.com/connect v1.16.2/go.mod h1:n2kgwskMHXC+lVqb18wngEpF95ldBHXjZYJussz5FRc=
dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
gitea.krombel.de/krombel/act v0.261.3-1 h1:6Br1aNz5Nw/ZPIIOzdtpXAx/Yu0kKKj6NqPTgj4GyFc= gitea.krombel.de/krombel/act v0.261.1-1 h1:/FFMKlynOEkpnEViOefqlpiGlK39+0dfCJGgC4w7Axk=
gitea.krombel.de/krombel/act v0.261.3-1/go.mod h1:Pg5C9kQY1CEA3QjthjhlrqOC/QOT5NyWNjOjRHw23Ok= gitea.krombel.de/krombel/act v0.261.1-1/go.mod h1:Pg5C9kQY1CEA3QjthjhlrqOC/QOT5NyWNjOjRHw23Ok=
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU=
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8=
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=

View File

@@ -42,14 +42,12 @@ func Execute(ctx context.Context) {
rootCmd.AddCommand(registerCmd) rootCmd.AddCommand(registerCmd)
// ./act_runner daemon // ./act_runner daemon
var daemArgs daemonArgs
daemonCmd := &cobra.Command{ daemonCmd := &cobra.Command{
Use: "daemon", Use: "daemon",
Short: "Run as a runner daemon", Short: "Run as a runner daemon",
Args: cobra.MaximumNArgs(0), Args: cobra.MaximumNArgs(1),
RunE: runDaemon(ctx, &daemArgs, &configFile), RunE: runDaemon(ctx, &configFile),
} }
daemonCmd.Flags().BoolVar(&daemArgs.Once, "once", false, "Run one job then exit")
rootCmd.AddCommand(daemonCmd) rootCmd.AddCommand(daemonCmd)
// ./act_runner exec // ./act_runner exec

View File

@@ -28,7 +28,7 @@ import (
"gitea.com/gitea/act_runner/internal/pkg/ver" "gitea.com/gitea/act_runner/internal/pkg/ver"
) )
func runDaemon(ctx context.Context, daemArgs *daemonArgs, configFile *string) func(cmd *cobra.Command, args []string) error { func runDaemon(ctx context.Context, configFile *string) func(cmd *cobra.Command, args []string) error {
return func(cmd *cobra.Command, args []string) error { return func(cmd *cobra.Command, args []string) error {
cfg, err := config.LoadDefault(*configFile) cfg, err := config.LoadDefault(*configFile)
if err != nil { if err != nil {
@@ -122,24 +122,9 @@ func runDaemon(ctx context.Context, daemArgs *daemonArgs, configFile *string) fu
poller := poll.New(cfg, cli, runner) poller := poll.New(cfg, cli, runner)
if daemArgs.Once {
done := make(chan struct{})
go func() {
defer close(done)
poller.PollOnce()
}()
// shutdown when we complete a job or cancel is requested
select {
case <-ctx.Done():
case <-done:
}
} else {
go poller.Poll() go poller.Poll()
<-ctx.Done() <-ctx.Done()
}
log.Infof("runner: %s shutdown initiated, waiting %s for running jobs to complete before shutting down", resp.Msg.Runner.Name, cfg.Runner.ShutdownTimeout) log.Infof("runner: %s shutdown initiated, waiting %s for running jobs to complete before shutting down", resp.Msg.Runner.Name, cfg.Runner.ShutdownTimeout)
ctx, cancel := context.WithTimeout(context.Background(), cfg.Runner.ShutdownTimeout) ctx, cancel := context.WithTimeout(context.Background(), cfg.Runner.ShutdownTimeout)
@@ -149,15 +134,10 @@ func runDaemon(ctx context.Context, daemArgs *daemonArgs, configFile *string) fu
if err != nil { if err != nil {
log.Warnf("runner: %s cancelled in progress jobs during shutdown", resp.Msg.Runner.Name) log.Warnf("runner: %s cancelled in progress jobs during shutdown", resp.Msg.Runner.Name)
} }
return nil return nil
} }
} }
type daemonArgs struct {
Once bool
}
// initLogging setup the global logrus logger. // initLogging setup the global logrus logger.
func initLogging(cfg *config.Config) { func initLogging(cfg *config.Config) {
isTerm := isatty.IsTerminal(os.Stdout.Fd()) isTerm := isatty.IsTerminal(os.Stdout.Fd())

View File

@@ -70,15 +70,6 @@ func (p *Poller) Poll() {
close(p.done) close(p.done)
} }
func (p *Poller) PollOnce() {
limiter := rate.NewLimiter(rate.Every(p.cfg.Runner.FetchInterval), 1)
p.pollOnce(limiter)
// signal that we're done
close(p.done)
}
func (p *Poller) Shutdown(ctx context.Context) error { func (p *Poller) Shutdown(ctx context.Context) error {
p.shutdownPolling() p.shutdownPolling()
@@ -110,19 +101,6 @@ func (p *Poller) Shutdown(ctx context.Context) error {
func (p *Poller) poll(wg *sync.WaitGroup, limiter *rate.Limiter) { func (p *Poller) poll(wg *sync.WaitGroup, limiter *rate.Limiter) {
defer wg.Done() defer wg.Done()
for {
p.pollOnce(limiter)
select {
case <-p.pollingCtx.Done():
return
default:
continue
}
}
}
func (p *Poller) pollOnce(limiter *rate.Limiter) {
for { for {
if err := limiter.Wait(p.pollingCtx); err != nil { if err := limiter.Wait(p.pollingCtx); err != nil {
if p.pollingCtx.Err() != nil { if p.pollingCtx.Err() != nil {
@@ -136,7 +114,6 @@ func (p *Poller) pollOnce(limiter *rate.Limiter) {
} }
p.runTaskWithRecover(p.jobsCtx, task) p.runTaskWithRecover(p.jobsCtx, task)
return
} }
} }

9
scripts/rootless.sh Executable file
View File

@@ -0,0 +1,9 @@
#!/usr/bin/env bash
# wait for docker daemon
while ! nc -z localhost 2376 </dev/null; do
echo 'waiting for docker daemon...'
sleep 5
done
. /opt/act/run.sh

View File

@@ -1,3 +0,0 @@
#!/usr/bin/env bash
exec s6-svscanctl -t /etc/s6

View File

@@ -1,5 +0,0 @@
#!/usr/bin/env bash
s6-svwait -U /etc/s6/docker
exec run.sh

View File

@@ -1,6 +0,0 @@
#!/usr/bin/env bash
if ! docker info &> /dev/null; then
echo "Waiting for Docker daemon to start..."
exit 1
fi

View File

@@ -1,4 +0,0 @@
#!/usr/bin/env bash
exec s6-svscanctl -t /etc/s6

View File

@@ -1 +0,0 @@
3

View File

@@ -1,3 +0,0 @@
#!/usr/bin/env bash
exec s6-notifyoncheck dockerd-entrypoint.sh

17
scripts/supervisord.conf Normal file
View File

@@ -0,0 +1,17 @@
[supervisord]
nodaemon=true
logfile=/dev/null
logfile_maxbytes=0
[program:dockerd]
command=/usr/local/bin/dockerd-entrypoint.sh
[program:act_runner]
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
command=/opt/act/rootless.sh
[eventlistener:processes]
command=bash -c "echo READY && read line && kill -SIGQUIT $PPID"
events=PROCESS_STATE_STOPPED,PROCESS_STATE_EXITED,PROCESS_STATE_FATAL