Golang / Singularity / gitlab
Menu
singularity を動かす
    ssh amane
    % singularity shell --shell /bin/zsh /mnt/ie-virsh/singularity/os_complete/os_complete.sif
環境変数
zshrc などに設定する
VSCode
singularity の中で VSCode を動かすのは、ちょっと難しいできるならやってみて。
Project を作成する
FileWrite2 というプロジェクトを作る% mkdir ~/src/go/fileWrite2 % cd ~/src/go/fileWrite2 % mod init ie.u-ryukyu.ac.jp/teacher/kono/os/fileWrite2 % go mod tidy % go run main.gohello.go
    package main
    import (
        "fmt"
    )
    func main() {
            fmt.Println("Hello, World!")
    }
先に gitlab で空のProjectを作る
group os/2023 の下の e215788-go-filewrite という名前で Project を作る
あとから gitlab に登録する
    git init
    git add
    git commit
する。gitlabのprojectを作って
    git remote add orign git@gitlab.ie.u-ryukyu.ac.jp:os/2023/kono-go-01.git
    git push -uf origin main
とする。(https: は使えないので ssh を使う)
    
go を走らせる
main.go をそこに作る
    package main
    import (
        "flag"
        "fmt"
        "ie.u-ryukyu.ac.jp/teacher/kono/os/fileWrite3/fileIO"
    )
    func sub1() {
            fmt.Println("sub1")
    }
    func main() {
            u := fileIO.FileIO{}
            getOpts(&u)
            fmt.Println("Hello, main !!"+ u.FileName)
            u.FileWrite()
            sub1()
            fmt.Println("Hello, 世界")
    }
    func getOpts(u *fileIO.FileIO) {
            fmt.Println("Hello, getOpts")
            flag.BoolVar(&u.Buffering, "b", false, "buffering")
            flag.StringVar(&u.FileName, "filename", "testData.txt", "file name to write")
            flag.IntVar(&u.BufferSize, "buffersize", 1024, "buffer size")
            flag.IntVar(&u.WriteSize, "writesize", 102400, "write size")
            flag.Parse()
            fmt.Println("Hello, getOpts !!"+ u.FileName)
    }
fileIO/fileWrite.go を作る
    package fileIO
    import (
            "bufio"
            "fmt"
            "os"
    )
    type FileIO struct {
            FileName   string
            Buffering  bool
            BufferSize int
            WriteSize  int
    }
    func check(e error) {
            if e != nil {
                    panic(e)
            }
    }
    func (u *FileIO) FileWrite() {
            fmt.Println("Hello, FileWrite "+ u.FileName)
            var f, err = os.Create(u.FileName)
            fmt.Println("created "+ u.FileName)
            check(err)
            d1 := []byte("h")
            if !u.Buffering {
                    u.BufferSize = 1
            }
            w := bufio.NewWriterSize(f, u.BufferSize)
            for i := 0; i < u.WriteSize; i++ {
                    w.Write(d1)
            }
            w.Flush()
            defer f.Close()
    }
   go test
でテストできるように main_test.go を書く。
    package main
    import (
            "ie.u-ryukyu.ac.jp/teacher/kono/os/fileWrite3/fileIO"
            "testing"
    )
    func Test_getOpts(t *testing.T) {
            type args struct {
                    u fileIO.FileIO
            }
            // u1 := fileIO.FileIO{}
            var tests = []struct {
                    name string
                    args args
            }{
                    {"test", args{fileIO.FileIO{FileName : "fileName", Buffering : false, BufferSize : 1024, WriteSize : 1024}}},
            //      {"test", args{fileIO.FileIO{"", false, 1024, 1024}}},
            }
            for _, tt := range tests {
                    t.Run(tt.name, func(t *testing.T) {
                            getOpts(& tt.args.u)
                            if tt.args.u.FileName == "" {
                                    t.Fail()
                            }
                    })
            }
    }
    func Test_sub1(t *testing.T) {
            tests := []struct {
                    name string
            }{
                    // TODO: Add test cases.
            }
            for _, tt := range tests {
                    t.Run(tt.name, func(t *testing.T) {
                    })
            }
    }
で、
    go run main.go
    go test
する。
gitlab CI/CD
今年は gitlab の CI/CD を使います。Project に .gitlab-ci.yml を以下の内容で追加して、git push します。
    image: golang:latest
    stages:
      - test
      - build
      - deploy
    format:
      stage: test
      script:
        - go fmt $(go list ./... | grep -v /vendor/)
        - go vet $(go list ./... | grep -v /vendor/)
        - go test -race $(go list ./... | grep -v /vendor/)
    compile:
      stage: build
      script:
        - mkdir -p mybinaries
        - go build -o mybinaries ./...
      artifacts:
        paths:
          - mybinaries
成功したのと失敗した version の consle のURLを含めて提出します。