人工Webhook、Docker、

使用Artifactory Webhooks和Docker进行持续部署

継続的デプロイメント(CD)ではメインブランチから最新のコード変更でソフトウェアを更新するために,インフラストラクチャと自動化に関する設定を行う必要があります。() (“液体软件”> > > > > > > > >完全な自動化により,デプロイがシームレスでエラーが発生しにくく,高速になり,変更の度にデプロイできるため,フィードバックループが短くなります。

継続的デプロイメントを実現するには以下の要素が必要です:

  • Jenkins, JFrog Pipelines, JFrog pipeline継続的インテグレーション(CI)
  • JFrog人工智能アーティファクト管理でアーティファクトを保存し,デプロイの対象(サーバー,スマートアプライアンス,コンピュータ)に新しいバージョンを提供する。
  • 新しいアーティファクトを処理して運用可能にするデプロイエージェント()。2;
    • プル:
    • 刷刷刷刷:

プルとプッシュモデルには長所と短所がありますが,両方組合わせて使用することもできます。プルモデルの最も大きな欠点はエージェントがバイナリストアの変更を認識していないため,いつ更新をトリガーするか分からないことです。プッシュモデルの欠点の一つはセキュリティで,これはターゲットがデプロイメントエージェントの認証を確実にする必要があるためです。

。DockerJFrog人工网络钩子

人工智能,刷刷刷刷

。お持ちでない場合は無償でクラウドインスタンスを作成することができます

docker-local-stage、docker-local-prodDocker? ? ?

【中文译文】

创建新的Docker存储库

新しいリポジトリ・ウィンドウから:

  1. Docker
  2. 存储库密钥“docker-local-stage
  3. “保存并完成”
  4. “docker-local-prod

2 .。管理|一般|人则“新网络钩子”?【中文】:

创建新的webhook

ノート:网址:http://host.docker.internal:7979/“,”。webhook,网络钩子,网络钩子,网络钩子。ここでの“host.docker.internalというホスト名は码头工人コンテナからホストにアクセスするためです。。

秘密令牌フィールドには任意の文字列を入力することができ,HTTPヘッダ“X-jfrog-event-authで送信されるため,信頼できるソースから来ていることをクエリによって確認することもできます。

Docker标签最近升级了

Docker标签得到了提升“。ArtifactoryではDockerイメージをプロモーション- > > > > > > >これは码头工人イメージをあるリポジトリから別のリポジトリに移動しますが内容を変更することはありません。これによりステージングでテストされたイメージが本番でデプロイされるイメージであることが保証されます。

选择存储库“。また”,包括模式“セクションにアーティファクトブラウザで码头工人イメージのmanifest.json

编辑存储库窗口

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

网络钩子

webhookハンドラーは本番サーバー上で実行され,イベントのペイロードを含むHTTPリクエストを受け取ります。:

{"domain": "docker", "event_type": "promoted", "data": {"image_name": "helloworld", "name": "manifest. log "。, "path": "helloworld/latest/manifest. Json "。Json ", "platforms": [], "repo_key": "docker-local-staging", "sha256": "ee34c5c94b4d7d0b319af21a84ebb0bcc16ef01be9a6ee0277329256ecee29b0", "size": 949, "tag": "latest"}}

Webhook

  • http://。
  • Docker。Artifactoryのwebhook設定にフィルターを追加した場合でも、サーバーは常に検証する必要があります。
  • Docker。
  • (。

。コードのサンプルはこちらのGithub? ? ? ? ? ?

函数main() {http。HandleFunc("/");ResponseWriter, r *http. request) {ctx:= context.Background() p, err:= readPayload(r)如果err != nil {http. requestError(w, Error .Error(), http.StatusBadRequest)日志。Printf("Payload reading error: %+v", err) return} if !isMyServerEvent(p) {http。错误(w, "Bad event", http.StatusBadRequest)日志。Printf("意外事件%+v", p) return} cli, err:= client. newclientwithopts (client. newclientwithopts)。from menv, client.WithAPIVersionNegotiation())如果err != nil{日志。Printf("新客户端错误:%+v", err) return} err = pullLatestVersion(cli, ctx)如果err !Printf("把错误:% + v”,犯错)返回}呃= stopRunningContainer (cli, ctx)如果犯错! = nil{如果client.IsErrNotFound (err){日志。Printf("容器不存在")}else{日志。Printf("停止错误:% + v”,犯错)返回}}呃= startContainer (cli, ctx)如果犯错! = nil{日志。Printf("启动错误:%+v", err)} else{日志。Printf("Container updated ")}})ListenAndServe(":8081", nil)}

★★★★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

  • golang
  • docker golang SDK

中文:。。★★★★★★★★★★★★★★【翻译Github? ? ? ? ? ?

函数isMyServerEvent(*http。请求,p DockerEventPayload) bool{返回p. domain == "docker" && p. eventtype == "promoted" && p. data . imagename == "helloworld" && p. data . repokey == "docker-local-staging" && p. data . tag == "latest" && r.Header.Get("X-JFrog-Event-Auth") == "mysecrets"}

Docker SDK (Docker SDK)。
。。ただし,サーバー環境は“码头工人登录”で設定しておくべきなので,これは必要ないでしょう。

命令行*客户端。客户端,ctx context.Context)错误{authConfig:= types。AuthConfig{用户名:"admin",密码:" Password ",} encodedJSON, _:= json.Marshal(AuthConfig) _, err:= cli。imageppull (ctx, imageName, types)ImagePullOptions {RegistryAuth: base64.URLEncoding。在codeToString( encodedJSON)}) if err != nil { log.Printf("Pull error: %+v", err) return err } return nil }

★★★★★★★★★★★★★★★★★

stopRunningContainer(cli *client。客户端,ctx上下文。上下文)错误{返回cli。ContainerRemove(ctx, containerName, types)ContainerRemoveOptions{Force: true})}

コンテナの作成後に起動します(golang码头工人SDKには“码头工人运行”はありません):

startContainer(cli *client。Client, ctx context.Context) error {resp, err:= cli。ContainerCreate (ctx,容器。配置{Image: imageName,}和容器。HostConfig{PortBindings: nat. portmap {"8080/tcp": []nat。PortBinding{{HostIP: "0.0.0.0", HostPort: "8080",},},}, nil, nil, containerName)如果err != nil {return err} err = cli。ContainerStart (ctx,分别地。ID, types.ContainerStartOptions{})如果err != nil{返回err}返回nil}

网络钩子。

イメージをビルド/プッシュ

以下のシンプルなgolangのwebサーバーをテストに利用します:

Package main import ("fmt" "net/http") function main() {http。HandleFunc("/");ResponseWriter, r *http.Request) {流(w,“Hello World, % s !”,r.URL.Path [1:])}) http。ListenAndServe(":8080", nil)}

以下の去コマンドを使って実行します:

去,运行服务器,去

ブラウザで“http://localhost: 8080”を指定することで“Hello world”と表示されます。

このアプリのDockerfileは以下の通りです(ほとんどがVSCodeのgolang Dockerfileテンプレートと同様です):

运行apk添加——no-cache git WORKDIR /go/src/app COPY . .运行命令go install -v ./…从alpine:最新运行apk——no-cache添加ca-certificates拷贝——FROM =builder /go/bin/app /app ENTRYPOINT ./app标签名称=blogpostevent版本=0.0.1

dockerfile (dockerfile)。★★★★★★★★★★★★★

Docker构建。- t localhost: 8082 / docker-local-staging / helloworld

JFrog CLIDocker (Docker, Docker, Docker, Docker, Docker)

Jfrog rt docker-push localhost:8082/docker-local-staging/helloworld docker-local-staging——url http://localhost:8082/artifactory——user admin——password password

。;

——copy——user admin——password——password——url http://localhost:8082/artifactory

このコマンドは以下のプロセスを起動します:

  • Artifactoryは码头工人イメージをdocker-local-prodリポジトリにコピーします。
  • 人工智能、HTTP、Webhook、Webhook、Webhook、Webhook、Webhook、Webhook、Webhook、Webhook、Webhook。
  • webhook(网络钩子)
  • 実行中のサーバが存在する場合,そのサーバを終了します。
  • 中文:。

★★★★★。

?

。★★★★★★★★★★★★★★★以下にいくつかのアイデアをご紹介します:

  • CI環境ですべての码头工人,JFrog CLIコマンドを実行します。“#prod”。
  • 。码头工人コマンドを実行するのではなく,Kubernetesや码头工人群あるいはクラウドプロバイダーのSDKを使うことをお勧めします。
  • 。ArtifactoryからのHTTPクエリにカスタムヘッダーを追加することにより、不要なデプロイメントがトリガーされないようにします。
  • “码头工人推”イベント用のwebhookを作成し,ステージング・デプロイを自動化します。
  • クラウドの法斯またはPaaSにエージェントを導入する
  • 2つのプロモーションイベントが同時に発生した場合に集約することで,コンテナの複数の並列デプロイメントを防止します。

齐声

このブログではArtifactoryのwebhookと完全に自動化されたワークフローを利用し,CI / CDプロセスの最後の1マイルを達成する方法をご紹介しました。哇,哇,哇,哇,。