尋找一種基于 AWS lambda 輸入暫停 gitlab 作業和恢復的方法。
由于我所在組織的權限限制,以下是我當前的 CI 作業流程:

在上圖中,在推送事件中,lambda 通過 webhook 觸發 gitlab 作業。gitlab 作業只獲取最新的代碼、zip 檔案并復制到特定的 s3 存盤桶。gitlab 作業完成后,相同的 lambda 然后觸發 codebuild 構建,該構建確實從 s3 存盤桶獲取最新的 zip 檔案,創建 UI 塊檔案并將工件推送到不同的 s3 存盤桶。
### gitlab-ci.yml ###
variables:
environment: <aws-account-number>
stages:
- get-latest-code
get-latest-code:
stage: get-latest-code
script:
- zip -r project.zip $(pwd)/*
- export PATH=$PATH:/tmp/project/.local/bin
- pip install awscli
- aws s3 cp $(pwd)/project.zip s3://project-input-bucket-dev
rules:
- if: ('$CI_PIPELINE_SOURCE == "merge_request_event"' || '$CI_PIPELINE_SOURCE == "push"')
### lambda code ###
def runner_lambda_handler(event, context):
cb = boto3.client( 'codebuild' )
builds_dir = os.environ.get('BUILDS_DIR', '/tmp/project/builds')
logger.debug("STARTING GIT LAB RUNNER")
gitlab_runner_cmd = f"gitlab-runner --debug run-single -u https://git.company.com/ -t {token} " \
f"--builds-dir {builds_dir} --max-builds 1 " \
f"--wait-timeout 900 --executor shell"
s3_libraries_loader.subprocess_cmd(gitlab_runner_cmd)
cb.start_build(projectName='PROJECT-Deploy-dev')
return {
"statusCode": 200,
"body": "Gitlab build success."
}
#### Codebuild Stack ####
codebuild.Project(self, f"Project-{env_name}",
project_name=f"Project-{env_name}",
role=codebuild_role,
environment_variables={
"INPUT_S3_ARTIFACTS_BUCKET": {
"value": input_bucket.bucket_name
},
"INPUT_S3_ARTIFACTS_OBJECT": {
"value": "project.zip"
},
"OUTPUT_S3_ARTIFACTS_BUCKET": {
"value": output_bucket.bucket_name
},
"PROJECT_NAME": {
"value": f"Project-{env_name}"
}
},
cache=codebuild.Cache.bucket(input_bucket),
environment=codebuild.BuildEnvironment(
build_image=codebuild.LinuxBuildImage.STANDARD_5_0
),
vpc=vpc,
security_groups=[codebuild_sg],
artifacts=codebuild.Artifacts.s3(
bucket=output_bucket,
include_build_id=False,
package_zip=False,
encryption=False
),
build_spec=codebuild.BuildSpec.from_object({
"version": "0.2",
"cache": {
"paths": ['/root/.m2/**/*', '/root/.npm/**/*', 'build/**/*', '*/project/node_modules/**/*']
},
"phases": {
"install": {
"runtime-versions": {
"nodejs": "14.x"
},
"commands": [
"aws s3 cp --quiet s3://$INPUT_S3_ARTIFACTS_BUCKET/$INPUT_S3_ARTIFACTS_OBJECT .",
"unzip $INPUT_S3_ARTIFACTS_OBJECT",
"cd project",
"export SASS_BINARY_DIR=$(pwd)",
"npm cache verify",
"npm install",
]
},
"build": {
"commands": [
"npm run build"
]
},
"post_build": {
"commands": [
"echo Clearing s3 bucket folder",
"aws s3 rm --recursive s3://$OUTPUT_S3_ARTIFACTS_BUCKET/$PROJECT_NAME"
]
}
},
"artifacts": {
"files": [
"**/*.html",
"**/*.js",
"**/*.css",
"**/*.ico",
"**/*.woff",
"**/*.woff2",
"**/*.svg",
"**/*.png"
],
"discard-paths": "yes",
"base-directory": "$(pwd)/dist/proj"
}
})
)
需要什么:
目前 gitlab 作業和 codebuild 作業之間存在脫節。我正在尋找一種在執行所有步驟后暫停 gitlab 作業的方法。稍后在代碼構建作業成功完成后,我可以恢復相同的 gitlab 作業并將其標記為已完成
提前致謝
uj5u.com熱心網友回復:
您需要更改 gitlab 的 webhook 更新部分,然后通過 curl 您可以檢查其他部分的狀態。如果他們的狀態沒有完成暫停 git push to push 事件
uj5u.com熱心網友回復:
您需要實作自己的邏輯來等待您完成的代碼構建作業,您可以使用批處理獲取構建來檢查狀態。
看看這個,你可以在你的 gitlab 作業中有類似的東西,等待 codebuild 作業完成
uj5u.com熱心網友回復:
您可以在管道中創建手動作業作為暫停。代碼構建可以呼叫 GitLab API 來運行手動作業,從而允許管道繼續。這可能是處理這種情況的最節省資源的方式。
但是,您將無法使用此方法恢復相同的作業。
沒有“暫停”作業的機制,但是如果您出于某種原因確實需要將事情保持在同一個作業中,則可以按照另一個答案中的建議實施輪詢機制。但是,您最終會消耗比需要更多的時間(如果使用 GitLab.com 共享運行器)或系統資源。如果該程序需要很長時間,您可能還需要考慮您的作業超時。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/472495.html
標籤:亚马逊网络服务 aws-lambda GitLab gitlab-ci-runner
上一篇:awslambda上的Django后端:什么是請求?
下一篇:RDS不支持創建資料庫實體
