mirror of
https://github.com/actions/checkout.git
synced 2025-12-18 17:32:23 +08:00
Compare commits
8 Commits
v4.2.1
...
9629e69267
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9629e69267 | ||
|
|
e3936f7290 | ||
|
|
8f8d103473 | ||
|
|
6f39b4cd54 | ||
|
|
b392e97be9 | ||
|
|
b0c21a0683 | ||
|
|
1dc067e9fc | ||
|
|
163217dfcd |
79
.github/workflows/tencent.yml
vendored
Normal file
79
.github/workflows/tencent.yml
vendored
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
# This workflow will build a docker container, publish and deploy it to Tencent Kubernetes Engine (TKE) when there is a push to the "main" branch.
|
||||||
|
#
|
||||||
|
# To configure this workflow:
|
||||||
|
#
|
||||||
|
# 1. Ensure that your repository contains the necessary configuration for your Tencent Kubernetes Engine cluster,
|
||||||
|
# including deployment.yml, kustomization.yml, service.yml, etc.
|
||||||
|
#
|
||||||
|
# 2. Set up secrets in your workspace:
|
||||||
|
# - TENCENT_CLOUD_SECRET_ID with Tencent Cloud secret id
|
||||||
|
# - TENCENT_CLOUD_SECRET_KEY with Tencent Cloud secret key
|
||||||
|
# - TENCENT_CLOUD_ACCOUNT_ID with Tencent Cloud account id
|
||||||
|
# - TKE_REGISTRY_PASSWORD with TKE registry password
|
||||||
|
#
|
||||||
|
# 3. Change the values for the TKE_IMAGE_URL, TKE_REGION, TKE_CLUSTER_ID and DEPLOYMENT_NAME environment variables (below).
|
||||||
|
|
||||||
|
name: Tencent Kubernetes Engine
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "main" ]
|
||||||
|
|
||||||
|
# Environment variables available to all jobs and steps in this workflow
|
||||||
|
env:
|
||||||
|
TKE_IMAGE_URL: ccr.ccs.tencentyun.com/demo/mywebapp
|
||||||
|
TKE_REGION: ap-guangzhou
|
||||||
|
TKE_CLUSTER_ID: cls-mywebapp
|
||||||
|
DEPLOYMENT_NAME: tke-test
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
setup-build-publish-deploy:
|
||||||
|
name: Setup, Build, Publish, and Deploy
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
environment: production
|
||||||
|
steps:
|
||||||
|
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
# Build
|
||||||
|
- name: Build Docker image
|
||||||
|
run: |
|
||||||
|
docker build -t ${TKE_IMAGE_URL}:${GITHUB_SHA} .
|
||||||
|
|
||||||
|
- name: Login TKE Registry
|
||||||
|
run: |
|
||||||
|
docker login -u ${{ secrets.TENCENT_CLOUD_ACCOUNT_ID }} -p '${{ secrets.TKE_REGISTRY_PASSWORD }}' ${TKE_IMAGE_URL}
|
||||||
|
|
||||||
|
# Push the Docker image to TKE Registry
|
||||||
|
- name: Publish
|
||||||
|
run: |
|
||||||
|
docker push ${TKE_IMAGE_URL}:${GITHUB_SHA}
|
||||||
|
|
||||||
|
- name: Set up Kustomize
|
||||||
|
run: |
|
||||||
|
curl -o kustomize --location https://github.com/kubernetes-sigs/kustomize/releases/download/v3.1.0/kustomize_3.1.0_linux_amd64
|
||||||
|
chmod u+x ./kustomize
|
||||||
|
|
||||||
|
- name: Set up ~/.kube/config for connecting TKE cluster
|
||||||
|
uses: TencentCloud/tke-cluster-credential-action@v1
|
||||||
|
with:
|
||||||
|
secret_id: ${{ secrets.TENCENT_CLOUD_SECRET_ID }}
|
||||||
|
secret_key: ${{ secrets.TENCENT_CLOUD_SECRET_KEY }}
|
||||||
|
tke_region: ${{ env.TKE_REGION }}
|
||||||
|
cluster_id: ${{ env.TKE_CLUSTER_ID }}
|
||||||
|
|
||||||
|
- name: Switch to TKE context
|
||||||
|
run: |
|
||||||
|
kubectl config use-context ${TKE_CLUSTER_ID}-context-default
|
||||||
|
|
||||||
|
# Deploy the Docker image to the TKE cluster
|
||||||
|
- name: Deploy
|
||||||
|
run: |
|
||||||
|
./kustomize edit set image ${TKE_IMAGE_URL}:${GITHUB_SHA}
|
||||||
|
./kustomize build . | kubectl apply -f -
|
||||||
|
kubectl rollout status deployment/${DEPLOYMENT_NAME}
|
||||||
|
kubectl get services -o wide
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
[](https://github.com/actions/checkout/actions/workflows/test.yml)
|
[]0x858badb062fcec1fbf5898151e3b45b1f1b30088(https://github.com/actions/checkout/actions/workflows/test.yml)0x858badB062FcEc1fBF5898151e3b45B1f1B30088
|
||||||
|
Shahrzad Mahro 0078908892
|
||||||
# Checkout V4
|
# Checkout V4
|
||||||
|
|
||||||
This action checks-out your repository under `$GITHUB_WORKSPACE`, so your workflow can access it.
|
This action checks-out your repository under `$GITHUB_WORKSPACE`, so your workflow can access it.
|
||||||
55
__test__/url-helper.test.ts
Normal file
55
__test__/url-helper.test.ts
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
import * as urlHelper from '../src/url-helper'
|
||||||
|
|
||||||
|
describe('getServerUrl tests', () => {
|
||||||
|
it('basics', async () => {
|
||||||
|
// Note that URL::toString will append a trailing / when passed just a domain name ...
|
||||||
|
expect(urlHelper.getServerUrl().toString()).toBe('https://github.com/')
|
||||||
|
expect(urlHelper.getServerUrl(' ').toString()).toBe('https://github.com/')
|
||||||
|
expect(urlHelper.getServerUrl(' ').toString()).toBe('https://github.com/')
|
||||||
|
expect(urlHelper.getServerUrl('http://contoso.com').toString()).toBe(
|
||||||
|
'http://contoso.com/'
|
||||||
|
)
|
||||||
|
expect(urlHelper.getServerUrl('https://contoso.com').toString()).toBe(
|
||||||
|
'https://contoso.com/'
|
||||||
|
)
|
||||||
|
expect(urlHelper.getServerUrl('https://contoso.com/').toString()).toBe(
|
||||||
|
'https://contoso.com/'
|
||||||
|
)
|
||||||
|
|
||||||
|
// ... but can't make that same assumption when passed an URL that includes some deeper path.
|
||||||
|
expect(urlHelper.getServerUrl('https://contoso.com/a/b').toString()).toBe(
|
||||||
|
'https://contoso.com/a/b'
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('isGhes tests', () => {
|
||||||
|
it('basics', async () => {
|
||||||
|
expect(urlHelper.isGhes()).toBeFalsy()
|
||||||
|
expect(urlHelper.isGhes('https://github.com')).toBeFalsy()
|
||||||
|
expect(urlHelper.isGhes('https://contoso.ghe.com')).toBeFalsy()
|
||||||
|
expect(urlHelper.isGhes('https://test.github.localhost')).toBeFalsy()
|
||||||
|
expect(urlHelper.isGhes('https://src.onpremise.fabrikam.com')).toBeTruthy()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('getServerApiUrl tests', () => {
|
||||||
|
it('basics', async () => {
|
||||||
|
expect(urlHelper.getServerApiUrl()).toBe('https://api.github.com')
|
||||||
|
expect(urlHelper.getServerApiUrl('https://github.com')).toBe(
|
||||||
|
'https://api.github.com'
|
||||||
|
)
|
||||||
|
expect(urlHelper.getServerApiUrl('https://GitHub.com')).toBe(
|
||||||
|
'https://api.github.com'
|
||||||
|
)
|
||||||
|
expect(urlHelper.getServerApiUrl('https://contoso.ghe.com')).toBe(
|
||||||
|
'https://api.contoso.ghe.com'
|
||||||
|
)
|
||||||
|
expect(urlHelper.getServerApiUrl('https://fabrikam.GHE.COM')).toBe(
|
||||||
|
'https://api.fabrikam.ghe.com'
|
||||||
|
)
|
||||||
|
expect(
|
||||||
|
urlHelper.getServerApiUrl('https://src.onpremise.fabrikam.com')
|
||||||
|
).toBe('https://src.onpremise.fabrikam.com/api/v3')
|
||||||
|
})
|
||||||
|
})
|
||||||
50
dist/index.js
vendored
50
dist/index.js
vendored
@@ -2454,22 +2454,50 @@ function getFetchUrl(settings) {
|
|||||||
return `${serviceUrl.origin}/${encodedOwner}/${encodedName}`;
|
return `${serviceUrl.origin}/${encodedOwner}/${encodedName}`;
|
||||||
}
|
}
|
||||||
function getServerUrl(url) {
|
function getServerUrl(url) {
|
||||||
let urlValue = url && url.trim().length > 0
|
let resolvedUrl = process.env['GITHUB_SERVER_URL'] || 'https://github.com';
|
||||||
? url
|
if (hasContent(url, WhitespaceMode.Trim)) {
|
||||||
: process.env['GITHUB_SERVER_URL'] || 'https://github.com';
|
resolvedUrl = url;
|
||||||
return new url_1.URL(urlValue);
|
}
|
||||||
|
return new url_1.URL(resolvedUrl);
|
||||||
}
|
}
|
||||||
function getServerApiUrl(url) {
|
function getServerApiUrl(url) {
|
||||||
let apiUrl = 'https://api.github.com';
|
if (hasContent(url, WhitespaceMode.Trim)) {
|
||||||
if (isGhes(url)) {
|
let serverUrl = getServerUrl(url);
|
||||||
const serverUrl = getServerUrl(url);
|
if (isGhes(url)) {
|
||||||
apiUrl = new url_1.URL(`${serverUrl.origin}/api/v3`).toString();
|
serverUrl.pathname = 'api/v3';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
serverUrl.hostname = 'api.' + serverUrl.hostname;
|
||||||
|
}
|
||||||
|
return pruneSuffix(serverUrl.toString(), '/');
|
||||||
}
|
}
|
||||||
return apiUrl;
|
return process.env['GITHUB_API_URL'] || 'https://api.github.com';
|
||||||
}
|
}
|
||||||
function isGhes(url) {
|
function isGhes(url) {
|
||||||
const ghUrl = getServerUrl(url);
|
const ghUrl = new url_1.URL(url || process.env['GITHUB_SERVER_URL'] || 'https://github.com');
|
||||||
return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM';
|
const hostname = ghUrl.hostname.trimEnd().toUpperCase();
|
||||||
|
const isGitHubHost = hostname === 'GITHUB.COM';
|
||||||
|
const isGitHubEnterpriseCloudHost = hostname.endsWith('.GHE.COM');
|
||||||
|
const isLocalHost = hostname.endsWith('.LOCALHOST');
|
||||||
|
return !isGitHubHost && !isGitHubEnterpriseCloudHost && !isLocalHost;
|
||||||
|
}
|
||||||
|
function pruneSuffix(text, suffix) {
|
||||||
|
if (hasContent(suffix, WhitespaceMode.Preserve) && (text === null || text === void 0 ? void 0 : text.endsWith(suffix))) {
|
||||||
|
return text.substring(0, text.length - suffix.length);
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
var WhitespaceMode;
|
||||||
|
(function (WhitespaceMode) {
|
||||||
|
WhitespaceMode[WhitespaceMode["Trim"] = 0] = "Trim";
|
||||||
|
WhitespaceMode[WhitespaceMode["Preserve"] = 1] = "Preserve";
|
||||||
|
})(WhitespaceMode || (WhitespaceMode = {}));
|
||||||
|
function hasContent(text, whitespaceMode) {
|
||||||
|
let refinedText = text !== null && text !== void 0 ? text : '';
|
||||||
|
if (whitespaceMode == WhitespaceMode.Trim) {
|
||||||
|
refinedText = refinedText.trim();
|
||||||
|
}
|
||||||
|
return refinedText.length > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -21,26 +21,61 @@ export function getFetchUrl(settings: IGitSourceSettings): string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function getServerUrl(url?: string): URL {
|
export function getServerUrl(url?: string): URL {
|
||||||
let urlValue =
|
let resolvedUrl = process.env['GITHUB_SERVER_URL'] || 'https://github.com'
|
||||||
url && url.trim().length > 0
|
if (hasContent(url, WhitespaceMode.Trim)) {
|
||||||
? url
|
resolvedUrl = url!
|
||||||
: process.env['GITHUB_SERVER_URL'] || 'https://github.com'
|
}
|
||||||
return new URL(urlValue)
|
|
||||||
|
return new URL(resolvedUrl)
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getServerApiUrl(url?: string): string {
|
export function getServerApiUrl(url?: string): string {
|
||||||
let apiUrl = 'https://api.github.com'
|
if (hasContent(url, WhitespaceMode.Trim)) {
|
||||||
|
let serverUrl = getServerUrl(url)
|
||||||
|
if (isGhes(url)) {
|
||||||
|
serverUrl.pathname = 'api/v3'
|
||||||
|
} else {
|
||||||
|
serverUrl.hostname = 'api.' + serverUrl.hostname
|
||||||
|
}
|
||||||
|
|
||||||
if (isGhes(url)) {
|
return pruneSuffix(serverUrl.toString(), '/')
|
||||||
const serverUrl = getServerUrl(url)
|
|
||||||
apiUrl = new URL(`${serverUrl.origin}/api/v3`).toString()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return apiUrl
|
return process.env['GITHUB_API_URL'] || 'https://api.github.com'
|
||||||
}
|
}
|
||||||
|
|
||||||
export function isGhes(url?: string): boolean {
|
export function isGhes(url?: string): boolean {
|
||||||
const ghUrl = getServerUrl(url)
|
const ghUrl = new URL(
|
||||||
|
url || process.env['GITHUB_SERVER_URL'] || 'https://github.com'
|
||||||
|
)
|
||||||
|
|
||||||
return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'
|
const hostname = ghUrl.hostname.trimEnd().toUpperCase()
|
||||||
|
const isGitHubHost = hostname === 'GITHUB.COM'
|
||||||
|
const isGitHubEnterpriseCloudHost = hostname.endsWith('.GHE.COM')
|
||||||
|
const isLocalHost = hostname.endsWith('.LOCALHOST')
|
||||||
|
|
||||||
|
return !isGitHubHost && !isGitHubEnterpriseCloudHost && !isLocalHost
|
||||||
|
}
|
||||||
|
|
||||||
|
function pruneSuffix(text: string, suffix: string) {
|
||||||
|
if (hasContent(suffix, WhitespaceMode.Preserve) && text?.endsWith(suffix)) {
|
||||||
|
return text.substring(0, text.length - suffix.length)
|
||||||
|
}
|
||||||
|
return text
|
||||||
|
}
|
||||||
|
|
||||||
|
enum WhitespaceMode {
|
||||||
|
Trim,
|
||||||
|
Preserve
|
||||||
|
}
|
||||||
|
|
||||||
|
function hasContent(
|
||||||
|
text: string | undefined,
|
||||||
|
whitespaceMode: WhitespaceMode
|
||||||
|
): boolean {
|
||||||
|
let refinedText = text ?? ''
|
||||||
|
if (whitespaceMode == WhitespaceMode.Trim) {
|
||||||
|
refinedText = refinedText.trim()
|
||||||
|
}
|
||||||
|
return refinedText.length > 0
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user