diff --git a/.gitea/workflows/build copy.yaml b/.gitea/workflows/build copy.yaml new file mode 100644 index 0000000..b550f5a --- /dev/null +++ b/.gitea/workflows/build copy.yaml @@ -0,0 +1,59 @@ +name: Release Build +on: + push: + tags: + - v* + +jobs: + release: + runs-on: ubuntu-latest + container: + image: golang:1.21 + steps: + - name: Checkout repository + run: | + git clone https://oauth2:${{ secrets.GITEATOKEN }}@direct-dev.ru/gitea/GiteaAdmin/hello_gitea.git hello_gitea + cd hello_gitea + git checkout ${{ github.ref }} + + - name: Setup Go + run: | + # Install jq for JSON parsing + apt-get update && apt-get install -y jq + git --version + go version + jq --version + + - name: Build + run: | + cd hello_gitea + mkdir -p bin + go build -o bin/hello-api-${{ github.ref_name }} main.go + ls -la bin/ + + - name: Create Release + run: | + cd hello_gitea + # Create release using Gitea API + curl -X POST \ + -H "Authorization: token ${{ secrets.GITEATOKEN }}" \ + -H "Content-Type: application/json" \ + -d '{ + "tag_name": "${{ github.ref_name }}", + "name": "Release ${{ github.ref_name }}", + "body": "Automated release", + "draft": false, + "prerelease": false + }' \ + "https://direct-dev.ru/gitea/api/v1/repos/GiteaAdmin/hello_gitea/releases" + + # Upload asset + RELEASE_ID=$(curl -s -H "Authorization: token ${{ secrets.GITEATOKEN }}" \ + "https://direct-dev.ru/gitea/api/v1/repos/GiteaAdmin/hello_gitea/releases/tags/${{ github.ref_name }}" | \ + jq -r '.id') + + curl -X POST \ + -H "Authorization: token ${{ secrets.GITEATOKEN }}" \ + -H "Content-Type: application/octet-stream" \ + --data-binary @bin/hello-api-${{ github.ref_name }} \ + "https://direct-dev.ru/gitea/api/v1/repos/GiteaAdmin/hello_gitea/releases/$RELEASE_ID/assets?name=hello-api-${{ github.ref_name }}" \ No newline at end of file diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml index b550f5a..b08c1e4 100644 --- a/.gitea/workflows/build.yaml +++ b/.gitea/workflows/build.yaml @@ -5,10 +5,28 @@ on: - v* jobs: - release: + build-binaries: runs-on: ubuntu-latest container: image: golang:1.21 + strategy: + matrix: + include: + - os: linux + arch: amd64 + suffix: linux-amd64 + - os: linux + arch: arm64 + suffix: linux-arm64 + - os: windows + arch: amd64 + suffix: windows-amd64.exe + - os: darwin + arch: amd64 + suffix: darwin-amd64 + - os: darwin + arch: arm64 + suffix: darwin-arm64 steps: - name: Checkout repository run: | @@ -24,13 +42,96 @@ jobs: go version jq --version - - name: Build + - name: Build for ${{ matrix.os }}-${{ matrix.arch }} run: | cd hello_gitea mkdir -p bin - go build -o bin/hello-api-${{ github.ref_name }} main.go + GOOS=${{ matrix.os }} GOARCH=${{ matrix.arch }} go build -o bin/hello-api-${{ matrix.suffix }} main.go ls -la bin/ + - name: Upload artifact + run: | + cd hello_gitea/bin + tar -czf hello-api-${{ matrix.suffix }}.tar.gz hello-api-${{ matrix.suffix }} + echo "Built: hello-api-${{ matrix.suffix }}.tar.gz" + + create-docker-image: + runs-on: ubuntu-latest + container: + image: golang:1.21 + needs: build-binaries + steps: + - name: Checkout repository + run: | + git clone https://oauth2:${{ secrets.GITEATOKEN }}@direct-dev.ru/gitea/GiteaAdmin/hello_gitea.git hello_gitea + cd hello_gitea + git checkout ${{ github.ref }} + + - name: Setup Docker + run: | + # Install Docker CLI + apt-get update && apt-get install -y docker.io + docker --version + + - name: Build Docker image + run: | + cd hello_gitea + # Build image using existing Dockerfile + docker build -t hello-api:${{ github.ref_name }} . + docker tag hello-api:${{ github.ref_name }} hello-api:latest + + - name: Login to Docker Hub + run: | + echo ${{ secrets.DOCKERHUB_TOKEN }} | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin + + - name: Push to Docker Hub + run: | + cd hello_gitea + docker push ${{ secrets.DOCKERHUB_USERNAME }}/hello-api:${{ github.ref_name }} + docker push ${{ secrets.DOCKERHUB_USERNAME }}/hello-api:latest + + create-release: + runs-on: ubuntu-latest + container: + image: golang:1.21 + needs: [build-binaries, create-docker-image] + steps: + - name: Checkout repository + run: | + git clone https://oauth2:${{ secrets.GITEATOKEN }}@direct-dev.ru/gitea/GiteaAdmin/hello_gitea.git hello_gitea + cd hello_gitea + git checkout ${{ github.ref }} + + - name: Setup Go + run: | + # Install jq for JSON parsing + apt-get update && apt-get install -y jq + git --version + go version + jq --version + + - name: Build all binaries + run: | + cd hello_gitea + mkdir -p bin + + # Build for all platforms + GOOS=linux GOARCH=amd64 go build -o bin/hello-api-linux-amd64 main.go + GOOS=linux GOARCH=arm64 go build -o bin/hello-api-linux-arm64 main.go + GOOS=windows GOARCH=amd64 go build -o bin/hello-api-windows-amd64.exe main.go + GOOS=darwin GOARCH=amd64 go build -o bin/hello-api-darwin-amd64 main.go + GOOS=darwin GOARCH=arm64 go build -o bin/hello-api-darwin-arm64 main.go + + # Create archives + cd bin + tar -czf hello-api-linux-amd64.tar.gz hello-api-linux-amd64 + tar -czf hello-api-linux-arm64.tar.gz hello-api-linux-arm64 + tar -czf hello-api-windows-amd64.tar.gz hello-api-windows-amd64.exe + tar -czf hello-api-darwin-amd64.tar.gz hello-api-darwin-amd64 + tar -czf hello-api-darwin-arm64.tar.gz hello-api-darwin-arm64 + + ls -la + - name: Create Release run: | cd hello_gitea @@ -41,19 +142,23 @@ jobs: -d '{ "tag_name": "${{ github.ref_name }}", "name": "Release ${{ github.ref_name }}", - "body": "Automated release", + "body": "Automated release with multi-platform binaries and Docker image", "draft": false, "prerelease": false }' \ "https://direct-dev.ru/gitea/api/v1/repos/GiteaAdmin/hello_gitea/releases" - # Upload asset + # Upload assets RELEASE_ID=$(curl -s -H "Authorization: token ${{ secrets.GITEATOKEN }}" \ "https://direct-dev.ru/gitea/api/v1/repos/GiteaAdmin/hello_gitea/releases/tags/${{ github.ref_name }}" | \ jq -r '.id') - curl -X POST \ - -H "Authorization: token ${{ secrets.GITEATOKEN }}" \ - -H "Content-Type: application/octet-stream" \ - --data-binary @bin/hello-api-${{ github.ref_name }} \ - "https://direct-dev.ru/gitea/api/v1/repos/GiteaAdmin/hello_gitea/releases/$RELEASE_ID/assets?name=hello-api-${{ github.ref_name }}" \ No newline at end of file + # Upload all binaries + for file in bin/*.tar.gz; do + echo "Uploading $file..." + curl -X POST \ + -H "Authorization: token ${{ secrets.GITEATOKEN }}" \ + -H "Content-Type: application/octet-stream" \ + --data-binary @$file \ + "https://direct-dev.ru/gitea/api/v1/repos/GiteaAdmin/hello_gitea/releases/$RELEASE_ID/assets?name=$(basename $file)" + done \ No newline at end of file diff --git a/.gitignore b/.gitignore index de17ae3..aeb2a1c 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ go.work.sum # env file .env bin/ +dockerhub_token \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..37be628 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,46 @@ +# Build stage +FROM golang:1.21-alpine AS builder + +# Install git and ca-certificates +RUN apk --no-cache add git ca-certificates + +WORKDIR /app + +# Copy go mod files +COPY go.mod go.sum ./ + +# Download dependencies +RUN go mod download + +# Copy source code +COPY . . + +# Build the application +RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o hello-api main.go + +# Final stage +FROM alpine:latest + +# Install jq and ca-certificates +RUN apk --no-cache add ca-certificates jq + +# Create non-root user +RUN addgroup -g 1001 -S appgroup && \ + adduser -u 1001 -S appuser -G appgroup + +WORKDIR /app + +# Copy binary from builder stage +COPY --from=builder /app/hello-api . + +# Change ownership to non-root user +RUN chown appuser:appgroup hello-api + +# Switch to non-root user +USER appuser + +# Expose port (if your app uses one) +EXPOSE 8080 + +# Run the application +CMD ["./hello-api"] \ No newline at end of file